diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..d7f8b44f --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,62 @@ +name: Deploy Hugo site to Pages + +on: + # Run on pushes targeting the default branch + push: + branches: main + # Allow to run this workflow manually from the Actions tab + workflow_dispatch: + +# Set permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +defaults: + run: + shell: bash + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Build + env: + # For maximum backward compatibility with Hugo modules + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + npm install + npm run build + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./public + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 + \ No newline at end of file diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml new file mode 100644 index 00000000..e946636d --- /dev/null +++ b/.github/workflows/preview.yml @@ -0,0 +1,86 @@ +name: Deploy PR previews + +on: + pull_request_target: + types: + - opened + - synchronize + - reopened + - closed + +concurrency: preview-${{ github.head_ref }} + +defaults: + run: + shell: bash + +jobs: + build-preview: + if: github.event_name == 'pull_request_target' && github.event.action != 'closed' + runs-on: ubuntu-latest + steps: + - name: Use Node.js + uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2 + with: + node-version: '18' + - name: Checkout + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Build + run: | + npm install + npm run build + - name: Upload artifact + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: "site" + path: ./public + + deploy-preview: + needs: build-preview + runs-on: ubuntu-latest + permissions: + pull-requests: write + environment: + name: pull-request-preview + url: ${{ steps.deployment.outputs.deployment-url }} + steps: + # checkout required for pr-preview-action to succeed, + # while the content will not be used + - name: Checkout + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + - name: Download the preview page + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + with: + name: "site" + path: ./public + - uses: rossjrw/pr-preview-action@4668d7cb417ce7067b0b59bc152b1ae1513010de # v1.4.6 + id: deployment + with: + source-dir: ./public + preview-branch: previews + umbrella-dir: pr-previews + deploy-repository: eclipse-langium/langium-previews + token: ${{ secrets.DEPLOY_PREVIEW_TOKEN }} + action: auto + + # remove the preview page when the PR got closed + remove-preview: + if: github.event_name == 'pull_request_target' && github.event.action == 'closed' + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + # checkout required for pr-preview-action to succeed, + # while the content will not be used + - name: Checkout + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + - uses: rossjrw/pr-preview-action@4668d7cb417ce7067b0b59bc152b1ae1513010de # v1.4.6 + id: deployment + with: + preview-branch: previews + umbrella-dir: pr-previews + deploy-repository: eclipse-langium/langium-previews + token: ${{ secrets.DEPLOY_PREVIEW_TOKEN }} + action: auto diff --git a/.gitignore b/.gitignore index 2e095e84..6504043b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,4 @@ /public/ -/hugo/resources/ -/hugo/static/css/ -hugo/static/libs -hugo/static/showcase/ -hugo/static/libs/ -hugo/static/playground/ node_modules/ .DS_Store .hugo_build.lock diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..abee2eef --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible Node.js debug attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome", + "url": "http://localhost:1313", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/README.md b/README.md index bd1fb42d..764e68e8 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This repository contains the assets required to build the Langium website and do Our setup uses TailwindCSS to build the styles which are then copied into the Hugo installation, from which our website is finally built. -Please look into the sub folders [hugo/](hugo/README.md) and [tailwind/](tailwind/README.md). +Please look into the sub folders [core/](core/README.md) [hugo/](hugo/README.md) and [tailwind/](tailwind/README.md). You can find the `showcase/` folder [here](hugo/content/showcase). diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 00000000..b6291f30 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1,2 @@ +bundle/ +dist/ diff --git a/core/README.md b/core/README.md new file mode 100644 index 00000000..4a6fed62 --- /dev/null +++ b/core/README.md @@ -0,0 +1,5 @@ +# core/ + +We utilize [monaco-editor-wrapper](https://www.npmjs.com/package/monaco-editor-wrapper) and [@typefox/monaco-editor-react](https://www.npmjs.com/package/@typefox/monaco-editor-react) to make the monaco-editor intgration a smoother experience. + +This package provides utility `createUserConfig` that provides a fully specified user configuration to be used by either of the two packages. The other purpose is to bundle the code, so it can be integrated with hugo and remove the burden dealing with complex javascript in the hugo build process. diff --git a/core/package.json b/core/package.json new file mode 100644 index 00000000..bcc0ab3a --- /dev/null +++ b/core/package.json @@ -0,0 +1,67 @@ +{ + "name": "langium-website-core", + "version": "1.0.0", + "type": "module", + "description": "Bundling complex sources for hugo", + "author": "TypeFox", + "license": "MIT", + "private": true, + "main": "./dist/index.js", + "module": "./dist/index.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./bundle": { + "types": "./dist/index.d.ts", + "default": "./bundle/monaco-editor-wrapper-bundle/index.js" + } + }, + "typesVersions": { + "*": { + ".": [ + "dist/index" + ], + "bundle": [ + "dist/index" + ] + } + }, + "files": [ + "dist", + "bundle", + "src", + "LICENSE", + "README.md" + ], + "scripts": { + "clean": "shx rm -rf ./bundle ./dist", + "compile": "tsc", + "build:bundle": "vite --config vite.bundle.ts build", + "build": "npm run clean && npm run compile && npm run build:bundle" + }, + "devDependencies": { + "@types/react": "~18.2.28", + "@types/react-dom": "~18.2.13", + "@types/vscode": "~1.83.0", + "typescript": "~5.2.2", + "vite": "~4.4.11" + }, + "dependencies": { + "@codingame/monaco-vscode-keybindings-service-override": "~1.83.2", + "@typefox/monaco-editor-react": "2.3.0", + "monaco-editor": "~0.44.0", + "monaco-editor-workers": "~0.44.0", + "monaco-editor-wrapper": "~3.3.0", + "monaco-languageclient": "~6.6.0", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0", + "vscode-languageserver": "~8.0.2" + }, + "volta": { + "node": "18.18.1", + "npm": "9.9.0" + } +} diff --git a/core/src/index.ts b/core/src/index.ts new file mode 100644 index 00000000..151921cf --- /dev/null +++ b/core/src/index.ts @@ -0,0 +1,17 @@ +import * as monaco from "monaco-editor"; +import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override'; +import type { MonacoEditorProps } from "@typefox/monaco-editor-react"; +import { MonacoEditorReactComp } from "@typefox/monaco-editor-react"; +import { addMonacoStyles } from 'monaco-editor-wrapper/styles'; + +export * from "monaco-editor-wrapper"; +export type * from "monaco-editor-wrapper"; +export * from "./monaco-editor-wrapper-utils.js"; + +export { + monaco, + MonacoEditorProps, + MonacoEditorReactComp, + addMonacoStyles, + getKeybindingsServiceOverride +} diff --git a/core/src/monaco-editor-wrapper-utils.ts b/core/src/monaco-editor-wrapper-utils.ts new file mode 100644 index 00000000..fd739bff --- /dev/null +++ b/core/src/monaco-editor-wrapper-utils.ts @@ -0,0 +1,176 @@ +import { languages } from "monaco-editor"; +import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override'; +import { EditorAppConfigClassic, EditorAppConfigExtended, LanguageClientConfig, UserConfig } from "monaco-editor-wrapper"; + +export type WorkerUrl = string; + +/** + * Generalized configuration used with 'getMonacoEditorReactConfig' to generate a working configuration for monaco-editor-react + */ +export interface MonacoReactConfig { + code: string, + languageId: string, + worker: WorkerUrl | Worker, + readonly?: boolean // whether to make the editor readonly or not (by default is false) +} + +/** + * Extended config, specifically for textmate usage + */ +export interface MonacoExtendedReactConfig extends MonacoReactConfig { + textmateGrammar: any; +} + +/** + * Editor config, specifically for monarch grammar usage + */ +export interface MonacoEditorReactConfig extends MonacoReactConfig { + monarchGrammar?: languages.IMonarchLanguage; +} + +/** + * Helper to identify a Extended config, for use with TextMate + */ +function isMonacoExtendedReactConfig(config: unknown): config is MonacoExtendedReactConfig { + return (config as MonacoExtendedReactConfig).textmateGrammar !== undefined; +} + + +/** + * Default language configuration, common to most Langium DSLs + */ +export const defaultLanguageConfig = { + "comments": { + "lineComment": "//", + "blockComment": ["/*", "*/"] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +}; + +/** + * Generates a UserConfig for a given Langium example, which is then passed to the monaco-editor-react component + * + * @param config A Extended or classic editor config to generate a UserConfig from + * @returns A completed UserConfig + */ +export function createUserConfig(config: MonacoExtendedReactConfig | MonacoEditorReactConfig): UserConfig { + // setup urls for config & grammar + const id = config.languageId; + + // check whether to use extended config (Textmate) or the classic editor config (Monarch) + let editorAppConfig: EditorAppConfigClassic | EditorAppConfigExtended; + const useExtendedConfig = isMonacoExtendedReactConfig(config); + if (useExtendedConfig) { + // setup extension contents + const languageConfigUrl = `/${id}-configuration.json`; + const languageGrammarUrl = `/${id}-grammar.json`; + const extensionContents = new Map(); + extensionContents.set(languageConfigUrl, JSON.stringify(defaultLanguageConfig)); + extensionContents.set(languageGrammarUrl, JSON.stringify(config.textmateGrammar)); + + editorAppConfig = { + $type: 'extended', + languageId: id, + code: config.code, + useDiffEditor: false, + extensions: [{ + config: { + name: id, + publisher: 'TypeFox', + version: '1.0.0', + engines: { + vscode: '*' + }, + contributes: { + languages: [{ + id: id, + extensions: [ `.${id}` ], + configuration: languageConfigUrl + }], + grammars: [{ + language: id, + scopeName: `source.${id}`, + path: languageGrammarUrl + }] + } + }, + filesOrContents: extensionContents, + }], + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.semanticHighlighting.enabled': true, + 'editor.lightbulb.enabled': true, + 'editor.guides.bracketPairsHorizontal': 'active' + }) + } + }; + } else { + editorAppConfig = { + $type: 'classic', + languageId: id, + code: config.code, + useDiffEditor: false, + languageExtensionConfig: { id }, + languageDef: config.monarchGrammar, + editorOptions: { + 'semanticHighlighting.enabled': true, + readOnly: config.readonly, + theme: 'vs-dark' + } + }; + } + + let languageClientConfig: LanguageClientConfig; + if (typeof config.worker === 'string') { + languageClientConfig = { + options: { + $type: 'WorkerConfig', + url: new URL(config.worker, window.location.href), + type: 'module', + name: `${id}-language-server-worker`, + } + }; + } else { + languageClientConfig = { + options: { + $type: 'WorkerDirect', + worker: config.worker + } + }; + } + + // generate user config for langium based language + const userConfig: UserConfig = { + wrapperConfig: { + serviceConfig: { + // only use keyboard service in addition to the default services from monaco-editor-wrapper + userServices: { + ...getKeybindingsServiceOverride() + }, + debugLogging: true + }, + editorAppConfig + }, + languageClientConfig + } + return userConfig; +} diff --git a/core/tsconfig.json b/core/tsconfig.json new file mode 100644 index 00000000..501bcbcb --- /dev/null +++ b/core/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "rootDir": "src", + "outDir": "dist", + "declaration": true, + "declarationDir": "dist" + }, + "include": [ + "src/**/*.ts", + ] +} \ No newline at end of file diff --git a/core/vite.bundle.ts b/core/vite.bundle.ts new file mode 100644 index 00000000..24a35854 --- /dev/null +++ b/core/vite.bundle.ts @@ -0,0 +1,35 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; + +const config = defineConfig({ + build: { + lib: { + entry: resolve(__dirname, './src/index.ts'), + name: 'monaco-editor-wrapper-bundle', + fileName: () => 'index.js', + formats: ['es'] + }, + outDir: resolve(__dirname, 'bundle/monaco-editor-wrapper-bundle'), + assetsDir: resolve(__dirname, 'bundle/monaco-editor-wrapper-bundle/assets'), + emptyOutDir: true, + cssCodeSplit: false, + commonjsOptions: { + strictRequires: true + }, + rollupOptions: { + output: { + name: 'monaco-editor-wrapper-bundle', + exports: 'named', + sourcemap: false, + assetFileNames: (assetInfo) => { + return `assets/${assetInfo.name}`; + } + } + } + }, + resolve: { + dedupe: ['monaco-editor', 'vscode'] + } +}); + +export default config; diff --git a/hugo/.gitignore b/hugo/.gitignore new file mode 100644 index 00000000..b9d7b3f1 --- /dev/null +++ b/hugo/.gitignore @@ -0,0 +1,5 @@ +resources/ +static/css/ +static/showcase/ +static/libs/ +static/playground/ diff --git a/hugo/assets/scripts/arithmetics/arithmetics-tools.tsx b/hugo/assets/scripts/arithmetics/arithmetics-tools.tsx new file mode 100644 index 00000000..1a4322ea --- /dev/null +++ b/hugo/assets/scripts/arithmetics/arithmetics-tools.tsx @@ -0,0 +1,95 @@ +import { monaco } from "langium-website-core/bundle"; + +type Pos = { + character: number; + line: number; +} + +export interface Evaluation { + range: { + start: Pos; + end: Pos; + } + text: string; + value: number; +} +export const examples = [`Module basicMath + +def a: 5; +def b: 3; +def c: a + b; +def d: (a ^ b); + +def root(x, y): + x^(1/y); + +def sqrt(x): + root(x, 2); + +2 * c; +b % 2; + +// This language is case-insensitive regarding symbol names +Root(D, 3); +Root(64, 3); +Sqrt(81);`, + + `MODULE priceCalculator + +DEF materialPerUnit: 100; + +DEF laborPerUnit: 200; + +DEF costPerUnit: materialPerUnit + laborPerUnit; + +DEF expectedNoOfSales: 200; + +DEF costOfGoodsSold: expectedNoOfSales * costPerUnit; + +DEF generalExpensesAndSales: 10000; + +DEF desiredProfitPerUnit: 50; + +DEF netPrice: + (costOfGoodsSold + generalExpensesAndSales) / expectedNoOfSales + desiredProfitPerUnit; + +DEF vat: 0.15; + + +DEF calcGrossListPrice(net, tax): + net / (1 - tax); + +calcGrossListPrice(netPrice, vat);` +] + +/** + * Monarch grammar for arithmetics + */ +export const syntaxHighlighting = { + ignoreCase: true, + keywords: [ + 'def', 'module' + ], + operators: [ + '*', '+', ',', '-', '/', ':', ';' + ], + symbols: /\(|\)|\*|\+|,|-|\/|:|;/, + tokenizer: { + initial: [ + { regex: /[_a-zA-Z][\w_]*/, action: { cases: { '@keywords': { "token": "keyword" }, '@default': { "token": "ID" } } } }, + { regex: /[0-9]+(\.[0-9]*)?/, action: { "token": "number" } }, + { include: '@whitespace' }, + { regex: /@symbols/, action: { cases: { '@operators': { "token": "operator" }, '@default': { "token": "" } } } }, + ], + whitespace: [ + { regex: /\s+/, action: { "token": "white" } }, + { regex: /\/\*/, action: { "token": "comment", "next": "@comment" } }, + { regex: /\/\/[^\n\r]*/, action: { "token": "comment" } }, + ], + comment: [ + { regex: /[^\/\*]+/, action: { "token": "comment" } }, + { regex: /\*\//, action: { "token": "comment", "next": "@pop" } }, + { regex: /[\/\*]/, action: { "token": "comment" } }, + ], + } +} as monaco.languages.IMonarchLanguage; \ No newline at end of file diff --git a/hugo/assets/scripts/arithmetics/arithmetics.tsx b/hugo/assets/scripts/arithmetics/arithmetics.tsx new file mode 100644 index 00000000..84b29401 --- /dev/null +++ b/hugo/assets/scripts/arithmetics/arithmetics.tsx @@ -0,0 +1,200 @@ +import { addMonacoStyles, createUserConfig, MonacoEditorReactComp, UserConfig } from "langium-website-core/bundle"; +import { buildWorkerDefinition } from "monaco-editor-workers"; +import React from "react"; +import { createRoot } from "react-dom/client"; +import { Evaluation, examples, syntaxHighlighting } from "./arithmetics-tools"; +import { Diagnostic, DocumentChangeResponse } from "langium-ast-helper"; + +addMonacoStyles('monaco-styles-helper'); + +buildWorkerDefinition( + "../../libs/monaco-editor-workers/workers", + new URL("", window.location.href).href, + false +); + +interface PreviewProps { + evaluations?: Evaluation[]; + diagnostics?: Diagnostic[]; + focusLine: (line: number) => void; +} + +let userConfig: UserConfig; + + +class Preview extends React.Component { + constructor(props: PreviewProps) { + super(props); + this.state = { + evaluations: props.evaluations, + diagnostics: props.diagnostics, + focusLine: props.focusLine, + }; + + this.startPreview = this.startPreview.bind(this); + } + + startPreview(evaluations: Evaluation[], diagnostics: Diagnostic[]) { + this.setState({ focusLine: this.state.focusLine.bind(this) }) + this.setState({ evaluations: evaluations, diagnostics: diagnostics }); + } + + render() { + // check if code contains an astNode + if (!this.state.evaluations) { + // Show the exception + return ( +
+
+ No Ast found +
+
+ ); + } + + // if the code doesn't contain any errors and the diagnostics aren't warnings + if (this.state.diagnostics == null || this.state.diagnostics.filter((i) => i.severity === 1).length == 0) { + return ( +
+ {this.state.evaluations.map((evaluation, index) => +
this.state.focusLine(evaluation.range.start.line + 1)}> +

+ {evaluation.range.start.line == evaluation.range.end.line && {`Line ${evaluation.range.start.line + 1}: `}} + {evaluation.range.start.line != evaluation.range.end.line && {`Line ${evaluation.range.start.line + 1}-${evaluation.range.end.line + 1}: `}} + {evaluation.text} = {evaluation.value} +

+
+ )} +
+ ); + } + // Show the exception + return ( +
+
+ {this.state.diagnostics.filter((i) => i.severity === 1).map((diagnostic, index) => +
+ {`Line ${diagnostic.range.start.line}-${diagnostic.range.end.line}: ${diagnostic.message}`} +

Source: {diagnostic.source} | Code: {diagnostic.code}

+
+ )} +
+
+ ); + } +} + + +interface AppState { + exampleIndex: number; +} +class App extends React.Component<{}, AppState> { + monacoEditor: React.RefObject; + preview: React.RefObject; + constructor(props) { + super(props); + + // bind 'this' ref for callbacks to maintain parent context + this.onMonacoLoad = this.onMonacoLoad.bind(this); + this.onDocumentChange = this.onDocumentChange.bind(this); + this.monacoEditor = React.createRef(); + this.preview = React.createRef(); + + this.state = { + exampleIndex: 0, + }; + } + + /** + * Callback that is invoked when Monaco is finished loading up. + * Can be used to safely register notification listeners, retrieve data, and the like + * + * @throws Error on inability to ref the Monaco component or to get the language client + */ + onMonacoLoad() { + // verify we can get a ref to the editor + if (!this.monacoEditor.current) { + throw new Error("Unable to get a reference to the Monaco Editor"); + } + + // verify we can get a ref to the language client + const lc = this.monacoEditor.current + ?.getEditorWrapper() + ?.getLanguageClient(); + if (!lc) { + throw new Error("Could not get handle to Language Client on mount"); + } + this.monacoEditor.current.getEditorWrapper()?.getEditor()?.focus(); + // register to receive DocumentChange notifications + lc.onNotification("browser/DocumentChange", this.onDocumentChange); + } + + /** + * Callback invoked when the document processed by the LS changes + * Invoked on startup as well + * @param resp Response data + */ + onDocumentChange(resp: DocumentChangeResponse) { + // decode the received Asts + let result = JSON.parse(resp.content) + let evaluations = result.$evaluations; + this.preview.current?.startPreview(evaluations, resp.diagnostics); + } + + setExample(index: number) { + this.setState({ exampleIndex: index }); + this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.setValue(examples[index]); + } + + render() { + const style = { + height: "100%", + width: "100%", + }; + + return ( +
+
+
+ Editor + +
+
+ +
+
+
+
+ Preview +
+
+ { + this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.revealLineInCenter(line); + this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.setPosition({ lineNumber: line, column: 1 }); + this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.focus(); + }} /> +
+
+
+ ); + } +} + +// setup config & render +userConfig = createUserConfig({ + languageId: 'arithmetics', + code: examples[0], + htmlElement: document.getElementById('root')!, + worker: '../../showcase/libs/worker/arithmeticsServerWorker.js', + monarchGrammar: syntaxHighlighting +}); +const root = createRoot(document.getElementById("root") as HTMLElement); +root.render(); diff --git a/hugo/assets/scripts/domainmodel/d3tree.tsx b/hugo/assets/scripts/domainmodel/d3tree.tsx new file mode 100644 index 00000000..bbc7e442 --- /dev/null +++ b/hugo/assets/scripts/domainmodel/d3tree.tsx @@ -0,0 +1,138 @@ +import React, { useRef, useEffect } from 'react'; +import * as d3 from 'd3'; +import { DomainModelElementTypeNames } from './domainmodel-tools'; + +export interface TreeNode { + name: string; + children?: TreeNode[]; + + tags?: TreeNodeTag[]; + $type?: DomainModelElementTypeNames; +} + +export type TreeNodeTag = 'supertype' | 'many'; +interface TreeProps { + data: TreeNode; +} + + +export default function D3Tree({ data }: TreeProps) { + const svgRef = useRef(null); + + useEffect(() => { + if (!svgRef.current) return; + + // get the leaf nodes of the tree + const getLeafNodes = (child: TreeNode): number => { + if (!child.children) return 1; + if(child.children.length === 0) return 1; + return child.children.map(getLeafNodes).reduce((a, b) => a + b); + }; + + // get the longest path in the tree + const getLongestPath = (child: TreeNode): number => { + if (!child.children) return 1; + if(child.children.length === 0) return 1; + return 1 + Math.max(...child.children.map(getLongestPath)); + }; + + const height = getLeafNodes(data) * 60; + const width = getLongestPath(data) * 120; + + const svg = d3.select(svgRef.current); + svg.selectAll('*').remove(); + + const hierarchy = d3.hierarchy(data); + const treeLayout = d3.tree().size([height, width]); + const treeData = treeLayout(hierarchy); + const g = svg.append('g'); + + const zoom = d3.zoom().on('zoom', (event) => { + g.attr('transform', event.transform); + }); + + // zoom to show the whole tree + svg.call(zoom.transform, d3.zoomIdentity.translate(width / 20, height / 30).scale(0.5)); + + svg.call(zoom, d3.zoomIdentity.translate(50, 50)); + + // draw the links + g.selectAll('.link') + .data(treeData.links()) + .enter().append('path') + .attr('class', 'link') + .attr('d', d => { + // connect parent node to child node + return `M${d.source.y},${d.source.x}C${d.source.y + 100},${d.source.x} ${d.target.y - 100},${d.target.x} ${d.target.y},${d.target.x}`; + }) + .style('fill', 'none') + .style('stroke', 'white') + .style('stroke-width', '1px') + .style('stroke-dasharray', function (d) { + if (d.target.data.tags?.includes('supertype')) return '10,5'; + if (d.source.data.tags?.includes('many')) return '5,5'; + return 'none'; + }) + .style('stroke-opacity', '0.4'); + + const node = g.selectAll('.node') + .data(treeData.descendants()) + .enter().append('g') + .attr('class', 'node') + .attr('transform', d => `translate(${d.y},${d.x})`); + + + // draw circle for nodes + node.append('circle') + .attr('r', 5) + .style('fill', function (d) { + switch (d.data.$type) { + case 'PackageDeclaration': + return '#8c2626'; // accentRed + case 'DataType': + return '#B6F059'; + case 'Entity': + return '#D568E7'; // accentViolet + case 'Feature': + return '#1FCDEB'; // accentBlue + default: + return '#26888C'; + } + }); + + // draw text for nodes + node.append('text') + .attr('dy', '0.31em') + .attr('x', d => d.children ? -6 : 6) + .attr('text-anchor', d => d.children ? 'end' : 'start') + .text(d => d.data.name) + .attr("transform", d => d.children ? `translate(${d.data.name.length * 5}, -20)` : 'translate(5, 0)') + .style('font-size', '1em') + .style('font-weight', function (d) { + switch (d.data.$type) { + case 'Domainmodel': + return 'bold'; + default: + return 'normal'; + } + }) + .style('fill', function (d) { + switch (d.data.$type) { + case 'PackageDeclaration': + return '#26888C'; + case 'DataType': + return 'green'; + case 'Entity': + return '#207578' + default: + return '#26888C'; + } + }); + + }, [data]); + + return ( + + ); +}; + diff --git a/hugo/assets/scripts/domainmodel/domainmodel-tools.ts b/hugo/assets/scripts/domainmodel/domainmodel-tools.ts new file mode 100644 index 00000000..f80e8e3a --- /dev/null +++ b/hugo/assets/scripts/domainmodel/domainmodel-tools.ts @@ -0,0 +1,222 @@ +import { AstNode } from "langium-ast-helper"; +import { TreeNode } from "./d3tree"; + + +export function getMainTreeNode(ast: AstNode): TreeNode { + const astNode = getDomainModelAst(ast as DomainModelAstNode); + // create a TreeNode a DataType + const getDataTypeTreeNode = (d: DataType): TreeNode => { + return { + ...d, + children: [] + } + } + + // create a TreeNode from a PackageDeclaration + const getPackageDeclarationTreeNode = (p: PackageDeclaration): TreeNode => { + return { + ...p, + children: p.elements.map(e => getTreeNode(e)) + } + } + + // create a TreeNode from any DomainModelElement + const getTreeNode = (e: DomainModelElement): TreeNode => { + switch(e.$type) { + case 'DataType': return getDataTypeTreeNode(e as DataType); + case 'Entity': return getEntityTreeNode(e as Entity); + case 'PackageDeclaration': return getPackageDeclarationTreeNode(e as PackageDeclaration); + default: return e as TreeNode; + } + } + + // create a TreeNode from an Entity + const getEntityTreeNode = (entity: Entity): TreeNode => { + + // create a TreeNode from a Feature + const getFeatureTreeNode = (feature: Feature): TreeNode => { + return { + name: `${feature.name}${feature.many ? '[]' : ''}`, + $type: feature.$type, + tags: feature.many ? ['many'] : [], + children: [getDataTypeTreeNode(feature.type.ref)] + } + } + + // get all children of an Entity (including the supertype) + const getChildren = (e: Entity): TreeNode[] => { + const superType = astNode.entities.find(entity => entity.name === e.superType?.ref.name); + const features = e.features.map(f => getFeatureTreeNode(f)); + + const children: TreeNode[] = superType ? [...features, { + name: superType.name, + $type: superType.$type, + tags: ['supertype'], + children: superType?.features.map(f => getFeatureTreeNode(f) ) + }] : features; + + return children; + } + + return { + ...entity, + children: getChildren(entity) + } + } + + // create a TreeNode from all Entities in the ast + const entities = astNode.entities.flatMap(e => getEntityTreeNode(e)); + // create a TreeNode from all DataTypes in the ast + const datatypes = astNode.dataTypes.map(d => getDataTypeTreeNode(d)); + // create a TreeNode from all PackageDeclarations in the ast + const packageDeclarations = astNode.packageDeclarations.map(p => getPackageDeclarationTreeNode(p)); + + const children: TreeNode[] = []; + + // if datatypes exist, add them to the children + if(datatypes.length > 0) { + children.push({ name: 'DataTypes', $type: 'DataType', children: datatypes }); + } + + // if entities exist, add them to the children + if(entities.length > 0) { + children.push({name: 'Entities', $type: 'Entity', children: entities}); + } + + // if packageDeclarations exist, add them to the children + if(packageDeclarations.length > 0) { + children.push({name: 'Packages', $type: 'PackageDeclaration', children: packageDeclarations}); + } + + + // return the root TreeNode + return { + name: astNode.$type, + $type: astNode.$type, + children: children + } +} + +/** + * Returns a DomainModelAstNode from a given ast. +*/ +export function getDomainModelAst(ast: DomainModelAstNode ): DomainModelAstNode { + return { + name: ast.name, + $type: 'Domainmodel', + elements: ast.elements, + packageDeclarations: (ast.elements as DomainModelElement[]).filter(e => e.$type === 'PackageDeclaration') as PackageDeclaration[], + entities: (ast.elements as DomainModelElement[]).filter(e => e.$type === 'Entity') as Entity[], + dataTypes: (ast.elements as DomainModelElement[]).filter(e => e.$type === 'DataType') as DataType[], + } +} + +// a more accessible representation of the DomainModel Ast +export interface DomainModelAstNode extends AstNode, DomainModelElement { + $type: 'Domainmodel'; + elements: DomainModelElementType[]; + + packageDeclarations: PackageDeclaration[]; + entities: Entity[]; + dataTypes: DataType[]; +} + +export interface PackageDeclaration extends DomainModelElement { + $type: 'PackageDeclaration'; + elements: DomainModelElementType[]; +} + +export interface Entity extends DomainModelElement { + $type: 'Entity'; + features: Feature[]; + superType?: { + ref: Entity + } +} + +export interface Feature extends DomainModelElement { + $type: 'Feature'; + type: { + ref: DataType + }; + many: boolean; +} + +export interface DataType extends DomainModelElement { + $type: 'DataType'; +} + +export interface DomainModelElement { + $type: string; + name: string; +} + +// create a union type of all possible DomainModelElement types +export type DomainModelElementType = PackageDeclaration | Entity | DataType | Feature | DomainModelAstNode; + +// create a union type of all possible DomainModelElement types names (string) +export type DomainModelElementTypeNames = DomainModelElementType['$type']; + +export const example = `// Define all datatypes +datatype String +datatype Int +datatype Decimal + +package big { + datatype Int + datatype Decimal +} + +package complex { + datatype Date +} + +// Define all entities +entity Blog { + title: String + date: complex.Date + many posts: Post +} + +entity HasAuthor { + author: String +} + +entity Post extends HasAuthor { + title: String + content: String + many comments: Comment +} + +entity Comment extends HasAuthor { + content: String +} +`; + +export const syntaxHighlighting = { + keywords: [ + 'datatype','entity','extends','many','package' + ], + operators: [ + '.',':' + ], + symbols: /\.|:|\{|\}/, + + tokenizer: { + initial: [ + { regex: /[_a-zA-Z][\w_]*/, action: { cases: { '@keywords': {"token":"keyword"}, '@default': {"token":"ID"} }} }, + { include: '@whitespace' }, + { regex: /@symbols/, action: { cases: { '@operators': {"token":"operator"}, '@default': {"token":""} }} }, + ], + whitespace: [ + { regex: /\s+/, action: {"token":"white"} }, + { regex: /\/\*/, action: {"token":"comment","next":"@comment"} }, + { regex: /\/\/[^\n\r]*/, action: {"token":"comment"} }, + ], + comment: [ + { regex: /[^\/\*]+/, action: {"token":"comment"} }, + { regex: /\*\//, action: {"token":"comment","next":"@pop"} }, + { regex: /[\/\*]/, action: {"token":"comment"} }, + ], + } +}; diff --git a/hugo/assets/scripts/domainmodel/domainmodel.tsx b/hugo/assets/scripts/domainmodel/domainmodel.tsx new file mode 100644 index 00000000..92ed77a2 --- /dev/null +++ b/hugo/assets/scripts/domainmodel/domainmodel.tsx @@ -0,0 +1,153 @@ +import { addMonacoStyles, createUserConfig, MonacoEditorReactComp, UserConfig } from "langium-website-core/bundle"; +import { buildWorkerDefinition } from "monaco-editor-workers"; +import React from "react"; +import { createRoot } from "react-dom/client"; +import { DomainModelAstNode, example, getMainTreeNode, syntaxHighlighting } from "./domainmodel-tools"; +import { deserializeAST, Diagnostic, DocumentChangeResponse } from 'langium-ast-helper'; + +import D3Tree from "./d3tree"; + +addMonacoStyles('monaco-styles-helper'); + +buildWorkerDefinition( + "../../libs/monaco-editor-workers/workers", + new URL("", window.location.href).href, + false +); + +let userConfig: UserConfig; + +interface AppState { + ast?: DomainModelAstNode; + diagnostics?: Diagnostic[]; +} + +class App extends React.Component<{}, AppState> { + monacoEditor: React.RefObject; + constructor(props) { + super(props); + + // bind 'this' ref for callbacks to maintain parent context + this.onMonacoLoad = this.onMonacoLoad.bind(this); + this.onDocumentChange = this.onDocumentChange.bind(this); + this.monacoEditor = React.createRef(); + + // set initial state + this.state = { + ast: undefined, + diagnostics: undefined, + }; + } + + /** + * Callback that is invoked when Monaco is finished loading up. + * Can be used to safely register notification listeners, retrieve data, and the like + * + * @throws Error on inability to ref the Monaco component or to get the language client + */ + onMonacoLoad() { + // verify we can get a ref to the editor + if (!this.monacoEditor.current) { + throw new Error("Unable to get a reference to the Monaco Editor"); + } + + // verify we can get a ref to the language client + const lc = this.monacoEditor.current + ?.getEditorWrapper() + ?.getLanguageClient(); + if (!lc) { + throw new Error("Could not get handle to Language Client on mount"); + } + this.monacoEditor.current.getEditorWrapper()?.getEditor()?.focus(); + // register to receive DocumentChange notifications + lc.onNotification("browser/DocumentChange", this.onDocumentChange); + } + + /** + * Callback invoked when the document processed by the LS changes + * Invoked on startup as well + * @param resp Response data + */ + onDocumentChange(resp: DocumentChangeResponse) { + // get the AST from the response and deserialize it + const ast = deserializeAST(resp.content) as DomainModelAstNode; + + this.setState({ + ast: ast, + diagnostics: resp.diagnostics, + }); + } + + renderAST(ast: DomainModelAstNode): JSX.Element { + if (!ast) { + return
No AST available.
; + } + + // if there are no errors, render the tree + if (this.state.diagnostics == null || this.state.diagnostics.filter((i) => i.severity === 1).length == 0) { + return ( + + ); + } + + // otherwise, render the errors + return ( +
+
+ {this.state.diagnostics.filter((i) => i.severity === 1).map((diagnostic, index) => +
+ {`Line ${diagnostic.range.start.line + 1}-${diagnostic.range.end.line + 1}: ${diagnostic.message}`} +

Source: {diagnostic.source} | Code: {diagnostic.code}

+
+ )} +
+
+ ); + + } + + render() { + const style = { + height: "100%", + width: "100%", + }; + + return ( +
+
+
+ Editor +
+
+ +
+
+
+
+ Preview +
+
+ {this.state.ast && this.renderAST(this.state.ast)} +
+
+
+ ); + } +} + + +userConfig = createUserConfig({ + languageId: 'domainmodel', + code: example, + htmlElement: document.getElementById('root')!, + worker: '../../showcase/libs/worker/domainmodelServerWorker.js', + monarchGrammar: syntaxHighlighting +}); + +const root = createRoot(document.getElementById("root") as HTMLElement); +root.render(); diff --git a/hugo/assets/scripts/langium-utils/langium-ast.ts b/hugo/assets/scripts/langium-utils/langium-ast.ts deleted file mode 100644 index 50d42849..00000000 --- a/hugo/assets/scripts/langium-utils/langium-ast.ts +++ /dev/null @@ -1,151 +0,0 @@ - -/** - * Provides utilities for deserializing Langium ASTs - */ -export class LangiumAST { - // Identify an AST node by it's type & shape - isReference(obj: unknown): obj is Reference { - return typeof obj === 'object' && obj !== null && typeof (obj as Reference).$ref === 'string'; - } - - // Identify a ref by its type & shape as well - isAstNode(obj: unknown): obj is AstNode { - return typeof obj === 'object' && obj !== null && typeof (obj as AstNode).$type === 'string'; - } - - // Takes the root, and a path string, traversing the root to find the node denoted by the path - getAstNode(root: AstNode, path: string): AstNode | undefined { - if (!path.startsWith('#')) { - // this isn't something we can decode, skip - return undefined; - } - - // break up path segments for traversal - const segments = path.substring(1).split('/'); - - return segments.reduce((previousValue, currentValue) => { - if (!previousValue || currentValue.length === 0) { - // no root or nothing else to check, return what we have so far - return previousValue; - } - const propertyIndex = currentValue.indexOf('@'); - if (propertyIndex > 0) { - // Array part of path to extract - const property = currentValue.substring(0, propertyIndex); - // get array index using prop - const arrayIndex = parseInt(currentValue.substring(propertyIndex + 1)); - // find array with prop & return via index - const array = (previousValue as unknown as Record)[property]; - return array?.[arrayIndex]; - } - // instead, index one farther down the tree using the current value - return (previousValue as unknown as Record)[currentValue]; - }, root); - } - - - // Link a given node - linkNode(node: AstNode, root: AstNode, container?: AstNode, containerProperty?: string, containerIndex?: number): void { - // set container details, if any (undefined for root) - node.$containerProperty = containerProperty; - node.$containerIndex = containerIndex; - node.$container = container; - - // iterate over all props in this node - for (const [propertyName, item] of Object.entries(node)) { - - if (propertyName === '$container') { - // don't evaluate containers again (causes a recursive loop) - continue; - } - - if (Array.isArray(item)) { - // Array of refs/nodes - for (let index = 0; index < item.length; index++) { - const element = item[index]; - if (this.isReference(element)) { - // reconstruct cross ref - element.ref = this.getAstNode(root, element.$ref); - } else if (this.isAstNode(element)) { - // another AST node we should link with proper details - this.linkNode(element, root, node, propertyName, index); - } - } - } else if (this.isReference(item)) { - // single reference to handle - item.ref = this.getAstNode(root, item.$ref); - } else if (this.isAstNode(item)) { - // single ast node to handle - this.linkNode(item, root, node, propertyName); - } - } - } - - // link given ast - linkAst(root: AstNode): void { - this.linkNode(root, root); - } - - /** - * Takes a string corresponding to a serialized Langium AST, and returns a deserialized AST node - * - * @param content String to parse & deserialize - * @returns A Langium AST with cross-refs restored - */ - deserializeAST(content: string): AstNode { - const root = JSON.parse(content); - this.linkNode(root, root); - return root; - } -} - -/** - * General position data for diagnostics - */ -type Pos = { - character: number; - line: number; -} - -/** - * Diagnostics that can be returned in a DocumentChange response - */ -export type Diagnostic = { - // general string-based code for this diagnostic (like 'linking-error') - code: string; - // user-friendly diagnostic message - message: string; - // start -> end range of the diagnostic - range: { - start: Pos; - end: Pos; - } - // severity code - severity: number; - // source language by string - source: string; -}; - -/** - * Response for a DocumentChange notification - */ -export type DocumentChangeResponse = { - uri: string; - content: string; - diagnostics: Diagnostic[]; -}; - -/** -* Approximation of a langium AST, capturing the most relevant information -*/ -export interface AstNode { - $type: string; - $container?: AstNode; - $containerProperty?: string; - $containerIndex?: number; -} - -export interface Reference { - ref?: T; - $ref: string -} \ No newline at end of file diff --git a/hugo/assets/scripts/minilogo/minilogo-tools.ts b/hugo/assets/scripts/minilogo/minilogo-tools.ts new file mode 100644 index 00000000..deee44bc --- /dev/null +++ b/hugo/assets/scripts/minilogo/minilogo-tools.ts @@ -0,0 +1,219 @@ +import { monaco } from "langium-website-core/bundle"; + +export interface Command { + name: 'penUp' | 'penDown' | 'move' | 'color'; + args: MoveArgs | ColorArgs | undefined; +} + +export interface MoveArgs { + x: number; + y: number; +} + +export interface ColorArgs { + color?: string; + r?: number; + g?: number; + b?: number; +} + +export function getCommands(commands: any[]): Command[] { + let result: Command[] = []; + commands.map((command) => { + switch (command.cmd) { + case 'penUp': + result.push({ name: 'penUp', args: undefined } as Command); + break; + case 'penDown': + result.push({ name: 'penDown', args: undefined } as Command); + break; + case 'move': + result.push({ name: 'move', args: { x: command.x, y: command.y } as MoveArgs} as Command); + break; + case 'color': + result.push({ name: 'color', args: { color: command.color, r: command.r, g: command.g, b: command.b } as ColorArgs } as Command); + break; + + } + }) + return result; +} + +export const syntaxHighlighting = { + keywords: [ + 'color', 'def', 'down', 'for', 'move', 'pen', 'to', 'up' + ], + operators: [ + '-', ',', '*', '/', '+', '=' + ], + symbols: /-|,|\(|\)|\{|\}|\*|\/|\+|=/, + + tokenizer: { + initial: [ + { regex: /#(\d|[a-fA-F]){3,6}/, action: { "token": "string" } }, + { regex: /[_a-zA-Z][\w_]*/, action: { cases: { '@keywords': { "token": "keyword" }, '@default': { "token": "string" } } } }, + { regex: /(?:(?:-?[0-9]+)?\.[0-9]+)|-?[0-9]+/, action: { "token": "number" } }, + { include: '@whitespace' }, + { regex: /@symbols/, action: { cases: { '@operators': { "token": "operator" }, '@default': { "token": "" } } } }, + ], + whitespace: [ + { regex: /\s+/, action: { "token": "white" } }, + { regex: /\/\*/, action: { "token": "comment", "next": "@comment" } }, + { regex: /\/\/[^\n\r]*/, action: { "token": "comment" } }, + ], + comment: [ + { regex: /[^\/\*]+/, action: { "token": "comment" } }, + { regex: /\*\//, action: { "token": "comment", "next": "@pop" } }, + { regex: /[\/\*]/, action: { "token": "comment" } }, + ], + } +} as monaco.languages.IMonarchLanguage; + +interface Example { + index: number; + name: string; + code: string; +} + +export const examples: Example[] = [{ + index: 0, + name: "Langium Logo", + code: `// Draws the langium logo in MiniLogo! +def langium() { + // draw top portion + // start + move(230, 90) + + // upper part of logo + pen(down) + move(45, 40) // 275, 130 + move(210, 0) // 485, 130 + move(-37, 80) // 448, 210 + move(-215, 0) // 233, 210 + move(-43, -40) // 190, 170 + move(40, -80) // 275, 130 + pen(up) + + // lower part of logo + move(-50, 103) + pen(down) + // starts @ 180, 193 + move(31, 30) // 211, 223 + + // crease + move(-61, 114) // 150, 337 + move(81, -102) // 231, 235 + + move(205, 0)// 436, 235 + move(-60, 123) // 376, 358 + move(-86, 0) // 290, 358 + move(-241, 179) // 49, 537 + move(11, 17) // 60, 554 + move(-59, 27) // 1, 581 + move(180, -388)// 181, 193 + pen(up) +} + +// program starts w/ pen UP and 0,0 position +// start off at 0,0 + +// calls the langium macro, drawing a version of the logo +color(#26888C) +langium() +`}, +{ + index: 1, + name: "Turtle", + code : ` + // Draw the head with a given dimension, and option to flip along the y + def drawHead(dimen, yFlip) { + move(dimen / 2, 0) + move(0, -dimen * yFlip) + move(-dimen/2, -dimen/2 * yFlip) + move(-dimen/2, dimen/2 * yFlip) + move(0, dimen * yFlip) + move(dimen / 2, 0) + } + + // Draw a shell shape as an octagon + def drawShellShape(dimen) { + move(dimen / 2,0) + move(dimen, dimen) + move(0, dimen) + move(-dimen, dimen) + move(-dimen, 0) + move(-dimen, -dimen) + move(0, -dimen) + move(dimen, -dimen) + move(dimen / 2, 0) + } + + // Helper function to move without painting + def moveNoDraw(x,y) { + pen(up) + move(x,y) + pen(down) + } + + // Draws the total turtle shell with a series of smaller ones + def drawShell() { + for x = 1 to 6 { + color(0, 255 / x, x * (255 / 5)) + drawShellShape(5 * x) + moveNoDraw(0,-7) + } + color(128, 255, 128) + drawShellShape(30) + } + + // Draws a turtle leg, using a given x & y to allow rotating & flipping + def drawLeg(x,y) { + move(x * 0.5, y * 0.5) + move(x, -y * 0.5) + move(-x * 0.5, -y * 0.5) + move(-x, y * 0.5) + } + + // Draws the turtle's legs + def drawLegs() { + // top right + moveNoDraw(25,10) + drawLeg(25,25) + + // top left + moveNoDraw(-50,0) + drawLeg(-25,25) + + // bottom left + moveNoDraw(0,70) + drawLeg(-25,-25) + + // bottom right + moveNoDraw(50,0) + drawLeg(25,-25) + } + + // Draws the tail as a smaller, inverted head + def drawTail() { + moveNoDraw(-25,10) + drawHead(10,-1) + } + + // Set starting pen position & color + def setup() { + // program starts w/ pen UP and 0,0 position + // start off at 0,0 + move(250,250) + pen(down) + color(green) + } + + setup() + + // draw the turtle! + drawShell() + drawHead(20,1) + drawLegs() + drawTail() + `}, +]; \ No newline at end of file diff --git a/hugo/assets/scripts/minilogo/minilogo.tsx b/hugo/assets/scripts/minilogo/minilogo.tsx new file mode 100644 index 00000000..c37802a1 --- /dev/null +++ b/hugo/assets/scripts/minilogo/minilogo.tsx @@ -0,0 +1,359 @@ +import { addMonacoStyles, createUserConfig, MonacoEditorReactComp, UserConfig } from "langium-website-core/bundle"; +import { buildWorkerDefinition } from "monaco-editor-workers"; +import React, { createRef } from "react"; +import { createRoot } from "react-dom/client"; +import { Diagnostic, DocumentChangeResponse, LangiumAST } from "../langium-utils/langium-ast"; +import { ColorArgs, Command, MoveArgs, examples, syntaxHighlighting } from "./minilogo-tools"; +import { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from "lz-string"; + +addMonacoStyles('monaco-styles-helper'); + +buildWorkerDefinition( + "../../libs/monaco-editor-workers/workers", + new URL("", window.location.href).href, + false +); + +let shouldAnimate = true; + +interface PreviewProps { + commands?: Command[]; + diagnostics?: Diagnostic[]; +} + +interface DrawCanvasProps { + commands: Command[]; +} + +let userConfig: UserConfig; + +class DrawCanvas extends React.Component { + canvasRef: React.RefObject; + posX: number; + posY: number; + scale: number; + drawing: boolean; + interval: NodeJS.Timer; + + constructor(props: DrawCanvasProps) { + super(props); + this.state = { + commands: props.commands, + }; + this.canvasRef = createRef(); + this.posX = 0; + this.posY = 0; + this.scale = 1.8; + this.drawing = false; + } + + componentDidMount() { + this.draw(!shouldAnimate); + } + + componentDidUpdate() { + this.draw(!shouldAnimate); + } + + init(canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D) { + this.stopDrawing(); + ctx.canvas.width = screen.availWidth; + ctx.canvas.height = screen.availHeight; + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.beginPath(); + ctx.strokeStyle = '#333'; + for (let x = 0; x <= canvas.width; x += canvas.width / 20) { + ctx.moveTo(x, 0); + ctx.lineTo(x, canvas.height); + } + for (let y = 0; y <= canvas.height; y += canvas.height / 20) { + ctx.moveTo(0, y); + ctx.lineTo(canvas.width, y); + } + ctx.stroke(); + ctx.scale(this.scale, this.scale); + + // reset + ctx.strokeStyle = 'white'; + this.posX = 0; + this.posY = 0; + this.scale = 1.8; + this.drawing = false; + } + + draw(instant: boolean) { + const commands = this.props.commands; + const canvas = this.canvasRef.current; + if (canvas && commands.length > 0) { + const ctx = canvas.getContext('2d')!; + this.init(canvas, ctx); + if (instant) { + while (commands.length > 0) { + this.dispatchCommand(commands.shift()!, ctx); + } + return; + } + this.interval = setInterval(() => { + if (commands.length > 0) { + this.dispatchCommand(commands.shift()!, ctx); + } else { + // finish existing draw + if (this.drawing) { + ctx.stroke(); + } + shouldAnimate = false; + this.stopDrawing(); + } + }, 1); + } + } + + stopDrawing() { + this.drawing = false; + this.posX = 0; + this.posY = 0; + clearInterval(this.interval); + } + + dispatchCommand(command: Command, context: CanvasRenderingContext2D) { + switch (command.name) { + case 'penUp': + this.drawing = false; + context.stroke(); + break; + case 'penDown': + this.drawing = true; + context.beginPath(); + context.moveTo(this.posX, this.posY); + break; + case 'move': + let args = command.args as MoveArgs; + this.posX += args.x; + this.posY += args.y; + if (!this.drawing) { + // move, no draw + context.moveTo(this.posX, this.posY); + } else { + // move & draw + context.lineTo(this.posX, this.posY); + } + + break; + case 'color': + let color = command.args as ColorArgs; + if (color.color) { + // literal color or hex + context.strokeStyle = color.color; + } else { + context.strokeStyle = `rgb(${color.r},${color.g},${color.b})`; + } + break; + } + } + + render() { + return ; + } +} +class Preview extends React.Component { + canvasRef: React.RefObject; + constructor(props: PreviewProps) { + super(props); + this.state = { + commands: props.commands, + diagnostics: props.diagnostics, + }; + this.canvasRef = createRef(); + this.startPreview = this.startPreview.bind(this); + } + + startPreview(commands: Command[], diagnostics: Diagnostic[]) { + this.setState({ commands, diagnostics }); + } + + render() { + // check if code contains an astNode + if (!this.state.commands) { + // Show the exception + return ( +
+
+ No Ast found +
+
+ ); + } + + // if the code doesn't contain any errors and the diagnostics aren't warnings + if (this.state.diagnostics == null || this.state.diagnostics.filter((i) => i.severity === 1).length == 0 && this.state.commands.length > 0) { + return ( + + ); + } + + // Show the exception + return ( +
+
+ {this.state.diagnostics.filter((i) => i.severity === 1).map((diagnostic, index) => +
+ {`Line ${diagnostic.range.start.line}-${diagnostic.range.end.line}: ${diagnostic.message}`} +

Source: {diagnostic.source} | Code: {diagnostic.code}

+
+ )} +
+
+ ); + } +} + + +interface AppState { + currentExample: number; +} +class App extends React.Component<{}, AppState> { + monacoEditor: React.RefObject; + preview: React.RefObject; + copyHint: React.RefObject; + shareButton: React.RefObject; + constructor(props) { + super(props); + + // bind 'this' ref for callbacks to maintain parent context + this.onMonacoLoad = this.onMonacoLoad.bind(this); + this.onDocumentChange = this.onDocumentChange.bind(this); + this.copyLink = this.copyLink.bind(this); + this.monacoEditor = React.createRef(); + this.preview = React.createRef(); + this.copyHint = React.createRef(); + this.shareButton = React.createRef(); + + this.state = { + currentExample: 0, + }; + } + + /** + * Callback that is invoked when Monaco is finished loading up. + * Can be used to safely register notification listeners, retrieve data, and the like + * + * @throws Error on inability to ref the Monaco component or to get the language client + */ + onMonacoLoad() { + // verify we can get a ref to the editor + if (!this.monacoEditor.current) { + throw new Error("Unable to get a reference to the Monaco Editor"); + } + + // verify we can get a ref to the language client + const lc = this.monacoEditor.current + ?.getEditorWrapper() + ?.getLanguageClient(); + if (!lc) { + throw new Error("Could not get handle to Language Client on mount"); + } + this.monacoEditor.current.getEditorWrapper()?.getEditor()?.focus(); + // register to receive DocumentChange notifications + lc.onNotification("browser/DocumentChange", this.onDocumentChange); + } + + /** + * Callback invoked when the document processed by the LS changes + * Invoked on startup as well + * @param resp Response data + */ + onDocumentChange(resp: DocumentChangeResponse) { + // decode the received Asts + let result = JSON.parse(resp.content) + let commands = result.$commands as Command[]; + this.preview.current?.startPreview(commands, resp.diagnostics); + } + + setExample(example: number) { + this.setState({ currentExample: example }); + this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.setValue(examples[example].code); + shouldAnimate = true; + } + + async copyLink() { + const code = this.monacoEditor.current?.getEditorWrapper()?.getEditor()?.getValue()!; + const url = new URL("/showcase/minilogo", window.origin); + url.searchParams.append("code", compressToEncodedURIComponent(code)); + + this.copyHint.current!.style.display = "block"; + this.shareButton.current!.src = '/assets/checkmark.svg'; + setTimeout(() => { + this.shareButton.current!.src = '/assets/share.svg'; + this.copyHint.current!.style.display = 'none'; + }, 1000); + + navigator.clipboard.writeText(window.location.href); + + await navigator.clipboard.writeText(url.toString()); + } + + componentDidMount() { + this.shareButton.current!.addEventListener('click', this.copyLink); + } + + render() { + const style = { + height: "100%", + width: "100%", + }; + + return ( +
+
+
+ Editor + +
+
Link was copied!
+ +
+
+
+ +
+
+
+
+ Preview +
+
+ +
+
+
+ ); + } +} + +export async function share(code: string): Promise { + const url = new URL("/showcase/minilogo", window.origin); + url.searchParams.append("code", compressToEncodedURIComponent(code)); + await navigator.clipboard.writeText(url.toString()); +} + +// setup config & render +const url = new URL(window.location.toString()); +let code = url.searchParams.get("code"); +userConfig = createUserConfig({ + languageId: 'minilogo', + code: code ? decompressFromEncodedURIComponent(code) : examples[0].code, + htmlElement: document.getElementById('root')!, + worker: '../../showcase/libs/worker/minilogoServerWorker.js', + monarchGrammar: syntaxHighlighting +}); +const root = createRoot(document.getElementById("root") as HTMLElement); +root.render(); diff --git a/hugo/assets/scripts/sql/constants.ts b/hugo/assets/scripts/sql/constants.ts new file mode 100644 index 00000000..5d237a09 --- /dev/null +++ b/hugo/assets/scripts/sql/constants.ts @@ -0,0 +1,351 @@ +import { monaco } from "langium-website-core/bundle"; + +export const syntaxHighlighting: monaco.languages.IMonarchLanguage = { + tokenizer: { + initial: [ + { regex: /x\'[A-Fa-f0-9]+\'/, action: { token: "string" } }, + { regex: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/, action: { token: "string" } }, + { regex: /\`(\\.|\\\\|[^`\\])*\`/, action: { token: "string" } }, + { + regex: /[_a-zA-Z][\w_]*/, + action: { + cases: { + "@keywords": { token: "keyword" }, + "@default": { token: "ID" }, + }, + }, + }, + { regex: /\d+((\.\d+)?([eE][\-+]?\d+)?)?/, action: { token: "number" } }, + { include: "@whitespace" }, + { + regex: /@symbols/, + action: { + cases: { + "@operators": { token: "operator" }, + "@default": { token: "" }, + }, + }, + }, + ], + whitespace: [ + { regex: /\s+/, action: { token: "white" } }, + { regex: /\/\*/, action: { token: "comment", next: "@comment" } }, + { regex: /\-\-[^\n\r]*/, action: { token: "comment" } }, + { regex: /\/\/[^\n\r]*/, action: { token: "comment" } }, + ], + comment: [ + { regex: /[^\/\*]+/, action: { token: "comment" } }, + { regex: /\*\//, action: { token: "comment", next: "@pop" } }, + { regex: /[\/\*]/, action: { token: "comment" } }, + ], + }, + keywords: [ + "ALL", + "AND", + "AS", + "ASC", + "BETWEEN", + "BY", + "CASCADE", + "CAST", + "CATALOG", + "CONSTRAINT", + "CREATE", + "CURRENT", + "DATABASE", + "DELETE", + "DESC", + "DISTINCT", + "EXCEPT", + "FALSE", + "FETCH", + "FIRST", + "FOLLOWING", + "FOREIGN", + "FROM", + "FUNCTION", + "GROUP", + "HAVING", + "IN", + "INDEX", + "INTERSECT", + "IS", + "JOIN", + "KEY", + "LEFT", + "LIKE", + "LIMIT", + "MINUS", + "NEXT", + "NOT", + "NULL", + "OFFSET", + "ON", + "ONLY", + "OR", + "ORDER", + "OVER", + "PARTITION", + "PERCENT", + "PRECEDING", + "PRIMARY", + "RANGE", + "RECURSIVE", + "REFERENCES", + "REPLACE", + "RIGHT", + "ROW", + "ROWS", + "SCHEMA", + "SELECT", + "TABLE", + "TIES", + "TOP", + "TRUE", + "UNBOUNDED", + "UNION", + "UNIQUE", + "USING", + "WHERE", + "WITH", + ], + symbols: /%|\(|\)|\*|\+|,|\-|\.|\/|::|::\$|::%|;|<|<=|<>|=|>|>=|\|\|/, + + operators: [ + "%", + "*", + "+", + ",", + "-", + ".", + "/", + "::", + "::$", + "::%", + ";", + "<", + "<=", + "<>", + "=", + ">", + ">=", + "||", + ], +}; + +export const defaultText = `SELECT p.firstname, p.lastname +FROM + passenger p + JOIN passengerdetails d + ON p.passenger_id=d.passenger_id +WHERE + d.sex = 'm'; + +SELECT * +FROM + airplane a + JOIN flight f + ON a.airplane_id=f.airplane_id; + +SELECT SUM(b.price) +FROM + booking b + JOIN flight f + ON b.flight_id=f.flight_id +WHERE + f.flight_id = 123; + +-- +-- Airport schema +-- +CREATE TABLE airline ( + airline_id INT NOT NULL, + iata CHAR NOT NULL, + airlinename CHAR, + base_airport INT NOT NULL, + PRIMARY KEY (airline_id), + UNIQUE KEY iata_unq (iata), + KEY heimat_idx (base_airport), + CONSTRAINT fluglinie_ibfk_1 FOREIGN KEY (base_airport) REFERENCES airport (airport_id) +); + +CREATE TABLE airplane ( + airplane_id INT NOT NULL, + capacity INT NOT NULL, + type_id INT NOT NULL, + airline_id INT NOT NULL, + PRIMARY KEY (airplane_id) +); + +CREATE TABLE airplane_type ( + type_id INT NOT NULL, + identifier CHAR, + description CHAR, + PRIMARY KEY (type_id) +); + +CREATE TABLE airport ( + airport_id INT NOT NULL, + iata CHAR, + icao CHAR NOT NULL, + name CHAR NOT NULL, + PRIMARY KEY (airport_id), + UNIQUE KEY icao_unq (icao), + KEY name_idx (name), + KEY iata_idx (iata) +); + +CREATE TABLE airport_geo ( + airport_id INT NOT NULL, + name CHAR NOT NULL, + city CHAR, + country CHAR, + latitude REAL NOT NULL, + longitude REAL NOT NULL, + KEY flughafen_idx (airport_id) +); + +CREATE TABLE airport_reachable ( + airport_id INT NOT NULL, + hops INT, + PRIMARY KEY (airport_id) +); + +CREATE TABLE booking ( + booking_id INT NOT NULL, + flight_id INT NOT NULL, + seat CHAR, + passenger_id INT NOT NULL, + price REAL NOT NULL, + PRIMARY KEY (booking_id), + UNIQUE KEY sitzplan_unq (flight_id,seat), + KEY flug_idx (flight_id), + KEY passagier_idx (passenger_id), + CONSTRAINT buchung_ibfk_1 FOREIGN KEY (flight_id) REFERENCES flight (flight_id), + CONSTRAINT buchung_ibfk_2 FOREIGN KEY (passenger_id) REFERENCES passenger (passenger_id) +); + +CREATE TABLE employee ( + employee_id INT NOT NULL, + firstname CHAR NOT NULL, + lastname CHAR NOT NULL, + birthdate DATETIME NOT NULL, + sex CHAR, + street CHAR NOT NULL, + city CHAR NOT NULL, + zip INT NOT NULL, + country CHAR NOT NULL, + emailaddress CHAR, + telephoneno CHAR, + salary REAL, + --department ENUM('Marketing','Buchhaltung','Management','Logistik','Flugfeld'), + username CHAR, + password CHAR, + PRIMARY KEY (employee_id), + UNIQUE KEY benutzer_unq (username) +); + +CREATE TABLE flight ( + flight_id INT NOT NULL, + flightno CHAR NOT NULL, + source INT NOT NULL, + destination INT NOT NULL, + departure DATETIME NOT NULL, + arrival DATETIME NOT NULL, + airline_id INT NOT NULL, + airplane_id INT NOT NULL, + PRIMARY KEY (flight_id), + KEY von_idx (source), + KEY nach_idx (destination), + KEY abflug_idx (departure), + KEY ankunft_idx (arrival), + KEY fluglinie_idx (airline_id), + KEY flugzeug_idx (airplane_id), + CONSTRAINT flug_ibfk_1 FOREIGN KEY (source) REFERENCES airport (airport_id), + CONSTRAINT flug_ibfk_2 FOREIGN KEY (destination) REFERENCES airport (airport_id), + CONSTRAINT flug_ibfk_3 FOREIGN KEY (airline_id) REFERENCES airline (airline_id), + CONSTRAINT flug_ibfk_4 FOREIGN KEY (airplane_id) REFERENCES airplane (airplane_id) +); + +CREATE TABLE flight_log ( + log_date DATETIME NOT NULL, + user CHAR NOT NULL, + flight_id INT NOT NULL, + flightno_old CHAR NOT NULL, + flightno_new CHAR NOT NULL, + from_old INT NOT NULL, + to_old INT NOT NULL, + from_new INT NOT NULL, + to_new INT NOT NULL, + departure_old DATETIME NOT NULL, + arrival_old DATETIME NOT NULL, + departure_new DATETIME NOT NULL, + arrival_new DATETIME NOT NULL, + airplane_id_old INT NOT NULL, + airplane_id_new INT NOT NULL, + airline_id_old INT NOT NULL, + airline_id_new INT NOT NULL, + comment CHAR +); + +CREATE TABLE flightschedule ( + flightno CHAR NOT NULL, + source INT NOT NULL, + destination INT NOT NULL, + departure DATETIME NOT NULL, + arrival DATETIME NOT NULL, + airline_id INT NOT NULL, + monday INT, + tuesday INT, + wednesday INT, + thursday INT, + friday INT, + saturday INT, + sunday INT, + PRIMARY KEY (flightno), + KEY von_idx (source), + KEY nach_idx (destination), + KEY fluglinie_idx (airline_id), + CONSTRAINT flugplan_ibfk_1 FOREIGN KEY (source) REFERENCES airport (airport_id), + CONSTRAINT flugplan_ibfk_2 FOREIGN KEY (destination) REFERENCES airport (airport_id), + CONSTRAINT flugplan_ibfk_3 FOREIGN KEY (airline_id) REFERENCES airline (airline_id) +); + +CREATE TABLE passenger ( + passenger_id INT NOT NULL, + passportno CHAR NOT NULL, + firstname CHAR NOT NULL, + lastname CHAR NOT NULL, + PRIMARY KEY (passenger_id), + UNIQUE KEY pass_unq (passportno) +); + +CREATE TABLE passengerdetails ( + passenger_id INT NOT NULL, + birthdate DATETIME NOT NULL, + sex CHAR, + street CHAR NOT NULL, + city CHAR NOT NULL, + zip INT NOT NULL, + country CHAR NOT NULL, + emailaddress CHAR, + telephoneno CHAR, + PRIMARY KEY (passenger_id), + CONSTRAINT passagierdetails_ibfk_1 FOREIGN KEY (passenger_id) REFERENCES passenger (passenger_id) ON DELETE CASCADE +); + +CREATE TABLE weatherdata ( + log_date DATETIME NOT NULL, + time DATETIME NOT NULL, + station INT NOT NULL, + temp REAL NOT NULL, + humidity REAL NOT NULL, + airpressure REAL NOT NULL, + wind REAL NOT NULL, + --weather enum('Nebel-Schneefall','Schneefall','Regen','Regen-Schneefall','Nebel-Regen','Nebel-Regen-Gewitter','Gewitter','Nebel','Regen-Gewitter'), + winddirection INT NOT NULL, + PRIMARY KEY (log_date,time,station) +); + +CREATE FUNCTION SUM(column REAL) AS REAL; +`; diff --git a/hugo/assets/scripts/sql/language-server.ts b/hugo/assets/scripts/sql/language-server.ts new file mode 100644 index 00000000..7c4a8381 --- /dev/null +++ b/hugo/assets/scripts/sql/language-server.ts @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright 2022-2023 TypeFox GmbH + * This program and the accompanying materials are made available under the + * terms of the MIT License, which is available in the project root. + ******************************************************************************/ + +import { startLanguageServer, EmptyFileSystem } from "langium"; +import { + createConnection, + BrowserMessageReader, + BrowserMessageWriter, +} from "vscode-languageserver/browser"; +import { createSqlServices } from "langium-sql"; +import { MySqlDialectTypes } from "langium-sql/lib/dialects/mysql/data-types"; +import { DialectTypes } from "langium-sql/lib/sql-data-types"; + +/* browser specific setup code */ +const messageReader = new BrowserMessageReader(self); +const messageWriter = new BrowserMessageWriter(self); + +const connection = createConnection(messageReader, messageWriter); + +// Inject the shared services and language-specific services +const { shared } = createSqlServices({ + connection, + ...EmptyFileSystem, + module: { dialect: { dataTypes: () => new DialectTypes(MySqlDialectTypes) } }, +}); + +// Start the language server with the shared services +startLanguageServer(shared); diff --git a/hugo/assets/scripts/sql/ui.tsx b/hugo/assets/scripts/sql/ui.tsx new file mode 100644 index 00000000..8cdacf04 --- /dev/null +++ b/hugo/assets/scripts/sql/ui.tsx @@ -0,0 +1,126 @@ +import { addMonacoStyles, createUserConfig, MonacoEditorReactComp, UserConfig } from "langium-website-core/bundle"; +import { buildWorkerDefinition } from "monaco-editor-workers"; +import React from "react"; +import { createRoot } from "react-dom/client"; +import { + DocumentChangeResponse, +} from "../langium-utils/langium-ast"; +import { + defaultText, + syntaxHighlighting, +} from "./constants"; + +addMonacoStyles('monaco-styles-helper'); + +buildWorkerDefinition( + "../../libs/monaco-editor-workers/workers", + new URL("", window.location.href).href, + false +); + +let userConfig: UserConfig; + +class App extends React.Component<{}> { + private monacoEditorLeft: React.RefObject; + constructor(props) { + super(props); + + // bind 'this' ref for callbacks to maintain parent context + this.onMonacoLoad = this.onMonacoLoad.bind(this); + this.onDocumentChange = this.onDocumentChange.bind(this); + this.monacoEditorLeft = React.createRef(); + } + + /** + * Callback that is invoked when Monaco is finished loading up. + * Can be used to safely register notification listeners, retrieve data, and the like + * + * @throws Error on inability to ref the Monaco component or to get the language client + */ + onMonacoLoad(editor: React.RefObject) { + // verify we can get a ref to the editor + if (!editor.current) { + throw new Error("Unable to get a reference to the Monaco Editor"); + } + + // verify we can get a ref to the language client + const lc = editor.current + ?.getEditorWrapper() + ?.getLanguageClient(); + if (!lc) { + throw new Error("Could not get handle to Language Client on mount"); + } + + // register to receive DocumentChange notifications + lc.onNotification("browser/DocumentChange", this.onDocumentChange); + } + + /** + * Callback invoked when the document processed by the LS changes + * Invoked on startup as well + * @param resp Response data + */ + onDocumentChange(resp: DocumentChangeResponse) { + // // decode the received Ast + // const statemachineAst = new LangiumAST().deserializeAST( + // resp.content + // ) as StateMachineAstNode; + // this.preview.current?.startPreview(statemachineAst, resp.diagnostics); + } + + render() { + const style = { + paddingTop: "5px", + }; + return ( +
+ this.onMonacoLoad(this.monacoEditorLeft)} + style={style} + /> +
+

