├── .husky
└── pre-commit
├── .babelrc
├── src
├── index.js
├── utils
│ ├── compose.js
│ ├── isObject.js
│ ├── curry.js
│ ├── deepMerge.js
│ └── makeCancelable.js
├── config
│ └── index.js
├── types.d.ts
├── validators
│ └── index.js
├── spec.js
└── loader
│ └── index.js
├── .gitignore
├── tea.yaml
├── .npmignore
├── playground
├── package.json
├── .gitignore
├── index.html
├── main.js
└── package-lock.json
├── eslint.config.mjs
├── LICENSE
├── package.json
├── rollup.config.mjs
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
└── README.md
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | npm test && npm run lint
2 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import loader from './loader';
2 |
3 | export default loader;
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | coverage/
2 | node_modules/
3 | yarn-error.log
4 | npm-debug.log
5 | lib/
6 | dist/
7 |
--------------------------------------------------------------------------------
/src/utils/compose.js:
--------------------------------------------------------------------------------
1 | const compose = (...fns) => x => fns.reduceRight((y, f) => f(y), x);
2 |
3 | export default compose;
4 |
--------------------------------------------------------------------------------
/src/utils/isObject.js:
--------------------------------------------------------------------------------
1 | function isObject(value) {
2 | return ({}).toString.call(value).includes('Object');
3 | }
4 |
5 | export default isObject;
6 |
--------------------------------------------------------------------------------
/tea.yaml:
--------------------------------------------------------------------------------
1 | # https://tea.xyz/what-is-this-file
2 | ---
3 | version: 1.0.0
4 | codeOwners:
5 | - '0x8958579fcDE99f81808e6c89aCFeEc3DF93Ad9bb'
6 | quorum: 1
7 |
--------------------------------------------------------------------------------
/src/config/index.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | paths: {
3 | vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs',
4 | },
5 | }
6 |
7 | export default config;
8 |
--------------------------------------------------------------------------------
/src/utils/curry.js:
--------------------------------------------------------------------------------
1 | function curry(fn) {
2 | return function curried(...args) {
3 | return args.length >= fn.length
4 | ? fn.apply(this, args)
5 | : (...nextArgs) => curried.apply(this, [...args, ...nextArgs]);
6 | }
7 | }
8 |
9 | export default curry;
10 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | npm-debug.log
2 | yarn-error.log
3 | webpack.config.js
4 | CODE_OF_CONDUCT.md
5 | .eslintrc.json
6 | .gitignore
7 | .npmignore
8 | .travis.yml
9 | .vscode/
10 |
11 | /demo/
12 | /src/
13 | /coverage/
14 | /.github/
15 | /node_modules/
16 |
17 | __snapshots__
18 | *.spec.js
19 | *.spec.js.snap
20 |
--------------------------------------------------------------------------------
/playground/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "monaco-loader",
3 | "private": true,
4 | "version": "0.0.1",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "preview": "vite preview"
9 | },
10 | "devDependencies": {
11 | "vite": "^6.0.0"
12 | },
13 | "dependencies": {
14 | "monaco-editor": "^0.54.0"
15 | }
16 | }
--------------------------------------------------------------------------------
/src/utils/deepMerge.js:
--------------------------------------------------------------------------------
1 | function merge(target, source) {
2 | Object.keys(source).forEach(key => {
3 | if (source[key] instanceof Object) {
4 | if (target[key]) {
5 | Object.assign(source[key], merge(target[key], source[key]));
6 | }
7 | }
8 | });
9 |
10 | return { ...target, ...source };
11 | }
12 |
13 | export default merge;
14 |
--------------------------------------------------------------------------------
/playground/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/playground/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Monaco Loader: Playground
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/types.d.ts:
--------------------------------------------------------------------------------
1 | import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api';
2 |
3 | export type Monaco = typeof monacoEditor;
4 |
5 | interface CancelablePromise extends Promise {
6 | cancel: () => void;
7 | }
8 |
9 | declare namespace loader {
10 | function init(): CancelablePromise;
11 | function config(params: {
12 | paths?: {
13 | vs?: string,
14 | },
15 | 'vs/nls'?: {
16 | availableLanguages?: object,
17 | },
18 | monaco?: Monaco,
19 | }): void;
20 | function __getMonacoInstance(): Monaco | null;
21 | }
22 |
23 | export default loader;
24 |
--------------------------------------------------------------------------------
/src/utils/makeCancelable.js:
--------------------------------------------------------------------------------
1 | // The source (has been changed) is https://github.com/facebook/react/issues/5465#issuecomment-157888325
2 |
3 | const CANCELATION_MESSAGE = {
4 | type: 'cancelation',
5 | msg: 'operation is manually canceled',
6 | };
7 |
8 | function makeCancelable(promise) {
9 | let hasCanceled_ = false;
10 |
11 | const wrappedPromise = new Promise((resolve, reject) => {
12 | promise.then(val => hasCanceled_ ? reject(CANCELATION_MESSAGE) : resolve(val));
13 | promise.catch(reject);
14 | });
15 |
16 | return (wrappedPromise.cancel = () => (hasCanceled_ = true), wrappedPromise);
17 | }
18 |
19 | export { CANCELATION_MESSAGE };
20 | export default makeCancelable;
21 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js';
2 |
3 | export default [
4 | js.configs.recommended,
5 | {
6 | languageOptions: {
7 | ecmaVersion: 2020,
8 | sourceType: 'module',
9 | globals: {
10 | // Browser globals
11 | window: 'readonly',
12 | document: 'readonly',
13 | navigator: 'readonly',
14 | console: 'readonly',
15 | setTimeout: 'readonly',
16 | clearTimeout: 'readonly',
17 | setInterval: 'readonly',
18 | clearInterval: 'readonly',
19 | fetch: 'readonly',
20 | Promise: 'readonly',
21 | // ES2020 globals
22 | globalThis: 'readonly',
23 | },
24 | },
25 | rules: {},
26 | },
27 | {
28 | ignores: ['**/spec.js', '**/*.spec.js', 'node_modules/**', 'lib/**'],
29 | },
30 | ];
31 |
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Suren Atoyan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/playground/main.js:
--------------------------------------------------------------------------------
1 | import loader from '../src'
2 |
3 | import * as monaco from 'monaco-editor';
4 | import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
5 | import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
6 | import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'
7 | import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
8 | import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
9 |
10 | self.MonacoEnvironment = {
11 | getWorker(_, label) {
12 | if (label === 'json') {
13 | return new jsonWorker()
14 | }
15 | if (label === 'css' || label === 'scss' || label === 'less') {
16 | return new cssWorker()
17 | }
18 | if (label === 'html' || label === 'handlebars' || label === 'razor') {
19 | return new htmlWorker()
20 | }
21 | if (label === 'typescript' || label === 'javascript') {
22 | return new tsWorker()
23 | }
24 | return new editorWorker()
25 | }
26 | }
27 |
28 | loader.config({ monaco });
29 | loader.init().then(monaco => monaco.editor.create(document.body, {
30 | value: '// some comment',
31 | language: 'javascript',
32 | }));
33 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@monaco-editor/loader",
3 | "version": "1.7.0",
4 | "description": "the library aims to setup monaco editor into your browser",
5 | "main": "lib/cjs/index.js",
6 | "module": "lib/es/index.js",
7 | "unpkg": "lib/umd/monaco-loader.min.js",
8 | "jsdelivr": "lib/umd/monaco-loader.min.js",
9 | "types": "lib/types.d.ts",
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/suren-atoyan/monaco-loader.git"
13 | },
14 | "homepage": "https://github.com/suren-atoyan/monaco-loader.git",
15 | "author": "Suren Atoyan ",
16 | "license": "MIT",
17 | "scripts": {
18 | "test": "jest",
19 | "test-watch": "npm run build && jest --watch",
20 | "coverage": "jest --collect-coverage",
21 | "lint": "npx eslint src",
22 | "prepublishOnly": "npm test && npm run lint && npm run build",
23 | "build": "rollup -c && cp ./src/types.d.ts ./lib/",
24 | "prepare": "husky"
25 | },
26 | "keywords": [
27 | "monaco",
28 | "editor",
29 | "loader",
30 | "monaco-editor",
31 | "monaco editor"
32 | ],
33 | "devDependencies": {
34 | "@babel/core": "^7.25.0",
35 | "@babel/preset-env": "^7.25.0",
36 | "@rollup/plugin-babel": "^6.0.4",
37 | "@rollup/plugin-commonjs": "^28.0.0",
38 | "@rollup/plugin-node-resolve": "^15.3.0",
39 | "@rollup/plugin-replace": "^6.0.1",
40 | "@rollup/plugin-terser": "^0.4.4",
41 | "babel-jest": "^29.7.0",
42 | "babel-loader": "^9.2.1",
43 | "eslint": "^9.14.0",
44 | "husky": "^9.1.6",
45 | "jest": "^29.7.0",
46 | "rollup": "^4.24.0"
47 | },
48 | "dependencies": {
49 | "state-local": "^1.0.6"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/validators/index.js:
--------------------------------------------------------------------------------
1 | import curry from '../utils/curry';
2 | import isObject from '../utils/isObject';
3 |
4 | /**
5 | * validates the configuration object and informs about deprecation
6 | * @param {Object} config - the configuration object
7 | * @return {Object} config - the validated configuration object
8 | */
9 | function validateConfig(config) {
10 | if (!config) errorHandler('configIsRequired');
11 | if (!isObject(config)) errorHandler('configType');
12 | if (config.urls) {
13 | informAboutDeprecation();
14 | return { paths: { vs: config.urls.monacoBase } };
15 | }
16 |
17 | return config;
18 | }
19 |
20 | /**
21 | * logs deprecation message
22 | */
23 | function informAboutDeprecation() {
24 | console.warn(errorMessages.deprecation);
25 | }
26 |
27 | function throwError(errorMessages, type) {
28 | throw new Error(errorMessages[type] || errorMessages.default);
29 | }
30 |
31 | const errorMessages = {
32 | configIsRequired: 'the configuration object is required',
33 | configType: 'the configuration object should be an object',
34 | default: 'an unknown error accured in `@monaco-editor/loader` package',
35 |
36 | deprecation: `Deprecation warning!
37 | You are using deprecated way of configuration.
38 |
39 | Instead of using
40 | monaco.config({ urls: { monacoBase: '...' } })
41 | use
42 | monaco.config({ paths: { vs: '...' } })
43 |
44 | For more please check the link https://github.com/suren-atoyan/monaco-loader#config
45 | `,
46 | };
47 |
48 | const errorHandler = curry(throwError)(errorMessages);
49 |
50 | const validators = {
51 | config: validateConfig,
52 | };
53 |
54 | export default validators;
55 |
56 | export { errorMessages, errorHandler };
57 |
--------------------------------------------------------------------------------
/rollup.config.mjs:
--------------------------------------------------------------------------------
1 | import nodeResolve from '@rollup/plugin-node-resolve';
2 | import terser from '@rollup/plugin-terser';
3 | import replace from '@rollup/plugin-replace';
4 | import commonjs from '@rollup/plugin-commonjs';
5 | import babel from '@rollup/plugin-babel';
6 |
7 | const defaultNodeResolveConfig = {};
8 | const nodeResolvePlugin = nodeResolve(defaultNodeResolveConfig);
9 |
10 | const commonPlugins = [
11 | nodeResolvePlugin,
12 | babel({
13 | presets: ['@babel/preset-env'],
14 | babelHelpers: 'bundled',
15 | }),
16 | commonjs(),
17 | ];
18 |
19 | const developmentPlugins = [
20 | ...commonPlugins,
21 | replace({
22 | 'process.env.NODE_ENV': JSON.stringify('development'),
23 | preventAssignment: true,
24 | }),
25 | ];
26 |
27 | const productionPlugins = [
28 | ...commonPlugins,
29 | replace({
30 | 'process.env.NODE_ENV': JSON.stringify('production'),
31 | preventAssignment: true,
32 | }),
33 | terser({ mangle: false }),
34 | ];
35 |
36 | const external = ['state-local'];
37 |
38 | export default [
39 | {
40 | input: 'src/index.js',
41 | external,
42 | output: {
43 | dir: 'lib/cjs/',
44 | format: 'cjs',
45 | exports: 'named',
46 | preserveModules: true,
47 | },
48 | plugins: commonPlugins,
49 | },
50 | {
51 | input: 'src/index.js',
52 | external,
53 | output: {
54 | dir: 'lib/es/',
55 | format: 'es',
56 | preserveModules: true,
57 | },
58 | plugins: commonPlugins,
59 | },
60 | {
61 | input: 'src/index.js',
62 | output: {
63 | file: 'lib/umd/monaco-loader.js',
64 | format: 'umd',
65 | name: 'monaco_loader',
66 | },
67 | plugins: developmentPlugins,
68 | },
69 | {
70 | input: 'src/index.js',
71 | output: {
72 | file: 'lib/umd/monaco-loader.min.js',
73 | format: 'umd',
74 | name: 'monaco_loader',
75 | },
76 | plugins: productionPlugins,
77 | },
78 | ];
79 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## 1.7.0
2 | ###### *Nov 21, 2025*
3 |
4 | - loader: merged #61 - add backward compatibility for 0.53 and 0.54 versions
5 | - monaco-editor: update to the latest version (0.55.1)
6 |
7 | ## 1.6.1
8 | ###### *Oct 14, 2025*
9 |
10 | - eslint: use mjs for eslint config file
11 | - package: remove type field
12 |
13 | ## 1.6.0
14 | ###### *Oct 12, 2025*
15 |
16 | - monaco-editor: update to the latest version (0.54.0)
17 | - package: update all dependencies to the latest version
18 | - playground: update all dependencies to the latest version
19 |
20 | ## 1.5.0
21 | ###### *Feb 13, 2025*
22 |
23 | - monaco-editor: update to the latest version (0.52.2)
24 | - package: remove monaco-editor from peerDependencies
25 |
26 | ## 1.4.0
27 | ###### *Oct 1, 2023*
28 |
29 | - monaco-editor: update to the latest version (0.43.0)
30 |
31 | ## 1.3.3
32 | ###### *Apr 2, 2023*
33 |
34 | - monaco-editor: update to the latest version (0.36.1)
35 |
36 | ## 1.3.2
37 | ###### *May 11, 2022*
38 |
39 | - utility: resolve monaco instance in case of provided monaco instance and global availability
40 |
41 | ## 1.3.1
42 | ###### *Apr 23, 2022*
43 |
44 | - utility: implement isInitialized flag
45 |
46 | ## 1.3.0
47 | ###### *Mar 20, 2022*
48 |
49 | - types: add optional monaco type into config params
50 | - utility: implement optional monaco param for config
51 | - test: fix a test case according to the new changes
52 | - playground: create a playground for testing the library
53 | - monaco-editor: update to the latest version (0.33.0)
54 |
55 | ## 1.2.0
56 | ###### *Oct 3, 2021*
57 |
58 | - monaco-editor: update to the latest version (0.28.1)
59 | - types: fix CancelablePromise type
60 |
61 | ## 1.1.1
62 | ###### *Jun 21, 2021*
63 |
64 | - monaco-editor: update to the latest version (0.25.2)
65 |
66 | ## 1.1.0
67 | ###### *Jun 12, 2021*
68 |
69 | - monaco-editor: update to the latest version (0.25.0)
70 |
71 | ## 1.0.1
72 | ###### *Mar 18, 2021*
73 |
74 | - monaco-editor: update to the latest version (0.23.0)
75 |
76 | ## 1.0.0
77 | ###### *Jan 15, 2021*
78 |
79 | 🎉 First stable release
80 |
81 | - utility: rename the main utility: monaco -> loader
82 | - helpers: create (+ named export) `__getMonacoInstance` internal helper
83 |
84 | ## 0.1.3
85 | ###### *Jan 8, 2021*
86 |
87 | - build: in `cjs` and `es` bundles `state-local` is marked as externam lib
88 | - build: in `cjs` and `es` modules structure is preserved - `output.preserveModules = true`
89 |
90 | ## 0.1.2
91 | ###### *Jan 7, 2021*
92 |
93 | - package: add jsdelivr source path
94 |
95 | ## 0.1.1
96 | ###### *Jan 7, 2021*
97 |
98 | - lib: rename scripts name (from 'core' to 'loader')
99 |
100 | ## 0.1.0
101 | ###### *Jan 6, 2021*
102 |
103 | 🎉 First release
104 |
--------------------------------------------------------------------------------
/src/spec.js:
--------------------------------------------------------------------------------
1 | import loader from '.';
2 | import { errorMessages } from './validators';
3 |
4 | // the loader utility has three methods: `config`, `init` and `__getMonacoInstance`
5 |
6 | // 1) `.config`
7 | // the `config` is a function with one parameter (required)
8 | // the only parameter is a configuration object, that should be an `Object` type
9 | // it will warn about deprecation message when there is `urls` field in
10 | // the configuration object
11 |
12 | describe('.config', () => {
13 | // test 1 - check if `config` is a function
14 | test('should be a function', () => {
15 | expect(loader.config).toBeInstanceOf(Function);
16 | });
17 |
18 | // test 2 - check if `config` throws an error when we don't pass an argument
19 | // check error message
20 | test('should throw an error when no arguments are passed', () => {
21 | function callConfigWithoutArguments() {
22 | loader.config();
23 | }
24 |
25 | expect(callConfigWithoutArguments).toThrow(errorMessages.configIsRequired);
26 | });
27 |
28 | // test 3 - check if `config` throws an error when the first argument is not an object
29 | // check the error message
30 | test('should throw an error when the first argument is not an object', () => {
31 | function callConfigWithNonObjectFirstArgument(config) {
32 | return () => loader.config(config);
33 | }
34 |
35 | expect(callConfigWithNonObjectFirstArgument('string')).toThrow(errorMessages.configType);
36 | expect(callConfigWithNonObjectFirstArgument([1, 2, 3])).toThrow(errorMessages.configType);
37 | expect(callConfigWithNonObjectFirstArgument(x => x + 1)).toThrow(errorMessages.configType);
38 | });
39 |
40 | // test 4 - check if `config` warns about deprecation when there is a `urls`
41 | // field in the configuration object
42 | test('should warn about deprecation', () => {
43 | const consoleWarnSpy = jest
44 | .spyOn(global.console, 'warn')
45 | .mockImplementation(() => {});
46 |
47 | loader.config({ urls: '...' });
48 |
49 | expect(consoleWarnSpy).toHaveBeenCalledWith(errorMessages.deprecation);
50 | consoleWarnSpy.mockRestore();
51 | });
52 | });
53 |
54 | // 2) `.init`
55 | // `init` is a function without parameters
56 | // it handle the initialization process of monaco-editor
57 | // returns an instance of monaco (with a cancelable promise)
58 |
59 | describe('.init', () => {
60 | // test 1 - check if `init` is a function
61 | test('should be a function', () => {
62 | expect(loader.init).toBeInstanceOf(Function);
63 | });
64 | });
65 |
66 | // 3) `.__getMonacoInstance`
67 | // internal helper function
68 | // extracts stored monaco instance from module state
69 | // returns the monaco instance or null
70 |
71 | describe('.__getMonacoInstance', () => {
72 | // test 1 - check if `__getMonacoInstance` is a function
73 | test('should be a function', () => {
74 | expect(loader.__getMonacoInstance).toBeInstanceOf(Function);
75 | });
76 |
77 | // test 2 - check if `__getMonacoInstance` returns `null`
78 | // as the initialization (.init) wasn't triggered
79 | test('should return null', () => {
80 | expect(loader.__getMonacoInstance()).toBe(undefined);
81 | });
82 | });
83 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at contact@surenatoyan.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/src/loader/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * loader module
3 | * @module src/loader
4 | *
5 | * the module aims to setup monaco-editor
6 | * into your browser by using its `loader` script
7 | */
8 |
9 | import state from 'state-local';
10 |
11 | import defaultConfig from '../config';
12 | import validators from '../validators';
13 | import compose from '../utils/compose';
14 | import deepMerge from '../utils/deepMerge';
15 | import makeCancelable from '../utils/makeCancelable';
16 |
17 | /** the local state of the module */
18 | const [getState, setState] = state.create({
19 | config: defaultConfig,
20 | isInitialized: false,
21 | resolve: null,
22 | reject: null,
23 | monaco: null,
24 | });
25 |
26 | /**
27 | * set the loader configuration
28 | * @param {Object} config - the configuration object
29 | */
30 | function config(globalConfig) {
31 | const { monaco, ...config } = validators.config(globalConfig);
32 |
33 | setState(state => ({
34 | config: deepMerge(
35 | state.config,
36 | config,
37 | ),
38 | monaco,
39 | }));
40 | }
41 |
42 | /**
43 | * handles the initialization of the monaco-editor
44 | * @return {Promise} - returns an instance of monaco (with a cancelable promise)
45 | */
46 | function init() {
47 | const state = getState(({ monaco, isInitialized, resolve }) => ({ monaco, isInitialized, resolve }));
48 |
49 | if (!state.isInitialized) {
50 | setState({ isInitialized: true });
51 |
52 | if (state.monaco) {
53 | state.resolve(state.monaco);
54 | return makeCancelable(wrapperPromise);
55 | }
56 |
57 | if (window.monaco && window.monaco.editor) {
58 | storeMonacoInstance(window.monaco);
59 | state.resolve(window.monaco);
60 | return makeCancelable(wrapperPromise);
61 | }
62 |
63 | compose(
64 | injectScripts,
65 | getMonacoLoaderScript,
66 | )(configureLoader);
67 | }
68 |
69 | return makeCancelable(wrapperPromise);
70 | }
71 |
72 | /**
73 | * injects provided scripts into the document.body
74 | * @param {Object} script - an HTML script element
75 | * @return {Object} - the injected HTML script element
76 | */
77 | function injectScripts(script) {
78 | return document.body.appendChild(script);
79 | }
80 |
81 | /**
82 | * creates an HTML script element with/without provided src
83 | * @param {string} [src] - the source path of the script
84 | * @return {Object} - the created HTML script element
85 | */
86 | function createScript(src) {
87 | const script = document.createElement('script');
88 | return (src && (script.src = src), script);
89 | }
90 |
91 | /**
92 | * creates an HTML script element with the monaco loader src
93 | * @return {Object} - the created HTML script element
94 | */
95 | function getMonacoLoaderScript(configureLoader) {
96 | const state = getState(({ config, reject }) => ({ config, reject }));
97 |
98 | const loaderScript = createScript(`${state.config.paths.vs}/loader.js`);
99 | loaderScript.onload = () => configureLoader();
100 |
101 | loaderScript.onerror = state.reject;
102 |
103 | return loaderScript;
104 | }
105 |
106 | /**
107 | * configures the monaco loader
108 | */
109 | function configureLoader() {
110 | const state = getState(
111 | ({ config, resolve, reject }) => ({ config, resolve, reject })
112 | );
113 |
114 | const require = window.require;
115 |
116 | require.config(state.config);
117 | require(
118 | ['vs/editor/editor.main'],
119 | function(loaded) {
120 | const monaco = loaded.m /* for 0.53 & 0.54 */ || loaded /* for other versions */;
121 | storeMonacoInstance(monaco);
122 | state.resolve(monaco);
123 | },
124 | function(error) {
125 | state.reject(error);
126 | },
127 | );
128 | }
129 |
130 | /**
131 | * store monaco instance in local state
132 | */
133 | function storeMonacoInstance(monaco) {
134 | if (!getState().monaco) {
135 | setState({ monaco });
136 | }
137 | }
138 |
139 | /**
140 | * internal helper function
141 | * extracts stored monaco instance
142 | * @return {Object|null} - the monaco instance
143 | */
144 | function __getMonacoInstance() {
145 | return getState(({ monaco }) => monaco);
146 | }
147 |
148 | const wrapperPromise = new Promise((resolve, reject) => setState({ resolve, reject }));
149 |
150 | export default { config, init, __getMonacoInstance };
151 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # @monaco-editor/loader · [](https://www.npmjs.com/package/@monaco-editor/loader) [](https://github.com/suren-atoyan/monaco-loader/blob/master/LICENSE) [](https://www.npmjs.com/package/@monaco-editor/loader) [](https://github.com/suren-atoyan/monaco-loader/pulls)
2 |
3 | The utility to easy setup `monaco-editor` into your browser
4 |
5 | ## Synopsis
6 |
7 | Configure and download monaco sources via its loader script, without needing to use webpack's (or any other module bundler's) configuration files
8 |
9 | ## Motivation
10 |
11 | It's been a while we are working with `monaco editor`. It's a great library and provides a powerful editor out of the box. Anyway, there were couple of problems related to the setup process. The main problem is the need to do some additional `webpack` configuration; that's not bad, but some quite useful tools, like `CRA`, aren't happy with that fact. The library [`@monaco-editor/react`](https://github.com/suren-atoyan/monaco-react) was being created to solve that problem - `monaco editor wrapper for easy/one-line integration with React applications without needing to use webpack's (or any other module bundler's) configuration files`. In that library, there was a utility that cares about the initialization process of monaco and overcomes the additional use of webpack configuration. That utility grows over time and now it's a separate library. Now, you can easily setup monaco into your browser, create your own editors, wrappers for React/Vue/Angular of whatever you want.
12 |
13 | ## How it works
14 |
15 | Monaco editor provides a script called `loader`, which itself provides tooling to download monaco sources. The library, under the hood, handles the configuration and loading part and gives us an easy-to-use API to interact with it
16 |
17 | ## Documentation
18 |
19 | #### Contents
20 |
21 | * [Installation](#installation)
22 | * [Introduction](#introduction)
23 | * [Usage](#usage)
24 | * [.config](#config)
25 | * [.init](#init)
26 | * [Notes](#notes)
27 | * [For `electron` users](#for-electron-users)
28 | * [For `Next.js` users](#for-nextjs-users)
29 |
30 | ### Installation
31 |
32 | ```bash
33 | npm install @monaco-editor/loader
34 | ```
35 |
36 | or
37 |
38 | ```bash
39 | yarn add @monaco-editor/loader
40 | ```
41 |
42 | NOTE: For TypeScript type definitions, this package uses the [monaco-editor](https://www.npmjs.com/package/monaco-editor) package as a peer dependency. So, if you need types and don't already have the [monaco-editor](https://www.npmjs.com/package/monaco-editor) package installed, you will need to do so.
43 |
44 | ### Introduction
45 |
46 | The library exports types and the utility called `loader`, the last one has two methods
47 |
48 | * [.config](#config)
49 | * [.init](#init)
50 |
51 | ### Usage
52 |
53 | ```javascript
54 | import loader from '@monaco-editor/loader';
55 |
56 | loader.init().then(monaco => {
57 | monaco.editor.create(/* editor container, e.g. document.body */, {
58 | value: '// some comment',
59 | language: 'javascript',
60 | });
61 | });
62 | ```
63 |
64 | [codesandbox](https://codesandbox.io/s/simple-usage-os49p)
65 |
66 | #### .config
67 |
68 | By using the `.config` method we can configure the monaco loader. By default all sources come from CDN, you can change that behavior and load them from wherever you want
69 |
70 | ```javascript
71 | import loader from '@monaco-editor/loader';
72 |
73 | // you can change the source of the monaco files
74 | loader.config({ paths: { vs: '...' } });
75 |
76 | // you can configure the locales
77 | loader.config({ 'vs/nls': { availableLanguages: { '*': 'de' } } });
78 |
79 | // or
80 | loader.config({
81 | paths: {
82 | vs: '...',
83 | },
84 | 'vs/nls' : {
85 | availableLanguages: {
86 | '*': 'de',
87 | },
88 | },
89 | });
90 |
91 | loader.init().then(monaco => { /* ... */ });
92 | ```
93 |
94 | [codesandbox](https://codesandbox.io/s/config-o6zn6)
95 |
96 | #### Configure the loader to load the monaco as an npm package
97 |
98 | ```javascript
99 | import loader from '@monaco-editor/loader';
100 | import * as monaco from 'monaco-editor';
101 |
102 | loader.config({ monaco });
103 |
104 | loader.init().then(monacoInstance => { /* ... */ });
105 | ```
106 |
107 | [codesandbox](https://codesandbox.io/s/npm-gswrvh)
108 |
109 | #### .init
110 |
111 | The `.init` method handles the initialization process. It returns the monaco instance, wrapped with cancelable promise
112 |
113 | ```javascript
114 | import loader from '@monaco-editor/loader';
115 |
116 | loader.init().then(monaco => {
117 | console.log('Here is the monaco instance', monaco);
118 | });
119 | ```
120 |
121 | [codesandbox](https://codesandbox.io/s/init-q2ipt)
122 |
123 | ```javascript
124 | import loader from '@monaco-editor/loader';
125 |
126 | const cancelable = loader.init();
127 |
128 | cancelable.then(monaco => {
129 | console.log('You will not see it, as it is canceled');
130 | });
131 |
132 | cancelable.cancel();
133 | ```
134 |
135 | [codesandbox](https://codesandbox.io/s/init-cancelable-9o42y)
136 |
137 | #### Notes
138 |
139 | ##### For `electron` users
140 |
141 | In general it works fine with electron, but there are several cases that developers usually face to and sometimes it can be confusing. Here they are:
142 |
143 | 1) **Download process fails** or if you use @monaco-editor/react **You see loading screen stuck**
144 | Usually, it's because your environment doesn't allow you to load external sources. By default, it loads monaco sources from CDN. You can see the [default configuration](https://github.com/suren-atoyan/monaco-loader/blob/master/src/config/index.js#L3). But sure you can change that behavior; the library is fully configurable. Read about it [here](https://github.com/suren-atoyan/monaco-loader#config). So, if you want to download it from your local files, you can do it like this:
145 |
146 | ```javascript
147 | import loader from '@monaco-editor/loader';
148 |
149 | loader.config({ paths: { vs: '../path-to-monaco' } });
150 | ```
151 |
152 | or, if you want to use it as an npm package, you can do it like this:
153 |
154 | ```javascript
155 | import loader from '@monaco-editor/loader';
156 | import * as monaco from 'monaco-editor';
157 |
158 | loader.config({ monaco });
159 |
160 | loader.init().then(monacoInstance => { /* ... */ });
161 | ```
162 |
163 | 2) **Based on your electron environment it can be required to have an absolute URL**
164 | The utility function taken from [here](https://github.com/microsoft/monaco-editor-samples/blob/master/electron-amd-nodeIntegration/electron-index.html) can help you to achieve that. Let's imagine you have `monaco-editor` package installed and you want to load monaco from the `node_modules` rather than from CDN: in that case, you can write something like this:
165 |
166 | ```javascript
167 | function ensureFirstBackSlash(str) {
168 | return str.length > 0 && str.charAt(0) !== '/'
169 | ? '/' + str
170 | : str;
171 | }
172 |
173 | function uriFromPath(_path) {
174 | const pathName = path.resolve(_path).replace(/\\/g, '/');
175 | return encodeURI('file://' + ensureFirstBackSlash(pathName));
176 | }
177 |
178 | loader.config({
179 | paths: {
180 | vs: uriFromPath(
181 | path.join(__dirname, '../node_modules/monaco-editor/min/vs')
182 | )
183 | }
184 | });
185 | ```
186 |
187 | or, just use it as an npm package.
188 |
189 | There were several issues about this topic that can be helpful too - [1](https://github.com/suren-atoyan/monaco-react/issues/48) [2](https://github.com/suren-atoyan/monaco-react/issues/12) [3](https://github.com/suren-atoyan/monaco-react/issues/58) [4](https://github.com/suren-atoyan/monaco-react/issues/87)
190 |
191 | And if you use `electron` with `monaco` and have faced an issue different than the above-discribed ones, please let us know to make this section more helpful.
192 |
193 | ##### For `Next.js` users
194 |
195 | The part of the source that should be pre-parsed is optimized for server-side rendering, so, in usual cases, it will work fine, but if you want to have access, for example, to [`monacoInstance`](#config) you should be aware that it wants to access the `document` object, and it requires browser environment. Basically you just need to avoid running that part out of browser environment, there are several ways to do that. One of them is described [here](https://nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr).
196 |
197 | And if you use `monaco` with `Next.js` and have faced an issue different than the above-described one, please let us know to make this section more helpful.
198 |
199 | ## License
200 |
201 | [MIT](./LICENSE)
202 |
--------------------------------------------------------------------------------
/playground/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "monaco-loader",
3 | "version": "0.0.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "monaco-loader",
9 | "version": "0.0.1",
10 | "dependencies": {
11 | "monaco-editor": "^0.52.0"
12 | },
13 | "devDependencies": {
14 | "vite": "^6.0.0"
15 | }
16 | },
17 | "node_modules/@esbuild/aix-ppc64": {
18 | "version": "0.25.10",
19 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
20 | "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==",
21 | "cpu": [
22 | "ppc64"
23 | ],
24 | "dev": true,
25 | "license": "MIT",
26 | "optional": true,
27 | "os": [
28 | "aix"
29 | ],
30 | "engines": {
31 | "node": ">=18"
32 | }
33 | },
34 | "node_modules/@esbuild/android-arm": {
35 | "version": "0.25.10",
36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz",
37 | "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==",
38 | "cpu": [
39 | "arm"
40 | ],
41 | "dev": true,
42 | "license": "MIT",
43 | "optional": true,
44 | "os": [
45 | "android"
46 | ],
47 | "engines": {
48 | "node": ">=18"
49 | }
50 | },
51 | "node_modules/@esbuild/android-arm64": {
52 | "version": "0.25.10",
53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz",
54 | "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==",
55 | "cpu": [
56 | "arm64"
57 | ],
58 | "dev": true,
59 | "license": "MIT",
60 | "optional": true,
61 | "os": [
62 | "android"
63 | ],
64 | "engines": {
65 | "node": ">=18"
66 | }
67 | },
68 | "node_modules/@esbuild/android-x64": {
69 | "version": "0.25.10",
70 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz",
71 | "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==",
72 | "cpu": [
73 | "x64"
74 | ],
75 | "dev": true,
76 | "license": "MIT",
77 | "optional": true,
78 | "os": [
79 | "android"
80 | ],
81 | "engines": {
82 | "node": ">=18"
83 | }
84 | },
85 | "node_modules/@esbuild/darwin-arm64": {
86 | "version": "0.25.10",
87 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz",
88 | "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==",
89 | "cpu": [
90 | "arm64"
91 | ],
92 | "dev": true,
93 | "license": "MIT",
94 | "optional": true,
95 | "os": [
96 | "darwin"
97 | ],
98 | "engines": {
99 | "node": ">=18"
100 | }
101 | },
102 | "node_modules/@esbuild/darwin-x64": {
103 | "version": "0.25.10",
104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz",
105 | "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==",
106 | "cpu": [
107 | "x64"
108 | ],
109 | "dev": true,
110 | "license": "MIT",
111 | "optional": true,
112 | "os": [
113 | "darwin"
114 | ],
115 | "engines": {
116 | "node": ">=18"
117 | }
118 | },
119 | "node_modules/@esbuild/freebsd-arm64": {
120 | "version": "0.25.10",
121 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz",
122 | "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==",
123 | "cpu": [
124 | "arm64"
125 | ],
126 | "dev": true,
127 | "license": "MIT",
128 | "optional": true,
129 | "os": [
130 | "freebsd"
131 | ],
132 | "engines": {
133 | "node": ">=18"
134 | }
135 | },
136 | "node_modules/@esbuild/freebsd-x64": {
137 | "version": "0.25.10",
138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz",
139 | "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==",
140 | "cpu": [
141 | "x64"
142 | ],
143 | "dev": true,
144 | "license": "MIT",
145 | "optional": true,
146 | "os": [
147 | "freebsd"
148 | ],
149 | "engines": {
150 | "node": ">=18"
151 | }
152 | },
153 | "node_modules/@esbuild/linux-arm": {
154 | "version": "0.25.10",
155 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz",
156 | "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==",
157 | "cpu": [
158 | "arm"
159 | ],
160 | "dev": true,
161 | "license": "MIT",
162 | "optional": true,
163 | "os": [
164 | "linux"
165 | ],
166 | "engines": {
167 | "node": ">=18"
168 | }
169 | },
170 | "node_modules/@esbuild/linux-arm64": {
171 | "version": "0.25.10",
172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz",
173 | "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==",
174 | "cpu": [
175 | "arm64"
176 | ],
177 | "dev": true,
178 | "license": "MIT",
179 | "optional": true,
180 | "os": [
181 | "linux"
182 | ],
183 | "engines": {
184 | "node": ">=18"
185 | }
186 | },
187 | "node_modules/@esbuild/linux-ia32": {
188 | "version": "0.25.10",
189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz",
190 | "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==",
191 | "cpu": [
192 | "ia32"
193 | ],
194 | "dev": true,
195 | "license": "MIT",
196 | "optional": true,
197 | "os": [
198 | "linux"
199 | ],
200 | "engines": {
201 | "node": ">=18"
202 | }
203 | },
204 | "node_modules/@esbuild/linux-loong64": {
205 | "version": "0.25.10",
206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz",
207 | "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==",
208 | "cpu": [
209 | "loong64"
210 | ],
211 | "dev": true,
212 | "license": "MIT",
213 | "optional": true,
214 | "os": [
215 | "linux"
216 | ],
217 | "engines": {
218 | "node": ">=18"
219 | }
220 | },
221 | "node_modules/@esbuild/linux-mips64el": {
222 | "version": "0.25.10",
223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz",
224 | "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==",
225 | "cpu": [
226 | "mips64el"
227 | ],
228 | "dev": true,
229 | "license": "MIT",
230 | "optional": true,
231 | "os": [
232 | "linux"
233 | ],
234 | "engines": {
235 | "node": ">=18"
236 | }
237 | },
238 | "node_modules/@esbuild/linux-ppc64": {
239 | "version": "0.25.10",
240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz",
241 | "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==",
242 | "cpu": [
243 | "ppc64"
244 | ],
245 | "dev": true,
246 | "license": "MIT",
247 | "optional": true,
248 | "os": [
249 | "linux"
250 | ],
251 | "engines": {
252 | "node": ">=18"
253 | }
254 | },
255 | "node_modules/@esbuild/linux-riscv64": {
256 | "version": "0.25.10",
257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz",
258 | "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==",
259 | "cpu": [
260 | "riscv64"
261 | ],
262 | "dev": true,
263 | "license": "MIT",
264 | "optional": true,
265 | "os": [
266 | "linux"
267 | ],
268 | "engines": {
269 | "node": ">=18"
270 | }
271 | },
272 | "node_modules/@esbuild/linux-s390x": {
273 | "version": "0.25.10",
274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz",
275 | "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==",
276 | "cpu": [
277 | "s390x"
278 | ],
279 | "dev": true,
280 | "license": "MIT",
281 | "optional": true,
282 | "os": [
283 | "linux"
284 | ],
285 | "engines": {
286 | "node": ">=18"
287 | }
288 | },
289 | "node_modules/@esbuild/linux-x64": {
290 | "version": "0.25.10",
291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz",
292 | "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==",
293 | "cpu": [
294 | "x64"
295 | ],
296 | "dev": true,
297 | "license": "MIT",
298 | "optional": true,
299 | "os": [
300 | "linux"
301 | ],
302 | "engines": {
303 | "node": ">=18"
304 | }
305 | },
306 | "node_modules/@esbuild/netbsd-arm64": {
307 | "version": "0.25.10",
308 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz",
309 | "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==",
310 | "cpu": [
311 | "arm64"
312 | ],
313 | "dev": true,
314 | "license": "MIT",
315 | "optional": true,
316 | "os": [
317 | "netbsd"
318 | ],
319 | "engines": {
320 | "node": ">=18"
321 | }
322 | },
323 | "node_modules/@esbuild/netbsd-x64": {
324 | "version": "0.25.10",
325 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz",
326 | "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==",
327 | "cpu": [
328 | "x64"
329 | ],
330 | "dev": true,
331 | "license": "MIT",
332 | "optional": true,
333 | "os": [
334 | "netbsd"
335 | ],
336 | "engines": {
337 | "node": ">=18"
338 | }
339 | },
340 | "node_modules/@esbuild/openbsd-arm64": {
341 | "version": "0.25.10",
342 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz",
343 | "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==",
344 | "cpu": [
345 | "arm64"
346 | ],
347 | "dev": true,
348 | "license": "MIT",
349 | "optional": true,
350 | "os": [
351 | "openbsd"
352 | ],
353 | "engines": {
354 | "node": ">=18"
355 | }
356 | },
357 | "node_modules/@esbuild/openbsd-x64": {
358 | "version": "0.25.10",
359 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz",
360 | "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==",
361 | "cpu": [
362 | "x64"
363 | ],
364 | "dev": true,
365 | "license": "MIT",
366 | "optional": true,
367 | "os": [
368 | "openbsd"
369 | ],
370 | "engines": {
371 | "node": ">=18"
372 | }
373 | },
374 | "node_modules/@esbuild/openharmony-arm64": {
375 | "version": "0.25.10",
376 | "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz",
377 | "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==",
378 | "cpu": [
379 | "arm64"
380 | ],
381 | "dev": true,
382 | "license": "MIT",
383 | "optional": true,
384 | "os": [
385 | "openharmony"
386 | ],
387 | "engines": {
388 | "node": ">=18"
389 | }
390 | },
391 | "node_modules/@esbuild/sunos-x64": {
392 | "version": "0.25.10",
393 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz",
394 | "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==",
395 | "cpu": [
396 | "x64"
397 | ],
398 | "dev": true,
399 | "license": "MIT",
400 | "optional": true,
401 | "os": [
402 | "sunos"
403 | ],
404 | "engines": {
405 | "node": ">=18"
406 | }
407 | },
408 | "node_modules/@esbuild/win32-arm64": {
409 | "version": "0.25.10",
410 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz",
411 | "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==",
412 | "cpu": [
413 | "arm64"
414 | ],
415 | "dev": true,
416 | "license": "MIT",
417 | "optional": true,
418 | "os": [
419 | "win32"
420 | ],
421 | "engines": {
422 | "node": ">=18"
423 | }
424 | },
425 | "node_modules/@esbuild/win32-ia32": {
426 | "version": "0.25.10",
427 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz",
428 | "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==",
429 | "cpu": [
430 | "ia32"
431 | ],
432 | "dev": true,
433 | "license": "MIT",
434 | "optional": true,
435 | "os": [
436 | "win32"
437 | ],
438 | "engines": {
439 | "node": ">=18"
440 | }
441 | },
442 | "node_modules/@esbuild/win32-x64": {
443 | "version": "0.25.10",
444 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz",
445 | "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==",
446 | "cpu": [
447 | "x64"
448 | ],
449 | "dev": true,
450 | "license": "MIT",
451 | "optional": true,
452 | "os": [
453 | "win32"
454 | ],
455 | "engines": {
456 | "node": ">=18"
457 | }
458 | },
459 | "node_modules/@rollup/rollup-android-arm-eabi": {
460 | "version": "4.52.4",
461 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz",
462 | "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==",
463 | "cpu": [
464 | "arm"
465 | ],
466 | "dev": true,
467 | "license": "MIT",
468 | "optional": true,
469 | "os": [
470 | "android"
471 | ]
472 | },
473 | "node_modules/@rollup/rollup-android-arm64": {
474 | "version": "4.52.4",
475 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz",
476 | "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==",
477 | "cpu": [
478 | "arm64"
479 | ],
480 | "dev": true,
481 | "license": "MIT",
482 | "optional": true,
483 | "os": [
484 | "android"
485 | ]
486 | },
487 | "node_modules/@rollup/rollup-darwin-arm64": {
488 | "version": "4.52.4",
489 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz",
490 | "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==",
491 | "cpu": [
492 | "arm64"
493 | ],
494 | "dev": true,
495 | "license": "MIT",
496 | "optional": true,
497 | "os": [
498 | "darwin"
499 | ]
500 | },
501 | "node_modules/@rollup/rollup-darwin-x64": {
502 | "version": "4.52.4",
503 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz",
504 | "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==",
505 | "cpu": [
506 | "x64"
507 | ],
508 | "dev": true,
509 | "license": "MIT",
510 | "optional": true,
511 | "os": [
512 | "darwin"
513 | ]
514 | },
515 | "node_modules/@rollup/rollup-freebsd-arm64": {
516 | "version": "4.52.4",
517 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz",
518 | "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==",
519 | "cpu": [
520 | "arm64"
521 | ],
522 | "dev": true,
523 | "license": "MIT",
524 | "optional": true,
525 | "os": [
526 | "freebsd"
527 | ]
528 | },
529 | "node_modules/@rollup/rollup-freebsd-x64": {
530 | "version": "4.52.4",
531 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz",
532 | "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==",
533 | "cpu": [
534 | "x64"
535 | ],
536 | "dev": true,
537 | "license": "MIT",
538 | "optional": true,
539 | "os": [
540 | "freebsd"
541 | ]
542 | },
543 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
544 | "version": "4.52.4",
545 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz",
546 | "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==",
547 | "cpu": [
548 | "arm"
549 | ],
550 | "dev": true,
551 | "license": "MIT",
552 | "optional": true,
553 | "os": [
554 | "linux"
555 | ]
556 | },
557 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
558 | "version": "4.52.4",
559 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz",
560 | "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==",
561 | "cpu": [
562 | "arm"
563 | ],
564 | "dev": true,
565 | "license": "MIT",
566 | "optional": true,
567 | "os": [
568 | "linux"
569 | ]
570 | },
571 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
572 | "version": "4.52.4",
573 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz",
574 | "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==",
575 | "cpu": [
576 | "arm64"
577 | ],
578 | "dev": true,
579 | "license": "MIT",
580 | "optional": true,
581 | "os": [
582 | "linux"
583 | ]
584 | },
585 | "node_modules/@rollup/rollup-linux-arm64-musl": {
586 | "version": "4.52.4",
587 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz",
588 | "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==",
589 | "cpu": [
590 | "arm64"
591 | ],
592 | "dev": true,
593 | "license": "MIT",
594 | "optional": true,
595 | "os": [
596 | "linux"
597 | ]
598 | },
599 | "node_modules/@rollup/rollup-linux-loong64-gnu": {
600 | "version": "4.52.4",
601 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz",
602 | "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==",
603 | "cpu": [
604 | "loong64"
605 | ],
606 | "dev": true,
607 | "license": "MIT",
608 | "optional": true,
609 | "os": [
610 | "linux"
611 | ]
612 | },
613 | "node_modules/@rollup/rollup-linux-ppc64-gnu": {
614 | "version": "4.52.4",
615 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz",
616 | "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==",
617 | "cpu": [
618 | "ppc64"
619 | ],
620 | "dev": true,
621 | "license": "MIT",
622 | "optional": true,
623 | "os": [
624 | "linux"
625 | ]
626 | },
627 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
628 | "version": "4.52.4",
629 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz",
630 | "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==",
631 | "cpu": [
632 | "riscv64"
633 | ],
634 | "dev": true,
635 | "license": "MIT",
636 | "optional": true,
637 | "os": [
638 | "linux"
639 | ]
640 | },
641 | "node_modules/@rollup/rollup-linux-riscv64-musl": {
642 | "version": "4.52.4",
643 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz",
644 | "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==",
645 | "cpu": [
646 | "riscv64"
647 | ],
648 | "dev": true,
649 | "license": "MIT",
650 | "optional": true,
651 | "os": [
652 | "linux"
653 | ]
654 | },
655 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
656 | "version": "4.52.4",
657 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz",
658 | "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==",
659 | "cpu": [
660 | "s390x"
661 | ],
662 | "dev": true,
663 | "license": "MIT",
664 | "optional": true,
665 | "os": [
666 | "linux"
667 | ]
668 | },
669 | "node_modules/@rollup/rollup-linux-x64-gnu": {
670 | "version": "4.52.4",
671 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz",
672 | "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==",
673 | "cpu": [
674 | "x64"
675 | ],
676 | "dev": true,
677 | "license": "MIT",
678 | "optional": true,
679 | "os": [
680 | "linux"
681 | ]
682 | },
683 | "node_modules/@rollup/rollup-linux-x64-musl": {
684 | "version": "4.52.4",
685 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz",
686 | "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==",
687 | "cpu": [
688 | "x64"
689 | ],
690 | "dev": true,
691 | "license": "MIT",
692 | "optional": true,
693 | "os": [
694 | "linux"
695 | ]
696 | },
697 | "node_modules/@rollup/rollup-openharmony-arm64": {
698 | "version": "4.52.4",
699 | "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz",
700 | "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==",
701 | "cpu": [
702 | "arm64"
703 | ],
704 | "dev": true,
705 | "license": "MIT",
706 | "optional": true,
707 | "os": [
708 | "openharmony"
709 | ]
710 | },
711 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
712 | "version": "4.52.4",
713 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz",
714 | "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==",
715 | "cpu": [
716 | "arm64"
717 | ],
718 | "dev": true,
719 | "license": "MIT",
720 | "optional": true,
721 | "os": [
722 | "win32"
723 | ]
724 | },
725 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
726 | "version": "4.52.4",
727 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz",
728 | "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==",
729 | "cpu": [
730 | "ia32"
731 | ],
732 | "dev": true,
733 | "license": "MIT",
734 | "optional": true,
735 | "os": [
736 | "win32"
737 | ]
738 | },
739 | "node_modules/@rollup/rollup-win32-x64-gnu": {
740 | "version": "4.52.4",
741 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz",
742 | "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==",
743 | "cpu": [
744 | "x64"
745 | ],
746 | "dev": true,
747 | "license": "MIT",
748 | "optional": true,
749 | "os": [
750 | "win32"
751 | ]
752 | },
753 | "node_modules/@rollup/rollup-win32-x64-msvc": {
754 | "version": "4.52.4",
755 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz",
756 | "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==",
757 | "cpu": [
758 | "x64"
759 | ],
760 | "dev": true,
761 | "license": "MIT",
762 | "optional": true,
763 | "os": [
764 | "win32"
765 | ]
766 | },
767 | "node_modules/@types/estree": {
768 | "version": "1.0.8",
769 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
770 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
771 | "dev": true,
772 | "license": "MIT"
773 | },
774 | "node_modules/esbuild": {
775 | "version": "0.25.10",
776 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz",
777 | "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==",
778 | "dev": true,
779 | "hasInstallScript": true,
780 | "license": "MIT",
781 | "bin": {
782 | "esbuild": "bin/esbuild"
783 | },
784 | "engines": {
785 | "node": ">=18"
786 | },
787 | "optionalDependencies": {
788 | "@esbuild/aix-ppc64": "0.25.10",
789 | "@esbuild/android-arm": "0.25.10",
790 | "@esbuild/android-arm64": "0.25.10",
791 | "@esbuild/android-x64": "0.25.10",
792 | "@esbuild/darwin-arm64": "0.25.10",
793 | "@esbuild/darwin-x64": "0.25.10",
794 | "@esbuild/freebsd-arm64": "0.25.10",
795 | "@esbuild/freebsd-x64": "0.25.10",
796 | "@esbuild/linux-arm": "0.25.10",
797 | "@esbuild/linux-arm64": "0.25.10",
798 | "@esbuild/linux-ia32": "0.25.10",
799 | "@esbuild/linux-loong64": "0.25.10",
800 | "@esbuild/linux-mips64el": "0.25.10",
801 | "@esbuild/linux-ppc64": "0.25.10",
802 | "@esbuild/linux-riscv64": "0.25.10",
803 | "@esbuild/linux-s390x": "0.25.10",
804 | "@esbuild/linux-x64": "0.25.10",
805 | "@esbuild/netbsd-arm64": "0.25.10",
806 | "@esbuild/netbsd-x64": "0.25.10",
807 | "@esbuild/openbsd-arm64": "0.25.10",
808 | "@esbuild/openbsd-x64": "0.25.10",
809 | "@esbuild/openharmony-arm64": "0.25.10",
810 | "@esbuild/sunos-x64": "0.25.10",
811 | "@esbuild/win32-arm64": "0.25.10",
812 | "@esbuild/win32-ia32": "0.25.10",
813 | "@esbuild/win32-x64": "0.25.10"
814 | }
815 | },
816 | "node_modules/fdir": {
817 | "version": "6.5.0",
818 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
819 | "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
820 | "dev": true,
821 | "license": "MIT",
822 | "engines": {
823 | "node": ">=12.0.0"
824 | },
825 | "peerDependencies": {
826 | "picomatch": "^3 || ^4"
827 | },
828 | "peerDependenciesMeta": {
829 | "picomatch": {
830 | "optional": true
831 | }
832 | }
833 | },
834 | "node_modules/fsevents": {
835 | "version": "2.3.3",
836 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
837 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
838 | "dev": true,
839 | "hasInstallScript": true,
840 | "license": "MIT",
841 | "optional": true,
842 | "os": [
843 | "darwin"
844 | ],
845 | "engines": {
846 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
847 | }
848 | },
849 | "node_modules/monaco-editor": {
850 | "version": "0.52.2",
851 | "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz",
852 | "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==",
853 | "license": "MIT"
854 | },
855 | "node_modules/nanoid": {
856 | "version": "3.3.11",
857 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
858 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
859 | "dev": true,
860 | "funding": [
861 | {
862 | "type": "github",
863 | "url": "https://github.com/sponsors/ai"
864 | }
865 | ],
866 | "license": "MIT",
867 | "bin": {
868 | "nanoid": "bin/nanoid.cjs"
869 | },
870 | "engines": {
871 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
872 | }
873 | },
874 | "node_modules/picocolors": {
875 | "version": "1.1.1",
876 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
877 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
878 | "dev": true,
879 | "license": "ISC"
880 | },
881 | "node_modules/picomatch": {
882 | "version": "4.0.3",
883 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
884 | "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
885 | "dev": true,
886 | "license": "MIT",
887 | "engines": {
888 | "node": ">=12"
889 | },
890 | "funding": {
891 | "url": "https://github.com/sponsors/jonschlinkert"
892 | }
893 | },
894 | "node_modules/postcss": {
895 | "version": "8.5.6",
896 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
897 | "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
898 | "dev": true,
899 | "funding": [
900 | {
901 | "type": "opencollective",
902 | "url": "https://opencollective.com/postcss/"
903 | },
904 | {
905 | "type": "tidelift",
906 | "url": "https://tidelift.com/funding/github/npm/postcss"
907 | },
908 | {
909 | "type": "github",
910 | "url": "https://github.com/sponsors/ai"
911 | }
912 | ],
913 | "license": "MIT",
914 | "dependencies": {
915 | "nanoid": "^3.3.11",
916 | "picocolors": "^1.1.1",
917 | "source-map-js": "^1.2.1"
918 | },
919 | "engines": {
920 | "node": "^10 || ^12 || >=14"
921 | }
922 | },
923 | "node_modules/rollup": {
924 | "version": "4.52.4",
925 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz",
926 | "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==",
927 | "dev": true,
928 | "license": "MIT",
929 | "dependencies": {
930 | "@types/estree": "1.0.8"
931 | },
932 | "bin": {
933 | "rollup": "dist/bin/rollup"
934 | },
935 | "engines": {
936 | "node": ">=18.0.0",
937 | "npm": ">=8.0.0"
938 | },
939 | "optionalDependencies": {
940 | "@rollup/rollup-android-arm-eabi": "4.52.4",
941 | "@rollup/rollup-android-arm64": "4.52.4",
942 | "@rollup/rollup-darwin-arm64": "4.52.4",
943 | "@rollup/rollup-darwin-x64": "4.52.4",
944 | "@rollup/rollup-freebsd-arm64": "4.52.4",
945 | "@rollup/rollup-freebsd-x64": "4.52.4",
946 | "@rollup/rollup-linux-arm-gnueabihf": "4.52.4",
947 | "@rollup/rollup-linux-arm-musleabihf": "4.52.4",
948 | "@rollup/rollup-linux-arm64-gnu": "4.52.4",
949 | "@rollup/rollup-linux-arm64-musl": "4.52.4",
950 | "@rollup/rollup-linux-loong64-gnu": "4.52.4",
951 | "@rollup/rollup-linux-ppc64-gnu": "4.52.4",
952 | "@rollup/rollup-linux-riscv64-gnu": "4.52.4",
953 | "@rollup/rollup-linux-riscv64-musl": "4.52.4",
954 | "@rollup/rollup-linux-s390x-gnu": "4.52.4",
955 | "@rollup/rollup-linux-x64-gnu": "4.52.4",
956 | "@rollup/rollup-linux-x64-musl": "4.52.4",
957 | "@rollup/rollup-openharmony-arm64": "4.52.4",
958 | "@rollup/rollup-win32-arm64-msvc": "4.52.4",
959 | "@rollup/rollup-win32-ia32-msvc": "4.52.4",
960 | "@rollup/rollup-win32-x64-gnu": "4.52.4",
961 | "@rollup/rollup-win32-x64-msvc": "4.52.4",
962 | "fsevents": "~2.3.2"
963 | }
964 | },
965 | "node_modules/source-map-js": {
966 | "version": "1.2.1",
967 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
968 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
969 | "dev": true,
970 | "license": "BSD-3-Clause",
971 | "engines": {
972 | "node": ">=0.10.0"
973 | }
974 | },
975 | "node_modules/tinyglobby": {
976 | "version": "0.2.15",
977 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
978 | "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
979 | "dev": true,
980 | "license": "MIT",
981 | "dependencies": {
982 | "fdir": "^6.5.0",
983 | "picomatch": "^4.0.3"
984 | },
985 | "engines": {
986 | "node": ">=12.0.0"
987 | },
988 | "funding": {
989 | "url": "https://github.com/sponsors/SuperchupuDev"
990 | }
991 | },
992 | "node_modules/vite": {
993 | "version": "6.3.6",
994 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz",
995 | "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==",
996 | "dev": true,
997 | "license": "MIT",
998 | "dependencies": {
999 | "esbuild": "^0.25.0",
1000 | "fdir": "^6.4.4",
1001 | "picomatch": "^4.0.2",
1002 | "postcss": "^8.5.3",
1003 | "rollup": "^4.34.9",
1004 | "tinyglobby": "^0.2.13"
1005 | },
1006 | "bin": {
1007 | "vite": "bin/vite.js"
1008 | },
1009 | "engines": {
1010 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
1011 | },
1012 | "funding": {
1013 | "url": "https://github.com/vitejs/vite?sponsor=1"
1014 | },
1015 | "optionalDependencies": {
1016 | "fsevents": "~2.3.3"
1017 | },
1018 | "peerDependencies": {
1019 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
1020 | "jiti": ">=1.21.0",
1021 | "less": "*",
1022 | "lightningcss": "^1.21.0",
1023 | "sass": "*",
1024 | "sass-embedded": "*",
1025 | "stylus": "*",
1026 | "sugarss": "*",
1027 | "terser": "^5.16.0",
1028 | "tsx": "^4.8.1",
1029 | "yaml": "^2.4.2"
1030 | },
1031 | "peerDependenciesMeta": {
1032 | "@types/node": {
1033 | "optional": true
1034 | },
1035 | "jiti": {
1036 | "optional": true
1037 | },
1038 | "less": {
1039 | "optional": true
1040 | },
1041 | "lightningcss": {
1042 | "optional": true
1043 | },
1044 | "sass": {
1045 | "optional": true
1046 | },
1047 | "sass-embedded": {
1048 | "optional": true
1049 | },
1050 | "stylus": {
1051 | "optional": true
1052 | },
1053 | "sugarss": {
1054 | "optional": true
1055 | },
1056 | "terser": {
1057 | "optional": true
1058 | },
1059 | "tsx": {
1060 | "optional": true
1061 | },
1062 | "yaml": {
1063 | "optional": true
1064 | }
1065 | }
1066 | }
1067 | }
1068 | }
1069 |
--------------------------------------------------------------------------------