{"id":30111595,"url":"https://github.com/esm-dev/modern-monaco","last_synced_at":"2026-05-07T03:03:43.496Z","repository":{"id":307836882,"uuid":"754678541","full_name":"esm-dev/modern-monaco","owner":"esm-dev","description":"A modern version of Monaco Editor.","archived":false,"fork":false,"pushed_at":"2026-03-01T13:19:28.000Z","size":845,"stargazers_count":1535,"open_issues_count":21,"forks_count":34,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-03-01T14:58:27.988Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/esm-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-08T15:02:38.000Z","updated_at":"2026-03-01T14:22:07.000Z","dependencies_parsed_at":"2025-08-02T15:16:22.119Z","dependency_job_id":"010ee719-85ee-4542-ac1b-f526acd200fe","html_url":"https://github.com/esm-dev/modern-monaco","commit_stats":null,"previous_names":["esm-dev/modern-monaco"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/esm-dev/modern-monaco","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esm-dev%2Fmodern-monaco","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esm-dev%2Fmodern-monaco/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esm-dev%2Fmodern-monaco/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esm-dev%2Fmodern-monaco/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/esm-dev","download_url":"https://codeload.github.com/esm-dev/modern-monaco/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esm-dev%2Fmodern-monaco/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29993650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-10T06:02:03.880Z","updated_at":"2026-05-07T03:03:43.489Z","avatar_url":"https://github.com/esm-dev.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003e [!WARNING]\n\u003e **This project is currently under active development. The API may change at any time. Use at your own risk.**\n\u003e Please report any issues or feature requests on the [issues](https://github.com/esm-dev/modern-monaco/issues) page.\n\n# Modern Monaco\n\nMeet the modern version of [Monaco Editor](https://www.npmjs.com/package/monaco-editor):\n\n- Easy to use, no `MonacoEnvironment` setup, web workers, or CSS loaders required.\n- Uses [Shiki](https://shiki.style) for syntax highlighting with extensive grammars and themes.\n- Lazy loading: pre-highlight code with Shiki while loading `monaco-editor-core` in the background.\n- Supports server-side rendering (SSR).\n- Workspace features (edit history, file system provider, persist protocol, etc.).\n- Automatically loads `.d.ts` files from [esm.sh](https://esm.sh) CDN for type checking.\n- Uses [import maps](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap) for resolving **bare specifier** imports in JavaScript/TypeScript.\n- VSCode `window` APIs like `showInputBox`, `showQuickPick`, etc.\n- Embedded languages (importmap/CSS/JavaScript) in HTML.\n- Inline `html` and `css` in JavaScript/TypeScript.\n- Auto-closing HTML/JSX tags.\n\n## Installation\n\nYou can install modern-monaco from NPM:\n\n```bash\nnpm i modern-monaco\n```\n\nOr import it from [esm.sh](https://esm.sh/) CDN in the browser without a build step:\n\n```js\nimport * from \"https://esm.sh/modern-monaco\"\n```\n\n## Usage\n\nmodern-monaco provides three modes to create a browser-based code editor:\n\n- **Lazy**: pre-highlight code with Shiki while loading the `editor-core.js` in the background.\n- **SSR**: render a mock editor on the server side and hydrates it on the client side.\n- **Manual**: create a Monaco editor instance manually.\n\n### Lazy Mode\n\n[monaco-editor](https://www.npmjs.com/package/monaco-editor) is a large package with additional CSS/Worker modules that requires `MonacoEnvironment` setup for language service support. modern-monaco provides a simple yet smart way to load editor modules on demand.\n\nBy pre-highlighting code with Shiki while loading editor modules in the background, modern-monaco can significantly reduce loading screen time.\n\nTo create a Monaco editor lazily, you need to add a `\u003cmonaco-editor\u003e` custom element in the HTML of your app, then call the `lazy` function provided by modern-monaco. You may also need a `Workspace` object to manage editor models without calling the native Monaco APIs.\n\n```html\n\u003c!-- index.html --\u003e\n\u003cmonaco-editor\u003e\u003c/monaco-editor\u003e\n\u003cscript src=\"app.js\" type=\"module\"\u003e\u003c/script\u003e\n```\n\n```js\n// app.js\nimport { lazy, Workspace } from \"modern-monaco\";\n\n// create a workspace with initial files\nconst workspace = new Workspace({\n  initialFiles: {\n    \"index.html\": `\u003chtml\u003e\u003cbody\u003e...\u003c/body\u003e\u003c/html\u003e`,\n    \"main.js\": `console.log(\"Hello, world!\")`,\n  },\n  entryFile: \"index.html\",\n});\n\n// initialize the editor lazily\nlazy({ workspace });\n\n// write a file and open it in the editor\nawait workspace.fs.writeFile(\"util.js\", \"export function add(a, b) { return a + b; }\");\nworkspace.openTextDocument(\"util.js\");\n```\n\n### SSR Mode\n\nSSR mode returns an instant pre-rendered editor on the server side and hydrates it on the client side.\n\n```js\nimport { renderToWebComponent } from \"modern-monaco/ssr\";\n\nexport default {\n  async fetch(req) {\n    const editorHTML = await renderToWebComponent(\n      `console.log(\"Hello, world!\")`,\n      {\n        language: \"javascript\",\n        theme: \"vitesse-dark\",\n        userAgent: req.headers.get(\"user-agent\"), // detect default font for different platforms\n      },\n    );\n    return new Response(\n      /* html */ `\n        ${editorHTML}\n        \u003cscript type=\"module\"\u003e\n          import { hydrate } from \"https://esm.sh/modern-monaco\";\n          // hydrate the editor\n          hydrate();\n        \u003c/script\u003e\n      `,\n      { headers: { \"Content-Type\": \"text/html\" } },\n    );\n  },\n};\n```\n\nSSR Demo: https://modern-monaco-demo.vercel.app ([Source](https://github.com/pi0/modern-monaco-demo) by [@pi0](https://github.com/pi0))\n\n### Manual Mode\n\nYou can also create a [Monaco editor](https://microsoft.github.io/monaco-editor/docs.html) instance manually. It loads themes and language grammars automatically.\n\n```html\n\u003cdiv id=\"editor\"\u003e\u003c/div\u003e\n\n\u003cscript type=\"module\"\u003e\n  import { init } from \"modern-monaco\";\n\n  // load monaco-editor-core.js\n  const monaco = await init();\n\n  // create a Monaco editor instance\n  const editor = monaco.editor.create(document.getElementById(\"editor\"));\n\n  // create and attach a model to the editor\n  editor.setModel(monaco.editor.createModel(`console.log(\"Hello, world!\")`, \"javascript\"));\n\u003c/script\u003e\n```\n\n## Using Workspace\n\nmodern-monaco provides VSCode-like workspace features, such as edit history, file system provider, and more.\n\n```js\nimport { lazy, Workspace } from \"modern-monaco\";\n\n// create a workspace with initial files\nconst workspace = new Workspace({\n  /** The name of the workspace, used for project isolation. Default is \"default\". */\n  name: \"project-name\",\n  /** Initial files in the workspace. */\n  initialFiles: {\n    \"index.html\": `\u003chtml\u003e\u003chead\u003e\u003ctitle\u003eHello, world!\u003c/title\u003e\u003c/head\u003e\u003cbody\u003e\u003cscript src=\"main.js\"\u003e\u003c/script\u003e\u003c/body\u003e\u003c/html\u003e`,\n    \"main.js\": `console.log(\"Hello, world!\")`,\n  },\n  /** File to open when the editor is loaded for the first time. */\n  entryFile: \"index.html\",\n});\n\n// use the workspace in lazy mode\nlazy({ workspace });\n\n// open a file in the workspace\nworkspace.openTextDocument(\"main.js\");\n```\n\n### Custom Workspace FileSystem\n\nBy default, modern-monaco uses `IndexedDB` as the workspace filesystem to persist the editor changes. With a custom filesystem, you can implement your own persistence logic.\n\n```ts\nimport { type FileSystem, lazy, Workspace } from \"modern-monaco\";\n\nclass CustomFileSystem implements FileSystem {\n  // Custom FileSystem implementation\n}\n\nconst workspace = new Workspace({\n  initialFiles: {\n    \"index.html\": indexHtml,\n    \"app.tsx\": appTsx,\n  },\n  customFS: new CustomFileSystem(),\n});\n\nlazy({ workspace });\n```\n\nPlease refer to the [FileSystem](./types/workspace.d.ts#L54) interface for more details.\n\n## Editor Theme \u0026 Language Grammars\n\nmodern-monaco uses [Shiki](https://shiki.style) for syntax highlighting with extensive grammars and themes. By default, it loads themes and grammars from esm.sh on demand.\n\n### Setting the Editor Theme\n\nTo set the editor theme, you can add a `theme` attribute to the `\u003cmonaco-editor\u003e` element.\n\n```html\n\u003cmonaco-editor theme=\"vitesse-dark\"\u003e\u003c/monaco-editor\u003e\n```\n\nOr add a `defaultTheme` option to the `lazy`, `init`, or `hydrate` function.\n\n```js\nlazy({\n  defaultTheme: \"one-dark-pro\",\n});\n```\n\n\u003e [!Note]\n\u003e The theme ID should be one of the [Shiki Themes](https://shiki.style/themes).\n\nYou can also load multiple themes by passing an array of theme inputs to the `themes` option.\n\n```js\nconst monaco = await init({\n  themes: [\n    \"one-light\",\n    \"one-dark-pro\",\n  ],\n});\n\nmonaco.editor.create(document.getElementById(\"editor\"), {\n  theme: \"one-light\",\n});\n// update the editor theme\nmonaco.editor.setTheme(\"one-dark-pro\");\n```\n\nmodern-monaco loads the theme data from the CDN when a theme ID is provided. You can also load a theme from a JSON file:\n\n```js\nimport OneDarkPro from \"tm-themes/themes/one-dark-pro.json\" with { type: \"json\" };\n\nlazy({\n  themes: [\n    // load language grammars from CDN, these language ids must be defined in the `tm-grammars` package\n    \"one-light\",\n\n    // import theme from `tm-themes` package without extra HTTP requests, but increases the bundle size\n    OneDarkPro,\n\n    // load theme from a URL\n    \"https://example.com/themes/mytheme.json\",\n\n    // load theme from an asset file\n    \"/assets/mytheme.json\",\n\n    // dynamically import\n    () =\u003e import(\"tm-themes/one-light.json\", { with: { type: \"json\" } }),\n\n    // hand-crafted theme\n    {\n      name: \"mytheme\",\n      base: \"vs-dark\",\n      colors: {/* ... */},\n      tokenColors: [/* ... */],\n    },\n  ],\n});\n```\n\n### Pre-loading Language Grammars\n\nBy default, modern-monaco loads language grammars when a specific language mode is attached to the editor. You can also pre-load language grammars by adding the `langs` option to the `lazy`, `init`, or `hydrate` functions. The `langs` option is an array of language grammars, which can be a language grammar object, a language ID, or a URL to the language grammar.\n\n```js\nimport markdown from \"tm-grammars/markdown.json\" with { type: \"json\" };\n\nlazy({\n  langs: [\n    // load language grammars from CDN, these language ids must be defined in the `tm-grammars` package\n    \"html\",\n    \"css\",\n    \"javascript\",\n    \"json\",\n\n    // import language grammar from `tm-grammars` package without extra HTTP requests, but increases the bundle size\n    markdown,\n\n    // load language grammar from a URL\n    \"https://example.com/grammars/mylang.json\",\n\n    // load language grammar from an asset file\n    \"/assets/mylang.json\",\n\n    // dynamically import\n    () =\u003e import(\"tm-grammars/markdown.json\", { with: { type: \"json\" } }),\n\n    // hand-crafted language grammar\n    {\n      name: \"mylang\",\n      scopeName: \"source.mylang\",\n      patterns: [/* ... */],\n    },\n  ],\n  // The CDN for loading language grammars and themes. Default is \"https://esm.sh\"\n  cdn: \"https://esm.sh\",\n});\n```\n\n## Editor Options\n\nYou can set editor options as attributes in the `\u003cmonaco-editor\u003e` element. The editor options are the same as [`editor.EditorOptions`](https://microsoft.github.io/monaco-editor/docs.html#variables/editor.EditorOptions.html).\n\n```html\n\u003cmonaco-editor\n  theme=\"vitesse-dark\"\n  fontFamily=\"Geist Mono\"\n  fontSize=\"16\"\n\u003e\u003c/monaco-editor\u003e\n```\n\nFor SSR mode, you can set editor options in the `renderToWebComponent` function.\n\n```js\nimport { renderToWebComponent } from \"modern-monaco/ssr\";\n\nconst html = await renderToWebComponent(\n  `console.log(\"Hello, world!\")`,\n  {\n    theme: \"vitesse-dark\",\n    language: \"javascript\",\n    fontFamily: \"Geist Mono\",\n    fontSize: 16,\n  },\n);\n```\n\nFor manual mode, check [here](https://microsoft.github.io/monaco-editor/docs.html#functions/editor.create.html) for more details.\n\n## Language Server Protocol (LSP)\n\nmodern-monaco by default supports full LSP features for the following languages:\n\n- HTML\n- CSS/SCSS/LESS\n- JavaScript/TypeScript\n- JSON\n\nAdditionally, modern-monaco supports features like:\n\n- File System Provider for import completions\n- Embedded languages in HTML\n- Inline `html` and `css` in JavaScript/TypeScript\n- Auto-closing HTML/JSX tags\n\n\u003e [!Note]\n\u003e You don't need to set `MonacoEnvironment.getWorker` for LSP support.\n\u003e modern-monaco automatically loads the required LSP workers.\n\n### LSP Language Configuration\n\nYou can configure built-in LSPs in the `lazy`, `init`, or `hydrate` functions.\n\n```js\nlazy({\n  lsp: {\n    // formatting options for all languages\n    formatting: {/* ... */},\n    // configure LSP for languages\n    html: {/* ... */},\n    css: {/* ... */},\n    json: {/* ... */},\n    typescript: {/* ... */},\n  },\n});\n```\n\nThe `LSPConfig` interface is defined as:\n\n```ts\nexport interface LSPConfig {\n  /** Formatting options. */\n  formatting?: {\n    /** Size of a tab in spaces. Default: 4. */\n    tabSize?: number;\n    /** Prefer spaces over tabs. Default: true.*/\n    insertSpaces?: boolean;\n    /** Trim trailing whitespace on a line. Default: true. */\n    trimTrailingWhitespace?: boolean;\n    /** Insert a newline character at the end of the file if one does not exist. Default: false. */\n    insertFinalNewline?: boolean;\n    /** Trim all newlines after the final newline at the end of the file. Default: false. */\n    trimFinalNewlines?: boolean;\n    /** Semicolon preference for JavaScript and TypeScript. Default: \"insert\". */\n    semicolon?: \"ignore\" | \"insert\" | \"remove\";\n  };\n  /** HTML language configuration. */\n  html?: {\n    /** Defines whether the standard HTML tags are shown. Default is true. */\n    useDefaultDataProvider?: boolean;\n    /** Provides a set of custom data providers. */\n    dataProviders?: { [providerId: string]: HTMLDataV1 };\n    /** Provides a set of custom HTML tags. */\n    customTags?: ITagData[];\n    /** The default value for empty attributes. Default is \"empty\". */\n    attributeDefaultValue?: \"empty\" | \"singlequotes\" | \"doublequotes\";\n    /** Whether to hide end tag suggestions. Default is false. */\n    hideEndTagSuggestions?: boolean;\n    /** Whether to hide auto complete proposals. Default is false. */\n    hideAutoCompleteProposals?: boolean;\n    /** Whether to show the import map code lens. Default is true. */\n    importMapCodeLens?: boolean;\n    /** Options for the diagnostics. */\n    diagnosticsOptions?: DiagnosticsOptions;\n  };\n  /** CSS language configuration. */\n  css?: {\n    /** Defines whether the standard CSS properties, at-directives, pseudoClasses and pseudoElements are shown. */\n    useDefaultDataProvider?: boolean;\n    /** Provides a set of custom data providers. */\n    dataProviders?: { [providerId: string]: CSSDataV1 };\n    /** A list of valid properties that not defined in the standard CSS properties. */\n    validProperties?: string[];\n    /** Options for the diagnostics. */\n    diagnosticsOptions?: DiagnosticsOptions;\n  };\n  /** JSON language configuration. */\n  json?: {\n    /** Whether to show the import map code lens. Default is true. */\n    importMapCodeLens?: boolean;\n    /** Defines whether comments are allowed or not. Default is disallowed. */\n    allowComments?: boolean;\n    /** A list of known schemas and/or associations of schemas to file names. */\n    schemas?: JSONSchemaSource[];\n    /** The severity of reported comments. Default is \"error\". */\n    comments?: SeverityLevel;\n    /** The severity of reported trailing commas. Default is \"error\". */\n    trailingCommas?: SeverityLevel;\n    /** The severity of problems from schema validation. Default is \"warning\". */\n    schemaValidation?: SeverityLevel;\n    /** The severity of problems that occurred when resolving and loading schemas. Default is \"warning\". */\n    schemaRequest?: SeverityLevel;\n    /** Options for the diagnostics. */\n    diagnosticsOptions?: DiagnosticsOptions;\n  };\n  /** TypeScript language configuration. */\n  typescript?: {\n    /** The default import maps. */\n    importMap?: ImportMap;\n    /** The compiler options. */\n    compilerOptions?: ts.CompilerOptions;\n    /** Options for the diagnostics. */\n    diagnosticsOptions?: DiagnosticsOptions;\n  };\n}\n```\n\nYou can also set the diagnostics options for each language by adding the `diagnosticsOptions` option to the `lsp` options:\n\n```js\nlazy({\n  lsp: {\n    css: {\n      diagnosticsOptions: {\n        // filter out unknown property errors\n        filter: (diagnostic) =\u003e diagnostic.code !== \"unknownProperty\",\n      },\n    },\n    json: {\n      diagnosticsOptions: {\n        // disable syntax and semantic validation\n        validate: false,\n      },\n    },\n    typescript: {\n      diagnosticsOptions: {\n        // ignore type not found errors (code 2307)\n        codesToIgnore: [2307],\n      },\n    },\n  },\n});\n```\n\n### Import Maps\n\nmodern-monaco uses [import maps](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap) to resolve **bare specifier** imports in JavaScript/TypeScript. By default, modern-monaco detects the `importmap` from the root `index.html` in the workspace.\n\n```js\nconst indexHtml = /* html */ `\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003cscript type=\"importmap\"\u003e\n      {\n        \"imports\": {\n          \"react\": \"https://esm.sh/react@18\",\n          \"react-dom/\": \"https://esm.sh/react-dom@18/\"\n        }\n      }\n    \u003c/script\u003e\n  \u003c/head\u003e\n  \u003cbody\u003e\n    \u003cdiv id=\"root\"\u003e\u003c/div\u003e\n    \u003cscript type=\"module\" src=\"app.tsx\"\u003e\u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n`;\nconst appTsx = `import { createRoot } from \"react-dom/client\";\n\ncreateRoot(document.getElementById(\"root\")).render(\u003cdiv\u003eHello, world!\u003c/div\u003e);\n`;\n\nconst workspace = new Workspace({\n  initialFiles: {\n    \"index.html\": indexHtml,\n    \"app.tsx\": appTsx,\n  },\n});\n```\n\nYou can also provide an import map object as the `lsp.typescript.importMap` option in the `lazy`, `init`, or `hydrate` functions.\n\n```js\nlazy({\n  lsp: {\n    typescript: {\n      importMap: {\n        \"react\": \"https://esm.sh/react@18\",\n        \"react-dom/\": \"https://esm.sh/react-dom@18/\",\n      },\n    },\n  },\n});\n```\n\n### Adding `tsconfig.json`\n\nYou can add a `tsconfig.json` file to configure the TypeScript compiler options for the TypeScript language service.\n\n```js\nconst tsconfig = {\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"strict\": true,\n  },\n};\nconst workspace = new Workspace({\n  initialFiles: {\n    \"tsconfig.json\": JSON.stringify(tsconfig, null, 2),\n  },\n});\n```\n\nYou can also manually add the TypeScript compiler options as the `lsp.typescript.compilerOptions` option in the `lazy`, `init`, or `hydrate` functions.\n\n```js\nlazy({\n  lsp: {\n    typescript: {\n      compilerOptions: {\n        target: \"ES2022\",\n        strict: true,\n      },\n    },\n  },\n});\n```\n\n## Using the `core` Module\n\nmodern-monaco includes built-in grammars and LSP providers for HTML, CSS, JavaScript/TypeScript, and JSON. If you don't need these features, you can use the `modern-monaco/core` sub-module to reduce the bundle size.\n\n```js\nimport { lazy } from \"modern-monaco/core\";\n\nlazy();\n```\n\n## Loading editor modules from a custom CDN\n\nBy default, modern-monaco loads editor modules from `https://esm.sh`. You can customize the CDN URL by providing an import map in your HTML.\n\n```html\n\u003cscript type=\"importmap\"\u003e\n  {\n    \"imports\": {\n      \"modern-monaco\": \"https://mycdn.com/modern-monaco@:version/dist/index.mjs\",\n      \"modern-monaco/editor-core\": \"https://mycdn.com/modern-monaco@:version/dist/editor-core.mjs\",\n      \"modern-monaco/lsp\": \"https://mycdn.com/modern-monaco@:version/dist/lsp/index.mjs\",\n      \"typescript\": \"https://mycdn.com/typescript@:version/lib/typescript.js\"\n    }\n  }\n\u003c/script\u003e\n```\n\n## License\n\n[MIT License](https://opensource.org/licenses/MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesm-dev%2Fmodern-monaco","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fesm-dev%2Fmodern-monaco","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesm-dev%2Fmodern-monaco/lists"}