Langium/SQL

+

+ This is a showcase of Langium/SQL. The editor above + is a Monaco editor driven by our SQL language server. The current setup mimics MySQL. +

+

Features

+

+

    +
  • Schema-driven: Add a set of table definitions to spread out the world for your SELECT queries. The table definitions can be located in a different file of the same workspace. You can keep definitions and queries separated.
  • +
  • Code completion: Press Ctrl + Space keys to trigger the completion directly. You will get suggestions for the current context.
  • +
  • Syntax highlighting: to distinguish what are keywords, identifiers, numeric literals and for a better perception of the SQL syntax.
  • +
  • Symbol search: Use Cmd or Ctrl + mouse click on a column name to find the definition of it or explore the places where a column is used.
  • +
  • Fast feedback about contextual correctness: Whether referenced columns exist or types on certain operators are matching.
  • +
  • Super-set approach: Any piece of any dialect that is missing can be added to the main grammar and be protected from other dialects using validations.
  • +
  • Highly customizable: Any behavior or aspect that is missing for your specific use case can be easily overwritten.
  • +
+

+

About the given SQL document

+

+ The document contains the database schema of an airport. It is a copy of the Flughafen DB by Stefan Proell, Eva Zangerle, Wolfgang Gassler + whose original code is located here. The document itself is licensed under + CC BY 4.0. To view a copy of this license, visit here. +

