├── .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 · [![monthly downloads](https://img.shields.io/npm/dm/@monaco-editor/loader)](https://www.npmjs.com/package/@monaco-editor/loader) [![gitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/suren-atoyan/monaco-loader/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/@monaco-editor/loader.svg?style=flat)](https://www.npmjs.com/package/@monaco-editor/loader) [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](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 | --------------------------------------------------------------------------------