+
+
+ ); + } +} + +// setup the global config before rendering +userConfig = createUserConfig({ + languageId: 'sql', + code: defaultText, + htmlElement: document.getElementById('root')!, + worker: '../../showcase/libs/worker/sqlServerWorker.js', + monarchGrammar: syntaxHighlighting +}); + +const element = document.getElementById("root") as HTMLElement; +element.className = 'w-full' +const root = createRoot(element); +root.render(); diff --git a/hugo/assets/scripts/statemachine/statemachine-tools.ts b/hugo/assets/scripts/statemachine/statemachine-tools.ts index 94195ee1..72003e51 100644 --- a/hugo/assets/scripts/statemachine/statemachine-tools.ts +++ b/hugo/assets/scripts/statemachine/statemachine-tools.ts @@ -1,5 +1,4 @@ -import { monaco } from "@typefox/monaco-editor-react/."; -import { AstNode } from "../langium-utils/langium-ast"; +import { AstNode } from "langium-ast-helper"; export class StateMachineTools { currentState: StateMachineState; @@ -133,50 +132,6 @@ export type StateMachineState = { } }[] }; - -export const syntaxHighlighting = { - keywords: [ - "actions", - "commands", - "end", - "events", - "initialState", - "state", - "statemachine", - ], - - // The main tokenizer for our languages - tokenizer: { - root: [ - // identifiers and keywords - [ - /[a-z_$][\w$]*/, - { - cases: { - "@keywords": "keyword", - "@default": "identifier", - }, - }, - ], - - // whitespace - { include: "@whitespace" }, - ], - - comment: [ - [/[^\/*]+/, "comment"], - [/\/\*/, "comment", "@push"], // nested comment - ["\\*/", "comment", "@pop"], - [/[\/*]/, "comment"], - ], - - whitespace: [ - [/[ \t\r\n]+/, "white"], - [/\/\*/, "comment", "@comment"], - [/\/\/.*$/, "comment"], - ], - }, - } as monaco.languages.IMonarchLanguage; export const defaultText = `// Create your own statemachine here! statemachine TrafficLight @@ -204,4 +159,4 @@ end state GreenLight switchCapacity => PowerOff next => YellowLight -end`; \ No newline at end of file +end`; diff --git a/hugo/assets/scripts/statemachine/statemachine.tsx b/hugo/assets/scripts/statemachine/statemachine.tsx index 30bd5a6b..75ee5284 100644 --- a/hugo/assets/scripts/statemachine/statemachine.tsx +++ b/hugo/assets/scripts/statemachine/statemachine.tsx @@ -1,19 +1,18 @@ -import { - MonacoEditorReactComp, - addMonacoStyles, -} from "@typefox/monaco-editor-react/bundle"; +import { addMonacoStyles, createUserConfig, MonacoEditorReactComp, UserConfig } from "langium-website-core/bundle"; import { buildWorkerDefinition } from "monaco-editor-workers"; import React from "react"; import { createRoot } from "react-dom/client"; -import { Diagnostic, DocumentChangeResponse, LangiumAST } from "../langium-utils/langium-ast"; -import { defaultText, StateMachineAstNode, StateMachineState, StateMachineTools, syntaxHighlighting } from "./statemachine-tools"; +import { defaultText, StateMachineAstNode, StateMachineState, StateMachineTools } from "./statemachine-tools"; +import statemachineGrammar from 'langium-statemachine-dsl/syntaxes/statemachine.tmLanguage.json'; +import { deserializeAST, Diagnostic, DocumentChangeResponse } from "langium-ast-helper"; + +addMonacoStyles('monaco-styles-helper'); buildWorkerDefinition( "../../libs/monaco-editor-workers/workers", new URL("", window.location.href).href, false ); -addMonacoStyles("monaco-editor-styles"); interface StateProps { name: string; @@ -40,12 +39,13 @@ class State extends React.Component { name: props.name, isActive: props.isActive, }; + this.stateRef = React.createRef(); } /** * set the state to active or inactive - * @param active true if the event should be aktive + * @param active true if the event should be active */ setActive(active: boolean) { this.setState({ isActive: active }); @@ -59,12 +59,12 @@ class State extends React.Component { ref={this.stateRef} > {this.state.isActive ? ( -
- {this.state.name} +
+ {this.props.name}
) : (
- {this.state.name} + {this.props.name}
)}
@@ -94,7 +94,7 @@ class Event extends React.Component { ); @@ -113,7 +113,7 @@ class Preview extends React.Component { } startPreview(ast: StateMachineAstNode, diagnostics: Diagnostic[]) { - this.setState({astNode: ast, diagnostics: diagnostics }); + this.setState({ astNode: ast, diagnostics: diagnostics }); } render() { @@ -130,24 +130,25 @@ class Preview extends React.Component { } // if the code doesn't contain any errors - if (this.state.diagnostics == null || (this.state.diagnostics.length == 0)) { - let states: State[] = []; - let events: Event[] = []; + if (this.state.diagnostics == null || this.state.diagnostics.filter((i) => i.severity === 1).length == 0) { + const statemachineTools = new StateMachineTools(this.state.astNode); + + const states: State[] = []; + const events: Event[] = []; - let statemachineTools = new StateMachineTools(this.state.astNode); // update the aktive state - const changeStates = function(state: StateMachineState) { + const changeStates = function (state: StateMachineState) { statemachineTools.setState(state); - + // loop through all states and set the active state events.forEach((i) => { i.setEnabled(statemachineTools.isEventEnabled(statemachineTools.getEventByName(i.props.name)!)); }); - + states.forEach((i) => { i.setActive(statemachineTools.isCurrentState(statemachineTools.getStateByName(i.props.name)!)); }); - + } return ( @@ -165,7 +166,7 @@ class Preview extends React.Component { > ); })} - +

States

{ // loop through every state and display it check if the state is active @@ -189,21 +190,24 @@ class Preview extends React.Component { return (
- {this.state.diagnostics.map((diagnostic, index) => -
- {`Line ${diagnostic.range.start.line}-${diagnostic.range.end.line}: ${diagnostic.message}`} -

Source: {diagnostic.source} | Code: {diagnostic.code}

-
- )} + {this.state.diagnostics.filter((i) => i.severity === 1).map((diagnostic, index) => +
+ {`Line ${diagnostic.range.start.line + 1}-${diagnostic.range.end.line + 1}: ${diagnostic.message}`} +

Source: {diagnostic.source} | Code: {diagnostic.code}

+
+ )}
); } } -class App extends React.Component<{}> { +class StateMachineComponent extends React.Component<{ + langiumConfig: UserConfig +}> { monacoEditor: React.RefObject; preview: React.RefObject; + constructor(props) { super(props); @@ -245,41 +249,52 @@ class App extends React.Component<{}> { */ onDocumentChange(resp: DocumentChangeResponse) { // decode the received Ast - const statemachineAst = new LangiumAST().deserializeAST(resp.content) as StateMachineAstNode; + const statemachineAst = deserializeAST(resp.content) as StateMachineAstNode; this.preview.current?.startPreview(statemachineAst, resp.diagnostics); } render() { const style = { - paddingTop: "5px", height: "100%", width: "100%", }; return ( -
-
-
+
+
+
+ Editor +
+
-
- +
+
+ Preview +
+
+ +
); } } +// setup config & render +const langiumGlobalConfig: UserConfig = createUserConfig({ + languageId: 'statemachine', + code: defaultText, + htmlElement: document.getElementById('root')!, + textmateGrammar: statemachineGrammar, + worker: '../../showcase/libs/worker/statemachineServerWorker.js' +}); + const root = createRoot(document.getElementById("root") as HTMLElement); -root.render(); +root.render(); diff --git a/hugo/config.toml b/hugo/config.toml index 925b916f..b54db004 100644 --- a/hugo/config.toml +++ b/hugo/config.toml @@ -2,9 +2,10 @@ baseURL = "/" title = "Langium" theme = "hugo-geekdoc" +# Required for publishing of previews as they are hosted in subdirs +relativeURLs = true + # Required to get well formatted code blocks -pygmentsUseClasses = true -pygmentsCodeFences = true disablePathToLower = true enableGitInfo = true # Required if you want to render robots.txt template @@ -14,6 +15,8 @@ enableRobotsTXT = true [markup.goldmark.renderer] # Needed for mermaid shortcode unsafe = true + [markup.highlight] + codeFences = false # Disable Hugo's code highlighter as it conflicts with prism's highligher. [markup.tableOfContents] startLevel = 1 endLevel = 9 @@ -24,6 +27,9 @@ enableRobotsTXT = true [build] noJSConfigInAssets = true + minify = true + [build.options] + sourceMap = true [params] # (Optional, default 6) Set how many table of contents levels to be showed on page. @@ -43,7 +49,7 @@ enableRobotsTXT = true # It can be either a remote url or a local file path relative to your content directory. # geekdocPrivacyPolicy = "https://www.typefox.io/imprint-privacy/#privacy" - geekdocRepo = "https://github.com/langium/langium-website" + geekdocRepo = "https://github.com/eclipse-langium/langium-website" geekdocEditPath = "blob/main/hugo/content" # (Optional, default true) Add an anchor link to headlines. diff --git a/hugo/content/docs/_index.md b/hugo/content/docs/_index.md index 4fc40cd8..9ab17e51 100644 --- a/hugo/content/docs/_index.md +++ b/hugo/content/docs/_index.md @@ -9,4 +9,4 @@ This reference documentation provides [an overview](/docs/langium-overview), a [ ## Want to contribute? -Visit the [Langium repository](https://github.com/langium/langium) to take part in improving Langium. +Visit the [Langium repository](https://github.com/eclipse-langium/langium) to take part in improving Langium. diff --git a/hugo/content/docs/configuration-services.md b/hugo/content/docs/configuration-services.md index 52f5b67a..8dbad125 100644 --- a/hugo/content/docs/configuration-services.md +++ b/hugo/content/docs/configuration-services.md @@ -21,16 +21,16 @@ The *language specific services* are services specific to one Langium language a * Utility services (e.g. `References`, `JsonSerializer`) ## Customization -If you have used the [Yeoman generator](https://www.npmjs.com/package/generator-langium), the entry point to services customization is found in the `src/language-server/...-module.ts` file, where '...' is the name of your language. There you can register new services or override the default implementations of services. Langium implements the *Inversion of Control* principle via the *Dependency Injection* pattern, which promotes loosely-coupled architectures, maintainability, and extensibility. +If you have used the [Yeoman generator](https://www.npmjs.com/package/generator-langium), the entry point to services customization is found in the `src/language/...-module.ts` file, where '...' is the name of your language. There you can register new services or override the default implementations of services. Langium implements the *Inversion of Control* principle via the *Dependency Injection* pattern, which promotes loosely-coupled architectures, maintainability, and extensibility. -For the following sections, we will use the [arithmetics example](https://github.com/langium/langium/tree/main/examples/arithmetics) to describe the procedure for replacing or adding services. Note that all names prefixed with *Arithmetics* should be understood as being specific to the language named *Arithmetics*, and in your project those services' names will be prefixed with your own language name. +For the following sections, we will use the [arithmetics example](https://github.com/eclipse-langium/langium/tree/main/examples/arithmetics) to describe the procedure for replacing or adding services. Note that all names prefixed with *Arithmetics* should be understood as being specific to the language named *Arithmetics*, and in your project those services' names will be prefixed with your own language name. Please note that it is *not mandatory* to implement all custom code via dependency injection. The main reason for using dependency injection is when your custom code *depends* on other services. In many cases you can use plain functions instead of service classes to implement your application logic. ### Overriding and Extending Services Thanks to the dependency injection pattern used in Langium, your can change the behavior of a service or add to its functionality in one place without having to modify every piece of code that depends on the service to be overridden or extended. -The [arithmetics example](https://github.com/langium/langium/tree/main/examples/arithmetics) provides a custom implementation of the `ScopeProvider` service, which overrides functionalities from the default implementation `DefaultScopeProvider`. +The [arithmetics example](https://github.com/eclipse-langium/langium/tree/main/examples/arithmetics) provides a custom implementation of the `ScopeProvider` service, which overrides functionalities from the default implementation `DefaultScopeProvider`. First, we need to register the new implementation of `ScopeProvider` inside of the `ArithmeticsModule`: @@ -135,6 +135,23 @@ export class ServiceClass { } ``` +#### Resolving cyclic dependencies + +In case one of the services the `ServiceClass` above depends on, also has a dependency back to the `ServiceClass`, your module will throw an error similar to this: `Cycle detected. Please make "ServiceClass" lazy.` Ideally, such cyclic dependencies between services should be avoided. Sometimes, cycles are unavoidable though. In order to make them lazy, assign a lambda function that returns the service in the constructor. You can then invoke this function in your service logic to get access to the depending service: +```Typescript +export class ServiceClass { + private readonly serviceOne: () => ServiceOne; + + constructor(services: ArithmeticsServices) { + this.serviceOne = () => services.ServiceOne; // <-- lazy evaluated service + } + /* service logic */ + method() { + this.serviceOne().methodOne(); + } +} +``` + #### Using ArithmeticsValidator in other services The `ArithmeticsValidator` needs to be registered inside of the `ValidationRegistry`. This done by [overriding](#overriding-and-extending-services) `ValidationRegistry` with `ArithmeticsValidationRegistry`. diff --git a/hugo/content/docs/document-lifecycle.md b/hugo/content/docs/document-lifecycle.md index 227a1b05..3672e486 100644 --- a/hugo/content/docs/document-lifecycle.md +++ b/hugo/content/docs/document-lifecycle.md @@ -72,7 +72,7 @@ Local scope computation consists of gathering all symbols contained in the AST, The default implementation of the `ScopeComputation` service attaches the description of every symbol to its direct container. This means that the container holds information about which named nodes are nested inside of it. You can override this default behavior to change the position where a symbol is reachable, or to change the name by which it can be referenced. It is even possible to associate the same symbol to multiple container nodes, possibly with different names, to control precisely where and how references to it can be resolved. However, keep in mind that you cannot access any cross-references in this phase. More complex, context-dependent scope mechanisms can be implemented in the `ScopeProvider` (see [next section](#linking)). -The *"Domainmodel"* example includes a [customization of scopes precomputation](https://github.com/langium/langium/blob/main/examples/domainmodel/src/language-server/domain-model-scope.ts) where every *entity* contained in a *package declaration* is exposed using its *qualified name*, that is the concatenation of the package name and entity name separated with `.` (similar to Java). +The *"Domainmodel"* example includes a [customization of scopes precomputation](https://github.com/eclipse-langium/langium/blob/main/examples/domainmodel/src/language-server/domain-model-scope.ts) where every *entity* contained in a *package declaration* is exposed using its *qualified name*, that is the concatenation of the package name and entity name separated with `.` (similar to Java). In languages with a type system, you would typically implement computation of types in an additional pre-processing step in order to make type information available in the document. This additional step can be registered to run after scope computation with the `onBuildPhase` method of `DocumentBuilder`. How types are computed heavily depends on the kind of type system, so there is no default implementation for it. diff --git a/hugo/content/docs/getting-started.md b/hugo/content/docs/getting-started.md index 9b06e233..cf53d7ee 100644 --- a/hugo/content/docs/getting-started.md +++ b/hugo/content/docs/getting-started.md @@ -5,7 +5,7 @@ weight: 50 Before diving into Langium itself, let's get your environment ready for development: -1. You have a working [Node environment](https://nodejs.org/en/download/) with version 12 or higher. +1. You have a working [Node environment](https://nodejs.org/en/download/) with version 16 or higher. 2. Install Yeoman and the Langium extension generator. ```bash npm i -g yo generator-langium @@ -45,7 +45,7 @@ person Bob Hello Bob! ``` -The file `src/language-server/hello-world.langium` in your newly created project contains your grammar. +The file `src/language/hello-world.langium` in your newly created project contains your grammar. ## Explaining the terms @@ -75,7 +75,7 @@ Here's the grammar that parses the previous text snippet: grammar HelloWorld hidden terminal WS: /\s+/; -terminal ID: /[_a-zA-Z][\w_]*/; +terminal ID: /[_a-zA-Z][\w]*/; entry Model: (persons+=Person | greetings+=Greeting)*; diff --git a/hugo/content/docs/grammar-language.md b/hugo/content/docs/grammar-language.md index 46cad0b7..45b933f2 100644 --- a/hugo/content/docs/grammar-language.md +++ b/hugo/content/docs/grammar-language.md @@ -2,7 +2,7 @@ title: "The Grammar Language" weight: 100 --- -The grammar language describes the syntax and structure of your language. The [Langium grammar language](https://github.com/langium/langium/blob/main/packages/langium/src/grammar/langium-grammar.langium) is implemented using Langium itself and therefore follows the same syntactic rules as any language created with Langium. The grammar language will define the structure of the *abstract syntax tree* (AST) which in Langium is a collection of *TypeScript types* describing the content of a parsed document and organized hierarchically. The individual nodes of the tree are then represented with JavaScript objects at runtime. +The grammar language describes the syntax and structure of your language. The [Langium grammar language](https://github.com/eclipse-langium/langium/blob/main/packages/langium/src/grammar/langium-grammar.langium) is implemented using Langium itself and therefore follows the same syntactic rules as any language created with Langium. The grammar language will define the structure of the *abstract syntax tree* (AST) which in Langium is a collection of *TypeScript types* describing the content of a parsed document and organized hierarchically. The individual nodes of the tree are then represented with JavaScript objects at runtime. In the following, we describe the Langium syntax and document structure. ## Language Declaration @@ -168,7 +168,7 @@ will result in an error message since the cross reference resolution will fail b #### Unassigned Rule Calls Parser rules do not necessarily need to create an object, they can also refer to other parser rules which in turn will be responsible for returning the object. -For example, in the [Arithmetics example](https://github.com/langium/langium/blob/main/examples/arithmetics/src/language-server/arithmetics.langium): +For example, in the [Arithmetics example](https://github.com/eclipse-langium/langium/blob/main/examples/arithmetics/src/language-server/arithmetics.langium): ```langium AbstractDefinition: Definition | DeclaredParameter; @@ -275,7 +275,7 @@ Please refer to [this blog post](https://www.typefox.io/blog/parsing-expressions ### Data Type Rules Data type rules are similar to terminal rules as they match a sequence of characters. However, they are parser rules and are therefore context-dependent. This allows for more flexible parsing, as they can be interspersed with hidden terminals, such as whitespaces or comments. Contrary to terminal rules, they cannot use *regular expressions* to match a stream of characters, so they have to be composed of keywords, terminal rules or other data type rules. -The following example from the [domain model example](https://github.com/langium/langium/blob/main/examples/domainmodel/src/language-server/domain-model.langium) uses the `QualifiedName` data type rule to enable references to other elements using their fully qualified name. +The following example from the [domain model example](https://github.com/eclipse-langium/langium/blob/main/examples/domainmodel/src/language-server/domain-model.langium) uses the `QualifiedName` data type rule to enable references to other elements using their fully qualified name. ```langium QualifiedName returns string: ID ('.' ID)*; diff --git a/hugo/content/docs/sematic-model.md b/hugo/content/docs/sematic-model.md index 6628e656..d612157e 100644 --- a/hugo/content/docs/sematic-model.md +++ b/hugo/content/docs/sematic-model.md @@ -20,7 +20,7 @@ The simplest way to write a parser rule is as follows: X: name=ID; ``` With this syntax, Langium will **infer** the type of the node to be generated when parsing the rule. By convention, the type of the node will be named after the name of the rule, resulting in this **TypeScript interface** in the semantic model: -```ts +```langium interface X extends AstNode { name: string } @@ -30,7 +30,7 @@ It is also possible to control the naming of the interface by using the followin X infers MyType: name=ID; ``` resulting in the following interface in the semantic model: -```ts +```langium interface MyType extends AstNode { name: string } @@ -45,7 +45,7 @@ X infers MyType: name=ID; Y infers MyType: name=ID count=INT; ``` This result in the creation of a single interface in the semantic model 'merging' the two parser rules with non-common properties made optional: -```ts +```langium interface MyType extends AstNode { count?: number name: string @@ -61,7 +61,7 @@ terminal ID returns string: /[a-zA-Z_][a-zA-Z0-9_]*/; X: name=ID count=INT; ``` -```ts +```langium // generated interface interface X extends AstNode { name: string @@ -79,7 +79,7 @@ QualifiedName returns string: ID '.' ID; X: name=QualifiedName; ``` -```ts +```langium // generated types type QualifiedName = string; @@ -99,7 +99,7 @@ There are three available kinds of [assignments](../grammar-language/#assignment X: name=ID numbers+=INT (numbers+=INT)* isValid?='valid'?; ``` -```ts +```langium // generated interface interface X extends AstNode { name: string @@ -120,7 +120,7 @@ X: 'x' name=ID; Y: crossValue=[X:ID] alt=(INT | X | [X:ID]); ``` -```ts +```langium // generated types interface X extends AstNode { name: string @@ -141,10 +141,9 @@ X: A | B; A: 'A' name=ID; B: 'B' name=ID count=INT; - ``` -```ts +```langium // generated types type X = A | B; @@ -173,7 +172,7 @@ A: 'A' name=ID; B: 'B' name=ID count=INT; ``` -```ts +```langium // generated types type X = A | B; @@ -191,7 +190,7 @@ interface B extends AstNode { Actions can also be used to control the structure of the semantic model types. This is a more advanced topic, so we recommend getting familiar with the rest of the documentation before diving into this section. -Let's consider two different grammars derived from the [Arithmetics example](https://github.com/langium/langium/blob/main/examples/arithmetics/src/language-server/arithmetics.langium). These grammars are designed to parse a document containing a single definition comprised of a name and an expression assignment, with an expression being any amount of additions or a numerical value. +Let's consider two different grammars derived from the [Arithmetics example](https://github.com/eclipse-langium/langium/blob/main/examples/arithmetics/src/language-server/arithmetics.langium). These grammars are designed to parse a document containing a single definition comprised of a name and an expression assignment, with an expression being any amount of additions or a numerical value. The first one does not use assigned actions: @@ -305,9 +304,11 @@ Y returns MyOtherType: name=ID count=INT; Explicitly declaring union types in the grammar is achieved with the keyword `type`: -```ts +```langium type X = A | B; +``` +```langium // generates: type X = A | B; ``` diff --git a/hugo/content/guides/builtin-library.md b/hugo/content/guides/builtin-library.md index 9e28780f..fb749d5c 100644 --- a/hugo/content/guides/builtin-library.md +++ b/hugo/content/guides/builtin-library.md @@ -39,10 +39,11 @@ export class HelloWorldWorkspaceManager extends DefaultWorkspaceManager { this.documentFactory = services.workspace.LangiumDocumentFactory; } - protected async loadAdditionalDocuments( + protected override async loadAdditionalDocuments( folders: WorkspaceFolder[], collector: (document: LangiumDocument) => void ): Promise { + await super.loadAdditionalDocuments(folders, collector); // Load our library using the `builtin` URI schema collector(this.documentFactory.fromString(builtinHelloWorld, URI.parse('builtin:///library.hello'))); } @@ -53,7 +54,9 @@ As a last step, we have to bind our newly created workspace manager: ```ts // Add this to the `hello-world-module.ts` included in the yeoman generated project -export const HelloWorldSharedModule: Module> = { +export type HelloWorldSharedServices = LangiumSharedServices; + +export const HelloWorldSharedModule: Module> = { workspace: { WorkspaceManager: (services) => new HelloWorldWorkspaceManager(services) } @@ -91,7 +94,7 @@ To fix this issue, we need to implement a custom `FileSystemProvider` on the cli ```ts import * as vscode from 'vscode'; -import { builtinHelloWorld } from './language-server/builtins'; +import { builtinHelloWorld } from './language/builtins'; export class DslLibraryFileSystemProvider implements vscode.FileSystemProvider { @@ -108,7 +111,7 @@ export class DslLibraryFileSystemProvider implements vscode.FileSystemProvider { return { ctime: date, mtime: date, - size: builtinHelloWorld.length, + size: Buffer.from(builtinHelloWorld).length, type: vscode.FileType.File }; } diff --git a/hugo/content/guides/code-bundling.md b/hugo/content/guides/code-bundling.md index dca1e53b..29089879 100644 --- a/hugo/content/guides/code-bundling.md +++ b/hugo/content/guides/code-bundling.md @@ -14,34 +14,44 @@ We generally recommend using [esbuild](https://esbuild.github.io/) to bundle Lan npm i --save-dev esbuild ``` -You can see a minimal configuration file below that bundles both your language server and your extension. It will run as a simple `node` script. +You can see a minimal configuration file below that bundles both your language server and your extension. + +```ts +//@ts-check +import * as esbuild from 'esbuild'; -```js const watch = process.argv.includes('--watch'); -const minify = process.argv.includes('--minify'); // Use this flag for production usage -const success = watch ? 'Watch build succeeded' : 'Build succeeded'; +const minify = process.argv.includes('--minify'); -require('esbuild').build({ - // Two entry points, one for the extension, one for the language server - entryPoints: ['src/extension.ts', 'src/language-server/main.ts'], - outdir: 'out', // All bundles are put into this directory - bundle: true, // We want to create bundles for the extension and language server - external: ['vscode'], // the vscode-module is created on-the-fly during runtime and must be excluded +const ctx = await esbuild.context({ + entryPoints: ['src/extension.ts', 'src/language/main.ts'], + outdir: 'out', + bundle: true, + target: "es6", + loader: { '.ts': 'ts' }, + external: ['vscode'], // the vscode-module is created on-the-fly and must be excluded. platform: 'node', // VSCode extensions run in a node process - sourcemap: !minify, // Sourcemaps help us debug our original TypeScript code even after bundling - watch: watch ? { - onRebuild(error) { - if (error) console.error('Watch build failed') - else console.log(success) - } - } : false, + sourcemap: !minify, minify -}) - .then(() => console.log(success)) - .catch(() => process.exit(1)); +}); + +if (watch) { + await ctx.watch(); +} else { + await ctx.rebuild(); + ctx.dispose(); +} +``` + +Store it in a module JavaScript file (`.mjs`) and create a corresponding script in your `package.json` file: + +```js +"scripts": { + "build": "node ./esbuild.mjs" +} ``` -If you want to use a Langium language server in the browser, you can get away with an even smaller setup with the following script in your `package.json` file: +If you want to use a Langium language server in the browser, you can get away with an even smaller setup with the following script: ```js "scripts": { @@ -86,9 +96,9 @@ const commonConfig = { } const lspConfig = { ...commonConfig, - entry: './src/language-server/main.ts', // the entry point of the language server + entry: './src/language/main.ts', // the entry point of the language server output: { - path: path.resolve(__dirname, 'out', 'language-server'), + path: path.resolve(__dirname, 'out', 'language'), filename: 'main.js', libraryTarget: 'commonjs2', devtoolModuleFilenameTemplate: '../../[resource-path]', diff --git a/hugo/content/guides/formatting.md b/hugo/content/guides/formatting.md index c4a913d8..5fec2a44 100644 --- a/hugo/content/guides/formatting.md +++ b/hugo/content/guides/formatting.md @@ -25,7 +25,7 @@ export const CustomModule: Module = { The entry point for the formatter is the abstract `format(AstNode)` method. The `AbstractFormatter` calls this method for every node of our model. To perform custom formatting for every type of node, we will use pattern matching. -In the following example, we will take a closer look at a formatter for the [domain-model](https://github.com/langium/langium/tree/main/examples/domainmodel) language. +In the following example, we will take a closer look at a formatter for the [domain-model](https://github.com/eclipse-langium/langium/tree/main/examples/domainmodel) language. In particular, we will see how we can format the root of our model (`DomainModel`) and each nested element (`Entity` and `PackageDeclaration`). To format each node, we use the `getNodeFormatter` method of the `AbstractFormatter`. The resulting generic `NodeFormatter` provides us with methods to select specific parts of a parsed `AstNode` such as properties or keywords. diff --git a/hugo/content/guides/multiple-languages.md b/hugo/content/guides/multiple-languages.md new file mode 100644 index 00000000..e9b0ee0d --- /dev/null +++ b/hugo/content/guides/multiple-languages.md @@ -0,0 +1,440 @@ +--- +title: "Multiple dependent languages" +weight: 400 +--- + +This guide is about integrating multiple dependent languages in one Langium project. + +One common situation where it makes sense to create dependent languages is when you only want to read concepts in one language and predefine them in another file (probably also a built-in one). Think of splitting SQL into a defining `CREATE TABLE table (...)`) and a reading part (`SELECT * FROM table`). + +> Notice that for `n` independent languages, you can simply create `n` independent Langium projects. + +If you want to see a living example, I recommend to visit the [`requirements` example](https://github.com/eclipse-langium/langium/tree/main/examples/requirements) of the main [Langium repository](https://github.com/eclipse-langium/langium). + +## Our plan + +The entire change touches several files. Let's summarize what needs to be done: + +1. the **grammar** (the `*.langium` file) needs to be split into the three parts that were discussed above +2. the **Langium configuration** (the `langium-config.json` file in the Langium project root) needs to split the language configuration into three parts +3. the **module file** of your language (`XXX-module.ts`) needs to create the new language services as well. +4. Last, but not least, you have to **cleanup all dependent files**. Here we can give general hints. +5. if you have a **VSCode extension** + 1. the `package.json` needs to be adapted + 2. the extension entry point file (`src/extension/main.ts`) needs to be changed slightly + + +## Our scenario + +To keep this guide easy, I will use the [`hello-world` project](/docs/getting-started/). + +Let’s imagine that we have three languages: + +* the first language **defines** persons +* the second language **greets** persons of the first language +* the third language **configures** which person you are + +Just as a finger practice, let's require that you cannot greet yourself. + +{{}} +flowchart + Implementation -->|requires| Definition + Configuration -->|requires| Definition + Implementation -->|requires| Configuration +{{}} + +## Let's start! + +### Grammar + +The most relevant change might be in the grammar. Here is the original grammar from the `hello-world` example, which is generated by Langium's Yeoman generator: + +```langium +grammar MultipleLanguages + +entry Model: + (persons+=Person | greetings+=Greeting)*; + +Person: + 'person' name=ID; + +Greeting: + 'Hello' person=[Person:ID] '!'; + +hidden terminal WS: /\s+/; +terminal ID: /[_a-zA-Z][\w_]*/; +terminal INT returns number: /[0-9]+/; +terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/; + +hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//; +hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; +``` + +Now, split it into three new files (let's call the entry rules units and the files we can name like `multiple-languages-(configuration|definition|implementation).langium`): + +Our definition grammar: +```langium +grammar MultiDefinition + +entry DefinitionUnit: + (persons+=Person)*; + +Person: + 'person' name=ID; + +hidden terminal WS: /\s+/; +terminal ID: /[_a-zA-Z][\w_]*/; + +hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//; +hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; +``` + +Our configuration grammar (note the import): +```langium +grammar MultiConfiguration + +import "multiple-languages-definition"; + +entry ConfigurationUnit: 'I' 'am' who=[Person:ID] '.'; +``` + +Our implementation grammar (note the import again): +```langium +grammar MultiImplementation + +import "multiple-languages-definition"; + +entry ImplementationUnit: + (greetings+=Greeting)*; + +Greeting: + 'Hello' person=[Person:ID] '!'; +``` + +### Langium configuration + +Splitting the grammar alone is not sufficient to generate anything using the CLI. You need to change the `langium-config.json` in the root folder as well. Let's make it happen! + +The initial version of this file was: + +```js +{ + "projectName": "MultipleLanguages", + "languages": [{ + "id": "multiple-languages", + "grammar": "src/language/multiple-languages.langium", + "fileExtensions": [".hello"], + "textMate": { + "out": "syntaxes/multiple-languages.tmLanguage.json" + }, + "monarch": { + "out": "syntaxes/multiple-languages.monarch.ts" + } + }], + "out": "src/language/generated" +} +``` + +The actual change is simple: Triple the object in the `languages` list and fill in reasonable values. Like here: + +```js +{ + "projectName": "MultipleLanguages", + "languages": [{ + "id": "multiple-languages-configuration", + "grammar": "src/language/multiple-languages-configuration.langium", + "fileExtensions": [".me"], + "textMate": { + "out": "syntaxes/multiple-languages-configuration.tmLanguage.json" + }, + "monarch": { + "out": "syntaxes/multiple-languages-configuration.monarch.ts" + } + }, { + "id": "multiple-languages-definition", + "grammar": "src/language/multiple-languages-definition.langium", + "fileExtensions": [".who"], + "textMate": { + "out": "syntaxes/multiple-languages-definition.tmLanguage.json" + }, + "monarch": { + "out": "syntaxes/multiple-languages-definition.monarch.ts" + } + }, { + "id": "multiple-languages-implementation", + "grammar": "src/language/multiple-languages-implementation.langium", + "fileExtensions": [".hello"], + "textMate": { + "out": "syntaxes/multiple-languages-implementation.tmLanguage.json" + }, + "monarch": { + "out": "syntaxes/multiple-languages-implementation.monarch.ts" + } + }], + "out": "src/language/generated" +} +``` + +From now on you are able to run the Langium CLI using the NPM scripts (`npm run langium:generate`). It will generate one file for the abstract syntax tree (AST) containing all languages concepts (it is also a good idea to keep the names of these concepts disjoint). + +For the next step you need to run the Langium generator once: + +```sh +npm run langium:generate +``` + +### Language module file + +The module file describes how your language services are built. +After adding two more languages, some important classes get generated - which need to be registered properly. + +1. Open the module file (`/src/language/multiple-languages-module.ts`). +2. You will notice a wrong import (which is ok, we renamed it in the previous steps and derived new classes by code generation). +3. Import the new generated modules instead. + Replace this line: + ```ts + import { + MultipleLanguagesGeneratedModule, + MultipleLanguagesGeneratedSharedModule + } from './generated/module.js'; + ``` + with the following: + ```ts + import { + MultiConfigurationGeneratedModule, + MultiDefinitionGeneratedModule, + MultiImplementationGeneratedModule, + MultipleLanguagesGeneratedSharedModule + } from './generated/module.js'; + ``` +4. In the function `createMultipleLanguagesServices` you will notice an error line now, because we deleted the old class name in the previous step. The code there needs to basically be tripled. But before we do this, we need to define the new output type of `createMultipleLanguagesServices`. In the end this should lead to this definition: + ```ts + export function createMultipleLanguagesServices(context: DefaultSharedModuleContext): { + shared: LangiumSharedServices, + Configuration: MultipleLanguagesServices, + Definition: MultipleLanguagesServices, + Implementation: MultipleLanguagesServices + } { + const shared = inject( + createDefaultSharedModule(context), + MultipleLanguagesGeneratedSharedModule + ); + const Configuration = inject( + createDefaultModule({ shared }), + MultiConfigurationGeneratedModule, + MultipleLanguagesModule + ); + const Definition = inject( + createDefaultModule({ shared }), + MultiDefinitionGeneratedModule, + MultipleLanguagesModule + ); + const Implementation = inject( + createDefaultModule({ shared }), + MultiImplementationGeneratedModule, + MultipleLanguagesModule + ); + shared.ServiceRegistry.register(Configuration); + shared.ServiceRegistry.register(Definition); + shared.ServiceRegistry.register(Implementation); + registerValidationChecks(Configuration); + registerValidationChecks(Definition); + registerValidationChecks(Implementation); + return { shared, Configuration, Definition, Implementation }; + } + ``` + +After this step, Langium is set up correctly. But if you try to build now, the compiler will throw you some errors, because the old concepts of the AST are not existing anymore. + +> Be aware of the fact that we are using `MultipleLanguagesModule` in all three services, three independent services! If you want to avoid this (because of duplicated state etc.), you should put some work into creating instances for each service. + +### Cleanup + +Let's clean up the error lines. Here are some general hints: + +* keep in mind, that you are dealing with three file types now, namely `*.me`, `*.who` and `*.hello` + * you can distinguish them very easily by selecting the right sub service from the result object of `createMultipleLanguagesServices`, which is either `Configuration`, `Definition` or `Implementation`, but not `shared` + * all these services have a sub service with file extensions: `[Configuration,Definition,...].LanguageMetaData.fileExtensions: string[]` + * so, when you are obtaining any documents from the `DocumentBuilder` you can be sure that they are parsed by the matching language service + * to distinguish them on your own, use the AST functions for determining the root type, for example for the Configuration language use `isConfigurationUnit(document.parseResult.value)` + +### VSCode extension + +If you have a VSCode extension, you need to touch two files: `package.json` and `src/extension/main.ts`. + +#### File `package.json` + +In this file we define what services this extension will contribute to VSCode. + +Before the change only one language and grammar was defined: + +```js +//... +"contributes": { + "languages": [ + { + "id": "multiple-languages", + "aliases": [ + "Multiple Languages", + "multiple-languages" + ], + "extensions": [".hello"], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "multiple-languages", + "scopeName": "source.multiple-languages", + "path": "./syntaxes/multiple-languages.tmLanguage.json" + } + ] +}, +//... +``` + +After the change, we tripled the information. Be aware of that the language ids must match the ids from the Langium configuration. Also make sure that the paths to the syntax files and the language configuration are correct. + +> For the language configuration for VSCode, we reused the old file three times. If you want to make a more precise configuration per language, you should also split this file. But let's use the same for a moment and for simplicity. + +```js +//... +"contributes": { + "languages": [ + { + "id": "multiple-languages-configuration", + "aliases": [ + "Multiple Languages Configuration", + "multiple-languages-configuration" + ], + "extensions": [".me"], + "configuration": "./language-configuration.json" + }, { + "id": "multiple-languages-definition", + "aliases": [ + "Multiple Languages Definition", + "multiple-languages-definition" + ], + "extensions": [".who"], + "configuration": "./language-configuration.json" + }, { + "id": "multiple-languages-implementation", + "aliases": [ + "Multiple Languages Implementation", + "multiple-languages-implementation" + ], + "extensions": [".hello"], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "multiple-languages-configuration", + "scopeName": "source.multiple-languages-configuration", + "path": "./syntaxes/multiple-languages-configuration.tmLanguage.json" + }, + { + "language": "multiple-languages-definition", + "scopeName": "source.multiple-languages-definition", + "path": "./syntaxes/multiple-languages-definition.tmLanguage.json" + }, + { + "language": "multiple-languages-implementation", + "scopeName": "source.multiple-languages-implementation", + "path": "./syntaxes/multiple-languages-implementation.tmLanguage.json" + } + ] +}, +``` + +#### File `src/extension/main.ts` + +And here is the extension file before the change: + +```ts +// Options to control the language client +const clientOptions: LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'multiple-languages' }] +}; +``` + +After the change, it should look like this (the language IDs should be the same as they are in the Langium configuration): + +```ts +// Options to control the language client +const clientOptions: LanguageClientOptions = { + documentSelector: [ + { scheme: 'file', language: 'multiple-languages-configuration' }, + { scheme: 'file', language: 'multiple-languages-definition' }, + { scheme: 'file', language: 'multiple-languages-implementation' } + ] +}; +``` + +## Test the extension! + +Now everything should be executable. **Do not forget to build**! + +Let's run the extension and create some files in our workspace: + +### Definition `people.who` + +``` +person Markus +person Michael +person Frank +``` + +### Configuration `thats.me` + +``` +I am Markus. +``` + +### Implementation `greetings.hello` + +``` +Hello Markus! +Hello Michael! +``` + +## Checklist + +You should be able now...: +* to see proper syntax highlighting +* to trigger auto completion for keywords +* to jump to the definition by Cmd/Ctrl-clicking on a person's name + +# Add a validator (task) + +As promised, let's add a simple validation rule, that you cannot greet yourself. Therefore we enter our name in the `thats.me` file like we did in the previous step. + +Try to include the following code to our validator. This is meant as task, try to find the missing pieces on your own :-). + +```ts +checkNotGreetingYourself(greeting: Greeting, accept: ValidationAcceptor): void { + const document = getDocument(greeting); + const configFilePath = join(document.uri.fsPath, '..', 'thats.me'); + const configDocument = this.documents.getOrCreateDocument(URI.file(configFilePath)); + if (greeting.person.ref) { + if (configDocument && isConfigurationUnit(configDocument.parseResult.value)) { + if(configDocument.parseResult.value.who.ref === greeting.person.ref) { + accept('warning', 'You cannot greet yourself 🙄!', { node: greeting, property: 'person' }); + } + } + } +} +``` + +After doing so, your name should display a warning, stating that you cannot greet yourself. + +# Troubleshooting + +In this section we will list common mistakes. + +* One prominent mistake is forgetting to build Langium and Typescript files, before running the extension. + +* Since we are basically just copy-pasting given configuration, be aware of what you are pasting. Make sure that the code still makes sense after copying. You probably forgot to adapt the pasted code. + +If you encounter any problems, we are happy to help in our [discussions](https://github.com/eclipse-langium/langium/discussions) page or our [issue tracker](https://github.com/eclipse-langium/langium/issues). + diff --git a/hugo/content/guides/scoping/qualified-name.md b/hugo/content/guides/scoping/qualified-name.md index 5ef4dd59..528006d5 100644 --- a/hugo/content/guides/scoping/qualified-name.md +++ b/hugo/content/guides/scoping/qualified-name.md @@ -152,7 +152,7 @@ export class CppScopeComputation extends DefaultScopeComputation { ``` This new change now allows us to use local names of functions in the local scope, while they are still exported using their fully qualified name to the global scope. -Another example for this style of scoping can be seen in the [domain-model example language](https://github.com/langium/langium/tree/main/examples/domainmodel). +Another example for this style of scoping can be seen in the [domain-model example language](https://github.com/eclipse-langium/langium/tree/main/examples/domainmodel). Also, click the following note to see the full implementation of the scope computation service.
diff --git a/hugo/content/imprint.html b/hugo/content/imprint.html index d0caf6e7..87d1d250 100644 --- a/hugo/content/imprint.html +++ b/hugo/content/imprint.html @@ -102,7 +102,7 @@

Support - + GitHub diff --git a/hugo/content/playground/Tree.tsx b/hugo/content/playground/Tree.tsx index 024a941d..2b15c1fd 100644 --- a/hugo/content/playground/Tree.tsx +++ b/hugo/content/playground/Tree.tsx @@ -11,11 +11,16 @@ import { preprocessAstNodeObject, PropertyNode, ValueNode } from "./preprocess"; import { clsx } from "clsx"; import { AstNodeLocator } from "langium/lib/workspace/ast-node-locator"; +export let treeRoot: ReactDOM.Root; + export function render(root: AstNode, locator: AstNodeLocator) { const location = document.getElementById("ast-body")!; const data = preprocessAstNodeObject(root, locator); - console.log(data) - ReactDOM.createRoot(location).render( + if (!treeRoot) { + // create a fresh root, if not already present + treeRoot = ReactDOM.createRoot(location); + } + treeRoot.render(
diff --git a/hugo/content/playground/_index.html b/hugo/content/playground/_index.html index 109a9508..d005d41b 100644 --- a/hugo/content/playground/_index.html +++ b/hugo/content/playground/_index.html @@ -14,31 +14,37 @@ + \ No newline at end of file diff --git a/hugo/content/playground/common.ts b/hugo/content/playground/common.ts index b66a037d..2cfc45e9 100644 --- a/hugo/content/playground/common.ts +++ b/hugo/content/playground/common.ts @@ -5,315 +5,315 @@ ******************************************************************************/ import { - LangiumInitialContent, + HelloWorldGrammar, LangiumMonarchContent, - StateMachineInitialContent, + DSLInitialContent, } from "./data"; import { generateMonarch } from "./monarch-generator"; import { decompressFromEncodedURIComponent } from 'lz-string'; -import { Diagnostic } from "vscode-languageserver"; -import { ByPassingMessageReader, ByPassingMessageWriter, MonacoConnection, MonacoEditorResult } from "./monaco-utils"; -import { AstNode, createServicesForGrammar } from "langium"; +import { Disposable } from "vscode-languageserver"; +import { DefaultAstNodeLocator, createServicesForGrammar } from "langium"; import { render } from './Tree'; -import { overlay } from "./utils"; -import { DefaultAstNodeLocator } from "langium/lib/workspace/ast-node-locator"; -export { share, overlay } from './utils' +import { overlay, throttle } from "./utils"; +import { addMonacoStyles, createUserConfig, MonacoEditorLanguageClientWrapper } from "langium-website-core/bundle"; +import { DocumentChangeResponse } from "../../assets/scripts/langium-utils/langium-ast"; -export type PlaygroundMessageType = "validated" | "changing" | "error" | "ast"; +export { share, overlay } from './utils'; +export { addMonacoStyles, MonacoEditorLanguageClientWrapper }; -export interface PlaygroundMessageBase { - type: PlaygroundMessageType; +export interface PlaygroundParameters { + grammar: string; + content: string; } -export interface PlaygroundError extends PlaygroundMessageBase { - type: "error"; - errors: Diagnostic[]; -} +/** + * Current langium grammar in the playground + */ +let currentGrammarContent = ''; -export interface PlaygroundAst extends PlaygroundMessageBase { - type: "ast"; - root: AstNode; -} +/** + * Current DSL program in the playground + */ -export interface PlaygroundOK extends PlaygroundMessageBase { - type: "validated"; - grammar: string; -} - -export interface PlaygroundChanging extends PlaygroundMessageBase { - type: "changing"; -} +let currentDSLContent = ''; -export type PlaygroundMessage = - | PlaygroundChanging - | PlaygroundError - | PlaygroundOK - | PlaygroundAst; +/** + * DSL wrapper, allowing us to quickly access the current in-model code + */ +let dslWrapper: MonacoEditorLanguageClientWrapper | undefined = undefined; -export interface MessageBase { - jsonrpc: "2.0"; -} +/** + * Update delay for new grammars & DSL programs to be processed + * Any new updates occurring during this delay will cause an existing update to be cancelled, + * and will reset the delay again + */ +const languageUpdateDelay = 150; -export interface Request extends MessageBase { - method: string; - params?: any[]; - id: string; -} +/** + * Counter for language ids, which are incremented on each change + */ +let nextIdCounter = 0; -export interface ResponseOK extends MessageBase { - result: any; - id: string; -} -export interface ResponseError extends MessageBase { - error: any; - id: string; +/** + * Helper for retrieving the next language id to use, to avoid conflicting with prior ones + */ +function nextId(): string { + return (nextIdCounter++).toString(); } -export interface Notification extends MessageBase { - method: string; - params?: any[]; -} -export interface PlaygroundParameters { - grammar: string; - content: string; +/** + * Helper to retrieve the current grammar & program in the playground. + * Typically used to generate a save link to this state + */ +export function getPlaygroundState(): PlaygroundParameters { + return { + grammar: currentGrammarContent, + content: currentDSLContent + }; } -export function isNotification(msg: Message): msg is Notification { - return !msg["id"] && msg["method"]; -} -type Message = Request | ResponseError | ResponseOK | Notification; +/** + * Starts the playground + * + * @param leftEditor Left editor element + * @param rightEditor Right editor element + * @param encodedGrammar Encoded grammar to optionally use + * @param encodedContent Encoded content to optionally use + */ +export async function setupPlayground( + leftEditor: HTMLElement, + rightEditor: HTMLElement, + encodedGrammar?: string, + encodedContent?: string +): Promise { + // setup initial contents for the grammar & dsl (Hello World) + currentGrammarContent = HelloWorldGrammar; + currentDSLContent = DSLInitialContent; + + // handle to a Monaco language client instance for the DSL (program) editor + let dslClient; + + // check to use existing grammar from URI + if (encodedGrammar) { + currentGrammarContent = decompressFromEncodedURIComponent(encodedGrammar) ?? currentGrammarContent; + } -const MagicAction = "PlaygroundMagic"; + // check to use existing content from URI + if (encodedContent) { + currentDSLContent = decompressFromEncodedURIComponent(encodedContent) ?? currentDSLContent; + } -export interface MessageWrapper { - wrap(message: T): Message; - unwrap(message: Message): T | null; -} + // setup langium wrapper + const langiumWrapper = await getFreshLangiumWrapper(leftEditor); -export type MessageCallback = (data: T) => void; + // setup DSL wrapper + await setupDSLWrapper().catch((e) => { + // failed to setup, can happen with a bad Langium grammar, report it & discard + console.error('DSL editor setup error: ' + e); + overlay(true, true); + }); -export class PlaygroundWrapper implements MessageWrapper { - wrap(message: PlaygroundMessage): Message { - return { - jsonrpc: "2.0", - method: MagicAction, - params: [message], - } as Notification; + // retrieve the langium language client + const langiumClient = langiumWrapper.getLanguageClient(); + if (!langiumClient) { + throw new Error('Unable to obtain language client for the Langium editor!'); } - unwrap(message: Message): PlaygroundMessage | null { - if (isNotification(message) && message.method === MagicAction) { - return message.params![0] as PlaygroundMessage; + + // register to receive new grammars from langium, and send them to the DSL language client + langiumClient.onNotification('browser/DocumentChange', (resp: DocumentChangeResponse) => { + + // verify the langium client is still running, and didn't crash due to a grammar issue + if (!langiumClient.isRunning()) { + throw new Error('Langium client is not running'); } - return null; - } -} -export interface MonacoConfig { - getMainCode(): string; - setMainCode(code: string): void; - setMainLanguageId(name: string): void; - setMonarchTokensProvider(monarch: any): void; - theme: string; - useLanguageClient: boolean; - useWebSocket: boolean; - setMonacoEditorOptions(monacoEditorOptions: Record): void; -} + // extract & update current grammar + currentGrammarContent = resp.content; -export interface MonacoClient { - getEditorConfig(): MonacoConfig; - setWorker(worker: Worker, connection: MonacoConnection): void; - startEditor(domElement: HTMLElement): void; - updateLayout(): void; - dispose(): Promise; - getMainCode(): string; -} + if (resp.diagnostics.filter(d => d.severity === 1).length) { + // error in the grammar, report an error & stop here + overlay(true, true); + return; + } -export function setupEditor( - domElement: HTMLElement, - name: string, - syntax: any, - content: string, - relativeWorkerURL: string, - monacoFactory: () => MonacoClient, - readerFactory: (worker: Worker) => ByPassingMessageReader, - writerFactory: (worker: Worker) => ByPassingMessageWriter, - onReady: () => void -) { - const client = monacoFactory(); - - const editorConfig = client.getEditorConfig(); - editorConfig.setMainLanguageId(name); - editorConfig.setMonarchTokensProvider(syntax); - editorConfig.setMonacoEditorOptions({ - minimap: { - enabled: false, - }, + // set a new timeout for updating our DSL grammar & editor, 200ms, to avoid intermediate states + throttle(1, languageUpdateDelay, async () => { + // display 'Loading...' while we regenerate the DSL editor + overlay(true, false); + + if (!dslWrapper) { + // no dsl wrapper to start (or previously crashed), setup from scratch + // no exception handling here, as we're 'assuming' the Langium grammar is valid at this point + // or we already have a wrapper that crashed (2nd case here) + await setupDSLWrapper(); + overlay(false, false); + } else { + // existing wrapper, attempt to first dispose + await dslWrapper?.dispose().then(async () => { + // disposed successfully, setup & clear overlay + await setupDSLWrapper(); + overlay(false, false); + + }).catch(async (e) => { + // failed to dispose, report & discard this error + // can happen when a previous editor was not started correctly + console.error('DSL editor disposal error: ' + e); + overlay(true, true); + + }); + } + }); }); - editorConfig.setMainCode(content); - editorConfig.theme = "vs-dark"; - - editorConfig.useLanguageClient = true; - editorConfig.useWebSocket = false; + /** + * Helper to configure & retrieve a fresh DSL wrapper + */ + async function setupDSLWrapper(): Promise { + // get a fresh DSL wrapper + dslWrapper = await getFreshDSLWrapper(rightEditor, nextId(), currentDSLContent, currentGrammarContent); + + // get a fresh client + dslClient = dslWrapper?.getLanguageClient(); + if (!dslClient) { + throw new Error('Failed to retrieve fresh DSL LS client'); + } - const workerURL = new URL(relativeWorkerURL, import.meta.url); + // re-register + registerForDocumentChanges(dslClient); + } - const worker = new Worker(workerURL.href, { - type: "classic", - name: "LS", - }); - const result: MonacoEditorResult = { - out: readerFactory(worker), - in: writerFactory(worker), - editor: client - }; - client.setWorker(worker, { - reader: result.out, - writer: result.in, + window.addEventListener("resize", () => { + dslWrapper?.updateLayout(); + langiumWrapper.updateLayout(); }); - client.startEditor(domElement); + // drop the overlay once done here + overlay(false, false); +} - onReady(); - return result; +/** + * Starts a fresh Monaco LC wrapper + * + * @param htmlElement Element to attach the editor to + * @param languageId ID of the language to use + * @param code Program to show in the editor + * @param grammarText Grammar text to use for the worker & monarch syntax + * @returns A promise resolving to a configured & started DSL wrapper + */ +async function getFreshDSLWrapper( + htmlElement: HTMLElement, + languageId: string, + code: string, + grammarText: string +): Promise { + + // construct and set a new monarch syntax onto the editor + const { Grammar } = await createServicesForGrammar({ grammar: grammarText }); + + const worker = await getLSWorkerForGrammar(grammarText); + const wrapper = new MonacoEditorLanguageClientWrapper(); + return wrapper.start(createUserConfig({ + languageId, + code, + worker, + monarchGrammar: generateMonarch(Grammar, languageId) + }), htmlElement).then(() => { + return wrapper; + }).catch(async (e) => { + console.error('Failed to start DSL wrapper: ' + e); + // don't leak the worker on failure to start + // normally we wouldn't need to manually terminate, but if the LC is stuck in the 'starting' state, the following dispose will fail prematurely + // and the worker will leak + worker.terminate(); + // try to cleanup the existing wrapper (but don't fail if we can't complete this action) + // particularly due to a stuck LC, which can cause this to fail part-ways through + try { + await wrapper.dispose(); + } catch (e) {} + return undefined; + }); } -interface ActionRequest { - message: PlaygroundMessage; - element: HTMLElement; - monacoFactory: (name: string) => MonacoClient; - editor?: MonacoEditorResult; - content: string; + +/** + * Gets a fresh langium wrapper + * + * @param htmlElement Element to attach the wrapper to + * @returns A promise resolving to a configured & started Langium wrapper + */ +async function getFreshLangiumWrapper(htmlElement: HTMLElement): Promise { + const langiumWrapper = new MonacoEditorLanguageClientWrapper(); + await langiumWrapper.start(createUserConfig({ + languageId: "langium", + code: currentGrammarContent, + worker: "./libs/worker/langiumServerWorker.js", + monarchGrammar: LangiumMonarchContent + }), htmlElement); + return langiumWrapper; } -type Action = ( - params: ActionRequest -) => Promise; -type Actions = Record; -const messageWrapper = new PlaygroundWrapper(); +/** + * Document change listener for modified DSL programs + */ +let dslDocumentChangeListener: Disposable; -const PlaygroundActions: Actions = { - ast: () => Promise.resolve(undefined), - changing: async ({ message, editor }) => { - if(message.type != "changing" || !editor) { - return editor; - } - overlay(true, false); - editor.editor.getEditorConfig().setMonacoEditorOptions({readOnly: true}); - return Promise.resolve(editor); - }, - error: async ({ message, editor }) => { - overlay(true, true); - if(message.type != "error" || !editor) { - return editor; - } - editor.editor.getEditorConfig().setMonacoEditorOptions({readOnly: true}); - return Promise.resolve(editor); - }, - validated: async ({ message, element, monacoFactory, editor, content }): Promise => { - if(message.type != "validated") { - return editor; - } +/** + * Helper for registering to receive new ASTs from parsed DSL programs + */ +function registerForDocumentChanges(dslClient: any | undefined) { + // dispose of any existing listener + if (dslDocumentChangeListener) { + dslDocumentChangeListener.dispose(); + } - if (editor) { - content = editor.editor.getMainCode(); - await editor.editor.dispose(); - } + // register to receive new ASTs from parsed DSL programs + dslDocumentChangeListener = dslClient!.onNotification('browser/DocumentChange', (resp: DocumentChangeResponse) => { - const { Grammar } = await createServicesForGrammar({ grammar: message.grammar }); - const syntax = generateMonarch(Grammar, "user"); - - editor = setupEditor( - element, - "user", - syntax, - content, - "../../libs/worker/userServerWorker.js", - () => monacoFactory("user"), - (worker) => new ByPassingMessageReader(worker, messageWrapper), - (worker) => new ByPassingMessageWriter(worker, messageWrapper), - () => { } - ); + // retrieve existing code from the model + currentDSLContent = dslWrapper?.getModel()?.getValue() as string; - editor.editor.getEditorConfig().setMonacoEditorOptions({readOnly: false}); - - await editor.in.byPassWrite(message); - - overlay(false, false); - - return editor; - }, -}; + // delay changes by 200ms, to avoid getting too many intermediate states + throttle(2, languageUpdateDelay, () => { + // render the AST in the far-right window + render( + JSON.parse(resp.content), + new DefaultAstNodeLocator() + ); + }); + }); +} -let userDefined: MonacoEditorResult | undefined; -export function setupPlayground( - monacoFactory: (name: string) => MonacoClient, - leftEditor: HTMLElement, - rightEditor: HTMLElement, - grammar?: string, - content?: string, - overlay?: (visible: boolean, hasError: boolean) => void -) { - let langiumContent = LangiumInitialContent; - let dslContent = StateMachineInitialContent; - - if (grammar) { - const decompressedGrammar = decompressFromEncodedURIComponent(grammar); - if (decompressedGrammar) { - langiumContent = decompressedGrammar; - } - } - if (content) { - const decompressedContent = decompressFromEncodedURIComponent(content); - if (decompressedContent) { - dslContent = decompressedContent; - } - } - - const langium = setupEditor( - leftEditor, - "langium", - LangiumMonarchContent, - langiumContent, - "../../libs/worker/langiumServerWorker.js", - () => monacoFactory("langium"), - (worker) => new ByPassingMessageReader(worker, messageWrapper), - (worker) => new ByPassingMessageWriter(worker, messageWrapper), - () => {} - ); - - langium.out.listenByPass(async (message) => { - userDefined = await PlaygroundActions[message.type]({ - message: message, - element: rightEditor, - monacoFactory, - editor: userDefined, - content: dslContent, +/** + * Produce a new LS worker for a given grammar, which returns a Promise once it's finished starting + * + * @param grammar To setup LS for + * @returns Configured LS worker + */ +async function getLSWorkerForGrammar(grammar: string): Promise { + return new Promise((resolve, reject) => { + // create & notify the worker to setup w/ this grammar + const worker = new Worker("./libs/worker/userServerWorker.js"); + worker.postMessage({ + type: "startWithGrammar", + grammar }); - userDefined?.out.listenByPass((data) => { - if (data.type !== "ast") { - return; + // wait for the worker to finish starting + worker.onmessage = (event) => { + if (event.data.type === "lsStartedWithGrammar") { + resolve(worker); } - render(data.root, new DefaultAstNodeLocator()); - }); - }); + }; - window.addEventListener("resize", () => { - userDefined?.editor.updateLayout(); - langium.editor.updateLayout(); - }); + worker.onerror = (event) => { + reject(event); + }; - return () => { - return { - grammar: langium.editor.getMainCode(), - content: userDefined?.editor.getMainCode() ?? "", - } as PlaygroundParameters; - }; + }); } diff --git a/hugo/content/playground/data.ts b/hugo/content/playground/data.ts index 098c0771..e3f82572 100644 --- a/hugo/content/playground/data.ts +++ b/hugo/content/playground/data.ts @@ -92,7 +92,7 @@ export const LangiumMonarchContent = { }, }; -export const LangiumInitialContent = `grammar HelloWorld +export const HelloWorldGrammar = `grammar HelloWorld entry Model: (persons+=Person | greetings+=Greeting)*; @@ -110,7 +110,8 @@ hidden terminal ML_COMMENT: /\\/\\*[\\s\\S]*?\\*\\//; hidden terminal SL_COMMENT: /\\/\\/[^\\n\\r]*/; `; -export const StateMachineInitialContent = `person John +// hello world program +export const DSLInitialContent = `person John person Jane Hello John! diff --git a/hugo/content/playground/langium-worker.ts b/hugo/content/playground/langium-worker.ts index fa804ebe..b69b74b3 100644 --- a/hugo/content/playground/langium-worker.ts +++ b/hugo/content/playground/langium-worker.ts @@ -5,39 +5,26 @@ ******************************************************************************/ import { DocumentState, startLanguageServer, EmptyFileSystem, createLangiumGrammarServices } from 'langium'; -import { createConnection, DiagnosticSeverity } from 'vscode-languageserver/browser'; -import { PlaygroundWrapper, ByPassingMessageReader, ByPassingMessageWriter } from './monaco-utils'; -import { throttle } from './utils'; +import { NotificationType } from 'vscode-languageserver/browser'; +import { DocumentChange, createServerConnection } from './worker-utils'; -/* browser specific setup code */ -const messageWrapper = new PlaygroundWrapper(); -const messageReader = new ByPassingMessageReader(self, messageWrapper); -const messageWriter = new ByPassingMessageWriter(self, messageWrapper); - -const connection = createConnection(messageReader, messageWriter); +// establish a browser server connection +const connection = createServerConnection(); // Inject the shared services and language-specific services const { shared } = createLangiumGrammarServices({ connection, ...EmptyFileSystem }); -const sendGrammar = throttle(1000, text => messageWriter.byPassWrite({ - type: 'validated', - grammar: text -})); +// Start the language server with the shared services +startLanguageServer(shared); -// by pass other messages that are required to make the playground work -shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, ([document]) => { - messageWriter.byPassWrite({type: 'changing'}); - const errors = (document.diagnostics ?? []).filter(d => d.severity === DiagnosticSeverity.Error); - if (errors.length > 0) { - sendGrammar.clear(); - return messageWriter.byPassWrite({ - type: 'error', - errors +// Send a notification with the serialized AST after every document change +const documentChangeNotification = new NotificationType('browser/DocumentChange'); +shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, documents => { + for (const document of documents) { + connection.sendNotification(documentChangeNotification, { + uri: document.uri.toString(), + content: document.textDocument.getText(), + diagnostics: document.diagnostics ?? [] }); } - sendGrammar.call(document.textDocument.getText()); - return Promise.resolve(); }); - -// Start the language server with the shared services -startLanguageServer(shared); \ No newline at end of file diff --git a/hugo/content/playground/preprocess.ts b/hugo/content/playground/preprocess.ts index aeb13a0f..f0adf6c2 100644 --- a/hugo/content/playground/preprocess.ts +++ b/hugo/content/playground/preprocess.ts @@ -4,9 +4,17 @@ * terms of the MIT License, which is available in the project root. ******************************************************************************/ -import { AstNode, Reference } from "langium"; +import { AstNode } from "langium"; import { AstNodeLocator } from "langium/lib/workspace/ast-node-locator"; +/** + * Represents a serialized version of a reference to an AstNode + */ +export interface Reference { + ref?: T; + $ref: string +} + export interface ValueNodeBase { kind: "object" | "array" | "string" | "boolean" | "number" | "reference" | "undefined"; } @@ -68,7 +76,7 @@ export function preprocessAstNodeValue( } else if (typeof valueOrValues === "object" || typeof valueOrValues === "undefined") { if(!valueOrValues) { return {kind: "undefined"}; - } else if ("$refText" in valueOrValues) { + } else if ("$ref" in valueOrValues) { return preprocessReferenceNode(valueOrValues, locator); } return preprocessAstNodeObject(valueOrValues, locator); @@ -127,10 +135,11 @@ export function preprocessReferenceNode( node: Reference, locator: AstNodeLocator ): ReferenceValueNode { - return node.ref + // check to display a valid reference, when present + return node.$ref ? { kind: "reference", - $text: locator.getAstNodePath(node.ref!), + $text: node.$ref } : { kind: "reference", diff --git a/hugo/content/playground/user-worker.ts b/hugo/content/playground/user-worker.ts index e1e869c0..6177712d 100644 --- a/hugo/content/playground/user-worker.ts +++ b/hugo/content/playground/user-worker.ts @@ -4,37 +4,58 @@ * terms of the MIT License, which is available in the project root. ******************************************************************************/ -import { AstNode, DocumentState, createServicesForGrammar, startLanguageServer } from 'langium'; -import { createConnection } from 'vscode-languageserver/browser'; -import { PlaygroundWrapper, ByPassingMessageReader, ByPassingMessageWriter } from './monaco-utils'; -import { throttle } from './utils'; - -const messageWrapper = new PlaygroundWrapper(); -const messageReader = new ByPassingMessageReader(self, messageWrapper); -const messageWriter = new ByPassingMessageWriter(self, messageWrapper); - -const sendAst = throttle(1000, root => messageWriter.byPassWrite({ - type: 'ast', - root -})); - -messageReader.listenByPass(message => { - if(message.type === 'validated') { - sendAst.clear(); - const connection = createConnection(messageReader, messageWriter); - createServicesForGrammar({ - grammar: message.grammar, - sharedModule: { - lsp: { Connection: () => connection} +import { DocumentState, createServicesForGrammar, startLanguageServer } from 'langium'; +import { NotificationType } from 'vscode-languageserver/browser.js'; +import { DocumentChange, createServerConnection } from './worker-utils'; + +// listen for messages to trigger starting the LS with a given grammar +addEventListener('message', async (event) => { + if (event.data.type && event.data.type === 'startWithGrammar') { + if (event.data.grammar === undefined) { + throw new Error('User worker was started without a grammar!'); + } + await startWithGrammar(event.data.grammar as string); + } +}); + +const documentChangeNotification = new NotificationType('browser/DocumentChange'); + +/** + * Starts up a LS with a given grammar. + * Upon completion posts a message back to the main thread that it's done + * + * @param grammarText Grammar string to create an LS for + */ +async function startWithGrammar(grammarText: string): Promise { + + // create a fresh connection for the LS + const connection = createServerConnection(); + + // create shared services & serializer for the given grammar grammar + const { shared, serializer } = await createServicesForGrammar({ + grammar: grammarText, + sharedModule: { + lsp: { + Connection: () => connection, } - }).then(({ shared }) => { - shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, ([document]) => { - const ast = document.parseResult.value; - sendAst.call(ast); - return Promise.resolve(); + } + }); + + // listen for validated documents, and send the AST back to the language client + shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, documents => { + for (const document of documents) { + const json = serializer.JsonSerializer.serialize(document.parseResult.value); + connection.sendNotification(documentChangeNotification, { + uri: document.uri.toString(), + content: json, + diagnostics: document.diagnostics ?? [] }); - - startLanguageServer(shared); - }); - } -}); \ No newline at end of file + } + }); + + // start the LS + startLanguageServer(shared); + + // notify the main thread that the LS is ready + postMessage({ type: 'lsStartedWithGrammar' }); +} diff --git a/hugo/content/playground/utils.ts b/hugo/content/playground/utils.ts index 83105a1d..e518a42d 100644 --- a/hugo/content/playground/utils.ts +++ b/hugo/content/playground/utils.ts @@ -15,25 +15,32 @@ export async function share(grammar: string, content: string): Promise { await navigator.clipboard.writeText(url.toString()); } -export function throttle(milliseconds: number, action: (input: T) => void) { - let timeout: NodeJS.Timeout | undefined = undefined; +/** + * Map of actions that are throttled, with the key being the unique id + * Used to clear them out if a subsequent action is dispatched + */ +const throttleMap = new Map(); - function clear() { - if (timeout) { - clearTimeout(timeout); - timeout = undefined; - } +/** + * Throttles an action with a fixed delay, such that subsequent attempts to dispatch + * the same action clear out the previous action, and reset the delay. + * + * @param id Unique id to associate with this action + * @param delay In milliseconds to delay the action + * @param action Action to perform (function to invoke) + */ +export function throttle(id: number, delay: number, action: () => void): void { + // clear out any previous action + if (throttleMap.has(id)) { + clearTimeout(throttleMap.get(id)!); } - return { - clear, - call: (input: T) => { - clear(); - timeout = setTimeout(() => { - action(input); - }, milliseconds); - }, - }; + // set a new timeout to perform the action + throttleMap.set(id, setTimeout(() => { + action(); + throttleMap.delete(id); + }, delay) + ); } export function overlay(visible: boolean, hasError: boolean) { diff --git a/hugo/content/playground/worker-utils.ts b/hugo/content/playground/worker-utils.ts new file mode 100644 index 00000000..344d7a23 --- /dev/null +++ b/hugo/content/playground/worker-utils.ts @@ -0,0 +1,17 @@ +import { Diagnostic, BrowserMessageReader, BrowserMessageWriter, createConnection, Connection } from 'vscode-languageserver/browser'; + +/** + * Describes a notification that can be sent from the LS, + * containing details on a changed document + */ +export type DocumentChange = { uri: string, content: string, diagnostics: Diagnostic[] }; + +/** + * Creates a connection for a language server to utilize (from a browser) + * @returns Server connection + */ +export function createServerConnection(): Connection { + const messageReader = new BrowserMessageReader(self); + const messageWriter = new BrowserMessageWriter(self); + return createConnection(messageReader, messageWriter); +} \ No newline at end of file diff --git a/hugo/content/showcase/arithmetics.html b/hugo/content/showcase/arithmetics.html index 79f39702..4969380b 100644 --- a/hugo/content/showcase/arithmetics.html +++ b/hugo/content/showcase/arithmetics.html @@ -4,9 +4,10 @@ type: langium layout: showcase-page url: "/showcase/arithmetics" -img: "/assets/office.jpg" -description: Description for the arithmetics example. +img: "/assets/Langium_Arithmetics.svg" +file: "scripts/arithmetics/arithmetics.tsx" +description: A language for arithmetic calculations. It supports definitions of functions and intermediate values. geekdochidden: true -draft: true +draft: false noMain: true --- diff --git a/hugo/content/showcase/domainmodel.html b/hugo/content/showcase/domainmodel.html index 738a16ad..956e85bd 100644 --- a/hugo/content/showcase/domainmodel.html +++ b/hugo/content/showcase/domainmodel.html @@ -1,12 +1,13 @@ --- title: "Domain Model" -weight: 200 +weight: 500 type: langium layout: showcase-page url: "/showcase/domainmodel" -img: "/assets/social-card.jpg" -description: Description for the domainmodel example. +img: "/assets/Langium_Domainmodel.svg" +file: "scripts/domainmodel/domainmodel.tsx" +description: A language designed for modeling data structures. Demonstrated using the structures for a blog. geekdochidden: true -draft: true +draft: false noMain: true --- diff --git a/hugo/content/showcase/minilogo.html b/hugo/content/showcase/minilogo.html new file mode 100644 index 00000000..d1cd69a4 --- /dev/null +++ b/hugo/content/showcase/minilogo.html @@ -0,0 +1,13 @@ +--- +title: "MiniLogo" +weight: 300 +type: langium +layout: showcase-page +url: "/showcase/minilogo" +img: "/assets/Langium_MiniLogo.svg" +file: "scripts/minilogo/minilogo.tsx" +description: A language designed to draw geometric shapes on a canvas. +geekdochidden: true +draft: false +noMain: true +--- diff --git a/hugo/content/showcase/openapi.html b/hugo/content/showcase/openapi.html new file mode 100644 index 00000000..2f6e8460 --- /dev/null +++ b/hugo/content/showcase/openapi.html @@ -0,0 +1,12 @@ +--- +title: "OpenAPI SL" +weight: 0 +type: langium +layout: showcase-page +externalUrl: "https://bestsolution-at.github.io/openapi-dsl/" +img: "/assets/BestSolution_OpenAPI.svg" +description: A proof-of-concept DSL to describe OpenAPI-Documents in a concise and human readable way. Made by BestSolution. +geekdochidden: true +draft: false +noMain: true +--- diff --git a/hugo/content/showcase/sql.html b/hugo/content/showcase/sql.html new file mode 100644 index 00000000..70a831db --- /dev/null +++ b/hugo/content/showcase/sql.html @@ -0,0 +1,13 @@ +--- +title: "SQL" +weight: 400 +type: langium +layout: showcase-page +url: "/showcase/sql" +img: "/assets/Langium_SQL.svg" +file: "scripts/sql/ui.tsx" +description: A language server for potentially any SQL dialect. Demonstrated by modeling an airport. +geekdochidden: true +draft: false +noMain: true +--- diff --git a/hugo/content/tutorials/generation.md b/hugo/content/tutorials/generation.md index 40d69c05..adad2497 100644 --- a/hugo/content/tutorials/generation.md +++ b/hugo/content/tutorials/generation.md @@ -17,7 +17,7 @@ To write the generator, we're going to work in the **src/cli/generator.ts** file ```ts // import the 'Model' type from our semantic model -import { Model } from '../language-server/generated/ast.ts'; +import { Model } from '../language/generated/ast.ts'; export function generateCommands(mode: Model, filePath: string, destination: string | undefined): string { // ... @@ -84,7 +84,7 @@ Now, let's expand on `generateStatements`. From our grammar, there are 5 types o We we want to expand our function to handle each of these cases. This is easy to do using some special `isTYPE` functions made available from our semantic model. These are automatically generated from our grammar, and allow us to verify the type of a node from our AST at runtime. ```ts -import { isPen, isMove, isMacro, isFor, isColor } from '../language-server/generated/ast'; +import { isPen, isMove, isMacro, isFor, isColor } from '../language/generated/ast'; ... diff --git a/hugo/content/tutorials/generation_in_the_web.md b/hugo/content/tutorials/generation_in_the_web.md index d8ab1e11..46f923de 100644 --- a/hugo/content/tutorials/generation_in_the_web.md +++ b/hugo/content/tutorials/generation_in_the_web.md @@ -5,389 +5,172 @@ weight: 7 {{< toc format=html >}} -In this tutorial we'll be talking about how to perform generation in the web by executing a custom LSP command. There are multiple ways to hook into Langium to utilize the generator, such as by directly exporting the generator API. However by using the LSP as is, we can save ourselves the effort of doing additional work. By using an LSP command, we can quickly and easily integrate new functionality into our existing Langium + Monaco integration. +*Updated on Oct. 4th, 2023 for usage with monaco-editor-wrapper 3.1.0 & above.* -We'll assume that you've already looked over most of the other tutorials at this point. It is particularly important that you have a language with working generation, and have a working instance of Langium + Monaco for your language (or another editor of your choice). In the case that you don't have a language to work with, you can follow along with [MiniLogo](https://github.com/langium/langium-minilogo), which is the example language used throughout these tutorials. +In this tutorial we'll be talking about how to perform generation in the web by listening for document builder notifications. There are multiple ways to hook into Langium to utilize the generator, such as by directly exporting the generator API. However, by listening to notifications from the document builder, we can do this with less code. This lets us quickly integrate new functionality into our existing Langium + Monaco integration, and focus more on what we would want to do with the generated output. -Since we're working with MiniLogo, we already know that our generated output is in the form of drawing instructions that transform some drawing context. The generated output that we've implemented so far consists of a JSON array of commands, making it very easy to interpret. Now that we're working in a web-based context, this approach lends itself naturally towards manipulating an HTML5 canvas. +*(This tutorial previously utilized custom LSP commands to achieve the same goal of generation. This is still a valid approach, but we've found setting up listening for notifications this way is much more straightforward. We've implemented this in our own example languages as well, and would recommend it going forward.)* -The parts that we still need to setup are: - -- exposing the generator via a custom LSP command -- invoking this custom command and getting the result -- adding a way to translate the generated result into drawing on an HTML5 canvas. - -## Overview of LSP Commands - -Based on the work done in previous tutorials, we already have set up a working generator with MinLogo. If you haven't already set this up you can go back to the [tutorial on generation](/tutorials/generation) and give it a look over. Continuing off of the code written in that tutorial, we want to factor out our existing generator (removing any non-web compatible dependencies, like 'fs'), and invoke it via a custom LSP command handler. - -If you're not familiar with the LSP (or custom commands), that's perfectly fine. The LSP is just a protocol that defines how our client & server communicate with each other, and this works even when they're both in the same application. In our case, the server will be Langium, and the client will be Monaco. This protocol also defines a way to [describe commands](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#command), and to [execute those custom commands from the client](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_executeCommand). So, we'll be having Monaco execute a custom command, Langium handling that command, and then getting the results returned to Monaco. +We'll assume that you've already looked over most of the other tutorials at this point. It is particularly important that you have a language with working generation, and have a working instance of Langium + Monaco for your language (or another editor of your choice). In the case that you don't have a language to work with, you can follow along with [MiniLogo](https://github.com/langium/langium-minilogo), which is the example language used throughout many of these tutorials. -Lastly, Langium itself provides an easy way to register custom handlers for these commands. Handlers are registered for commands by name, and are invoked when that command is received. There are a number of reasons why this is a powerful approach: +Since we're working with MiniLogo here, we already know that our generated output is in the form of drawing instructions that transform some drawing context. The generated output that we've implemented so far consists of a JSON array of commands, making it very easy to interpret. Now that we're working in a web-based context, this approach lends itself naturally towards manipulating an HTML5 canvas. -- Clients can send commands without any knowledge of Langium's internals -- Langium can handle commands without any knowledge of the client sending them -- Commands can be executed server-side with *full access* to Langium's capabilities - -This effectively allows Langium to integrate with just about any application that is capable of working with the LSP (and sending custom commands). It also does this without requiring any tight dependencies on Langium itself, keeping your existing application logic separate from your Langium logic. - -## Adding a Generator Endpoint for the Web - -We'll start by adding a new file **src/web/index.ts** that will act as the generator endpoint for the web. This directory was created in the previous tutorial about running Langium + Monaco in the web, and should already contain an express `app.ts` configuration. +The parts that we still need to setup are: -Our new file will contain a single exported function as our entry point, which will be used by our command handler. For MiniLogo we'll call this function `parseAndGenerate`. Much like the name suggests, this function takes a concrete MiniLogo program, parses it, and then generates output from the corresponding AST. This will share some logic that was used with the CLI before, so the code should be familiar if you've read the tutorial on [customizing the CLI](/tutorials/customizing_cli). +- handle document validations, and generate notifications with our generator output +- listen for these notifications in the client, and extract the generated output +- interpret the generated output as drawing commands, and update the canvas -For our `parseAndGenerate` function to work, we will have to make a slight change to the way that we extract an AST node from our document. Previously, we referenced a file on disk to read from. In this context we have no such file, instead our program is a string stored in memory. So, we'll need to create an in-memory document. Once we have this document, the rest of our process is the same. We can write this supporting function for creating in-memory documents like so: +## Handling Document Validations -```ts -import { AstNode, LangiumServices } from "langium"; -import { URI } from "vscode-uri"; - -/** - * Extracts an AST node from a virtual document, represented as a string - * @param content Content to create virtual document from - * @param services For constructing & building a virtual document - * @returns A promise for the parsed result of the document - */ - async function extractAstNodeFromString(content: string, services: LangiumServices): Promise { - // create a document from a string instead of a file - const doc = services.shared.workspace.LangiumDocumentFactory.fromString(content, URI.parse('memory://minilogo.document')); - // proceed with build & validation - await services.shared.workspace.DocumentBuilder.build([doc], { validationChecks: 'all' }); - // get the parse result (root of our AST) - return doc.parseResult?.value as T; -} -``` +This is the first step we'll need, since without being able to generate notifications in the first place we would have nothing to listen to. -Once we have this function in place, we can create our `parseAndGenerate` function in the same file. +Thankfully a lot of the groundwork has already been done in previous tutorials, as well as within Langium itself. We just need to setup the an onBuildPhase listener for the document builder in our LS. Using the LS entry point **main-browser.ts** that we setup in the last tutorial on Langium + Monaco, we can add the following code to the end of our `startLanguageServer` function. ```ts -import { EmptyFileSystem } from "langium"; -import { createHelloWorldServices } from '../language-server/hello-world-module'; -import { Model } from "../language-server/generated/ast"; -import { generateCommands } from '../generator/generator'; - -/** - * Parses a MiniLogo program & generates output as a list of Objects - * @param miniLogoProgram MiniLogo program to parse - * @returns Generated output from this MiniLogo program - */ -export async function parseAndGenerate (miniLogoProgram: string): Promise { - const services = createHelloWorldServices(EmptyFileSystem).HelloWorld; - const model = await extractAstNodeFromString(miniLogoProgram, services); - // generate mini logo drawing commands from the model - const cmds = generateCommands(model); - return Promise.resolve(cmds); -} +// modified import from the previous tutorial: Langium + Monaco +import { + BrowserMessageReader, + BrowserMessageWriter, + Diagnostic, + NotificationType, + createConnection +} from 'vscode-languageserver/browser.js'; + +// additional imports +import { Model } from './generated/ast.js'; +import { Command, getCommands } from './minilogo-actions.js'; +import { generateStatements } from '../generator/generator.js'; + +// startLanguageServer... + +// Send a notification with the serialized AST after every document change +type DocumentChange = { uri: string, content: string, diagnostics: Diagnostic[] }; +const documentChangeNotification = new NotificationType('browser/DocumentChange'); +// use the built-in AST serializer +const jsonSerializer = MiniLogo.serializer.JsonSerializer; +// listen on fully validated documents +shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, documents => { + // perform this for every validated document in this build phase batch + for (const document of documents) { + const model = document.parseResult.value as Model; + let json: Command[] = []; + + // only generate commands if there are no errors + if(document.diagnostics === undefined + || document.diagnostics.filter((i) => i.severity === 1).length === 0 + ) { + json = generateStatements(model.stmts); + } + + // inject the commands into the model + // this is safe so long as you careful to not clobber existing properties + // and is incredibly helpful to enrich the feedback you get from the LS per document + (model as unknown as {$commands: Command[]}).$commands = json; + + // send the notification for this validated document, + // with the serialized AST + generated commands as the content + connection.sendNotification(documentChangeNotification, { + uri: document.uri.toString(), + content: jsonSerializer.serialize(model, { sourceText: true, textRegions: true }), + diagnostics: document.diagnostics ?? [] + }); + } +}); ``` -Ah, but we don't yet have a `generator` folder to import from! So let's make that real quick as part of our next step. +And that's it for setting up the onBuildPhase listener itself. We still need to address the usage of `generateMiniLogoCmds`, which is tied to the LS implementation. -## Factoring out the Generator +Based on the work done in previous tutorials, we already have set up a working generator with MinLogo. If you haven't already set this up you can go back to the [tutorial on generation](/tutorials/generation) and give it a look over. Ideally, we'll already have setup our `generateStatements` function for MiniLogo, meaning so long as the imported module doesn't have any modules that are browser incompatible, we should be able to use it as is. Based on the previous setup however, we should have a **generator.js** file that is free of such conflicts, as much of them should be separated into the cli directly. -While factoring out into a separate `generator` folder, it's important to make sure that the code that your generator depends on is not tightly coupled with any file system related functionality -- or anything else that is not compatible with running in the browser. As an example, the yeoman generator example produces a generator that is connected with the CLI, which uses the file system. Thankfully, the implementation is quite simple, and it's not too difficult to decouple the generator from the CLI. +This saves us quite a bit of time, since we don't need to handle setting up & dispatching a document for validation, we simply tap into the existing workflow and collect the result when it's ready. This is a great example of how Langium's architecture allows us to easily extend existing functionality, and add new features without having to rewrite existing code. -First, create a new folder, **src/generator/** . Then, move **src/cli/generator.ts** into **src/generator/generator.ts**. Be sure to update imports in your generator, as well as anything in the CLI that references this. +As a concluding note for this section, don't forget to rebuild your language server bundle! It might not be a bad idea to clean as well, just to be sure everything is working as expected at this step. -Alright, now we need to decouple the file system related functionality from the generator. To do this, we're going to take our `generateCommands` function, and compress it down to this: +## Listening for Notifications in the Client -```ts -/** - * Generates simple drawing commands from a MiniLogo Model - * @param model Model to generate commmands from - * @returns Generated commands that captures the program's drawing intent - */ -export function generateCommands(model: Model): Object[] { - return generateStatements(model.stmts); -} -``` +The next step we need to make is to actually listen for these notifications from the client's end. This takes us back to the [Langium + Monaco](/tutorials/langium_and_monaco) setup in the previous tutorial. -Notice how we dropped all the other parameters, as well as any other logic *besides* the actual generation itself. This is what we want, a simple generator interface that does exactly what it says, and nothing else. However, this completely breaks the existing CLI function `generateAction` (located in **src/cli/index.ts**) that we wrote before, so we need to correct it as well. This involves moving up some of the file system logic into this function instead. +After starting the wrapper successfully, we want to retrieve the MonacoLanguageClient instance (a wrapper around the language client itself) and listen for `browser/DocumentChange` notifications. ```ts -import { extractDestinationAndName } from './cli-util'; -import path from 'path'; -import fs from 'fs'; - -export const generateAction = async (fileName: string, opts: GenerateOptions): Promise => { - const services = createHelloWorldServices(NodeFileSystem).HelloWorld; - const model = await extractAstNode(fileName, services); - - // invoke generator to get commands - const cmds = generateCommands(model); - - // handle file related functionality here now - const data = extractDestinationAndName(fileName, opts.destination); - const generatedFilePath = `${path.join(data.destination, data.name)}.json`; - if (!fs.existsSync(data.destination)) { - fs.mkdirSync(data.destination, { recursive: true }); - } - fs.writeFileSync(generatedFilePath, JSON.stringify(cmds, undefined, 2)); - - console.log(chalk.green(`MiniLogo commands generated successfully: ${generatedFilePath}`)); -}; -``` - -Now the generator is cleanly separated from our CLI, and thus from our file system dependencies. At this point we're ready to write up a custom command handler, and invoke our generator API through it. - -## Adding a Custom LSP Command Handler to Langium +// wrapper has started... -To add a custom command handler, start by modifying the existing module file for our language. For MiniLogo, this is located in **src/language-server/minilogo-module.ts**. In this file we can add our custom command handler as a special class: - -```typescript -import { AbstractExecuteCommandHandler, ExecuteCommandAcceptor } from 'langium'; - -... - -class MiniLogoCommandHandler extends AbstractExecuteCommandHandler { - registerCommands(acceptor: ExecuteCommandAcceptor): void { - // accept a single command called 'parseAndGenerate' - acceptor('parseAndGenerate', args => { - // invoke generator on this data, and return the response - return parseAndGenerate(args[0]); - }); - } +// get the language client +const client = wrapper.getLanguageClient(); +if (!client) { + throw new Error('Unable to obtain language client!'); } -``` - -We only need the one function `registerCommands`, which allows us to accept an arbitrary number of custom commands by name. For this example, we're going to accept a command called `parseAndGenerate`, which matches the name of our generator endpoint. Once we've accepted a command matching this name, we receive an array of arguments, and invoke the generator on the first entry. This isn't well typed in this case (just an array of `any`), but we have advance knowledge that we'll be receiving a single string as an argument -- which corresponds to the concrete text of a MiniLogo program. -To register this custom command handler, we also need to update the `createMiniLogoServices` function in the same file. Specifically we need to register this new command handler as our `ExecuteCommandHandler` for the shared LSP services this language provides. +// listen for document change notifications +client.onNotification('browser/DocumentChange', onDocumentChange); -```typescript -shared.lsp.ExecuteCommandHandler = new MiniLogoCommandHandler(); -``` - -For some context, this should follow the creation of the standard services. - -```typescript -export function createMiniLogoServices(context: DefaultSharedModuleContext): { - shared: LangiumSharedServices, - MiniLogo: MiniLogoServices -} { - const shared = inject( - createDefaultSharedModule(context), - MiniLogoGeneratedSharedModule - ); - const MiniLogo = inject( - createDefaultModule({ shared }), - MiniLogoGeneratedModule, - MiniLogoModule - ); - // add our custom command handler to our 'shared' services - shared.lsp.ExecuteCommandHandler = new MiniLogoCommandHandler(); - shared.ServiceRegistry.register(MiniLogo); - return { shared, MiniLogo }; +function onDocumentChange(resp: any) { + let commands = JSON.parse(resp.content).$commands; + // ... do something with these commands } ``` -And now our implementation features a custom command handler that takes a MiniLogo program, and returns a generated result from that program's AST. To get these changes into the language server itself, you'll want to rebuild & bundle everything once more. If you recall the command from the last tutorial, we can do this via `build:web`. - -```bash -npm run build:web -``` +Now this works, but when do we receive notifications, and how often? Well a good thing you asked, because if you started this up and began editing your program, you would be receiving a notification for every single change! Including whitespace changes. Now that's probably not what we're looking for, but the content is correct, we just want to slow it down a bit. We can do this by setting a timeout and a semaphore to prevent multiple notifications from being processed at once. -## Importing the Generator - -Now, if you've been following along with our prior tutorials, you should have a **src/static/** folder already setup with an HTML and JS file, plus an updated language server bundle. We can now go into the HTML file, and make a couple changes to our HTML file to get things ready to work with our new changes. - -- add a canvas -- add a button to trigger updating the canvas - -You should also replace the previous HTML & CSS files with the following contents. The HTML updates add Monaco, a Canvas, and a build button. The CSS styles these new additions so that they're properly aligned. - -{{< tabs "new-html-css" >}} -{{< tab "HTML" >}} - -```html - - - - - - - MiniLogo in Langium - - -

MiniLogo in Langium

- - -
- -
-
-
-
-
- -
- -
-
- - -
- -
- -
-
-
-

Powered by

- Langium -
- - - - -``` +```ts +let running = false; +let timeout: number | null = null; -{{< /tab >}} -{{< tab "CSS" >}} -We need to update our **styles.css** file as well to allow a side-by-side view of Monaco and our canvas. You can replace your previous CSS content with these new contents to achieve that effect. - -```css -html,body { - background: rgb(33,33,33); - font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; - color: white; - /* for monaco */ - margin: 0; - padding: 0; - width: 100%; - height: 100%; -} -h1 { - text-align: center; -} -#minilogo-canvas { - display: block; - margin: 8px auto; - text-align: center; -} -#page-wrapper { - display: flex; - max-width: 2000px; - margin: 4px auto; - padding: 4px; - min-height: 80vh; - justify-content: center; -} -#page-wrapper .half { - display: flex; - width: 40vw; -} -.build { - display: block; - margin: 8px auto; - width: 300px; - height: 30px; - background: none; - border: 2px #fff solid; - color: #fff; - transition: 0.3s; - font-size: 1.2rem; - border-radius: 4px; -} -.build:hover { - border-color: #6cf; - color: #6cf; - cursor: pointer; -} -.build:active { - color: #fff; - border-color: #fff; -} -footer { - text-align: center; - color: #444; - font-size: 1.2rem; - margin-bottom: 16px; -} -@media(max-width: 1000px) { - #page-wrapper { - display: block; - } - #page-wrapper .half { - display: block; - width: auto; +function onDocumentChange(resp: any) { + // block until we're finished with a given run + if (running) { + return; } - #minilogo-canvas { - margin-top: 32px; + + // clear previous timeouts + if (timeout) { + clearTimeout(timeout); } - #page-wrapper { - min-height: auto; - } -} -/* for monaco */ -.wrapper { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; -} + timeout = window.setTimeout(async () => { + running = true; + let commands = JSON.parse(resp.content).$commands; + await updateMiniLogoCanvas(commands); + running = false; -#monaco-editor-root { - flex-grow: 1; + }, 200); // delay of 200ms is arbitrary, choose what makes the most sense in your use case } ``` -{{< /tab >}} -{{< /tabs >}} +And now we have a nice delay where repeated updates are discarded, until we have about 200ms without a subsequent update. That allows us to take the commands we're working with, and start doing something with them. The semaphore will prevent following updates from overriding the current run, allowing it to finish before starting a new execution. -At this point, running `npm run build:web && npm run serve` should show Monaco on the left, an empty space on the right (this is the canvas), along with an "Update Canvas" button at the bottom. If you see this, then you can trust that the layout was updated correctly. +You may have also noticed we added `updateMiniLogoCanvas` as the action to perform with our commands. This will be implemented in the next step, where we interpret our drawing commands. -We'll also want to go into **setup.js** file, and add a small modification to the end. This change will create a global function on the window, giving us a callback that lets us execute our command to parse and generate data from the current program in Monaco. It's important that this goes into the same file as your Monaco setup code, as it directly interacts with the Monaco language client instance. +That's it for listening for notifications! Now that we have our commands extracted, we'll can actually perform a series of drawing actions on an HTML5 canvas. -```js -// modify your previous import to bring in the appropriate monaco-vscode-api version -import { vscode } from './monaco-editor-wrapper/index.js'; +## Interpreting Draw Commands (Drawing) -... - -const generateAndDisplay = (async () => { - console.info('generating & running current code...'); - const value = client.editor.getValue(); - // parse & generate commands for drawing an image - // execute custom LSP command, and receive the response - const minilogoCmds = await vscode.commands.executeCommand('parseAndGenerate', value); - updateMiniLogoCanvas(minilogoCmds); -}); +If you've gotten to this point then you're on the final stretch! The last part we need to implement is the actual logic that takes our drawing commands and updates the canvas. This logic will be the content of the `updateMiniLogoCanvas` function, and we'll walk through each step here. -// Updates the mini-logo canvas -window.generateAndDisplay = generateAndDisplay; +First, let's get a handle on our canvas, as well as the associated 2D context. -// Takes generated MiniLogo commands, and draws on an HTML5 canvas -function updateMiniLogoCanvas(cmds) { - // print the commands out, so we can verify what we have received. - // TODO, will change in th next section... - alert(JSON.stringify(cmds)); +```ts +const canvas : HTMLCanvasElement | null = document.getElementById('minilogo-canvas') as HTMLCanvasElement | null; +if (!canvas) { + throw new Error('Unable to find canvas element!'); } -``` - -Running the build & serve workflow again, you should be able to now click "Update Canvas" and view an alert containing your generated commands corresponding with the current MiniLogo program in Monaco. Feel free to use the **examples/langium.logo** or **examples/test.logo** to try this out. - -## Interpreting Draw Commands -If you've gotten to this point then you're on the final stretch! The last part we need to implement is the actual logic that takes our drawing commands and updates the canvas. This logic will replace the existing contents of the `updateMiniLogoCanvas` function, and we'll walk through each step here. - -First, let's get a handle on our canvas, as well as the associated 2D context. - -```js -const canvas = document.getElementById('minilogo-canvas'); const context = canvas.getContext('2d'); +if (!context) { + throw new Error('Unable to get canvas context!'); +} ``` We'll also want to clean up the context, in case we already drew something there before. This will be relevant when we're updating the canvas multiple times with a new program. -```js +```ts context.clearRect(0, 0, canvas.width, canvas.height); ``` Next, we want to setup a background grid to display. It's not essential for drawing, but it looks nicer than an empty canvas. -```js +```ts context.beginPath(); context.strokeStyle = '#333'; for (let x = 0; x <= canvas.width; x+=(canvas.width / 10)) { @@ -403,38 +186,40 @@ context.stroke(); After drawing a grid, let's reset the stroke to a white color. -```js +```ts context.strokeStyle = 'white'; ``` Let's also setup some initial drawing state. This will be used to keep track of the pen state, and where we are on the canvas. -```js +```ts // maintain some state about our drawing context let drawing = false; let posX = 0; let posY = 0; ``` -And let's begin evaluating each of our commands. To do this, we'll setup an interval that repeatedly shifts the top element from our list of commands, evaluates it, and repeats. Once we're out of commands to evaluate, we'll clear the interval. Feel free to adjust the delay (or remove it entirely) in your version. - -```js -// use the command list to execute each command with a small delay -const id = setInterval(() => { - if (cmds.length > 0) { - // evaluate the next command in the current env/context - evalCmd(cmds.shift(), context); - } else { - // finish existing draw - if (drawing) { - context.stroke(); +And let's begin evaluating each of our commands. To do this, we'll setup an interval that repeatedly shifts the top element from our list of commands, evaluates it, and repeats. Once we're out of commands to evaluate, we'll clear the interval. The whole invocation will be wrapped in a promise, to make it easy to await later on. Feel free to adjust the delay (or remove it entirely) in your version. + +```ts +const doneDrawingPromise = new Promise((resolve) => { + // use the command list to execute each command with a small delay + const id = setInterval(() => { + if (cmds.length > 0) { + dispatchCommand(cmds.shift() as MiniLogoCommand, context); + } else { + // finish existing draw + if (drawing) { + context.stroke(); + } + clearInterval(id); + resolve(''); } - clearInterval(id); - } -}, 1); + }, 1); +}); ``` -The evaluate command itself only needs to handle 4 cases: +`dispatchCommand` itself only needs to handle 4 cases: - penUp - penDown @@ -445,11 +230,11 @@ Knowing this, and the details about what properties each command type can have, *Be sure to add this function inside the `updateMiniLogoCanvas` function, otherwise it will not have access to the necessary state!* -```js -// evaluate a single command in the current context -function evalCmd(cmd, context) { - if (cmd.cmd) { - switch (cmd.cmd) { +```ts +// dispatches a single command in the current context +function dispatchCommand(cmd: MiniLogoCommand, context: CanvasRenderingContext2D) { + if (cmd.name) { + switch (cmd.name) { // pen is lifted off the canvas case 'penUp': drawing = false; @@ -466,8 +251,8 @@ function evalCmd(cmd, context) { // move across the canvas // will draw only if the pen is 'down' case 'move': - const x = cmd.x; - const y = cmd.y; + const x = cmd.args.x; + const y = cmd.args.y; posX += x; posY += y; if (!drawing) { @@ -481,39 +266,37 @@ function evalCmd(cmd, context) { // set the color of the stroke case 'color': - if (cmd.color) { + if ((cmd.args as { color: string }).color) { // literal color or hex - context.strokeStyle = cmd.color; + context.strokeStyle = (cmd.args as { color: string }).color; } else { // literal r,g,b components - context.strokeStyle = `rgb(${cmd.r},${cmd.g},${cmd.b})`; + const args = cmd.args as { r: number, g: number, b: number }; + context.strokeStyle = `rgb(${args.r},${args.g},${args.b})`; } break; + // fallback in case we missed an instruction + default: + throw new Error('Unrecognized command received: ' + JSON.stringify(cmd)); + } } } ``` -Lastly, we want to view the page with some output on the canvas when our editor is finished starting, rather than an empty half of the screen to start. We can address this by setting the `generateAndDisplay` function to be called once the editor is finished loading. We can place this anywhere after our `startingPromise` has been created. +Now that we can interpret commands into drawing instructions, we're effectively done with setting up the last part of MiniLogo. Since we're listening to document updates, we don't need to do anything other than to just start it up and start with an example program. -```js -startingPromise.then(() => { - generateAndDisplay(); -}); -``` - -That's it, we're all done writing up our JS file. We should now be able to run the following (assuming the generator script is also executed by `build:web`), and get our results in `localhost:3000`. +That's it, we're all done writing up our TS file. We should now be able to run the following (assuming the generator script is also executed by `build:web`), and get our results in `localhost:3000`. ```bash npm run build:web npm run serve ``` -If all went well, you should see a white diamond sketched out on the canvas when the page loads. If not, double check that you set the `mainCode` that will display in your application on loading in. If you didn't, you can add it like so: +If all went well, you should see a white diamond sketched out on the canvas when the page loads. If not, double check that you receive & use the `code` value correctly in your `createUserConfig` function. You can also add the program yourself from here: -```js -editorConfig.setMainCode(` +```minilogo def test() { move(100, 0) pen(down) @@ -525,8 +308,6 @@ def test() { } color(white) test() - -`); ``` Once you have something drawing on the screen, you're all set, congratulations! You've just successfully written your own Langium-based language, deployed it in the web, and hooked up generation to boot. In fact, you've done *quite* a lot if you've gone through all of these tutorials so far. @@ -538,13 +319,13 @@ Once you have something drawing on the screen, you're all set, congratulations! - configuring code bundling - building an extension - setting up Langium + Monaco in the web -- adding a custom LSP command & handler -- using an LSP command to drive generation & draw images +- adding a document build phase listener +- listening for notifications in the client, and using the results And the concepts that we've gone over from the beginning to now are not just for MiniLogo of course, they can be easily generalized to work for your own language as well. As you've been going through these tutorials, we hope that you've been thinking about how you could have done things *differently* too. Whether a simple improvement, or another approach, we believe it's this creative kind of thinking that takes an idea of a language and really allows it to grow into something great. -One easy point to make is how the example code shown in these tutorials is designed to designed to be easy to demonstrate. However, it can improved with better error checking, better logic, generator optimizations, etc. +One easy note is how the example code shown in these tutorials was designed to be easy to demonstrate. It could definitely be improved with better error checking, better logic, generator optimizations, etc; something to keep in mind. -It is also easy to imagine how one could extend their generator to produce their own functionality, besides drawing. It's even possible to imagine that you might have multiple generator targets, as there is no requirement to have a single generator output form like we've done in these tutorials. You could add as many different outputs forms as you need for each specific target, and even share some functionality between generators. +It's also easy to imagine how one could extend their generator to produce their own functionality besides drawing. For example, imagine that you might have multiple generator targets, as there is no requirement to have a single generator output form like we've done in these tutorials. You could add as many different output forms as you need for each specific target, and even share some functionality between generators. We hope that these tutorials have given you a practical demonstration of how to construct a language in Langium, and facilitated further exploration into more advanced topics & customizations. If you're interested about learning more about Langium, you can continue through our other tutorials, reach out to us via discussions on Github, or continue working on your Langium-based language. diff --git a/hugo/content/tutorials/langium_and_monaco.md b/hugo/content/tutorials/langium_and_monaco.md index cc3e982a..48111921 100644 --- a/hugo/content/tutorials/langium_and_monaco.md +++ b/hugo/content/tutorials/langium_and_monaco.md @@ -5,41 +5,35 @@ weight: 6 {{< toc format=html >}} -In this tutorial we'll be talking about running Langium in the web with the Monaco editor. If you're not familiar with Monaco, it's the editor that powers VS Code. We're quite fond of it at TypeFox, so we've taken the time to write up this tutorial to explain how to integrate Langium in the web with Monaco, no backend required. - -As a disclaimer, just because we are using Monaco in this tutorial does not mean that you cannot use another code editor of your choice. For example, you can use Code Mirror with Langium as well. Generally, if an editor has LSP support, it is very likely you can integrate it quite easily with Langium, since it's LSP compatible. +*Updated on Oct. 4th, 2023 for usage with monaco-editor-wrapper 3.1.0 & above, as well as Langium 2.0.2* -Without further ado, let's jump into getting your web-based Langium experience setup. - -## Getting your Language Setup for the Web +In this tutorial we'll be talking about running Langium in the web with the Monaco editor. If you're not familiar with Monaco, it's the editor that powers VS Code. We're quite fond of it at TypeFox, so we've taken the time to write up this tutorial to explain how to integrate Langium in the web with Monaco, no backend required. -To begin, you're going to need a Langium-based language to work with. We have already written [MiniLogo](https://github.com/langium/langium-minilogo) in Langium as an example for deploying a language in the web. However, if you've been following along with these tutorials, you should be ready to move your own language into a web-based context. +Although we're using Monaco in this tutorial, that does not mean that you cannot use another code editor of your choice. For example, you can use Code Mirror with Langium as well. Generally, if an editor has LSP support, it is very likely you can integrate it easily with Langium, since it's LSP compatible. -Per usual, we'll be using MiniLogo as the motivating example here. +Without further ado, let's jump into getting your web-based Langium experience setup! -Once you have a language picked, you're going to want to add a script to your **package.json** to build a web worker for your language. The bundle this script produces will contain the language server for your language. +## Technologies You'll Need -```json -{ - ... - "build:worker": "esbuild --minify ./out/language-server/main.js --bundle --format=iife --outfile=./public/minilogo-server-worker.js" -} -``` +- [Langium](https://www.npmjs.com/package/langium) 2.0.2 or greater +- [Monaco Editor Wrapper](https://www.npmjs.com/package/monaco-editor-wrapper) 3.1.0 or greater +- [ESBuild](https://www.npmjs.com/package/esbuild) 0.18.20 or greater -Now, assuming `esbuild` is installed, if we try to invoke this it *won't succeed as expected*. Instead we'll get a warning back about some dependencies that couldn't be resolved. For example: +## Getting your Language Setup for the Web -> Could not resolve "fs" +To begin, you're going to need a Langium-based language to work with. We have already written [MiniLogo](https://github.com/langium/langium-minilogo) in Langium as an example for deploying a language in the web. However, if you've been following along with these tutorials so far, you should be ready to move your own language into a web-based context. -This makes sense since we're bundling for the web, and we can't depend on packages that rely on the usual environment with a filesystem. So, we need to update our language to make it compatible in a web-based context. +Per usual, we'll be using MiniLogo as the motivating example here. ## Factoring out File System Dependencies -First off, let's create a new entry point for our language server in **src/language-server/main-browser.ts**. This will mirror the regular entry point that we use to build already, but will allow us to target a web-based context instead. In this file, we'll have the following contents: +In order to build for the browser, we need to create a bundle that is free of any browser-incompatible modules. To do this, let's create a new entry point for our language server in **src/language-server/main-browser.ts**. This will mirror the regular entry point that we use to build already, but will target a browser-based context instead. We'll start with the following content: ```ts import { startLanguageServer, EmptyFileSystem } from 'langium'; -import { BrowserMessageReader, BrowserMessageWriter, createConnection } from 'vscode-languageserver/browser'; -import { createHelloWorldServices } from './hello-world-module'; +import { BrowserMessageReader, BrowserMessageWriter, createConnection } from 'vscode-languageserver/browser.js'; +// your services & module name may differ based on your language's name +import { createMiniLogoServices } from './minilogo-module.js'; declare const self: DedicatedWorkerGlobalScope; @@ -50,68 +44,117 @@ const messageWriter = new BrowserMessageWriter(self); const connection = createConnection(messageReader, messageWriter); // Inject the shared services and language-specific services -const { shared } = createHelloWorldServices({ connection, ...EmptyFileSystem }); +const { shared, MiniLogo } = createMiniLogoServices({connection, ...EmptyFileSystem }); // Start the language server with the shared services startLanguageServer(shared); ``` -Again, this is based on code that was originally produced by the yeoman generator, thus the **hello world** references. +Again, this is based on code that was originally produced by the yeoman generator, so it should look familiar. -Most of this is similar to what's in the **main.ts** file. The exceptions are the message readers & writers, and the notion of an `EmptyFileSystem` for the browser. There is a virtual file system API that we could utilize on most modern browsers, but for this tutorial we'll assume we aren't using any file system. Instead we'll have a single source 'file' located in our Monaco editor in memory. +Most of this is in line with what's contained in the **main.ts** file. The exceptions being the message readers & writers, and the notion of an `EmptyFileSystem` for the browser. There is a virtual file system API that we could utilize on most modern browsers, but for this tutorial we'll assume we aren't using any file system. Instead we'll have a single source 'file' located in memory. -We'll also need to include a library to resolve the missing `DedicatedWorkerGlobalScope`, which is normally not accessible until we update our **tsconfig.json** in our project root. We need to supplement the libs entry with `DOM` and `webworker`. From the yeoman generator example, the `lib` entry usually has just `["ESNext"]`. +We'll also need to include a library to resolve the missing `DedicatedWorkerGlobalScope`, which is normally not accessible until we update our **tsconfig.json** in our project root. We need to supplement the libs entry with `DOM` and `WebWorker`. From the yeoman generator example, the `lib` entry usually has just `["ESNext"]`. ```json { "compilerOptions": { ... - "lib": ["ESNext","DOM","webworker"] + "lib": ["ESNext", "DOM", "WebWorker"] } } ``` -Going back to the script we wrote before in our **package.json**, we're now ready to change **main.js** to **main-browser.js**: +Now that we have a new entry point for the browser, we need to add a script to our **package.json** to build a web worker for this language. The bundle this script produces will contain the language server for your language. The following script example is specific to MiniLogo, but should capture the general approach quite nicely: ```json { ... - "build:worker": "esbuild --minify ./out/language-server/main-browser.js --bundle --format=iife --outfile=./public/minilogo-server-worker.js" + "build:worker": "esbuild --minify ./out/language-server/main-browser.js --bundle --format=iife --outfile=./public/minilogo-server-worker.js", } ``` -Running `npm run build:worker` again, we should see the bundle is successfully generated without issue. If you're still having problems building the worker, double check that you're not coupled to `fs` or other file system dependent libraries in a related file. +Assuming `esbuild` is installed, and we've properly factored out any modules that are not suitable for a browser-based context, we should be good to go! + +Running `npm run build:worker` we should see the bundle is successfully generated without issue. If you're still having problems building the worker, double check that you're not coupled to `fs` or other file system dependent modules in a related file. Note that although our generator is still connected to using the file system, it's not relevant for the worker bundle to function. ## Setting up Monaco -Now we're going to setup Monaco, but not with Langium yet, as we want to be sure it's working first. +Now we're going to setup Monaco, but not with Langium yet, as we want to be sure it's working first before connecting the two. -For convenience, we're going to use two helper libraries from npm that wrap around some of Monaco's core functionality. +For convenience, we're going to use the Monaco Editor Wrapper (MER) to wrap around some of Monaco's core functionality, along with the Monaco Editor Workers package to assist. These packages are both maintained by TypeFox, and are designed to make it easier to use Monaco in a web-based context. We'll be using the following versions of these packages: -- [monaco-editor-wrapper](https://www.npmjs.com/package/monaco-editor-wrapper) -- [monaco-editor-workers](https://www.npmjs.com/package/monaco-editor-workers) +- [Monaco Editor Wrapper](https://www.npmjs.com/package/monaco-editor-wrapper) version **3.1.0** +- [monaco-editor-workers](https://www.npmjs.com/package/monaco-editor-workers) version **0.39.0** -Both these packages should be installed as dependencies for your language. In particular, it's important that you're using version **1.4.0** or later of the monaco-editor-wrapper. +Both these packages should be installed as dependencies for your language. In particular, this guide will assume that you're using version **3.1.0** or later of the monaco-editor-wrapper package, and version **0.39.0** of the monaco-editor-workers package. -Additionally, we'll want to add `express` as a development dependency (don't forget to also add `@types/express` too), since we'll be using that to run a local web server to test our standalone webpage. +Additionally, we'll want a way to serve this bundled language server. The choice of how you want to go about this is ultimately up to you. Previously we've recommended `express` as a development dependency (don't forget to also add `@types/express` too), as a powerful & lightweight NodeJS server framework. However, we'll be going with the built-in NodeJS support for standing up a web-server; however again the choice is yours here. -We'll also want to add some more scripts to our package.json to copy over the necessary files from the monaco-editor-wrapper & monaco-editor-worker into the **public** folder. We'll be referencing these library assets to setup the webpage for Langium and Monaco. +We'll also want to add some more scripts to our package.json to copy over the necessary files from the monaco-editor-wrapper & monaco-editor-worker into the **public** folder. We'll be referencing these library assets to setup the webpage for Langium + Monaco. ```json { ... - "prepare:public": "npx shx mkdir -p ./public && npx shx cp -fr ./src/static/* ./public/", - "copy:monaco-editor-wrapper": "npx shx cp -fr ./node_modules/monaco-editor-wrapper/bundle ./public/monaco-editor-wrapper", - "copy:monaco-workers": "npx shx cp -fr ./node_modules/monaco-editor-workers/dist/ ./public/monaco-editor-workers", - "build:web": "npm run build && npm run prepare:public && npm run build:worker && npm run copy:monaco-editor-wrapper && npm run copy:monaco-workers" + "prepare:public": "node scripts/prepare-public.mjs", + "build:web": "npm run build && npm run prepare:public && npm run build:worker && node scripts/copy-monaco-assets.mjs", } ``` -The last script is there to provide a convenient way to invoke all the intermediate build steps in sequence. However you'll want to wait before running the `build:web` script, as we still need to add our **static** assets to make that work. +Both scripts reference *mjs* files that need to be added as well into the scripts folder: -If you went with another editor you would want to make sure that the assets required for that editor will also be copied into **public** folder as part of your output. +**scripts/prepare-public.mjs** + +```js +import * as esbuild from 'esbuild' +import shell from 'shelljs' + +// setup & copy over css & html to public +shell.mkdir('-p', './public'); +shell.cp('-fr', './src/static/*.css', './public/'); +shell.cp('-fr', './src/static/*.html', './public'); + +// bundle minilogo.ts, and also copy to public +await esbuild.build({ + entryPoints: ['./src/static/minilogo.ts'], + minify: true, + sourcemap: true, + bundle: true, + outfile: './public/minilogo.js', +}); +``` + +**scripts/copy-monaco-assets.mjs** + +```js +import shell from 'shelljs' + +// copy workers to public +shell.mkdir('-p', './public/monaco-editor-workers/workers'); +shell.cp( + '-fr', + './node_modules/monaco-editor-workers/dist/index.js', + './public/monaco-editor-workers/index.js' +); +shell.cp( + '-fr', + './node_modules/monaco-editor-workers/dist/workers/editorWorker-es.js', + './public/monaco-editor-workers/workers/editorWorker-es.js' +); +shell.cp( + '-fr', + './node_modules/monaco-editor-workers/dist/workers/editorWorker-iife.js', + './public/monaco-editor-workers/workers/editorWorker-iife.js' +); +``` + +This saves us from writing these extra details into our package json, and focusing on the overall goal each step. + +The last script, `build:web` is there to provide a convenient way to invoke all the intermediate build steps in sequence. However you'll want to wait before running the `build:web` script, as we still need to add our **static** assets to make that work; which will come in the next step. + +As a quick note, if you went with another editor you would want to make sure that the assets required for that editor will also be copied into **public** folder as part of your output. ## Setting up a Static Page @@ -130,10 +173,26 @@ Here's the raw contents of the HTML content stored in **src/static/index.html**.

MiniLogo in Langium

-
- -
+ + +
+ +
+
+
+
+
+ +
+ +
+
+ + +
+
+

@@ -141,7 +200,7 @@ Here's the raw contents of the HTML content stored in **src/static/index.html**. Langium
- + ``` @@ -154,9 +213,10 @@ html,body { font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; color: white; /* for monaco */ - margin: 8px auto; - width: 80%; - height: 80%; + margin: 0; + padding: 0; + width: 100%; + height: 100%; } h1 { text-align: center; @@ -166,6 +226,39 @@ h1 { margin: 8px auto; text-align: center; } +#page-wrapper { + display: flex; + max-width: 2000px; + margin: 4px auto; + padding: 4px; + min-height: 75vh; + justify-content: center; +} +#page-wrapper .half { + display: flex; + width: 40vw; +} +.build { + display: block; + margin: 8px auto; + width: 300px; + height: 30px; + background: none; + border: 2px #fff solid; + color: #fff; + transition: 0.3s; + font-size: 1.2rem; + border-radius: 4px; +} +.build:hover { + border-color: #6cf; + color: #6cf; + cursor: pointer; +} +.build:active { + color: #fff; + border-color: #fff; +} footer { text-align: center; color: #444; @@ -173,10 +266,21 @@ footer { margin-bottom: 16px; } @media(max-width: 1000px) { + #page-wrapper { + display: block; + } + #page-wrapper .half { + display: block; + width: auto; + } #minilogo-canvas { margin-top: 32px; } + #page-wrapper { + min-height: auto; + } } + /* for monaco */ .wrapper { display: flex; @@ -184,128 +288,305 @@ footer { height: 100%; width: 100%; } + #monaco-editor-root { flex-grow: 1; } + +#status-msg { + color: red; +} ``` -Finally, there's the actual Javascript setting up our Monaco instance (stored in **src/static/setup.js**), and for setting up Langium as well. This is the most complex part of setting up Langium + Monaco in the web, so we'll walk through the file in parts. +Finally, there's the actual Javascript setting up our Monaco instance (stored in **src/static/minilogo.ts**), and for setting up Langium as well. This is the most complex part of setting up Langium + Monaco in the web, so we'll walk through the file in parts. -First, we need to import and setup the worker, as well as some language client wrapper configuration. +(*Update on Oct. 4th, 2023: Previously we wrote this as **src/static/setup.js**. This new file can be considered the same, but reworked into TypeScript & updated for the new versions of Langium & the MER.*) -```js -import { MonacoEditorLanguageClientWrapper } from './monaco-editor-wrapper/index.js'; -import { buildWorkerDefinition } from "./monaco-editor-workers/index.js"; +First, we need to import and setup the worker, as well as some language client wrapper configuration. -buildWorkerDefinition('./monaco-editor-workers/workers', new URL('', window.location.href).href, false); +```ts +import { MonacoEditorLanguageClientWrapper, UserConfig } from "monaco-editor-wrapper/bundle"; +import { buildWorkerDefinition } from "monaco-editor-workers"; +import { addMonacoStyles } from 'monaco-editor-wrapper/styles'; -MonacoEditorLanguageClientWrapper.addMonacoStyles('monaco-editor-styles'); +/** + * Setup Monaco's own workers and also incorporate the necessary styles for the monaco-editor + */ +function setup() { + buildWorkerDefinition( + './monaco-editor-workers/workers', + new URL('', window.location.href).href, + false + ); + addMonacoStyles('monaco-editor-styles'); +} ``` -Then, we'll want to instantiate our language client wrapper. We'll also need to get a handle for the editor configuration, and set the current language id to `minilogo`. This should match the id of the language that will be recognized by our language server. +Then, we'll want to instantiate our language client wrapper. In previous versions of the `monaco-editor-wrapper` package (before 2.0.0), configuration was performed by manually setting properties on the `MonacoEditorLanguageClientWrapper` instance. However, as of 3.1.0 (at the time of writing this), the constructor for `MonacoEditorLanguageClientWrapper` now takes a configuration object as its first argument. This configuration object allows us to set the same properties as before, but with more fine-grained control over all the properties that are set. -```js -const client = new MonacoEditorLanguageClientWrapper(); -const editorConfig = client.getEditorConfig(); -editorConfig.setMainLanguageId('minilogo'); -``` +We're going to walk through the parts that will be used to build up this configuration first, and then joining the actual configuration object together afterwards. -Then, we'll want to add some static syntax highlighting. This part is a bit verbose, but suffice it to say that the single argument passed to `setMonarchTokensProvider` is a JSON object that allows recognizing tokens in MiniLogo and applying styling to those tokens. It represents a Monarch grammar that achieves this express purpose. +To start, let's keep in mind that our current language id will be `minilogo`. This should match the id of the language that will be recognized by our language server. -```js -editorConfig.setMonarchTokensProvider({ - keywords: [ - 'color','def','down','for','move','pen','to','up' - ], - operators: [ - '-',',','*','/','+','=' - ], - symbols: /-|,|\(|\)|\{|\}|\*|\/|\+|=/, - - tokenizer: { - initial: [ - { regex: /#(\d|[a-fA-F])+/, action: {"token":"string"} }, - { regex: /[_a-zA-Z][\w_]*/, action: { cases: { '@keywords': {"token":"keyword"}, '@default': {"token":"string"} }} }, - { regex: /-?[0-9]+/, action: {"token":"number"} }, - { include: '@whitespace' }, - { regex: /@symbols/, action: { cases: { '@operators': {"token":"operator"}, '@default': {"token":""} }} }, - ], - whitespace: [ - { regex: /\s+/, action: {"token":"white"} }, - { regex: /\/\*/, action: {"token":"comment","next":"@comment"} }, - { regex: /\/\/[^\n\r]*/, action: {"token":"comment"} }, +Then, we'll want to add some static syntax highlighting. To do this we have a couple choices, using a TextMate or a [Monarch grammar](https://microsoft.github.io/monaco-editor/monarch.html). Both will provide us with the ability to parse our language, and apply styling to our tokens. However we have to choose one, we cannot use both simultaneously. This is related to how Monaco itself is configured with regards to whether we're using the VSCode API config, or the classic editor config. This makes sense to a degree, as we can only prepare the editor one way or the other. + +For MiniLogo, our monarch grammar will look like so: + +```ts +/** + * Returns a Monarch grammar definition for MiniLogo + */ +function getMonarchGrammar() { + return { + keywords: [ + 'color','def','down','for','move','pen','to','up' ], - comment: [ - { regex: /[^\/\*]+/, action: {"token":"comment"} }, - { regex: /\*\//, action: {"token":"comment","next":"@pop"} }, - { regex: /[\/\*]/, action: {"token":"comment"} }, + operators: [ + '-',',','*','/','+','=' ], - } -}); + symbols: /-|,|\(|\)|\{|\}|\*|\/|\+|=/, + + tokenizer: { + initial: [ + { regex: /#(\d|[a-fA-F]){3,6}/, action: {"token":"string"} }, + { regex: /[_a-zA-Z][\w_]*/, action: { cases: { '@keywords': {"token":"keyword"}, '@default': {"token":"string"} }} }, + { regex: /(?:(?:-?[0-9]+)?\.[0-9]+)|-?[0-9]+/, action: {"token":"number"} }, + { include: '@whitespace' }, + { regex: /@symbols/, action: { cases: { '@operators': {"token":"operator"}, '@default': {"token":""} }} }, + ], + whitespace: [ + { regex: /\s+/, action: {"token":"white"} }, + { regex: /\/\*/, action: {"token":"comment","next":"@comment"} }, + { regex: /\/\/[^\n\r]*/, action: {"token":"comment"} }, + ], + comment: [ + { regex: /[^\/\*]+/, action: {"token":"comment"} }, + { regex: /\*\//, action: {"token":"comment","next":"@pop"} }, + { regex: /[\/\*]/, action: {"token":"comment"} }, + ], + } + }; +} ``` -We can produce this Monarch grammar by updating our **langium-config.json** to also produce a Monarch file as output. Note that although we're talking about MiniLogo here, we based this example off of the hello-world example produced by the yeoman generator. As such, we still have hello world names here and there, and for this tutorial we'll just use the same name again as for the TextMate grammar. +We can produce this Monarch grammar by updating our **langium-config.json** to produce a Monarch file as output. Note that although we're talking about MiniLogo here, we based this example off of the hello-world example produced by the yeoman generator. As such, we still have hello world names here and there, and for this tutorial we'll just use the same name again as for the TextMate grammar. ```json ... "textMate": { - "out": "syntaxes/hello-world.tmLanguage.json" + "out": "syntaxes/minilogo.tmLanguage.json" }, "monarch": { - "out": "syntaxes/hello-world.monarch.ts" + "out": "syntaxes/minilogo.monarch.ts" } ``` -To generate this file, run `npm run langium:generate`. You can then copy over the definition of the grammar from **syntaxes/hello-world.monarch.ts** (or whatever other name you have given this file) into the `setMonarchTokensProvider` function to setup that highlighting. Keep in mind that this generated monarch grammar is *very* simple. If you want more complex highlighting, we recommend writing your own custom monarch grammar, and storing it somewhere else to prevent it from being overridden. If you're interested, you can find more details about the [Monarch grammar highlighting language here](https://microsoft.github.io/monaco-editor/monarch.html). +To generate this file, run `npm run langium:generate`. You can then copy over the definition of the grammar from **syntaxes/hello-world.monarch.ts** (or whatever other name you have given this file). Keep in mind that this generated monarch grammar is *very* simple. If you want more complex highlighting, we recommend writing your own custom monarch grammar, and storing it somewhere else to prevent it from being overridden. If you're interested, you can find more details about the [Monarch grammar highlighting language here](https://microsoft.github.io/monaco-editor/monarch.html). Then, we want to setup the code that shows up by default. The following is a fixed MiniLogo program that should display a white diamond in the top left corner of the screen. -```js -editorConfig.setMainCode(` -def test() { - move(100, 0) - pen(down) - move(100, 100) - move(-100, 100) - move(-100, -100) - move(100, -100) - pen(up) +```ts +/** + * Retrieves the program code to display, either a default or from local storage + */ +function getMainCode() { + let mainCode = ` + def test() { + move(100, 0) + pen(down) + move(100, 100) + move(-100, 100) + move(-100, -100) + move(100, -100) + pen(up) + } + color(white) + test() + + `; + + // optionally: use local storage to save the code + // and seek to restore any previous code from our last session + if (window.localStorage) { + const storedCode = window.localStorage.getItem('mainCode'); + if (storedCode !== null) { + mainCode = storedCode; + } + } + + return mainCode; } -color(white) -test() +``` + +Since we're planning to use a language server with Monaco, we'll need to setup a language client config too. To do this we'll also need to generate a worker using our language server worker file, but that's fairly straightforward to setup here. Keep in mind that you'll need to have access to the bundle produced from your **main-browser.ts** from before. Here the built result is copied over as **public/minilogo-server-worker.js**. -`); +```ts +/** + * Creates & returns a fresh worker using the MiniLogo language server + */ +function getWorker() { + const workerURL = new URL('minilogo-server-worker.js', window.location.href); + return new Worker(workerURL.href, { + type: 'module', + name: 'MiniLogoLS' + }); +} ``` -Lastly, we'll cap off our JS file with some final configurations to setup the theme, configure how we use Langium's language server, and finish setting up the editor. +By creating the worker in advance, we give ourselves the ability to directly interact with the worker/LS independent of the wrapper itself, and to even pre-configure it before use. This can be hugely beneficial, especially if we expect to customize our LS on the fly. -```js -editorConfig.theme = 'vs-dark'; -editorConfig.useLanguageClient = true; -editorConfig.useWebSocket = false; +Lastly, let's setup the user config, which will be used to startup the wrapper. -const workerURL = new URL('./minilogo-server-worker.js', import.meta.url); -console.log(workerURL.href); +```ts +type WorkerUrl = string; -const lsWorker = new Worker(workerURL.href, { - type: 'classic', - name: 'MiniLogo Language Server' -}); -client.setWorker(lsWorker); +/** + * Classic configuration for the monaco editor (for use with a Monarch grammar) + */ +interface ClassicConfig { + code: string, + htmlElement: HTMLElement, + languageId: string, + worker: WorkerUrl | Worker, + monarchGrammar: any; +} + +/** + * Generates a valid UserConfig for a given Langium example + * + * @param config An extended or classic editor config to generate a UserConfig from + * @returns A completed UserConfig + */ +function createUserConfig(config: ClassicConfig): UserConfig { + // setup urls for config & grammar + const id = config.languageId; + + // generate langium config + return { + htmlElement: config.htmlElement, + wrapperConfig: { + editorAppConfig: { + $type: 'classic', + languageId: id, + useDiffEditor: false, + code: config.code, + theme: 'vs-dark', + languageDef: config.monarchGrammar + }, + serviceConfig: { + enableModelService: true, + configureConfigurationService: { + defaultWorkspaceUri: '/tmp/' + }, + enableKeybindingsService: true, + enableLanguagesService: true, + debugLogging: false + } + }, + languageClientConfig: { + options: { + $type: 'WorkerDirect', + worker: config.worker as Worker, + name: `${id}-language-server-worker` + } + } + }; +} +``` + +This particular UserConfig will be for configuring a classic editor, rather than a VSCode extension-based editor. This is because we're using a Monarch grammar, which is not supported by the extension configuration. However, if we wanted to use a TextMate grammar, we could use the extension based configuration instead. + +```json +editorAppConfig: { + $type: 'vscodeApi', + languageId: id, + useDiffEditor: false, + code: config.code, + ... +} +``` -// keep a reference to a promise for when the editor is finished starting, we'll use this to setup the canvas on load -const startingPromise = client.startEditor(document.getElementById("monaco-editor-root")); +You would just need to fill in the rest of the details for associating a TextMate grammar & such. [Here's an example from the monaco-components repo](https://github.com/TypeFox/monaco-components/blob/4f301445eca943b9775166704304637cf5e8bd00/packages/examples/src/langium/config/wrapperLangiumVscode.ts#L37). + +Regardless of how the user config is setup, we can now invoke that helper function with a handful of configuration details, and have a working UserConfig to pass to the wrapper. + +```ts +// create a wrapper instance +const wrapper = new MonacoEditorLanguageClientWrapper(); + +// start up with a user config +await wrapper.start(createUserConfig({ + htmlElement: document.getElementById("monaco-editor-root")!, + languageId: 'minilogo', + code: getMainCode(), + worker: getWorker(), + monarchGrammar: getMonarchGrammar() +})); ``` -Note the `startingPromise` that's returned from `startEditor`. We're not using this yet, but it will be important for our setup in the next tutorial. +That's it! Now if everything was configured correctly, we should have a valid wrapper that will display the code we want in our browser. + +## Serving via NodeJS + +Now that we have our files all setup, and our build process prepared, we can put together a mini server application to make viewing our public assets easy. We'll do this by adding **src/web/app.ts** to our project, and giving it the following contents: + +```ts +/** + * Simple server app for serving generated examples locally + * Based on: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework + */ +import * as fs from "node:fs"; +import * as http from "node:http"; +import * as path from "node:path"; + +const port = 3000; -## Serving via Express +const MIME_TYPES: Record = { + default: "application/octet-stream", + html: "text/html; charset=UTF-8", + js: "application/javascript", + css: "text/css", +}; + +const STATIC_PATH = path.join(process.cwd(), "./public"); + +const toBool = [() => true, () => false]; + +const prepareFile = async (url: string) => { + const paths = [STATIC_PATH, url]; + if (url.endsWith("/")) { + paths.push("index.html"); + } + const filePath = path.join(...paths); + const pathTraversal = !filePath.startsWith(STATIC_PATH); + const exists = await fs.promises.access(filePath).then(...toBool); + const found = !pathTraversal && exists; + // there's no 404, just redirect to index.html in all other cases + const streamPath = found ? filePath : STATIC_PATH + "/index.html"; + const ext = path.extname(streamPath).substring(1).toLowerCase(); + const stream = fs.createReadStream(streamPath); + return { found, ext, stream }; +}; + +http + .createServer(async (req, res) => { + const file = await prepareFile(req.url!); + const statusCode = file.found ? 200 : 404; + const mimeType: string = MIME_TYPES[file.ext] || MIME_TYPES.default; + res.writeHead(statusCode, { "Content-Type": mimeType }); + file.stream.pipe(res); + console.log(`${req.method} ${req.url} ${statusCode}`); + }) + .listen(port); + +console.log(`Server for MiniLogo assets listening on http://localhost:${port}`); +``` -Now that we have our files all setup, and our build process prepared, we can put together a mini express application to make viewing our public assets easy. We'll do this by adding **src/web/app.ts** to our project, and giving it the following contents: +If you would like to compact this, and don't mind adding additional deps to your project, you can include `express` and `@types/express` to your project, and use the following code instead: ```ts /** - * Simple app for serving generated examples + * Simple express app for serving generated examples */ import express from 'express'; @@ -317,7 +598,7 @@ console.log(`Server for MiniLogo assets listening on http://localhost:${port}`); }); ``` -And to invoke express, we need to add one more script to our package.json. +And to invoke the server, we need to add one more script to our package.json. ```json { @@ -333,6 +614,6 @@ npm run build:web npm run serve ``` -You should be greeted with a page that contains a working Monaco instance and a small MiniLogo program in the editor. This editor has the highlighting we would expect, and also is fully connected to the language server for our language. This means we have full LSP support for operations that we would expect to have in a desktop editor. +You should be greeted with a page that contains a working Monaco instance and a small MiniLogo program in the editor. This editor has the highlighting we would expect, and also is fully connected to the language server for our language. This means we have full LSP support for operations that we would expect to have in a native IDE, such as VSCode. And that's it, we have successfully implemented Langium + Monaco in the web for our language. It's not doing much at this time besides presenting us with an editor, but in the next tutorial we'll talk about [using the same setup to add generation in the web](/tutorials/generation_in_the_web). Since our generation has already been configured natively in prior tutorials, we can use what we've written to quickly implement a web application that translates MiniLogo programs into drawing instructions for an HTML5 canvas. diff --git a/hugo/content/tutorials/validation.md b/hugo/content/tutorials/validation.md index c785b943..b41015bd 100644 --- a/hugo/content/tutorials/validation.md +++ b/hugo/content/tutorials/validation.md @@ -21,7 +21,7 @@ In this example we're going to *disallow* names that are non-unique for definiti ## The Validation Registry -In order to express these constraints, we need to modify our language's **validator**. By default, this can be found in **src/language-server/YOUR-LANGUAGE-validator.ts**; with a name that corresponds to your language. This file begins with a validation registry that extends the default validation registry. The validation registry allows us to register validation checks for our language. +In order to express these constraints, we need to modify our language's **validator**. By default, this can be found in **src/language/YOUR-LANGUAGE-validator.ts**; with a name that corresponds to your language. This file begins with a validation registry that extends the default validation registry. The validation registry allows us to register validation checks for our language. The constructor for the registry is of particular interest, as it allows associating validation functions with *specific* nodes in your AST. Here you can see an example of the constructor below for the default hello world language from the yeoman generator. @@ -60,7 +60,7 @@ With this in mind, we can look back at our grammar that we've written for MiniLo - Validate that definitions have unique names in a Model - Validate that arguments have unique names in a Definition -In order to perform a validation, we need to know the type of that node to validate. Beyond checking our grammar to find this, we can also check the semantic model (akin to the abstract syntax) of our language. This was generated while running `npm run langium:generate`, and is located in **src/language-server/generated/ast.ts**. Peeking into this model, we can see that our rule for `Model` was written like so: +In order to perform a validation, we need to know the type of that node to validate. Beyond checking our grammar to find this, we can also check the semantic model (akin to the abstract syntax) of our language. This was generated while running `npm run langium:generate`, and is located in **src/language/generated/ast.ts**. Peeking into this model, we can see that our rule for `Model` was written like so: ```langium entry Model: (stmts+=Stmt | defs+=Def)*; diff --git a/hugo/content/tutorials/writing_a_grammar.md b/hugo/content/tutorials/writing_a_grammar.md index 5e6fae05..e971bf9b 100644 --- a/hugo/content/tutorials/writing_a_grammar.md +++ b/hugo/content/tutorials/writing_a_grammar.md @@ -36,7 +36,7 @@ Now that we have an idea of our semantics and our concrete syntax, we can then s As an aside, our version of MiniLogo will be an *approximation* of Dr. Walkingshaw's version. We won't adhere to it completely, and we won't be incorporating some elements, such as variable declarations. -To get started sketching the grammar we'll be using the **Hello World** example from the yeoman generator. You can read about how to get this setup in the [Getting Started](/docs/getting-started/) section of our docs. We'll be working with a fresh from the generator using only the defaults, and building up from that. We'll begin by modifying the default grammar file, and updating it to work for MiniLogo. You can find this file under **src/language-server/hello-world.langium** in your new project. If you used a name other than the default, the file will still be there, but using your custom name instead. +To get started sketching the grammar we'll be using the **Hello World** example from the yeoman generator. You can read about how to get this setup in the [Getting Started](/docs/getting-started/) section of our docs. We'll be working with a fresh from the generator using only the defaults, and building up from that. We'll begin by modifying the default grammar file, and updating it to work for MiniLogo. You can find this file under **src/language/hello-world.langium** in your new project. If you used a name other than the default, the file will still be there, but using your custom name instead. We'll be overriding the existing langium grammar file completely, so delete the old contents before we begin. @@ -221,7 +221,7 @@ Color: 'color' '(' ((r = Expr ',' g=Expr ',' b=Expr) | color=ID | color=HEX) ') What's interesting here is that the color & r,g,b properties are *both* optional. Since in either case only one or the other will be defined. With the two forms, this is enough information to quickly determine what kind of color command we have, and to handle it correctly later on. -## Addding Expressions +## Adding Expressions Now we're at the core of our language, **Expressions**. In MiniLogo we want to be able to express not only literal values, but also references and arithmetic operations such as addition, subtraction, multiplication, and division. When implementing expressions, we need to keep in mind that Langium is based off of Chevrotain, which produces top-down parsers. This means we have to watch out for cases that lead to left-recursion. In order to avoid this, we need to be careful not to define a rule with itself on the left-hand side. For example, something like `Expr: e1=Expr ...` would not work, because the parser would infinitely try to parse another expression forever. diff --git a/hugo/layouts/langium/list.html b/hugo/layouts/langium/list.html index 1958f237..b47abbc5 100644 --- a/hugo/layouts/langium/list.html +++ b/hugo/layouts/langium/list.html @@ -4,9 +4,19 @@
{{range where .Pages.ByWeight ".Params.draft" false}} diff --git a/hugo/layouts/partials/langium-mobile-menu.html b/hugo/layouts/partials/langium-mobile-menu.html index b1a007fd..dcade5fd 100644 --- a/hugo/layouts/partials/langium-mobile-menu.html +++ b/hugo/layouts/partials/langium-mobile-menu.html @@ -39,7 +39,7 @@ Support - + GitHub diff --git a/hugo/layouts/partials/langium-nav.html b/hugo/layouts/partials/langium-nav.html index 753d3e5c..1a1c909a 100644 --- a/hugo/layouts/partials/langium-nav.html +++ b/hugo/layouts/partials/langium-nav.html @@ -12,7 +12,7 @@ class="nav-link-desktop text-emeraldLangium dark:text-emeraldLangium"> Support - + GitHub \ No newline at end of file diff --git a/hugo/package.json b/hugo/package.json index 7ae94a6a..c6255185 100644 --- a/hugo/package.json +++ b/hugo/package.json @@ -5,48 +5,55 @@ "license": "MIT", "private": true, "scripts": { - "clean:static": "npx shx rm -rf ./static/showcase ./static/playground ./static/libs", - "copy:libs:prepare": "npx shx mkdir -p ./static/libs/monaco-editor-workers/workers", - "copy:monaco-editor-wrapper": "npm run copy:libs:prepare && npx shx cp -fr ../node_modules/monaco-editor-wrapper/bundle ./static/libs/monaco-editor-wrapper", - "copy:monaco-workers": "npm run copy:libs:prepare && npx shx cp -f ../node_modules/monaco-editor-workers/dist/index.* ./static/libs/monaco-editor-workers && npx shx cp -f ../node_modules/monaco-editor-workers/dist/workers/editorWorker-iife.js ./static/libs/monaco-editor-workers/workers", + "clean:static": "shx rm -rf ./static/showcase ./static/playground ./static/libs", + "copy:libs:prepare": "shx mkdir -p ./static/libs/monaco-editor-workers/workers", + "copy:monaco-workers": "npm run copy:libs:prepare && shx cp -f ../node_modules/monaco-editor-workers/dist/index.* ./static/libs/monaco-editor-workers && shx cp -f ../node_modules/monaco-editor-workers/dist/workers/editorWorker-iife.js ./static/libs/monaco-editor-workers/workers", "build:worker/statemachine": "esbuild ../node_modules/langium-statemachine-dsl/out/language-server/main-browser.js --bundle --format=iife --outfile=./static/showcase/libs/worker/statemachineServerWorker.js", + "build:worker/arithmetics": "esbuild ../node_modules/langium-arithmetics-dsl/out/language-server/main-browser.js --bundle --format=iife --outfile=./static/showcase/libs/worker/arithmeticsServerWorker.js", + "build:worker/domainmodel": "esbuild ../node_modules/langium-domainmodel-dsl/out/language-server/main-browser.js --bundle --format=iife --outfile=./static/showcase/libs/worker/domainmodelServerWorker.js", "build:worker/playground-langium": "esbuild ./content/playground/langium-worker.ts --bundle --format=iife --outfile=./static/playground/libs/worker/langiumServerWorker.js", "build:worker/playground-user": "esbuild ./content/playground/user-worker.ts --bundle --format=iife --outfile=./static/playground/libs/worker/userServerWorker.js", "build:worker/playground-common": "esbuild ./content/playground/common.ts --bundle --format=esm --outfile=./static/playground/libs/worker/common.js", - "build:static": "npm run clean:static && npm run build:worker/statemachine && npm run build:worker/playground-common && npm run build:worker/playground-langium && npm run build:worker/playground-user && npm run copy:monaco-editor-wrapper && npm run copy:monaco-workers", + "build:worker/sql": "esbuild ./assets/scripts/sql/language-server.ts --bundle --format=iife --outfile=./static/showcase/libs/worker/sqlServerWorker.js", + "build:worker/minilogo": "esbuild ../node_modules/langium-minilogo/out/language-server/main-browser.js --bundle --format=iife --outfile=./static/showcase/libs/worker/minilogoServerWorker.js", + "build:static": "npm run clean:static && npm run build:worker/statemachine && npm run build:worker/domainmodel && npm run build:worker/sql && npm run build:worker/minilogo && npm run build:worker/arithmetics && npm run build:worker/playground-common && npm run build:worker/playground-langium && npm run build:worker/playground-user && npm run copy:monaco-workers", "build": "npm run build:static && cross-env NODE_ENV=production hugo --config ./config.toml -b / -d ../public --gc --minify ", "watch": "npm run build:static && cross-env NODE_ENV=development hugo server --config ./config.toml -D -b localhost:1313 -d ../public --appendPort=false", "watch:gitpod": "npm run build:static && cross-env NODE_ENV=development hugo server --config ./config.toml -D -b `gp url 1313` -d ../public --appendPort=false" }, "devDependencies": { - "@rollup/plugin-inject": "^5.0.2", + "@rollup/plugin-inject": "~5.0.4", "@types/lz-string": "^1.3.34", "@types/mustache": "^4.2.1", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "esbuild": "^0.15.7" + "@types/react": "~18.2.28", + "@types/react-dom": "~18.2.13", + "esbuild": "~0.19.4" }, "dependencies": { - "clsx": "^1.2.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", "@babel/cli": "~7.19.3", "@babel/core": "~7.20.5", "@babel/preset-react": "~7.18.6", "@babel/preset-typescript": "~7.18.6", - "@typefox/monaco-editor-react": "1.0.0-next.6", + "@types/d3": "^7.4.0", + "clsx": "^1.2.1", + "d3": "^7.8.5", "hugo-extended": "~0.89.4", - "langium": "1.1.0", - "langium-arithmetics-dsl": "~1.1.0", - "langium-domainmodel-dsl": "~1.1.0", - "langium-statemachine-dsl": "~1.1.0", + "langium": "^1.2.0", + "langium-arithmetics-dsl": "~1.2.1", + "langium-domainmodel-dsl": "~1.2.0", + "langium-minilogo": "^1.2.0", + "langium-sql": "^0.2.3", + "langium-statemachine-dsl": "~1.2.0", + "langium-website-core": "~1.0.0", "lz-string": "^1.4.4", - "monaco-editor-workers": "0.34.2", - "monaco-editor-wrapper": "1.4.1", - "vscode-languageserver": "8.0.2" + "monaco-editor-workers": "~0.44.0", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "vscode-languageserver": "~8.0.2", + "langium-ast-helper": "0.1.2" }, "volta": { - "node": "16.18.1", - "npm": "8.19.3" + "node": "18.18.1", + "npm": "9.9.0" } } diff --git a/hugo/static/assets/BestSolution_OpenAPI.svg b/hugo/static/assets/BestSolution_OpenAPI.svg new file mode 100644 index 00000000..c01af066 --- /dev/null +++ b/hugo/static/assets/BestSolution_OpenAPI.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugo/static/assets/Langium_Arithmetics.svg b/hugo/static/assets/Langium_Arithmetics.svg new file mode 100644 index 00000000..608003dc --- /dev/null +++ b/hugo/static/assets/Langium_Arithmetics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/hugo/static/assets/Langium_Domainmodel.svg b/hugo/static/assets/Langium_Domainmodel.svg new file mode 100644 index 00000000..5923ecee --- /dev/null +++ b/hugo/static/assets/Langium_Domainmodel.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Entity + + + + + + + + + Entity + + + + + + + + + + + + Package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugo/static/assets/Langium_MiniLogo.svg b/hugo/static/assets/Langium_MiniLogo.svg new file mode 100644 index 00000000..4aa18793 --- /dev/null +++ b/hugo/static/assets/Langium_MiniLogo.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + diff --git a/hugo/static/assets/Langium_SQL.svg b/hugo/static/assets/Langium_SQL.svg new file mode 100644 index 00000000..5f41a466 --- /dev/null +++ b/hugo/static/assets/Langium_SQL.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hugo/static/assets/external_link.svg b/hugo/static/assets/external_link.svg new file mode 100644 index 00000000..5373e99c --- /dev/null +++ b/hugo/static/assets/external_link.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/hugo/static/custom.css b/hugo/static/custom.css index 751cda8b..2d0b36c4 100644 --- a/hugo/static/custom.css +++ b/hugo/static/custom.css @@ -210,6 +210,10 @@ h4 { font-size: 1.125rem; } +.gdoc-markdown pre code { + overflow-x: scroll; +} + .gdoc_heart { margin-left: 5px; } diff --git a/hugo/static/index.js b/hugo/static/index.js index 24ce6865..92756ba0 100644 --- a/hugo/static/index.js +++ b/hugo/static/index.js @@ -206,9 +206,9 @@ const boxes = gsap.utils.toArray(".feature-item-container"); if(Array.isArray(boxes) && boxes.length && boxes.every(b => b && 'offsetLeft' in b)) { const loop = horizontalLoop(boxes, {paused: true, draggable: true}); boxes.forEach((box, i) => box.addEventListener("click", () => loop.toIndex(i, {duration: 0.8, ease: "power1.inOut"}))); + document.querySelector("#features-right")?.addEventListener("click", () => loop.next({duration: 0.4, ease: "power1.inOut"})); + document.querySelector("#features-left")?.addEventListener("click", () => loop.previous({duration: 0.4, ease: "power1.inOut"})); } -document.querySelector("#features-right")?.addEventListener("click", () => loop.next({duration: 0.4, ease: "power1.inOut"})); -document.querySelector("#features-left")?.addEventListener("click", () => loop.previous({duration: 0.4, ease: "power1.inOut"})); // copied from here: https://greensock.com/docs/v3/HelperFunctions /* diff --git a/hugo/static/prism/langium-prism.js b/hugo/static/prism/langium-prism.js index 46000a2e..f174e169 100644 --- a/hugo/static/prism/langium-prism.js +++ b/hugo/static/prism/langium-prism.js @@ -21,7 +21,7 @@ Prism.languages.langium = { pattern: /\b(interface|fragment|terminal|boolean|current|extends|grammar|returns|bigint|hidden|import|infers|number|string|entry|false|infer|Date|true|type|with)\b/ }, property: { - pattern: /\b[a-z][\w]*(?==|\?=|\+=|:|>)\b/ + pattern: /\b[a-z][\w]*(?==|\?=|\+=|\??:|>)\b/ }, entity: { pattern: /\b[A-Z][\w]*\b/ diff --git a/hugo/static/prism/prism.css b/hugo/static/prism/prism.css index 086c1b43..36337a39 100644 --- a/hugo/static/prism/prism.css +++ b/hugo/static/prism/prism.css @@ -10,7 +10,7 @@ https://prismjs.com/download.html#themes=prism-dark */ .token.prolog, .token.doctype, .token.cdata { - color: #6A9955; + color: var(--token-comment); } .token.punctuation { @@ -27,7 +27,7 @@ https://prismjs.com/download.html#themes=prism-dark */ .token.number, .token.constant, .token.symbol { - color: #9CDCFE; + color: var(--token-constants); } .token.selector, @@ -36,44 +36,46 @@ https://prismjs.com/download.html#themes=prism-dark */ .token.char, .token.builtin, .token.inserted { - color: #CE9178; + color: var(--token-string); } .token.operator, .token.entity, .token.url, -.token.variable { - color: #4EC9B0; -} - +.token.variable, .token.class { - color: #4EC9B0; + color: var(--token-entity); } .token.atrule, .token.attr-value, .token.keyword { - color: #569CD6; + color: var(--token-keyword); } .token.regex, .token.important { - color: #D16969; + color: var(--token-regex); } -.token.important, -.token.bold { - font-weight: bold; +:root, +:root[color-mode="light"] { + --token-comment: #008000; + --token-constants: #001080; + --token-string: #A31515; + --token-entity: #267F99; + --token-keyword: #0000FF; + --token-regex: #D16969; } -.token.italic { - font-style: italic; +@media (prefers-color-scheme: dark) { + :root { + --token-comment: #6A9955; + --token-constants: #9CDCFE; + --token-string: #CE9178; + --token-entity: #4EC9B0; + --token-keyword: #569CD6; + --token-regex: #D16969; + } } -.token.entity { - cursor: help; -} - -.token.deleted { - color: red; -} diff --git a/hugo/themes/hugo-geekdoc/data/menu/extra.yml b/hugo/themes/hugo-geekdoc/data/menu/extra.yml index f30404cd..4f0814ec 100644 --- a/hugo/themes/hugo-geekdoc/data/menu/extra.yml +++ b/hugo/themes/hugo-geekdoc/data/menu/extra.yml @@ -1,5 +1,5 @@ header: - name: GitHub - ref: https://github.com/langium/langium + ref: https://github.com/eclipse-langium/langium icon: gdoc_github external: true \ No newline at end of file diff --git a/hugo/themes/hugo-geekdoc/data/menu/more.yml b/hugo/themes/hugo-geekdoc/data/menu/more.yml index e3aa8d9a..b7e5ebe2 100644 --- a/hugo/themes/hugo-geekdoc/data/menu/more.yml +++ b/hugo/themes/hugo-geekdoc/data/menu/more.yml @@ -4,6 +4,6 @@ more: external: true icon: "gdoc_download" - name: "View Source" - ref: "https://github.com/langium/langium" + ref: "https://github.com/eclipse-langium/langium" external: true icon: "gdoc_github" \ No newline at end of file diff --git a/hugo/vite.showcase-worker.ts b/hugo/vite.showcase-worker.ts new file mode 100644 index 00000000..b95a9efe --- /dev/null +++ b/hugo/vite.showcase-worker.ts @@ -0,0 +1,20 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; + +const config = defineConfig({ + build: { + lib: { + entry: resolve(__dirname, '../node_modules/langium-statemachine-dsl/out/language-server/main-browser.js'), + name: 'statemachineServerWorker', + fileName: () => 'statemachineServerWorker.js', + formats: ['iife'] + }, + outDir: resolve(__dirname, 'static/showcase/libs/worker/'), + emptyOutDir: false, + commonjsOptions: { + strictRequires: true + } + } +}); + +export default config; \ No newline at end of file diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index b1a799c1..00000000 --- a/netlify.toml +++ /dev/null @@ -1,2 +0,0 @@ -[build] - command = "npm ci && npm run build" diff --git a/package-lock.json b/package-lock.json index 38f5732d..a62eea17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,71 @@ { "name": "langium-website-project", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "langium-website-project", "license": "MIT", "workspaces": [ + "core", "hugo", "tailwind" ], "devDependencies": { - "concurrently": "~7.6.0", + "concurrently": "~8.2.1", "cross-env": "~7.0.3", "shx": "~0.3.4" } }, + "core": { + "name": "langium-website-core", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-keybindings-service-override": "~1.83.2", + "@typefox/monaco-editor-react": "2.3.0", + "monaco-editor": "~0.44.0", + "monaco-editor-workers": "~0.44.0", + "monaco-editor-wrapper": "~3.3.0", + "monaco-languageclient": "~6.6.0", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0", + "vscode-languageserver": "~8.0.2" + }, + "devDependencies": { + "@types/react": "~18.2.28", + "@types/react-dom": "~18.2.13", + "@types/vscode": "~1.83.0", + "typescript": "~5.2.2", + "vite": "~4.4.11" + } + }, + "foundation": { + "name": "langium-website-foundation", + "version": "1.0.0", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-keybindings-service-override": "~1.83.2", + "@typefox/monaco-editor-react": "2.3.0", + "monaco-editor": "~0.44.0", + "monaco-editor-workers": "~0.44.0", + "monaco-editor-wrapper": "~3.3.0", + "monaco-languageclient": "~6.6.0", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0", + "vscode-languageserver": "~8.0.2" + }, + "devDependencies": { + "@types/react": "~18.2.28", + "@types/react-dom": "~18.2.13", + "@types/vscode": "~1.83.0", + "typescript": "~5.2.2", + "vite": "~4.4.11" + } + }, "hugo": { "name": "langium-website-hugo", "license": "MIT", @@ -24,55 +74,39 @@ "@babel/core": "~7.20.5", "@babel/preset-react": "~7.18.6", "@babel/preset-typescript": "~7.18.6", - "@typefox/monaco-editor-react": "1.0.0-next.6", + "@types/d3": "^7.4.0", "clsx": "^1.2.1", + "d3": "^7.8.5", "hugo-extended": "~0.89.4", - "langium": "1.1.0", - "langium-arithmetics-dsl": "~1.1.0", - "langium-domainmodel-dsl": "~1.1.0", - "langium-statemachine-dsl": "~1.1.0", + "langium": "^1.2.0", + "langium-arithmetics-dsl": "~1.2.1", + "langium-ast-helper": "0.1.2", + "langium-domainmodel-dsl": "~1.2.0", + "langium-minilogo": "^1.2.0", + "langium-sql": "^0.2.3", + "langium-statemachine-dsl": "~1.2.0", + "langium-website-core": "~1.0.0", "lz-string": "^1.4.4", - "monaco-editor-workers": "0.34.2", - "monaco-editor-wrapper": "1.4.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "vscode-languageserver": "8.0.2" + "monaco-editor-workers": "~0.44.0", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "vscode-languageserver": "~8.0.2" }, "devDependencies": { - "@rollup/plugin-inject": "^5.0.2", + "@rollup/plugin-inject": "~5.0.4", "@types/lz-string": "^1.3.34", "@types/mustache": "^4.2.1", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "esbuild": "^0.15.7" - } - }, - "hugo/node_modules/monaco-editor-wrapper": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "@types/css-font-loading-module": "~0.0.7", - "monaco-languageclient": "4.0.3", - "normalize-url": "~8.0.0", - "vscode-languageserver-protocol": "3.17.2", - "vscode-ws-jsonrpc": "2.0.1" - } - }, - "hugo/node_modules/normalize-url": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/react": "~18.2.28", + "@types/react-dom": "~18.2.13", + "esbuild": "~0.19.4" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "license": "Apache-2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -81,7 +115,8 @@ }, "node_modules/@babel/cli": { "version": "7.19.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", + "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", "dependencies": { "@jridgewell/trace-mapping": "^0.3.8", "commander": "^4.0.1", @@ -107,40 +142,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.5", - "license": "MIT", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -152,47 +190,40 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.5", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dependencies": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -202,16 +233,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -221,159 +255,187 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.6", - "license": "MIT", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -383,7 +445,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, @@ -393,7 +456,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -405,25 +469,29 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, @@ -432,8 +500,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.5", - "license": "MIT", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -442,10 +511,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -455,10 +525,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -468,10 +539,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -481,14 +553,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -498,10 +571,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -511,11 +585,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -525,12 +600,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.20.2", - "license": "MIT", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -541,7 +618,8 @@ }, "node_modules/@babel/preset-react": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -559,7 +637,8 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -572,30 +651,44 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { - "version": "7.18.10", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.5", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -604,11 +697,12 @@ } }, "node_modules/@babel/types": { - "version": "7.20.5", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -617,7 +711,8 @@ }, "node_modules/@chevrotain/cst-dts-gen": { "version": "10.4.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.4.2.tgz", + "integrity": "sha512-0+4bNjlndNWMoVLH/+y4uHnf6GrTipsC+YTppJxelVJo+xeRVQ0s2PpkdDCVTsu7efyj+8r1gFiwVXsp6JZ0iQ==", "dependencies": { "@chevrotain/gast": "10.4.2", "@chevrotain/types": "10.4.2", @@ -626,7 +721,8 @@ }, "node_modules/@chevrotain/gast": { "version": "10.4.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.4.2.tgz", + "integrity": "sha512-4ZAn8/mjkmYonilSJ60gGj1tAF0cVWYUMlIGA0e4ATAc3a648aCnvpBw7zlPHDQjFp50XC13iyWEgWAKiRKTOA==", "dependencies": { "@chevrotain/types": "10.4.2", "lodash": "4.17.21" @@ -634,16 +730,91 @@ }, "node_modules/@chevrotain/types": { "version": "10.4.2", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.4.2.tgz", + "integrity": "sha512-QzSCjg6G4MvIoLeIgOiMR0IgzkGEQqrNJJIr3T5ETRa7l4Av4AMIiEctV99mvDr57iXwwk0/kr3RJxiU36Nevw==" }, "node_modules/@chevrotain/utils": { "version": "10.4.2", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.4.2.tgz", + "integrity": "sha512-V34dacxWLwKcvcy32dx96ADJVdB7kOJLm7LyBkBQw5u5HC9WdEFw2G17zml+U3ivavGTrGPJHl8o9/UJm0PlUw==" + }, + "node_modules/@codingame/monaco-vscode-configuration-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-1.83.2.tgz", + "integrity": "sha512-I13oNZjAs3Ypmo8wQzKRwvTjFhBOYGBR107/MpZI9JJgi16t1DwfL8IaDnc2yOOwNFkVrJ44Wr2TwFKS6RhUHw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-editor-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-service-override/-/monaco-vscode-editor-service-override-1.83.2.tgz", + "integrity": "sha512-Ou6StiX26baj98GGKDd5FIICe0pEl6RbopBlrPZ7H20F5T+d5WckEmzopBpGfrnLj/VaOHr8BT6tC3WzaNJWbw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-keybindings-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-keybindings-service-override/-/monaco-vscode-keybindings-service-override-1.83.2.tgz", + "integrity": "sha512-zEsTTH/H70DZzyZTu2WeLhakZ8N1W/LlPhgKxksrPluAVMeUAOaU2cuia7PXwxJ7mUtVf13W5BL4HZVwYxngrw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-languages-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-1.83.2.tgz", + "integrity": "sha512-re9A6EF4cHzXWGkoZcuUERr+O3JiGMEQ2UsH470gKKzsWfbcJ7Ob8u/G6F06PRZoFuTUTqeTTzL7xdPN8tnjKA==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-model-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-1.83.2.tgz", + "integrity": "sha512-hWAbiOcDegRv4ft2HZHMAMisw5U4Vy6iILY3JwNN+y2tNhuRZz4aqHhHVgVz7bIz/iJtS4wmyN7aKmyXtUnokw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-textmate-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-textmate-service-override/-/monaco-vscode-textmate-service-override-1.83.2.tgz", + "integrity": "sha512-R7ScgN80uSmNBOHmZop+ae+dbboH3SBCPHOYOctyflD7E8UKrENwEv+4OPJqjUm+HjgrRrDDfgwNzSbvPAhjvw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2", + "vscode-oniguruma": "1.7.0", + "vscode-textmate": "9.0.0" + } + }, + "node_modules/@codingame/monaco-vscode-theme-defaults-default-extension": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-defaults-default-extension/-/monaco-vscode-theme-defaults-default-extension-1.83.2.tgz", + "integrity": "sha512-PsFRBLN+ce6bP5PVkTBCTUoHMCALwBWwjDeYfsRWS6RQuIFTL9rTEzS2D1i/gRDNadWN6Emb6tce6D4Oqj+/qQ==", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } + }, + "node_modules/@codingame/monaco-vscode-theme-service-override": { + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-service-override/-/monaco-vscode-theme-service-override-1.83.2.tgz", + "integrity": "sha512-aJWZBrD/c12YGia43iV7JmXFc16MJ3oYS3iYBj8RByV3pWfkhgIGDCGZbenRLdf2R045X1lQ8StAVrZe88oZzw==", + "dependencies": { + "monaco-editor": "0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@1.83.2" + } }, "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", + "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", "cpu": [ "arm" ], @@ -656,87 +827,435 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ - "loong64" + "arm64" ], "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "license": "MIT", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "license": "MIT", - "optional": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", + "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + }, + "node_modules/@lit/reactive-element": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.2.tgz", + "integrity": "sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -744,9 +1263,10 @@ } }, "node_modules/@rollup/plugin-inject": { - "version": "5.0.3", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.4.tgz", + "integrity": "sha512-dM93Nyqp9Ah14jvThFFA30ifjB8cDKk3Bx69M1nIIHGytXug3VrTv5HEuYBzevu45HvZ0ho7t+40bmScmkzZhg==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", @@ -756,7 +1276,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -766,8 +1286,9 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -787,7 +1308,8 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -797,7 +1319,8 @@ }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -806,27 +1329,29 @@ } }, "node_modules/@tailwindcss/line-clamp": { - "version": "0.4.2", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz", + "integrity": "sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g==", "dev": true, - "license": "MIT", "peerDependencies": { "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" } }, "node_modules/@typefox/monaco-editor-react": { - "version": "1.0.0-next.6", - "resolved": "https://registry.npmjs.org/@typefox/monaco-editor-react/-/monaco-editor-react-1.0.0-next.6.tgz", - "integrity": "sha512-Ns1q6Lqp4G9FEkYvkevU4thvQ+2S8M1lAKonIKqw/KsSD9O10e+D6YPpksrH/HTsO8Dbg5ykSfRApNVrzb3k7Q==", - "dependencies": { - "monaco-editor-workers": "0.34.2", - "monaco-editor-wrapper": "1.6.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@typefox/monaco-editor-react/-/monaco-editor-react-2.3.0.tgz", + "integrity": "sha512-Q/V4lv1Y7IT5+Dzxz+C/LGR4FkJ5oZMY7irf4EEbI9pEjXeYCc+T1rXPvS2hj/d3ch14FIQwbL8WXQ63Y9TqjQ==", + "peerDependencies": { + "monaco-editor": "~0.44.0", + "monaco-editor-wrapper": "~3.3.0", "react": "~18.2.0", - "react-dom": "~18.2.0" + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -835,52 +1360,293 @@ } }, "node_modules/@types/css-font-loading-module": { - "version": "0.0.7", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "license": "MIT", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.8.tgz", + "integrity": "sha512-PdJeLlCJj/ShOA+c0dXdZ/e1P0Cdjhip+dRBtPaigOqwKd0DiFx3NeO6T2E7AQ5JszSR3dub3YkQjc2hcQyxSw==" + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", "dependencies": { - "@types/node": "*" + "@types/d3-selection": "*" } }, - "node_modules/@types/lz-string": { - "version": "1.3.34", + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", + "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-s84fKOrzqqNCAPljhVyC5TjAo6BH4jKHw9NRNFNiRUY5QSgZCmVm5XILlWbisiKl+0OcS7eWihmKGS5akc2iQw==", + "deprecated": "This is a stub types definition. lz-string provides its own type definitions, so you do not need this installed.", "dev": true, - "license": "MIT" + "dependencies": { + "lz-string": "*" + } }, "node_modules/@types/mustache": { "version": "4.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.2.tgz", + "integrity": "sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==", + "dev": true }, "node_modules/@types/node": { - "version": "18.11.10", - "license": "MIT" + "version": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "node_modules/@types/prop-types": { "version": "15.7.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true }, "node_modules/@types/react": { - "version": "18.0.26", + "version": "18.2.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", + "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -888,29 +1654,56 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.10", + "version": "18.2.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", + "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/responselike": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.2", - "dev": true, - "license": "MIT" + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "node_modules/@types/vscode": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.0.tgz", + "integrity": "sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -920,8 +1713,9 @@ }, "node_modules/acorn-node": { "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, - "license": "Apache-2.0", "dependencies": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -930,15 +1724,17 @@ }, "node_modules/acorn-walk": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/aggregate-error": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -949,15 +1745,17 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -970,8 +1768,9 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "devOptional": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -982,18 +1781,27 @@ }, "node_modules/arg": { "version": "5.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-union": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "engines": { "node": ">=8" } }, "node_modules/autoprefixer": { - "version": "10.4.13", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -1005,10 +1813,9 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -1026,10 +1833,13 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -1043,28 +1853,66 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/binary-extensions": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "1.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1072,7 +1920,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -1081,7 +1930,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "funding": [ { "type": "opencollective", @@ -1090,14 +1941,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -1108,6 +1962,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -1122,7 +1978,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1130,7 +1985,8 @@ }, "node_modules/buffer-alloc": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -1138,29 +1994,42 @@ }, "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "node_modules/buffer-crc32": { "version": "0.2.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { "node": "*" } }, "node_modules/buffer-fill": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "license": "MIT", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1176,7 +2045,8 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, @@ -1187,16 +2057,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001436", + "version": "1.0.30001518", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz", + "integrity": "sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==", "funding": [ { "type": "opencollective", @@ -1205,13 +2090,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/careful-downloader": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/careful-downloader/-/careful-downloader-2.0.2.tgz", + "integrity": "sha512-reL+MmVF5Y+Yzj94Udo63+b9IzdkbxNYfrw620YwBYDtiqRZr5Y9rTrrAndWycAa7yW/JtyV0OYvJlPzqjtSFA==", "dependencies": { "debug": "^4.3.3", "decompress": "^4.2.1", @@ -1226,7 +2115,8 @@ }, "node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1240,7 +2130,8 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -1250,7 +2141,8 @@ }, "node_modules/chevrotain": { "version": "10.4.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.4.2.tgz", + "integrity": "sha512-gzF5GxE0Ckti5kZVuKEZycLntB5X2aj9RVY0r4/220GwQjdnljU+/t3kP74/FMWC7IzCDDEjQ9wsFUf0WCdSHg==", "dependencies": { "@chevrotain/cst-dts-gen": "10.4.2", "@chevrotain/gast": "10.4.2", @@ -1261,15 +2153,20 @@ } }, "node_modules/chevrotain-allstar": { - "version": "0.1.4", - "license": "MIT", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.1.7.tgz", + "integrity": "sha512-oMSHkXVCDQxnj3tDCqcEoMnNIEiYlAYT0FVja1PaLrT3njXGvg5JXTXs/tk2NI42SR3LMJyqTNgjR4VyDIf19w==", "dependencies": { - "chevrotain": "^10.4.1", "lodash": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "~10.4.1" } }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, "funding": [ { @@ -1277,7 +2174,6 @@ "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1296,15 +2192,17 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "engines": { "node": ">=6" } }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1316,7 +2214,8 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -1326,14 +2225,16 @@ }, "node_modules/clsx": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { "node": ">=6" } }, "node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -1343,57 +2244,104 @@ }, "node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } }, "node_modules/commander": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "engines": { "node": ">= 6" } }, "node_modules/concat-map": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { - "version": "7.6.0", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.1.tgz", + "integrity": "sha512-nVraf3aXOpIcNud5pB9M82p1tynmZkrSGQ1p6X/VY8cJ+2LMVqAgXsJxYYefACSHbTYlm92O1xuhdGTjwoEvbQ==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", + "chalk": "^4.1.2", + "date-fns": "^2.30.0", "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.3.1" + "yargs": "^17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + "node": "^14.13.0 || >=16.0.0" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cross-env": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -1409,8 +2357,9 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1422,7 +2371,8 @@ }, "node_modules/crypto-random-string": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dependencies": { "type-fest": "^1.0.1" }, @@ -1435,7 +2385,8 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "engines": { "node": ">=10" }, @@ -1445,8 +2396,9 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -1455,72 +2407,470 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "dev": true, - "license": "MIT" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true }, - "node_modules/date-fns": { - "version": "2.29.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.11" + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "engines": { + "node": ">=12" } }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { - "ms": "2.1.2" + "internmap": "1 - 2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=12" } }, - "node_modules/decompress": { - "version": "4.2.1", - "license": "MIT", + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dependencies": { - "mimic-response": "^3.1.0" + "d3-path": "1 - 3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/decompress-response/node_modules/mimic-response": { + "node_modules/d3-color": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1528,7 +2878,8 @@ }, "node_modules/decompress-tar": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dependencies": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -1540,7 +2891,8 @@ }, "node_modules/decompress-tarbz2": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dependencies": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -1554,14 +2906,16 @@ }, "node_modules/decompress-tarbz2/node_modules/file-type": { "version": "6.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "engines": { "node": ">=4" } }, "node_modules/decompress-targz": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dependencies": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -1573,7 +2927,8 @@ }, "node_modules/decompress-unzip": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dependencies": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -1586,14 +2941,16 @@ }, "node_modules/decompress-unzip/node_modules/file-type": { "version": "3.9.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "engines": { "node": ">=0.10.0" } }, "node_modules/decompress/node_modules/make-dir": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dependencies": { "pify": "^3.0.0" }, @@ -1603,29 +2960,33 @@ }, "node_modules/decompress/node_modules/make-dir/node_modules/pify": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { "node": ">=4" } }, "node_modules/defer-to-connect": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } }, "node_modules/defined": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { "version": "6.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -1645,22 +3006,50 @@ }, "node_modules/del/node_modules/is-path-inside": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "engines": { "node": ">=8" } }, "node_modules/del/node_modules/slash": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { "node": ">=8" } }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detective": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", "dev": true, - "license": "MIT", "dependencies": { "acorn-node": "^1.8.2", "defined": "^1.0.0", @@ -1675,12 +3064,14 @@ }, "node_modules/didyoumean": { "version": "1.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, "node_modules/dir-glob": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { "path-type": "^4.0.0" }, @@ -1690,36 +3081,54 @@ }, "node_modules/dlv": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "license": "ISC" + "version": "1.4.479", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.479.tgz", + "integrity": "sha512-ABv1nHMIR8I5n3O3Een0gr6i0mfM+YcTZqjHy3pAYaOjgFG+BMquuKrSyfYf5CbEkLr9uM05RA3pOk4udNB/aQ==" }, "node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/end-of-stream": { "version": "1.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/error-ex": { "version": "1.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1729,36 +3138,36 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", + "@esbuild/darwin-arm64": "0.19.4", + "@esbuild/darwin-x64": "0.19.4", + "@esbuild/freebsd-arm64": "0.19.4", + "@esbuild/freebsd-x64": "0.19.4", + "@esbuild/linux-arm": "0.19.4", + "@esbuild/linux-arm64": "0.19.4", + "@esbuild/linux-ia32": "0.19.4", + "@esbuild/linux-loong64": "0.19.4", + "@esbuild/linux-mips64el": "0.19.4", + "@esbuild/linux-ppc64": "0.19.4", + "@esbuild/linux-riscv64": "0.19.4", + "@esbuild/linux-s390x": "0.19.4", + "@esbuild/linux-x64": "0.19.4", + "@esbuild/netbsd-x64": "0.19.4", + "@esbuild/openbsd-x64": "0.19.4", + "@esbuild/sunos-x64": "0.19.4", + "@esbuild/win32-arm64": "0.19.4", + "@esbuild/win32-ia32": "0.19.4", + "@esbuild/win32-x64": "0.19.4" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", + "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, @@ -1769,12 +3178,12 @@ "node": ">=12" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", + "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, @@ -1785,12 +3194,12 @@ "node": ">=12" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", + "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, @@ -1801,12 +3210,12 @@ "node": ">=12" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", + "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, @@ -1817,12 +3226,12 @@ "node": ">=12" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", + "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, @@ -1833,12 +3242,12 @@ "node": ">=12" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", + "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, @@ -1849,12 +3258,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", + "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", "cpu": [ - "ia32" + "arm" ], "dev": true, "optional": true, @@ -1865,12 +3274,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", + "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, @@ -1881,12 +3290,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", + "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", "cpu": [ - "arm" + "ia32" ], "dev": true, "optional": true, @@ -1897,12 +3306,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", + "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", "cpu": [ - "arm64" + "mips64el" ], "dev": true, "optional": true, @@ -1913,12 +3322,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", + "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", "cpu": [ - "mips64el" + "ppc64" ], "dev": true, "optional": true, @@ -1929,12 +3338,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", + "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", "cpu": [ - "ppc64" + "riscv64" ], "dev": true, "optional": true, @@ -1945,12 +3354,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", + "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", "cpu": [ - "riscv64" + "s390x" ], "dev": true, "optional": true, @@ -1961,12 +3370,12 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", + "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", "cpu": [ - "s390x" + "x64" ], "dev": true, "optional": true, @@ -1977,10 +3386,10 @@ "node": ">=12" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", + "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", "cpu": [ "x64" ], @@ -1993,10 +3402,10 @@ "node": ">=12" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", + "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", "cpu": [ "x64" ], @@ -2009,10 +3418,10 @@ "node": ">=12" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", + "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", "cpu": [ "x64" ], @@ -2025,12 +3434,12 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", + "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "optional": true, @@ -2041,12 +3450,12 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", + "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", "cpu": [ - "x64" + "ia32" ], "dev": true, "optional": true, @@ -2057,12 +3466,12 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", + "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, @@ -2075,26 +3484,97 @@ }, "node_modules/escalade": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "license": "MIT", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2107,29 +3587,33 @@ } }, "node_modules/fastq": { - "version": "1.14.0", - "license": "ISC", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fd-slicer": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dependencies": { "pend": "~1.2.0" } }, "node_modules/file-type": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "engines": { "node": ">=4" } }, "node_modules/fill-range": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2137,9 +3621,40 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "6.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -2151,10 +3666,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -2163,13 +3687,23 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-constants": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2181,16 +3715,20 @@ }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "license": "MIT", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -2201,26 +3739,44 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dependencies": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -2231,7 +3787,8 @@ }, "node_modules/glob": { "version": "7.2.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2249,7 +3806,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -2259,14 +3817,16 @@ }, "node_modules/globals": { "version": "11.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, "node_modules/globby": { "version": "11.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2284,14 +3844,16 @@ }, "node_modules/globby/node_modules/slash": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { "node": ">=8" } }, "node_modules/got": { - "version": "11.8.5", - "license": "MIT", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -2313,12 +3875,14 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "license": "ISC" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { "function-bind": "^1.1.1" }, @@ -2328,14 +3892,38 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2343,13 +3931,46 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "license": "BSD-2-Clause" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/http2-wrapper": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -2360,8 +3981,9 @@ }, "node_modules/hugo-extended": { "version": "0.89.4", + "resolved": "https://registry.npmjs.org/hugo-extended/-/hugo-extended-0.89.4.tgz", + "integrity": "sha512-vaZrvPNqNmNcok2nOb542XmPzlj1qrrzFaux2g1tvu8ecDoE+vkg8i1moCvVxxOgwz1V+NvUxpiVEqcI+e0pcg==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "careful-downloader": "^2.0.1", "log-symbols": "^5.0.0", @@ -2375,8 +3997,21 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -2390,26 +4025,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { - "version": "5.2.1", - "license": "MIT", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { "node": ">= 4" } }, "node_modules/indent-string": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2417,24 +4054,44 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { "node": ">= 0.10" } }, "node_modules/is-arrayish": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "devOptional": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2443,8 +4100,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "license": "MIT", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -2454,22 +4112,25 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2479,25 +4140,29 @@ }, "node_modules/is-natural-number": { "version": "4.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-cwd": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "engines": { "node": ">=6" } }, "node_modules/is-path-inside": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "engines": { "node": ">=12" }, @@ -2507,14 +4172,16 @@ }, "node_modules/is-stream": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-unicode-supported": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "engines": { "node": ">=12" }, @@ -2524,20 +4191,24 @@ }, "node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/jsesc": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, @@ -2547,15 +4218,18 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json5": { - "version": "2.2.1", - "license": "MIT", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -2565,7 +4239,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -2574,16 +4249,17 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "license": "MIT", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/langium": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-1.1.0.tgz", - "integrity": "sha512-TsWY/DIOR73se9/YaMQZpvfFWWrhWP0FQS9MrpxWEnMJR0FoKVpMF1thPWXZexLSfyEm1pn2oYzCdW4KUBqXxA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-1.2.1.tgz", + "integrity": "sha512-tpUa1r47pxuUBNqX5X4GAB08qhWpVwWhxjwOV+948skElHO9OV6emngfY3jOYzchJS4H6UZwyKalsOb8GGPsnQ==", "dependencies": { "chevrotain": "~10.4.2", "chevrotain-allstar": "~0.1.4", @@ -2596,13 +4272,13 @@ } }, "node_modules/langium-arithmetics-dsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-arithmetics-dsl/-/langium-arithmetics-dsl-1.1.0.tgz", - "integrity": "sha512-wQgYEI2hBI02qfCkX4EW1f0C7pcPWOG8oqszL4uFKx1IDQM57uCmx63mcJA3MVq897bEtNoQyQ92RZnXUwdI2Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/langium-arithmetics-dsl/-/langium-arithmetics-dsl-1.2.1.tgz", + "integrity": "sha512-xFbiAVYJIOb1ld7q7cT6eahhbN6rdYkP2o13pCtRLVFP6/oJQ7tPF9CLDJJyQeZJtP4eSM/35VuNUwaljmm6Fw==", "dependencies": { "chalk": "~4.1.2", "commander": "~10.0.0", - "langium": "~1.1.0", + "langium": "~1.2.0", "vscode-languageclient": "~8.0.2", "vscode-languageserver": "~8.0.2" }, @@ -2614,21 +4290,26 @@ } }, "node_modules/langium-arithmetics-dsl/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { "node": ">=14" } }, + "node_modules/langium-ast-helper": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/langium-ast-helper/-/langium-ast-helper-0.1.2.tgz", + "integrity": "sha512-xS64ZOp3fOUcTnlQoLwYwJKi2SU8yPeKGLFZlhxFUR4zJCtJ0teFfwsC+TR7GXWS5Tf3pxG+/Lf4mgkpKhOY+Q==" + }, "node_modules/langium-domainmodel-dsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-domainmodel-dsl/-/langium-domainmodel-dsl-1.1.0.tgz", - "integrity": "sha512-cd2ItFfI+Pya1jYZD0ATi5nHrLJcCDIi+OCDUVPMVe+1Y1jTBZq5Cvr/FapndpW2/Ex2B9d8c0Q0JYhvGYeA1Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/langium-domainmodel-dsl/-/langium-domainmodel-dsl-1.2.0.tgz", + "integrity": "sha512-xlkXmltp5p096GueLMSXZiBiZC1kMMec1CRlnw6b6JoiLPw87b6oDPTQRyZbkwxjCRq6XPnpE5aHafwPxTr1dw==", "dependencies": { "chalk": "~4.1.2", "commander": "~10.0.0", - "langium": "~1.1.0", + "langium": "~1.2.0", "lodash": "~4.17.21", "vscode-languageclient": "~8.0.2", "vscode-languageserver": "~8.0.2" @@ -2641,21 +4322,73 @@ } }, "node_modules/langium-domainmodel-dsl/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { "node": ">=14" } }, - "node_modules/langium-statemachine-dsl": { + "node_modules/langium-minilogo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/langium-minilogo/-/langium-minilogo-1.2.0.tgz", + "integrity": "sha512-hmeY2VSR4GlcAJ1rLIQBm8Sc4sL0XaQjv4cgI/N+tHmsrGtXUaFO/s7s6hpzjUEfRZgfR38u6L3df9VXbZ7svQ==", + "dependencies": { + "colors": "^1.4.0", + "commander": "^8.0.0", + "express": "^4.18.2", + "langium": "~1.2.1", + "monaco-editor-comp": "~1.6.0", + "vscode-languageclient": "~8.0.2", + "vscode-languageserver": "~8.0.2" + }, + "bin": { + "minilogo-cli": "bin/cli" + }, + "engines": { + "vscode": "^1.56.0" + } + }, + "node_modules/langium-minilogo/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/langium-sql": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/langium-sql/-/langium-sql-0.2.3.tgz", + "integrity": "sha512-OSRZttyyULW/1OsUBQQ9lj8qY+eJhsb+FeWWjUZWQadn8bubVYlaYL9UoYmsKeAwwP9kQvkQEKQZQLVevfsphQ==", + "dependencies": { + "langium": "~1.1.0", + "lodash": "^4.17.21" + } + }, + "node_modules/langium-sql/node_modules/langium": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-statemachine-dsl/-/langium-statemachine-dsl-1.1.0.tgz", - "integrity": "sha512-jjqRPogDK0xi86GkwTtijO/LS+NcdtYlSrHTn0aEvY76Bsv6g+3gkFcHHZrtqoLboQAN7OpxolSZh3TB2NkVNQ==", + "resolved": "https://registry.npmjs.org/langium/-/langium-1.1.0.tgz", + "integrity": "sha512-TsWY/DIOR73se9/YaMQZpvfFWWrhWP0FQS9MrpxWEnMJR0FoKVpMF1thPWXZexLSfyEm1pn2oYzCdW4KUBqXxA==", + "dependencies": { + "chevrotain": "~10.4.2", + "chevrotain-allstar": "~0.1.4", + "vscode-languageserver": "~8.0.2", + "vscode-languageserver-textdocument": "~1.0.8", + "vscode-uri": "~3.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/langium-statemachine-dsl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/langium-statemachine-dsl/-/langium-statemachine-dsl-1.2.0.tgz", + "integrity": "sha512-bOomgWpr5QD3uVhmuBpqLCT1Q1pc6BZypCV3BCRQ7A20MOS0QYjZlkbV7L/QC1pfLCGYR3teKqT+3cUSlXg2jA==", "dependencies": { "chalk": "~4.1.2", "commander": "~10.0.0", - "langium": "~1.1.0", + "langium": "~1.2.0", "lodash": "^4.17.21", "vscode-languageclient": "~8.0.2", "vscode-languageserver": "~8.0.2" @@ -2668,13 +4401,17 @@ } }, "node_modules/langium-statemachine-dsl/node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { "node": ">=14" } }, + "node_modules/langium-website-core": { + "resolved": "core", + "link": true + }, "node_modules/langium-website-hugo": { "resolved": "hugo", "link": true @@ -2684,20 +4421,51 @@ "link": true }, "node_modules/lilconfig": { - "version": "2.0.6", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lit": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.5.0.tgz", + "integrity": "sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==", + "dependencies": { + "@lit/reactive-element": "^1.5.0", + "lit-element": "^3.2.0", + "lit-html": "^2.5.0" + } + }, + "node_modules/lit-element": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.2.tgz", + "integrity": "sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.7.0" + } + }, + "node_modules/lit-html": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.5.tgz", + "integrity": "sha512-YqUzpisJodwKIlbMFCtyrp58oLloKGnnPLMJ1t23cbfIJjg/H9pvLWK4XS69YeubK5HUs1UE4ys9w5dP1zg6IA==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } }, "node_modules/locate-path": { - "version": "7.1.1", - "license": "MIT", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dependencies": { "p-locate": "^6.0.0" }, @@ -2710,11 +4478,13 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/log-symbols": { "version": "5.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" @@ -2727,8 +4497,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.1.2", - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2738,7 +4509,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2748,32 +4520,33 @@ }, "node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lz-string": { - "version": "1.4.4", - "license": "WTFPL", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" }, @@ -2783,7 +4556,8 @@ }, "node_modules/make-dir": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -2794,28 +4568,53 @@ }, "node_modules/make-dir/node_modules/pify": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "engines": { "node": ">=6" } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "license": "ISC", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge2": { "version": "1.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -2824,16 +4623,48 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { "node": ">=4" } }, "node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2842,23 +4673,35 @@ } }, "node_modules/minimist": { - "version": "1.2.7", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/monaco-editor-comp": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/monaco-editor-comp/-/monaco-editor-comp-1.6.0.tgz", + "integrity": "sha512-LGOubZ2YdyiwvoJGU732wTTpQ5LqU/Mx/WiN4tDVTWrAlDUyLPMqMLiow5erA5Rc7b6i+whNhyq9M5/g9CGOhw==", + "dependencies": { + "lit": "~2.5.0", + "monaco-editor-wrapper": "1.6.0" + } + }, + "node_modules/monaco-editor-comp/node_modules/monaco-editor": { "version": "0.34.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", + "integrity": "sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==", "peer": true }, - "node_modules/monaco-editor-workers": { - "version": "0.34.2", - "license": "MIT" - }, - "node_modules/monaco-editor-wrapper": { + "node_modules/monaco-editor-comp/node_modules/monaco-editor-wrapper": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/monaco-editor-wrapper/-/monaco-editor-wrapper-1.6.0.tgz", "integrity": "sha512-ETGAicvsGER2QUl0aUhm0K3gXPiQnidrMXkUEzdipTtkNKfoCt3+IgxxoUY1oYbaPNEyN7Vj9Tp5NoTMYxd47Q==", @@ -2870,7 +4713,24 @@ "vscode-ws-jsonrpc": "2.0.1" } }, - "node_modules/monaco-editor-wrapper/node_modules/normalize-url": { + "node_modules/monaco-editor-comp/node_modules/monaco-languageclient": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-4.0.3.tgz", + "integrity": "sha512-1mGIUb5PFRknITBhNxgH0SnQy1/jntt9oo0cQpOl3HdhYEL/CYK2UrsZZX7Udqmz1PXKyRIzQ3tZ7dJn4mzWtA==", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@1.69.13", + "vscode-jsonrpc": "8.0.2", + "vscode-languageclient": "8.0.2" + }, + "engines": { + "node": ">=16.11.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "vscode": ">= npm:@codingame/monaco-vscode-api@1.69.0 < npm:@codingame/monaco-vscode-api@1.70.0" + } + }, + "node_modules/monaco-editor-comp/node_modules/normalize-url": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", @@ -2881,30 +4741,296 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/monaco-languageclient": { - "version": "4.0.3", - "license": "MIT", + "node_modules/monaco-editor-comp/node_modules/vscode": { + "name": "@codingame/monaco-vscode-api", + "version": "1.69.13", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.69.13.tgz", + "integrity": "sha512-7+dQbQ5O8mQhFyUcAiiJkCotNjZUzRxh4NMBKc/BSIFi0jG47bay+jP/+ngsmxHBapjs/xUAPaKSGNnf9WBmAA==", + "peerDependencies": { + "monaco-editor": "~0.34.0", + "vscode-oniguruma": "^1.6.2", + "vscode-textmate": "^7.0.1" + } + }, + "node_modules/monaco-editor-comp/node_modules/vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/monaco-editor-comp/node_modules/vscode-textmate": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-7.0.4.tgz", + "integrity": "sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A==", + "peer": true + }, + "node_modules/monaco-editor-comp/node_modules/vscode-ws-jsonrpc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-2.0.1.tgz", + "integrity": "sha512-ne5DO8/qe8tHt1U4LafLiYS832Yd4OltkP4+YZVOQwqGEU5nwLwZowUBqqEWt8sOZ0eLdCLV9luotGC2aUQ+LA==", "dependencies": { - "vscode": "npm:@codingame/monaco-vscode-api@1.69.13", - "vscode-jsonrpc": "8.0.2", - "vscode-languageclient": "8.0.2" + "vscode-jsonrpc": "8.0.2" }, "engines": { "node": ">=16.11.0", "npm": ">=8.0.0" + } + }, + "node_modules/monaco-editor-workers": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor-workers/-/monaco-editor-workers-0.44.0.tgz", + "integrity": "sha512-rvdO292CMnxs9Y3Hl6nAjVx8d0SjcDgmXmZNVoaOCNJrdnTEEzcWcHJzEQsajTAAq4H2oeBmDZRpDE0US5DhXA==", + "dependencies": { + "monaco-editor": "~0.44.0" }, "peerDependencies": { - "vscode": ">= npm:@codingame/monaco-vscode-api@1.69.0 < npm:@codingame/monaco-vscode-api@1.70.0" + "monaco-editor": "~0.44.0" + } + }, + "node_modules/monaco-editor-wrapper": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/monaco-editor-wrapper/-/monaco-editor-wrapper-3.3.0.tgz", + "integrity": "sha512-UhGMi2mtgbMiynLnPzr4/V/pCpyohUYjzgl97obW13PW/K84XPnO0TkA7OwMqzzmDzlJlcMF8X2hB3eR1Or2/A==", + "dependencies": { + "@codingame/monaco-vscode-configuration-service-override": "~1.83.2", + "@codingame/monaco-vscode-editor-service-override": "~1.83.2", + "@codingame/monaco-vscode-textmate-service-override": "~1.83.2", + "@codingame/monaco-vscode-theme-defaults-default-extension": "~1.83.2", + "@codingame/monaco-vscode-theme-service-override": "~1.83.2", + "monaco-editor": "~0.44.0", + "monaco-languageclient": "~6.6.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0", + "vscode-languageclient": "~8.1.0", + "vscode-languageserver-protocol": "~3.17.3", + "vscode-ws-jsonrpc": "~3.0.0" + }, + "peerDependencies": { + "monaco-languageclient": "~6.6.0", + "vscode-ws-jsonrpc": "~3.0.0" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageclient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "engines": { + "vscode": "^1.67.0" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageclient/node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "dependencies": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageclient/node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/monaco-editor-wrapper/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/monaco-editor-wrapper/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/monaco-languageclient": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-6.6.0.tgz", + "integrity": "sha512-Ued2Tpj2z4NiUy8l8KVM4TAk+sd2I9e78OWdXzwNbZz6nqMSK3w5uZkY3qj3LrlERZjJAITjBdUdplDb25t+fw==", + "hasInstallScript": true, + "dependencies": { + "@codingame/monaco-vscode-editor-service-override": "~1.83.2", + "@codingame/monaco-vscode-languages-service-override": "~1.83.2", + "@codingame/monaco-vscode-model-service-override": "~1.83.2", + "monaco-editor": "~0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0", + "vscode-languageclient": "~8.1.0" + }, + "engines": { + "node": ">=16.11.0", + "npm": ">=9.0.0" + }, + "peerDependencies": { + "monaco-editor": "~0.44.0", + "vscode": "npm:@codingame/monaco-vscode-api@>=1.83.2 <1.84.0" + }, + "peerDependenciesMeta": { + "monaco-editor": { + "optional": false + }, + "vscode": { + "optional": false + } + } + }, + "node_modules/monaco-languageclient/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/monaco-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-languageclient/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-languageclient/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/monaco-languageclient/node_modules/vscode-languageclient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "engines": { + "vscode": "^1.67.0" } }, + "node_modules/monaco-languageclient/node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "dependencies": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "node_modules/monaco-languageclient/node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + }, + "node_modules/monaco-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.4", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2912,13 +5038,23 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { - "version": "2.0.6", - "license": "MIT" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/normalize-package-data": { "version": "3.0.3", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -2929,9 +5065,21 @@ "node": ">=10" } }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.8", - "license": "ISC", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2942,25 +5090,33 @@ "node": ">=10" } }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { "node": ">=10" }, @@ -2970,36 +5126,60 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/p-cancelable": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/p-limit": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -3012,7 +5192,8 @@ }, "node_modules/p-locate": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dependencies": { "p-limit": "^4.0.0" }, @@ -3025,7 +5206,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -3038,7 +5220,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3052,51 +5235,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } }, "node_modules/pend": { "version": "1.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -3106,21 +5310,24 @@ }, "node_modules/pify": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie": { "version": "2.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { "pinkie": "^2.0.0" }, @@ -3129,7 +5336,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", "dev": true, "funding": [ { @@ -3139,11 +5348,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -3153,8 +5365,9 @@ }, "node_modules/postcss-import": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -3168,9 +5381,10 @@ } }, "node_modules/postcss-js": { - "version": "4.0.0", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -3182,13 +5396,14 @@ "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.21" } }, "node_modules/postcss-load-config": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, - "license": "MIT", "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" @@ -3215,8 +5430,9 @@ }, "node_modules/postcss-nested": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -3232,9 +5448,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3245,26 +5462,57 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } }, "node_modules/pump": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", "url": "https://github.com/sponsors/feross" }, { @@ -3275,12 +5523,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -3288,9 +5536,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -3300,7 +5571,8 @@ }, "node_modules/react-dom": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -3311,15 +5583,17 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/read-pkg": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -3335,7 +5609,8 @@ }, "node_modules/read-pkg-up": { "version": "9.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", @@ -3349,8 +5624,9 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "license": "MIT", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3363,12 +5639,14 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -3378,6 +5656,8 @@ }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -3386,24 +5666,33 @@ "node": ">= 0.10" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, "node_modules/regexp-to-ast": { "version": "0.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.1", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, - "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3416,11 +5705,13 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/responselike": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -3430,7 +5721,8 @@ }, "node_modules/reusify": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3438,7 +5730,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, @@ -3449,12 +5742,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/rollup": { - "version": "3.10.0", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -3468,6 +5765,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -3482,21 +5781,28 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/rxjs": { - "version": "7.6.0", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -3510,19 +5816,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/scheduler": { "version": "0.23.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/seek-bzip": { "version": "1.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dependencies": { "commander": "^2.8.1" }, @@ -3533,19 +5845,82 @@ }, "node_modules/seek-bzip/node_modules/commander": { "version": "2.20.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/semver": { - "version": "6.3.0", - "license": "ISC", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3555,24 +5930,27 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.7.4", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -3587,8 +5965,9 @@ }, "node_modules/shx": { "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.3", "shelljs": "^0.8.5" @@ -3600,29 +5979,46 @@ "node": ">=6" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/slash": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "engines": { "node": ">=6" } }, "node_modules/source-map-js": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/spawn-command": { - "version": "0.0.2-1", - "dev": true, - "license": "MIT" + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true }, "node_modules/spdx-correct": { - "version": "3.1.1", - "license": "Apache-2.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3630,35 +6026,49 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "license": "CC0-1.0" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3670,8 +6080,9 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3681,15 +6092,17 @@ }, "node_modules/strip-dirs": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dependencies": { "is-natural-number": "^4.0.1" } }, "node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3702,8 +6115,9 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3712,9 +6126,10 @@ } }, "node_modules/tailwindcss": { - "version": "3.2.4", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", "dev": true, - "license": "MIT", "dependencies": { "arg": "^5.0.2", "chokidar": "^3.5.3", @@ -3730,12 +6145,12 @@ "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.18", + "postcss": "^8.0.9", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.10", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1" @@ -3753,8 +6168,9 @@ }, "node_modules/tailwindcss/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3764,7 +6180,8 @@ }, "node_modules/tar-stream": { "version": "1.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -3780,14 +6197,16 @@ }, "node_modules/temp-dir": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "engines": { "node": ">=8" } }, "node_modules/tempy": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-2.0.0.tgz", + "integrity": "sha512-m+QReZVhpa0Y56fmfoLFRZN4aDFdd3qVd8a9k3RfyTw/1utVYNg+Ar4BY6l4/TlkhYCCJFfhYWt9uy0127buJg==", "dependencies": { "del": "^6.0.0", "is-stream": "^3.0.0", @@ -3804,7 +6223,8 @@ }, "node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3814,22 +6234,26 @@ }, "node_modules/through": { "version": "2.3.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/to-buffer": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -3837,22 +6261,33 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/tslib": { - "version": "2.4.1", - "dev": true, - "license": "0BSD" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true }, "node_modules/type-fest": { "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { "node": ">=12.20" }, @@ -3860,9 +6295,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -3870,7 +6331,8 @@ }, "node_modules/unique-string": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -3883,13 +6345,24 @@ }, "node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.10", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -3898,15 +6371,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -3914,36 +6390,182 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/vscode": { "name": "@codingame/monaco-vscode-api", - "version": "1.69.13", - "license": "MIT", - "peerDependencies": { - "monaco-editor": "~0.34.0", - "vscode-oniguruma": "^1.6.2", - "vscode-textmate": "^7.0.1" + "version": "1.83.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.2.tgz", + "integrity": "sha512-wTdkrnMZV85jyZQm9PZW98JMTwhzuETALAtTiMVX9Lvw/tdrbRQC5lBZjjEytHGxhSC141rd5JcwPrDkuimZGA==", + "dependencies": { + "monaco-editor": "0.44.0" + }, + "bin": { + "monaco-treemending": "monaco-treemending.js" } }, "node_modules/vscode-jsonrpc": { - "version": "8.0.2", - "license": "MIT", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { "version": "8.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", + "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", "dependencies": { "minimatch": "^3.0.4", "semver": "^7.3.5", @@ -3953,9 +6575,21 @@ "vscode": "^1.67.0" } }, + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/vscode-languageclient/node_modules/semver": { - "version": "7.3.8", - "license": "ISC", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3966,9 +6600,15 @@ "node": ">=10" } }, + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/vscode-languageserver": { "version": "8.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", + "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", "dependencies": { "vscode-languageserver-protocol": "3.17.2" }, @@ -3978,39 +6618,52 @@ }, "node_modules/vscode-languageserver-protocol": { "version": "3.17.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", "dependencies": { "vscode-jsonrpc": "8.0.2", "vscode-languageserver-types": "3.17.2" } }, + "node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "node_modules/vscode-languageserver-types": { "version": "3.17.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, "node_modules/vscode-oniguruma": { "version": "1.7.0", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" }, "node_modules/vscode-textmate": { - "version": "7.0.4", - "license": "MIT", - "peer": true + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-9.0.0.tgz", + "integrity": "sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==" }, "node_modules/vscode-uri": { "version": "3.0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, "node_modules/vscode-ws-jsonrpc": { - "version": "2.0.1", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-3.0.0.tgz", + "integrity": "sha512-22IbVb2K691np9pOubyahNBj1BicsbtlbiaHOJu5/rvyWDqmqPMAqpAfojwGjdBztp8EtO8TAO7lmyY6hnmYAA==", "dependencies": { - "vscode-jsonrpc": "8.0.2" + "vscode-jsonrpc": "~8.1.0" }, "engines": { "node": ">=16.11.0", @@ -4019,8 +6672,9 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4033,8 +6687,9 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4049,39 +6704,45 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { - "version": "17.6.2", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4097,15 +6758,17 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -4113,7 +6776,8 @@ }, "node_modules/yocto-queue": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "engines": { "node": ">=12.20" }, @@ -4132,2380 +6796,5 @@ "tailwindcss": "~3.2.4" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/cli": { - "version": "7.19.3", - "requires": { - "@jridgewell/trace-mapping": "^0.3.8", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5" - }, - "@babel/core": { - "version": "7.20.5", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.20.5", - "requires": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9" - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2" - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1" - }, - "@babel/helper-validator-option": { - "version": "7.18.6" - }, - "@babel/helpers": { - "version": "7.20.6", - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3" - }, - "has-flag": { - "version": "3.0.0" - }, - "supports-color": { - "version": "5.5.0", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.5" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.20.2", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.18.6", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - } - }, - "@babel/template": { - "version": "7.18.10", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.5", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.5", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@chevrotain/cst-dts-gen": { - "version": "10.4.2", - "requires": { - "@chevrotain/gast": "10.4.2", - "@chevrotain/types": "10.4.2", - "lodash": "4.17.21" - } - }, - "@chevrotain/gast": { - "version": "10.4.2", - "requires": { - "@chevrotain/types": "10.4.2", - "lodash": "4.17.21" - } - }, - "@chevrotain/types": { - "version": "10.4.2" - }, - "@chevrotain/utils": { - "version": "10.4.2" - }, - "@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "dev": true, - "optional": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0" - }, - "@jridgewell/set-array": { - "version": "1.1.2" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-inject": { - "version": "5.0.3", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.27.0" - } - }, - "@rollup/pluginutils": { - "version": "5.0.2", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - } - }, - "@sindresorhus/is": { - "version": "4.6.0" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tailwindcss/line-clamp": { - "version": "0.4.2", - "dev": true, - "requires": {} - }, - "@typefox/monaco-editor-react": { - "version": "1.0.0-next.6", - "resolved": "https://registry.npmjs.org/@typefox/monaco-editor-react/-/monaco-editor-react-1.0.0-next.6.tgz", - "integrity": "sha512-Ns1q6Lqp4G9FEkYvkevU4thvQ+2S8M1lAKonIKqw/KsSD9O10e+D6YPpksrH/HTsO8Dbg5ykSfRApNVrzb3k7Q==", - "requires": { - "monaco-editor-workers": "0.34.2", - "monaco-editor-wrapper": "1.6.0", - "react": "~18.2.0", - "react-dom": "~18.2.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.3", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/css-font-loading-module": { - "version": "0.0.7" - }, - "@types/estree": { - "version": "1.0.0", - "dev": true - }, - "@types/http-cache-semantics": { - "version": "4.0.1" - }, - "@types/keyv": { - "version": "3.1.4", - "requires": { - "@types/node": "*" - } - }, - "@types/lz-string": { - "version": "1.3.34", - "dev": true - }, - "@types/mustache": { - "version": "4.2.2", - "dev": true - }, - "@types/node": { - "version": "18.11.10" - }, - "@types/normalize-package-data": { - "version": "2.4.1" - }, - "@types/prop-types": { - "version": "15.7.5", - "dev": true - }, - "@types/react": { - "version": "18.0.26", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.10", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/responselike": { - "version": "1.0.0", - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "devOptional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "dev": true - }, - "array-union": { - "version": "2.1.0" - }, - "autoprefixer": { - "version": "10.4.13", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "balanced-match": { - "version": "1.0.2" - }, - "base64-js": { - "version": "1.5.1" - }, - "binary-extensions": { - "version": "2.2.0", - "devOptional": true - }, - "bl": { - "version": "1.2.3", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer": { - "version": "5.7.1", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0" - }, - "buffer-crc32": { - "version": "0.2.13" - }, - "buffer-fill": { - "version": "1.0.0" - }, - "cacheable-lookup": { - "version": "5.0.4" - }, - "cacheable-request": { - "version": "7.0.2", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "camelcase-css": { - "version": "2.0.1", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001436" - }, - "careful-downloader": { - "version": "2.0.2", - "requires": { - "debug": "^4.3.3", - "decompress": "^4.2.1", - "fs-extra": "^10.0.0", - "got": "^11.8.3", - "is-path-inside": "^4.0.0", - "tempy": "^2.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chevrotain": { - "version": "10.4.2", - "requires": { - "@chevrotain/cst-dts-gen": "10.4.2", - "@chevrotain/gast": "10.4.2", - "@chevrotain/types": "10.4.2", - "@chevrotain/utils": "10.4.2", - "lodash": "4.17.21", - "regexp-to-ast": "0.5.0" - } - }, - "chevrotain-allstar": { - "version": "0.1.4", - "requires": { - "chevrotain": "^10.4.1", - "lodash": "^4.17.21" - } - }, - "chokidar": { - "version": "3.5.3", - "devOptional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "2.2.0" - }, - "cliui": { - "version": "8.0.1", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clsx": { - "version": "1.2.1" - }, - "color-convert": { - "version": "2.0.1", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4" - }, - "commander": { - "version": "4.1.1" - }, - "concat-map": { - "version": "0.0.1" - }, - "concurrently": { - "version": "7.6.0", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - } - }, - "convert-source-map": { - "version": "1.9.0" - }, - "core-util-is": { - "version": "1.0.3" - }, - "cross-env": { - "version": "7.0.3", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0" - } - } - }, - "cssesc": { - "version": "3.0.0", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "dev": true - }, - "date-fns": { - "version": "2.29.3", - "dev": true - }, - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - }, - "decompress": { - "version": "4.2.1", - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0" - } - } - } - } - }, - "decompress-response": { - "version": "6.0.0", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0" - } - } - }, - "decompress-tar": { - "version": "4.1.1", - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0" - } - } - }, - "defer-to-connect": { - "version": "2.0.1" - }, - "defined": { - "version": "1.0.1", - "dev": true - }, - "del": { - "version": "6.1.1", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.3" - }, - "slash": { - "version": "3.0.0" - } - } - }, - "detective": { - "version": "5.2.1", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284" - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1" - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "estree-walker": { - "version": "2.0.2", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.14.0", - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "requires": { - "pend": "~1.2.0" - } - }, - "file-type": { - "version": "5.2.0" - }, - "fill-range": { - "version": "7.0.1", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "6.3.0", - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "fraction.js": { - "version": "4.2.0", - "dev": true - }, - "fs-constants": { - "version": "1.0.0" - }, - "fs-extra": { - "version": "10.1.0", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0" - }, - "fs.realpath": { - "version": "1.0.0" - }, - "fsevents": { - "version": "2.3.2", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1" - }, - "gensync": { - "version": "1.0.0-beta.2" - }, - "get-caller-file": { - "version": "2.0.5", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "glob": { - "version": "7.2.3", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0" - }, - "globby": { - "version": "11.1.0", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0" - } - } - }, - "got": { - "version": "11.8.5", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10" - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0" - }, - "hosted-git-info": { - "version": "4.1.0", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0" - }, - "http2-wrapper": { - "version": "1.0.3", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "hugo-extended": { - "version": "0.89.4", - "requires": { - "careful-downloader": "^2.0.1", - "log-symbols": "^5.0.0", - "read-pkg-up": "^9.0.0" - } - }, - "ieee754": { - "version": "1.2.1" - }, - "ignore": { - "version": "5.2.1" - }, - "indent-string": { - "version": "4.0.0" - }, - "inflight": { - "version": "1.0.6", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "interpret": { - "version": "1.4.0", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1" - }, - "is-binary-path": { - "version": "2.1.0", - "devOptional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-natural-number": { - "version": "4.0.1" - }, - "is-number": { - "version": "7.0.0" - }, - "is-path-cwd": { - "version": "2.2.0" - }, - "is-path-inside": { - "version": "4.0.0" - }, - "is-stream": { - "version": "1.1.0" - }, - "is-unicode-supported": { - "version": "1.3.0" - }, - "isarray": { - "version": "1.0.0" - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "js-tokens": { - "version": "4.0.0" - }, - "jsesc": { - "version": "2.5.2" - }, - "json-buffer": { - "version": "3.0.1" - }, - "json-parse-even-better-errors": { - "version": "2.3.1" - }, - "json5": { - "version": "2.2.1" - }, - "jsonfile": { - "version": "6.1.0", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "4.5.2", - "requires": { - "json-buffer": "3.0.1" - } - }, - "langium": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-1.1.0.tgz", - "integrity": "sha512-TsWY/DIOR73se9/YaMQZpvfFWWrhWP0FQS9MrpxWEnMJR0FoKVpMF1thPWXZexLSfyEm1pn2oYzCdW4KUBqXxA==", - "requires": { - "chevrotain": "~10.4.2", - "chevrotain-allstar": "~0.1.4", - "vscode-languageserver": "~8.0.2", - "vscode-languageserver-textdocument": "~1.0.8", - "vscode-uri": "~3.0.7" - } - }, - "langium-arithmetics-dsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-arithmetics-dsl/-/langium-arithmetics-dsl-1.1.0.tgz", - "integrity": "sha512-wQgYEI2hBI02qfCkX4EW1f0C7pcPWOG8oqszL4uFKx1IDQM57uCmx63mcJA3MVq897bEtNoQyQ92RZnXUwdI2Q==", - "requires": { - "chalk": "~4.1.2", - "commander": "~10.0.0", - "langium": "~1.1.0", - "vscode-languageclient": "~8.0.2", - "vscode-languageserver": "~8.0.2" - }, - "dependencies": { - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" - } - } - }, - "langium-domainmodel-dsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-domainmodel-dsl/-/langium-domainmodel-dsl-1.1.0.tgz", - "integrity": "sha512-cd2ItFfI+Pya1jYZD0ATi5nHrLJcCDIi+OCDUVPMVe+1Y1jTBZq5Cvr/FapndpW2/Ex2B9d8c0Q0JYhvGYeA1Q==", - "requires": { - "chalk": "~4.1.2", - "commander": "~10.0.0", - "langium": "~1.1.0", - "lodash": "~4.17.21", - "vscode-languageclient": "~8.0.2", - "vscode-languageserver": "~8.0.2" - }, - "dependencies": { - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" - } - } - }, - "langium-statemachine-dsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/langium-statemachine-dsl/-/langium-statemachine-dsl-1.1.0.tgz", - "integrity": "sha512-jjqRPogDK0xi86GkwTtijO/LS+NcdtYlSrHTn0aEvY76Bsv6g+3gkFcHHZrtqoLboQAN7OpxolSZh3TB2NkVNQ==", - "requires": { - "chalk": "~4.1.2", - "commander": "~10.0.0", - "langium": "~1.1.0", - "lodash": "^4.17.21", - "vscode-languageclient": "~8.0.2", - "vscode-languageserver": "~8.0.2" - }, - "dependencies": { - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" - } - } - }, - "langium-website-hugo": { - "version": "file:hugo", - "requires": { - "@babel/cli": "~7.19.3", - "@babel/core": "~7.20.5", - "@babel/preset-react": "~7.18.6", - "@babel/preset-typescript": "~7.18.6", - "@rollup/plugin-inject": "^5.0.2", - "@typefox/monaco-editor-react": "1.0.0-next.6", - "@types/lz-string": "^1.3.34", - "@types/mustache": "^4.2.1", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "clsx": "^1.2.1", - "esbuild": "^0.15.7", - "hugo-extended": "~0.89.4", - "langium": "1.1.0", - "langium-arithmetics-dsl": "~1.1.0", - "langium-domainmodel-dsl": "~1.1.0", - "langium-statemachine-dsl": "~1.1.0", - "lz-string": "^1.4.4", - "monaco-editor-workers": "0.34.2", - "monaco-editor-wrapper": "1.4.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "vscode-languageserver": "8.0.2" - }, - "dependencies": { - "monaco-editor-wrapper": { - "version": "1.4.1", - "requires": { - "@types/css-font-loading-module": "~0.0.7", - "monaco-languageclient": "4.0.3", - "normalize-url": "~8.0.0", - "vscode-languageserver-protocol": "3.17.2", - "vscode-ws-jsonrpc": "2.0.1" - } - }, - "normalize-url": { - "version": "8.0.0" - } - } - }, - "langium-website-tailwind": { - "version": "file:tailwind", - "requires": { - "@tailwindcss/line-clamp": "~0.4.2", - "autoprefixer": "~10.4.13", - "postcss": "~8.4.19", - "tailwindcss": "~3.2.4" - } - }, - "lilconfig": { - "version": "2.0.6", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4" - }, - "locate-path": { - "version": "7.1.1", - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21" - }, - "log-symbols": { - "version": "5.1.0", - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "dependencies": { - "chalk": { - "version": "5.1.2" - } - } - }, - "loose-envify": { - "version": "1.4.0", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0" - }, - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.4.4" - }, - "magic-string": { - "version": "0.27.0", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, - "make-dir": { - "version": "2.1.0", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1" - }, - "semver": { - "version": "5.7.1" - } - } - }, - "merge2": { - "version": "1.4.1" - }, - "micromatch": { - "version": "4.0.5", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-response": { - "version": "1.0.1" - }, - "minimatch": { - "version": "3.1.2", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "dev": true - }, - "monaco-editor": { - "version": "0.34.1", - "peer": true - }, - "monaco-editor-workers": { - "version": "0.34.2" - }, - "monaco-editor-wrapper": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/monaco-editor-wrapper/-/monaco-editor-wrapper-1.6.0.tgz", - "integrity": "sha512-ETGAicvsGER2QUl0aUhm0K3gXPiQnidrMXkUEzdipTtkNKfoCt3+IgxxoUY1oYbaPNEyN7Vj9Tp5NoTMYxd47Q==", - "requires": { - "@types/css-font-loading-module": "~0.0.7", - "monaco-languageclient": "4.0.3", - "normalize-url": "~8.0.0", - "vscode-languageserver-protocol": "3.17.2", - "vscode-ws-jsonrpc": "2.0.1" - }, - "dependencies": { - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==" - } - } - }, - "monaco-languageclient": { - "version": "4.0.3", - "requires": { - "vscode": "npm:@codingame/monaco-vscode-api@1.69.13", - "vscode-jsonrpc": "8.0.2", - "vscode-languageclient": "8.0.2" - } - }, - "ms": { - "version": "2.1.2" - }, - "nanoid": { - "version": "3.3.4", - "dev": true - }, - "node-releases": { - "version": "2.0.6" - }, - "normalize-package-data": { - "version": "3.0.3", - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "normalize-path": { - "version": "3.0.0", - "devOptional": true - }, - "normalize-range": { - "version": "0.1.2", - "dev": true - }, - "normalize-url": { - "version": "6.1.0" - }, - "object-assign": { - "version": "4.1.1" - }, - "object-hash": { - "version": "3.0.0", - "dev": true - }, - "once": { - "version": "1.4.0", - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "2.1.1" - }, - "p-limit": { - "version": "4.0.0", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "5.0.0" - }, - "path-is-absolute": { - "version": "1.0.1" - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "dev": true - }, - "path-type": { - "version": "4.0.0" - }, - "pend": { - "version": "1.2.0" - }, - "picocolors": { - "version": "1.0.0" - }, - "picomatch": { - "version": "2.3.1" - }, - "pify": { - "version": "2.3.0" - }, - "pinkie": { - "version": "2.0.4" - }, - "pinkie-promise": { - "version": "2.0.1", - "requires": { - "pinkie": "^2.0.0" - } - }, - "postcss": { - "version": "8.4.21", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.0", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "6.0.0", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1" - }, - "pump": { - "version": "3.0.0", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "queue-microtask": { - "version": "1.2.3" - }, - "quick-lru": { - "version": "5.1.1" - }, - "react": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dom": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "read-cache": { - "version": "1.0.0", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-pkg": { - "version": "7.1.0", - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "9.1.0", - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2" - } - } - }, - "readdirp": { - "version": "3.6.0", - "devOptional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regexp-to-ast": { - "version": "0.5.0" - }, - "require-directory": { - "version": "2.1.1", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1" - }, - "responselike": { - "version": "2.0.1", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "reusify": { - "version": "1.0.4" - }, - "rimraf": { - "version": "3.0.2", - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.10.0", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.6.0", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1" - }, - "scheduler": { - "version": "0.23.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "seek-bzip": { - "version": "1.0.6", - "requires": { - "commander": "^2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3" - } - } - }, - "semver": { - "version": "6.3.0" - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "shell-quote": { - "version": "1.7.4", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.3.4", - "dev": true, - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - } - }, - "slash": { - "version": "2.0.0" - }, - "source-map-js": { - "version": "1.0.2", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12" - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2" - } - } - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-dirs": { - "version": "2.1.0", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "tailwindcss": { - "version": "3.2.4", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.18", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp-dir": { - "version": "2.0.0" - }, - "tempy": { - "version": "2.0.0", - "requires": { - "del": "^6.0.0", - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.0.0", - "unique-string": "^3.0.0" - }, - "dependencies": { - "is-stream": { - "version": "3.0.0" - } - } - }, - "through": { - "version": "2.3.8" - }, - "to-buffer": { - "version": "1.1.1" - }, - "to-fast-properties": { - "version": "2.0.0" - }, - "to-regex-range": { - "version": "5.0.1", - "requires": { - "is-number": "^7.0.0" - } - }, - "tree-kill": { - "version": "1.2.2", - "dev": true - }, - "tslib": { - "version": "2.4.1", - "dev": true - }, - "type-fest": { - "version": "2.19.0" - }, - "unbzip2-stream": { - "version": "1.4.3", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unique-string": { - "version": "3.0.0", - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universalify": { - "version": "2.0.0" - }, - "update-browserslist-db": { - "version": "1.0.10", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.69.13", - "requires": {} - }, - "vscode-jsonrpc": { - "version": "8.0.2" - }, - "vscode-languageclient": { - "version": "8.0.2", - "requires": { - "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.2" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "vscode-languageserver": { - "version": "8.0.2", - "requires": { - "vscode-languageserver-protocol": "3.17.2" - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.2", - "requires": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.8" - }, - "vscode-languageserver-types": { - "version": "3.17.2" - }, - "vscode-oniguruma": { - "version": "1.7.0", - "peer": true - }, - "vscode-textmate": { - "version": "7.0.4", - "peer": true - }, - "vscode-uri": { - "version": "3.0.7" - }, - "vscode-ws-jsonrpc": { - "version": "2.0.1", - "requires": { - "vscode-jsonrpc": "8.0.2" - } - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2" - }, - "xtend": { - "version": "4.0.2" - }, - "y18n": { - "version": "5.0.8", - "dev": true - }, - "yallist": { - "version": "4.0.0" - }, - "yaml": { - "version": "1.10.2", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "1.0.0" - } } } diff --git a/package.json b/package.json index 13e9e8ed..cb45657c 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,23 @@ "license": "MIT", "private": true, "scripts": { - "watch": "concurrently -c gray,blue -k -n hugo,tailwind \"npm run watch --workspace hugo\" \"npm run watch --workspace tailwind\"", - "watch:gitpod": "concurrently -c gray,blue -k -n hugo,tailwind \"npm run watch:gitpod --workspace hugo\" \"npm run watch --workspace tailwind\"", - "build": "npm run clean && npm run build --workspace=tailwind --workspace=hugo", - "clean": "npx shx rm -rf public && npm run clean --workspace=tailwind" + "watch": "npm run build --workspace core && concurrently -c gray,blue -k -n hugo,tailwind \"npm run watch --workspace hugo\" \"npm run watch --workspace tailwind\"", + "watch:gitpod": "npm run build --workspace core && concurrently -c gray,blue -k -n hugo,tailwind \"npm run watch:gitpod --workspace hugo\" \"npm run watch --workspace tailwind\"", + "build": "npm run clean && npm run build --workspace core --workspace=tailwind --workspace=hugo", + "clean": "shx rm -rf public && npm run clean --workspace core --workspace=tailwind" }, "devDependencies": { - "concurrently": "~7.6.0", + "concurrently": "~8.2.1", "cross-env": "~7.0.3", "shx": "~0.3.4" }, "workspaces": [ + "core", "hugo", "tailwind" ], "volta": { - "node": "16.17.0", - "npm": "8.15.0" + "node": "18.18.1", + "npm": "9.9.0" } } diff --git a/tailwind/package.json b/tailwind/package.json index 5047693a..a9b9b572 100644 --- a/tailwind/package.json +++ b/tailwind/package.json @@ -6,7 +6,7 @@ "license": "MIT", "private": true, "scripts": { - "clean": "npx shx rm -rf ../hugo/static/css/style.css", + "clean": "shx rm -rf ../hugo/static/css/style.css", "build": "cross-env NODE_ENV=production tailwindcss -i ./style.css -o ../hugo/static/css/style.css -c ./tailwind.config.js", "watch": "cross-env NODE_ENV=development tailwindcss -i ./style.css -o ../hugo/static/css/style.css -c ./tailwind.config.js --watch " }, @@ -15,5 +15,9 @@ "autoprefixer": "~10.4.13", "postcss": "~8.4.19", "tailwindcss": "~3.2.4" + }, + "volta": { + "node": "18.16.0", + "npm": "9.6.6" } } diff --git a/tailwind/style.css b/tailwind/style.css index 3e7ccbe1..df31edbe 100644 --- a/tailwind/style.css +++ b/tailwind/style.css @@ -62,4 +62,4 @@ .feature-item-content { @apply h-full w-full box-border rounded-xl border-2 border-emeraldLangium dark:border-emeraldLangium sm:px-6 px-2 pb-6 mx-2 sm:mx-0 bg-emeraldLangium dark:bg-gray-900 shadow-lg; -} \ No newline at end of file +}