diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0e796c3f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +build \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..183ed7c8b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": ["langium.langium-vscode"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..3d67d0a5f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +// A launch configuration that launches the extension inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}/packages/schema" + ] + }, + { + "name": "Attach to Language Server", + "type": "node", + "port": 6009, + "request": "attach", + "skipFiles": ["/**"], + "sourceMaps": true, + "outFiles": ["${workspaceFolder}/out/**/*.js"] + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 000000000..179e3af91 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +

ZenStack

diff --git a/package.json b/package.json new file mode 100644 index 000000000..a65d3649e --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "zenstack", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/schema/.eslintrc.json b/packages/schema/.eslintrc.json new file mode 100644 index 000000000..8252235cf --- /dev/null +++ b/packages/schema/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/packages/schema/.vscodeignore b/packages/schema/.vscodeignore new file mode 100644 index 000000000..4f97a2668 --- /dev/null +++ b/packages/schema/.vscodeignore @@ -0,0 +1,4 @@ +.vscode/** +.vscode-test/** +.gitignore +langium-quickstart.md diff --git a/packages/schema/bin/cli b/packages/schema/bin/cli new file mode 100755 index 000000000..f0a525864 --- /dev/null +++ b/packages/schema/bin/cli @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require("../out/cli").default(); \ No newline at end of file diff --git a/packages/schema/jest.config.ts b/packages/schema/jest.config.ts new file mode 100644 index 000000000..4b5c9766b --- /dev/null +++ b/packages/schema/jest.config.ts @@ -0,0 +1,195 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/r7/j1xwztq57cl_s92mt6g410tc0000gn/T/jest_dx", + + // Automatically clear mock calls, instances, contexts and results before every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: 'v8', + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state before every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state and implementation before every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + // testEnvironment: "jest-environment-node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // A map from regular expressions to paths to transformers + transform: { '^.+\\.tsx?$': 'ts-jest' }, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/packages/schema/langium-config.json b/packages/schema/langium-config.json new file mode 100644 index 000000000..568072312 --- /dev/null +++ b/packages/schema/langium-config.json @@ -0,0 +1,14 @@ +{ + "projectName": "ZModel", + "languages": [ + { + "id": "zmodel", + "grammar": "src/language-server/zmodel.langium", + "fileExtensions": [".zmodel"], + "textMate": { + "out": "syntaxes/zmodel.tmLanguage.json" + } + } + ], + "out": "src/language-server/generated" +} diff --git a/packages/schema/langium-quickstart.md b/packages/schema/langium-quickstart.md new file mode 100644 index 000000000..5b0a4c77b --- /dev/null +++ b/packages/schema/langium-quickstart.md @@ -0,0 +1,41 @@ +# Welcome to your Langium VS Code Extension + +## What's in the folder + +This folder contains all necessary files for your language extension. + +- `package.json` - the manifest file in which you declare your language support. +- `language-configuration.json` - the language configuration used in the VS Code editor, defining the tokens that are used for comments and brackets. +- `src/extension.ts` - the main code of the extension, which is responsible for launching a language server and client. +- `src/language-server/zmodel.langium` - the grammar definition of your language. +- `src/language-server/main.ts` - the entry point of the language server process. +- `src/language-server/zmodel-module.ts` - the dependency injection module of your language implementation. Use this to register overridden and added services. +- `src/language-server/zmodel-validator.ts` - an example validator. You should change it to reflect the semantics of your language. +- `src/cli/index.ts` - the entry point of the command line interface (CLI) of your language. +- `src/cli/generator.ts` - the code generator used by the CLI to write output files from DSL documents. +- `src/cli/cli-util.ts` - utility code for the CLI. + +## Get up and running straight away + +- Run `npm run langium:generate` to generate TypeScript code from the grammar definition. +- Run `npm run build` to compile all TypeScript code. +- Press `F5` to open a new window with your extension loaded. +- Create a new file with a file name suffix matching your language. +- Verify that syntax highlighting, validation, completion etc. are working as expected. +- Run `./bin/cli` to see options for the CLI; `./bin/cli generate ` generates code for a given DSL file. + +## Make changes + +- Run `npm run watch` to have the TypeScript compiler run automatically after every change of the source files. +- Run `npm run langium:watch` to have the Langium generator run automatically afer every change of the grammar declaration. +- You can relaunch the extension from the debug toolbar after making changes to the files listed above. +- You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + +## Install your extension + +- To start using your extension with VS Code, copy it into the `/.vscode/extensions` folder and restart Code. +- To share your extension with the world, read the [VS Code documentation](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) about publishing an extension. + +## To Go Further + +Documentation about the Langium framework is available at https://langium.org diff --git a/packages/schema/language-configuration.json b/packages/schema/language-configuration.json new file mode 100644 index 000000000..8f162a0c4 --- /dev/null +++ b/packages/schema/language-configuration.json @@ -0,0 +1,30 @@ +{ + "comments": { + // symbol used for single line comment. Remove this entry if your language does not support line comments + "lineComment": "//", + // symbols used for start and end a block comment. Remove this entry if your language does not support block comments + "blockComment": [ "/*", "*/" ] + }, + // symbols used as brackets + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + // symbols that can be used to surround a selection + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +} \ No newline at end of file diff --git a/packages/schema/out/cli/cli-util.js b/packages/schema/out/cli/cli-util.js new file mode 100644 index 000000000..dcf3fb812 --- /dev/null +++ b/packages/schema/out/cli/cli-util.js @@ -0,0 +1,61 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extractDestinationAndName = exports.extractAstNode = exports.extractDocument = void 0; +const colors_1 = __importDefault(require("colors")); +const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); +const vscode_uri_1 = require("vscode-uri"); +function extractDocument(fileName, services) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const extensions = services.LanguageMetaData.fileExtensions; + if (!extensions.includes(path_1.default.extname(fileName))) { + console.error(colors_1.default.yellow(`Please choose a file with one of these extensions: ${extensions}.`)); + process.exit(1); + } + if (!fs_1.default.existsSync(fileName)) { + console.error(colors_1.default.red(`File ${fileName} does not exist.`)); + process.exit(1); + } + const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.resolve(fileName))); + yield services.shared.workspace.DocumentBuilder.build([document], { validationChecks: 'all' }); + const validationErrors = ((_a = document.diagnostics) !== null && _a !== void 0 ? _a : []).filter(e => e.severity === 1); + if (validationErrors.length > 0) { + console.error(colors_1.default.red('There are validation errors:')); + for (const validationError of validationErrors) { + console.error(colors_1.default.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`)); + } + process.exit(1); + } + return document; + }); +} +exports.extractDocument = extractDocument; +function extractAstNode(fileName, services) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + return (_a = (yield extractDocument(fileName, services)).parseResult) === null || _a === void 0 ? void 0 : _a.value; + }); +} +exports.extractAstNode = extractAstNode; +function extractDestinationAndName(filePath, destination) { + filePath = filePath.replace(/\..*$/, '').replace(/[.-]/g, ''); + return { + destination: destination !== null && destination !== void 0 ? destination : path_1.default.join(path_1.default.dirname(filePath), 'generated'), + name: path_1.default.basename(filePath) + }; +} +exports.extractDestinationAndName = extractDestinationAndName; +//# sourceMappingURL=cli-util.js.map \ No newline at end of file diff --git a/packages/schema/out/cli/cli-util.js.map b/packages/schema/out/cli/cli-util.js.map new file mode 100644 index 000000000..d545d06e0 --- /dev/null +++ b/packages/schema/out/cli/cli-util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cli-util.js","sourceRoot":"","sources":["../../src/cli/cli-util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,gDAAwB;AACxB,4CAAoB;AAEpB,2CAAiC;AAEjC,SAAsB,eAAe,CAAC,QAAgB,EAAE,QAAyB;;;QAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,MAAM,CAAC,sDAAsD,UAAU,GAAG,CAAC,CAAC,CAAC;YAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB;QAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,GAAG,CAAC,QAAQ,QAAQ,kBAAkB,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,gBAAG,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClH,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/F,MAAM,gBAAgB,GAAG,CAAC,MAAA,QAAQ,CAAC,WAAW,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;QACpF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;gBAC5C,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,GAAG,CACpB,QAAQ,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,eAAe,CAAC,OAAO,KAAK,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CACvI,CAAC,CAAC;aACN;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB;QAED,OAAO,QAAQ,CAAC;;CACnB;AA3BD,0CA2BC;AAED,SAAsB,cAAc,CAAoB,QAAgB,EAAE,QAAyB;;;QAC/F,OAAO,MAAA,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,0CAAE,KAAU,CAAC;;CAC9E;AAFD,wCAEC;AAOD,SAAgB,yBAAyB,CAAC,QAAgB,EAAE,WAA+B;IACvF,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO;QACH,WAAW,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;QAC1E,IAAI,EAAE,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAChC,CAAC;AACN,CAAC;AAND,8DAMC"} \ No newline at end of file diff --git a/packages/schema/out/cli/generator.js b/packages/schema/out/cli/generator.js new file mode 100644 index 000000000..d30cd2d46 --- /dev/null +++ b/packages/schema/out/cli/generator.js @@ -0,0 +1,24 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateJavaScript = void 0; +const fs_1 = __importDefault(require("fs")); +const langium_1 = require("langium"); +const path_1 = __importDefault(require("path")); +const cli_util_1 = require("./cli-util"); +function generateJavaScript(model, filePath, destination) { + const data = (0, cli_util_1.extractDestinationAndName)(filePath, destination); + const generatedFilePath = `${path_1.default.join(data.destination, data.name)}.js`; + const fileNode = new langium_1.CompositeGeneratorNode(); + fileNode.append('"use strict";', langium_1.NL, langium_1.NL); + // model.greetings.forEach(greeting => fileNode.append(`console.log('Hello, ${greeting.person.ref?.name}!');`, NL)); + if (!fs_1.default.existsSync(data.destination)) { + fs_1.default.mkdirSync(data.destination, { recursive: true }); + } + fs_1.default.writeFileSync(generatedFilePath, (0, langium_1.processGeneratorNode)(fileNode)); + return generatedFilePath; +} +exports.generateJavaScript = generateJavaScript; +//# sourceMappingURL=generator.js.map \ No newline at end of file diff --git a/packages/schema/out/cli/generator.js.map b/packages/schema/out/cli/generator.js.map new file mode 100644 index 000000000..07c96109d --- /dev/null +++ b/packages/schema/out/cli/generator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/cli/generator.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,qCAA2E;AAC3E,gDAAwB;AAExB,yCAAuD;AAEvD,SAAgB,kBAAkB,CAC9B,KAAY,EACZ,QAAgB,EAChB,WAA+B;IAE/B,MAAM,IAAI,GAAG,IAAA,oCAAyB,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAEzE,MAAM,QAAQ,GAAG,IAAI,gCAAsB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,YAAE,EAAE,YAAE,CAAC,CAAC;IACzC,oHAAoH;IAEpH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QAClC,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACvD;IACD,YAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAA,8BAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAjBD,gDAiBC"} \ No newline at end of file diff --git a/packages/schema/out/cli/index.js b/packages/schema/out/cli/index.js new file mode 100644 index 000000000..2cbd0bd69 --- /dev/null +++ b/packages/schema/out/cli/index.js @@ -0,0 +1,44 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateAction = void 0; +const colors_1 = __importDefault(require("colors")); +const commander_1 = require("commander"); +const module_1 = require("../language-server/generated/module"); +const zmodel_module_1 = require("../language-server/zmodel-module"); +const cli_util_1 = require("./cli-util"); +const generator_1 = require("./generator"); +const generateAction = (fileName, opts) => __awaiter(void 0, void 0, void 0, function* () { + const services = (0, zmodel_module_1.createZModelServices)().ZModel; + const model = yield (0, cli_util_1.extractAstNode)(fileName, services); + const generatedFilePath = (0, generator_1.generateJavaScript)(model, fileName, opts.destination); + console.log(colors_1.default.green(`JavaScript code generated successfully: ${generatedFilePath}`)); +}); +exports.generateAction = generateAction; +function default_1() { + const program = new commander_1.Command(); + program + // eslint-disable-next-line @typescript-eslint/no-var-requires + .version(require('../../package.json').version); + const fileExtensions = module_1.ZModelLanguageMetaData.fileExtensions.join(', '); + program + .command('generate') + .argument('', `source file (possible file extensions: ${fileExtensions})`) + .option('-d, --destination ', 'destination directory of generating') + .description('generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file') + .action(exports.generateAction); + program.parse(process.argv); +} +exports.default = default_1; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/schema/out/cli/index.js.map b/packages/schema/out/cli/index.js.map new file mode 100644 index 000000000..0293f48b3 --- /dev/null +++ b/packages/schema/out/cli/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,yCAAoC;AAEpC,gEAA6E;AAC7E,oEAAwE;AACxE,yCAA4C;AAC5C,2CAAiD;AAE1C,MAAM,cAAc,GAAG,CAC1B,QAAgB,EAChB,IAAqB,EACR,EAAE;IACf,MAAM,QAAQ,GAAG,IAAA,oCAAoB,GAAE,CAAC,MAAM,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAc,EAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EACxC,KAAK,EACL,QAAQ,EACR,IAAI,CAAC,WAAW,CACnB,CAAC;IACF,OAAO,CAAC,GAAG,CACP,gBAAM,CAAC,KAAK,CACR,2CAA2C,iBAAiB,EAAE,CACjE,CACJ,CAAC;AACN,CAAC,CAAA,CAAC;AAhBW,QAAA,cAAc,kBAgBzB;AAMF;IACI,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;QACH,8DAA8D;SAC7D,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,+BAAsB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CACL,QAAQ,EACR,0CAA0C,cAAc,GAAG,CAC9D;SACA,MAAM,CACH,yBAAyB,EACzB,qCAAqC,CACxC;SACA,WAAW,CACR,2FAA2F,CAC9F;SACA,MAAM,CAAC,sBAAc,CAAC,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAxBD,4BAwBC"} \ No newline at end of file diff --git a/packages/schema/out/extension.js b/packages/schema/out/extension.js new file mode 100644 index 000000000..2c985d64f --- /dev/null +++ b/packages/schema/out/extension.js @@ -0,0 +1,81 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deactivate = exports.activate = void 0; +const vscode = __importStar(require("vscode")); +const path = __importStar(require("path")); +const node_1 = require("vscode-languageclient/node"); +let client; +// This function is called when the extension is activated. +function activate(context) { + client = startLanguageClient(context); +} +exports.activate = activate; +// This function is called when the extension is deactivated. +function deactivate() { + if (client) { + return client.stop(); + } + return undefined; +} +exports.deactivate = deactivate; +function startLanguageClient(context) { + const serverModule = context.asAbsolutePath(path.join('out', 'language-server', 'main')); + // The debug options for the server + // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging. + // By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached. + const debugOptions = { + execArgv: [ + '--nolazy', + `--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${process.env.DEBUG_SOCKET || '6009'}`, + ], + }; + // If the extension is launched in debug mode then the debug server options are used + // Otherwise the run options are used + const serverOptions = { + run: { module: serverModule, transport: node_1.TransportKind.ipc }, + debug: { + module: serverModule, + transport: node_1.TransportKind.ipc, + options: debugOptions, + }, + }; + const fileSystemWatcher = vscode.workspace.createFileSystemWatcher('**/*.zmodel'); + context.subscriptions.push(fileSystemWatcher); + // Options to control the language client + const clientOptions = { + documentSelector: [{ scheme: 'file', language: 'zmodel' }], + synchronize: { + // Notify the server about file changes to files contained in the workspace + fileEvents: fileSystemWatcher, + }, + }; + // Create the language client and start the client. + const client = new node_1.LanguageClient('zmodel', 'ZenStack Model', serverOptions, clientOptions); + // Start the client. This will also launch the server + client.start(); + return client; +} +//# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/packages/schema/out/extension.js.map b/packages/schema/out/extension.js.map new file mode 100644 index 000000000..efc599158 --- /dev/null +++ b/packages/schema/out/extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,2CAA6B;AAC7B,qDAKoC;AAEpC,IAAI,MAAsB,CAAC;AAE3B,2DAA2D;AAC3D,SAAgB,QAAQ,CAAC,OAAgC;IACrD,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAFD,4BAEC;AAED,6DAA6D;AAC7D,SAAgB,UAAU;IACtB,IAAI,MAAM,EAAE;QACR,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;KACxB;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AALD,gCAKC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAC9C,CAAC;IACF,mCAAmC;IACnC,8GAA8G;IAC9G,sHAAsH;IACtH,MAAM,YAAY,GAAG;QACjB,QAAQ,EAAE;YACN,UAAU;YACV,YAAY,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAChC,EAAE;SACL;KACJ,CAAC;IAEF,oFAAoF;IACpF,qCAAqC;IACrC,MAAM,aAAa,GAAkB;QACjC,GAAG,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAa,CAAC,GAAG,EAAE;QAC3D,KAAK,EAAE;YACH,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,oBAAa,CAAC,GAAG;YAC5B,OAAO,EAAE,YAAY;SACxB;KACJ,CAAC;IAEF,MAAM,iBAAiB,GACnB,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE9C,yCAAyC;IACzC,MAAM,aAAa,GAA0B;QACzC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1D,WAAW,EAAE;YACT,2EAA2E;YAC3E,UAAU,EAAE,iBAAiB;SAChC;KACJ,CAAC;IAEF,mDAAmD;IACnD,MAAM,MAAM,GAAG,IAAI,qBAAc,CAC7B,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,CAChB,CAAC;IAEF,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO,MAAM,CAAC;AAClB,CAAC"} \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/ast.js b/packages/schema/out/language-server/generated/ast.js new file mode 100644 index 000000000..d98cf5683 --- /dev/null +++ b/packages/schema/out/language-server/generated/ast.js @@ -0,0 +1,215 @@ +"use strict"; +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reflection = exports.ZModelAstReflection = exports.isSimpleInvocationExpr = exports.SimpleInvocationExpr = exports.isModel = exports.Model = exports.isLiteralExpr = exports.LiteralExpr = exports.isFragmentExpansion = exports.FragmentExpansion = exports.isFragment = exports.Fragment = exports.isEnumField = exports.EnumField = exports.isEnum = exports.Enum = exports.isDataSourceField = exports.DataSourceField = exports.isDataSource = exports.DataSource = exports.isDataModelFieldType = exports.DataModelFieldType = exports.isDataModelFieldAttribute = exports.DataModelFieldAttribute = exports.isDataModelField = exports.DataModelField = exports.isDataModel = exports.DataModel = exports.isSimpleExpr = exports.SimpleExpr = exports.isDeclaration = exports.Declaration = void 0; +/* eslint-disable @typescript-eslint/array-type */ +/* eslint-disable @typescript-eslint/no-empty-interface */ +const langium_1 = require("langium"); +exports.Declaration = 'Declaration'; +function isDeclaration(item) { + return exports.reflection.isInstance(item, exports.Declaration); +} +exports.isDeclaration = isDeclaration; +exports.SimpleExpr = 'SimpleExpr'; +function isSimpleExpr(item) { + return exports.reflection.isInstance(item, exports.SimpleExpr); +} +exports.isSimpleExpr = isSimpleExpr; +exports.DataModel = 'DataModel'; +function isDataModel(item) { + return exports.reflection.isInstance(item, exports.DataModel); +} +exports.isDataModel = isDataModel; +exports.DataModelField = 'DataModelField'; +function isDataModelField(item) { + return exports.reflection.isInstance(item, exports.DataModelField); +} +exports.isDataModelField = isDataModelField; +exports.DataModelFieldAttribute = 'DataModelFieldAttribute'; +function isDataModelFieldAttribute(item) { + return exports.reflection.isInstance(item, exports.DataModelFieldAttribute); +} +exports.isDataModelFieldAttribute = isDataModelFieldAttribute; +exports.DataModelFieldType = 'DataModelFieldType'; +function isDataModelFieldType(item) { + return exports.reflection.isInstance(item, exports.DataModelFieldType); +} +exports.isDataModelFieldType = isDataModelFieldType; +exports.DataSource = 'DataSource'; +function isDataSource(item) { + return exports.reflection.isInstance(item, exports.DataSource); +} +exports.isDataSource = isDataSource; +exports.DataSourceField = 'DataSourceField'; +function isDataSourceField(item) { + return exports.reflection.isInstance(item, exports.DataSourceField); +} +exports.isDataSourceField = isDataSourceField; +exports.Enum = 'Enum'; +function isEnum(item) { + return exports.reflection.isInstance(item, exports.Enum); +} +exports.isEnum = isEnum; +exports.EnumField = 'EnumField'; +function isEnumField(item) { + return exports.reflection.isInstance(item, exports.EnumField); +} +exports.isEnumField = isEnumField; +exports.Fragment = 'Fragment'; +function isFragment(item) { + return exports.reflection.isInstance(item, exports.Fragment); +} +exports.isFragment = isFragment; +exports.FragmentExpansion = 'FragmentExpansion'; +function isFragmentExpansion(item) { + return exports.reflection.isInstance(item, exports.FragmentExpansion); +} +exports.isFragmentExpansion = isFragmentExpansion; +exports.LiteralExpr = 'LiteralExpr'; +function isLiteralExpr(item) { + return exports.reflection.isInstance(item, exports.LiteralExpr); +} +exports.isLiteralExpr = isLiteralExpr; +exports.Model = 'Model'; +function isModel(item) { + return exports.reflection.isInstance(item, exports.Model); +} +exports.isModel = isModel; +exports.SimpleInvocationExpr = 'SimpleInvocationExpr'; +function isSimpleInvocationExpr(item) { + return exports.reflection.isInstance(item, exports.SimpleInvocationExpr); +} +exports.isSimpleInvocationExpr = isSimpleInvocationExpr; +class ZModelAstReflection { + getAllTypes() { + return ['DataModel', 'DataModelField', 'DataModelFieldAttribute', 'DataModelFieldType', 'DataSource', 'DataSourceField', 'Declaration', 'Enum', 'EnumField', 'Fragment', 'FragmentExpansion', 'LiteralExpr', 'Model', 'SimpleExpr', 'SimpleInvocationExpr']; + } + isInstance(node, type) { + return (0, langium_1.isAstNode)(node) && this.isSubtype(node.$type, type); + } + isSubtype(subtype, supertype) { + if (subtype === supertype) { + return true; + } + switch (subtype) { + case exports.DataModel: + case exports.Enum: + case exports.Fragment: { + return this.isSubtype(exports.Declaration, supertype); + } + case exports.LiteralExpr: + case exports.SimpleInvocationExpr: { + return this.isSubtype(exports.SimpleExpr, supertype); + } + default: { + return false; + } + } + } + getReferenceType(referenceId) { + switch (referenceId) { + case 'DataModelFieldType:reference': { + return exports.Declaration; + } + case 'FragmentExpansion:value': { + return exports.Fragment; + } + default: { + throw new Error(`${referenceId} is not a valid reference id.`); + } + } + } + getTypeMetaData(type) { + switch (type) { + case 'DataModel': { + return { + name: 'DataModel', + mandatory: [ + { name: 'fields', type: 'array' }, + { name: 'fragments', type: 'array' } + ] + }; + } + case 'DataModelField': { + return { + name: 'DataModelField', + mandatory: [ + { name: 'attributes', type: 'array' } + ] + }; + } + case 'DataModelFieldAttribute': { + return { + name: 'DataModelFieldAttribute', + mandatory: [ + { name: 'args', type: 'array' } + ] + }; + } + case 'DataModelFieldType': { + return { + name: 'DataModelFieldType', + mandatory: [ + { name: 'array', type: 'boolean' }, + { name: 'optional', type: 'boolean' } + ] + }; + } + case 'DataSource': { + return { + name: 'DataSource', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Enum': { + return { + name: 'Enum', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Fragment': { + return { + name: 'Fragment', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Model': { + return { + name: 'Model', + mandatory: [ + { name: 'datasources', type: 'array' }, + { name: 'enums', type: 'array' }, + { name: 'fragments', type: 'array' }, + { name: 'models', type: 'array' } + ] + }; + } + case 'SimpleInvocationExpr': { + return { + name: 'SimpleInvocationExpr', + mandatory: [ + { name: 'args', type: 'array' } + ] + }; + } + default: { + return { + name: type, + mandatory: [] + }; + } + } + } +} +exports.ZModelAstReflection = ZModelAstReflection; +exports.reflection = new ZModelAstReflection(); +//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/ast.js.map b/packages/schema/out/language-server/generated/ast.js.map new file mode 100644 index 000000000..d9fbe15dd --- /dev/null +++ b/packages/schema/out/language-server/generated/ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/language-server/generated/ast.ts"],"names":[],"mappings":";AAAA;;;gFAGgF;;;AAEhF,kDAAkD;AAClD,0DAA0D;AAC1D,qCAAqF;AAIxE,QAAA,WAAW,GAAG,aAAa,CAAC;AAEzC,SAAgB,aAAa,CAAC,IAAa;IACvC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;AACpD,CAAC;AAFD,sCAEC;AAIY,QAAA,UAAU,GAAG,YAAY,CAAC;AAEvC,SAAgB,YAAY,CAAC,IAAa;IACtC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,kBAAU,CAAC,CAAC;AACnD,CAAC;AAFD,oCAEC;AASY,QAAA,SAAS,GAAG,WAAW,CAAC;AAErC,SAAgB,WAAW,CAAC,IAAa;IACrC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,iBAAS,CAAC,CAAC;AAClD,CAAC;AAFD,kCAEC;AASY,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAE/C,SAAgB,gBAAgB,CAAC,IAAa;IAC1C,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,sBAAc,CAAC,CAAC;AACvD,CAAC;AAFD,4CAEC;AAQY,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAEjE,SAAgB,yBAAyB,CAAC,IAAa;IACnD,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,+BAAuB,CAAC,CAAC;AAChE,CAAC;AAFD,8DAEC;AAUY,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,SAAgB,oBAAoB,CAAC,IAAa;IAC9C,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,0BAAkB,CAAC,CAAC;AAC3D,CAAC;AAFD,oDAEC;AAOY,QAAA,UAAU,GAAG,YAAY,CAAC;AAEvC,SAAgB,YAAY,CAAC,IAAa;IACtC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,kBAAU,CAAC,CAAC;AACnD,CAAC;AAFD,oCAEC;AAQY,QAAA,eAAe,GAAG,iBAAiB,CAAC;AAEjD,SAAgB,iBAAiB,CAAC,IAAa;IAC3C,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,uBAAe,CAAC,CAAC;AACxD,CAAC;AAFD,8CAEC;AAQY,QAAA,IAAI,GAAG,MAAM,CAAC;AAE3B,SAAgB,MAAM,CAAC,IAAa;IAChC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,YAAI,CAAC,CAAC;AAC7C,CAAC;AAFD,wBAEC;AAOY,QAAA,SAAS,GAAG,WAAW,CAAC;AAErC,SAAgB,WAAW,CAAC,IAAa;IACrC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,iBAAS,CAAC,CAAC;AAClD,CAAC;AAFD,kCAEC;AAQY,QAAA,QAAQ,GAAG,UAAU,CAAC;AAEnC,SAAgB,UAAU,CAAC,IAAa;IACpC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,gBAAQ,CAAC,CAAC;AACjD,CAAC;AAFD,gCAEC;AAOY,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAErD,SAAgB,mBAAmB,CAAC,IAAa;IAC7C,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,yBAAiB,CAAC,CAAC;AAC1D,CAAC;AAFD,kDAEC;AAOY,QAAA,WAAW,GAAG,aAAa,CAAC;AAEzC,SAAgB,aAAa,CAAC,IAAa;IACvC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAW,CAAC,CAAC;AACpD,CAAC;AAFD,sCAEC;AASY,QAAA,KAAK,GAAG,OAAO,CAAC;AAE7B,SAAgB,OAAO,CAAC,IAAa;IACjC,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAK,CAAC,CAAC;AAC9C,CAAC;AAFD,0BAEC;AAQY,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D,SAAgB,sBAAsB,CAAC,IAAa;IAChD,OAAO,kBAAU,CAAC,UAAU,CAAC,IAAI,EAAE,4BAAoB,CAAC,CAAC;AAC7D,CAAC;AAFD,wDAEC;AAMD,MAAa,mBAAmB;IAE5B,WAAW;QACP,OAAO,CAAC,WAAW,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAChQ,CAAC;IAED,UAAU,CAAC,IAAa,EAAE,IAAY;QAClC,OAAO,IAAA,mBAAS,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,SAAiB;QACxC,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,IAAI,CAAC;SACf;QACD,QAAQ,OAAO,EAAE;YACb,KAAK,iBAAS,CAAC;YACf,KAAK,YAAI,CAAC;YACV,KAAK,gBAAQ,CAAC,CAAC;gBACX,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAW,EAAE,SAAS,CAAC,CAAC;aACjD;YACD,KAAK,mBAAW,CAAC;YACjB,KAAK,4BAAoB,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAU,EAAE,SAAS,CAAC,CAAC;aAChD;YACD,OAAO,CAAC,CAAC;gBACL,OAAO,KAAK,CAAC;aAChB;SACJ;IACL,CAAC;IAED,gBAAgB,CAAC,WAA+B;QAC5C,QAAQ,WAAW,EAAE;YACjB,KAAK,8BAA8B,CAAC,CAAC;gBACjC,OAAO,mBAAW,CAAC;aACtB;YACD,KAAK,yBAAyB,CAAC,CAAC;gBAC5B,OAAO,gBAAQ,CAAC;aACnB;YACD,OAAO,CAAC,CAAC;gBACL,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,+BAA+B,CAAC,CAAC;aAClE;SACJ;IACL,CAAC;IAED,eAAe,CAAC,IAAY;QACxB,QAAQ,IAAI,EAAE;YACV,KAAK,WAAW,CAAC,CAAC;gBACd,OAAO;oBACH,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;wBACjC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;qBACvC;iBACJ,CAAC;aACL;YACD,KAAK,gBAAgB,CAAC,CAAC;gBACnB,OAAO;oBACH,IAAI,EAAE,gBAAgB;oBACtB,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;qBACxC;iBACJ,CAAC;aACL;YACD,KAAK,yBAAyB,CAAC,CAAC;gBAC5B,OAAO;oBACH,IAAI,EAAE,yBAAyB;oBAC/B,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;qBAClC;iBACJ,CAAC;aACL;YACD,KAAK,oBAAoB,CAAC,CAAC;gBACvB,OAAO;oBACH,IAAI,EAAE,oBAAoB;oBAC1B,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;wBAClC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;qBACxC;iBACJ,CAAC;aACL;YACD,KAAK,YAAY,CAAC,CAAC;gBACf,OAAO;oBACH,IAAI,EAAE,YAAY;oBAClB,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;qBACpC;iBACJ,CAAC;aACL;YACD,KAAK,MAAM,CAAC,CAAC;gBACT,OAAO;oBACH,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;qBACpC;iBACJ,CAAC;aACL;YACD,KAAK,UAAU,CAAC,CAAC;gBACb,OAAO;oBACH,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;qBACpC;iBACJ,CAAC;aACL;YACD,KAAK,OAAO,CAAC,CAAC;gBACV,OAAO;oBACH,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE;wBACtC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;wBAChC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;wBACpC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;qBACpC;iBACJ,CAAC;aACL;YACD,KAAK,sBAAsB,CAAC,CAAC;gBACzB,OAAO;oBACH,IAAI,EAAE,sBAAsB;oBAC5B,SAAS,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;qBAClC;iBACJ,CAAC;aACL;YACD,OAAO,CAAC,CAAC;gBACL,OAAO;oBACH,IAAI,EAAE,IAAI;oBACV,SAAS,EAAE,EAAE;iBAChB,CAAC;aACL;SACJ;IACL,CAAC;CACJ;AAnID,kDAmIC;AAEY,QAAA,UAAU,GAAG,IAAI,mBAAmB,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/grammar.js b/packages/schema/out/language-server/generated/grammar.js new file mode 100644 index 000000000..596a899bf --- /dev/null +++ b/packages/schema/out/language-server/generated/grammar.js @@ -0,0 +1,900 @@ +"use strict"; +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZModelGrammar = void 0; +const langium_1 = require("langium"); +let loadedZModelGrammar; +const ZModelGrammar = () => loadedZModelGrammar || (loadedZModelGrammar = (0, langium_1.loadGrammar)(`{ + "$type": "Grammar", + "isDeclared": true, + "name": "ZModel", + "rules": [ + { + "$type": "ParserRule", + "name": "Model", + "entry": true, + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "Assignment", + "feature": "datasources", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataSource" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "models", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModel" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "enums", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "Enum" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "fragments", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "Fragment" + }, + "arguments": [] + } + } + ], + "cardinality": "*" + }, + "definesHiddenTokens": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataSource", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "datasource" + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataSourceField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataSourceField", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "=" + }, + { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "SimpleExpr", + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleInvocationExpr" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "SimpleInvocationExpr", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "function", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "(" + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "," + } + ], + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": ")" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "LiteralExpr", + "alternatives": { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "BOOLEAN" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "INT" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "STRING" + }, + "arguments": [] + } + ] + } + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Enum", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "enum" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "EnumField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "EnumField", + "alternatives": { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModel", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "model" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fragments", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "FragmentExpansion" + }, + "arguments": [] + }, + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "FragmentExpansion", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "..." + }, + { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "CrossReference", + "type": { + "$refText": "Fragment" + }, + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + }, + "deprecatedSyntax": false + } + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelField", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "fieldType", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelFieldType" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "attributes", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelFieldAttribute" + }, + "arguments": [] + }, + "cardinality": "*" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelFieldType", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "FieldType" + }, + "arguments": [] + }, + { + "$type": "Assignment", + "feature": "reference", + "operator": "=", + "terminal": { + "$type": "CrossReference", + "type": { + "$refText": "Declaration" + }, + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + }, + "deprecatedSyntax": false + } + } + ] + }, + { + "$type": "Assignment", + "feature": "array", + "operator": "?=", + "terminal": { + "$type": "Keyword", + "value": "[]" + }, + "cardinality": "?" + }, + { + "$type": "Assignment", + "feature": "optional", + "operator": "?=", + "terminal": { + "$type": "Keyword", + "value": "?" + }, + "cardinality": "?" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Declaration", + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "DataModel" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "Fragment" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "Enum" + }, + "arguments": [] + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelFieldAttribute", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "@" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "(" + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "," + } + ], + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + } + ], + "cardinality": "?" + }, + { + "$type": "Keyword", + "value": ")" + } + ], + "cardinality": "?" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Fragment", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "fragment" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "FieldType", + "fragment": true, + "alternatives": { + "$type": "Assignment", + "feature": "type", + "operator": "=", + "terminal": { + "$type": "Alternatives", + "elements": [ + { + "$type": "Keyword", + "value": "String" + }, + { + "$type": "Keyword", + "value": "Boolean" + }, + { + "$type": "Keyword", + "value": "Int" + }, + { + "$type": "Keyword", + "value": "Float" + }, + { + "$type": "Keyword", + "value": "DateTime" + }, + { + "$type": "Keyword", + "value": "JSON" + } + ] + } + }, + "definesHiddenTokens": false, + "entry": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "WS", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\s+" + }, + "fragment": false + }, + { + "$type": "TerminalRule", + "name": "BOOLEAN", + "type": { + "$type": "ReturnType", + "name": "boolean" + }, + "terminal": { + "$type": "RegexToken", + "regex": "true|false" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "ID", + "terminal": { + "$type": "RegexToken", + "regex": "[_a-zA-Z][\\\\w_]*" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "STRING", + "terminal": { + "$type": "RegexToken", + "regex": "\\"[^\\"]*\\"|'[^']*'" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "INT", + "type": { + "$type": "ReturnType", + "name": "number" + }, + "terminal": { + "$type": "RegexToken", + "regex": "[0-9]+" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "ML_COMMENT", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/" + }, + "fragment": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "SL_COMMENT", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\/\\\\/[^\\\\n\\\\r]*" + }, + "fragment": false + } + ], + "definesHiddenTokens": false, + "hiddenTokens": [], + "imports": [], + "interfaces": [], + "types": [], + "usedGrammars": [] +}`)); +exports.ZModelGrammar = ZModelGrammar; +//# sourceMappingURL=grammar.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/grammar.js.map b/packages/schema/out/language-server/generated/grammar.js.map new file mode 100644 index 000000000..cbf60d100 --- /dev/null +++ b/packages/schema/out/language-server/generated/grammar.js.map @@ -0,0 +1 @@ +{"version":3,"file":"grammar.js","sourceRoot":"","sources":["../../../src/language-server/generated/grammar.ts"],"names":[],"mappings":";AAAA;;;gFAGgF;;;AAEhF,qCAA+C;AAE/C,IAAI,mBAAwC,CAAC;AACtC,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,mBAAmB,IAAG,CAAC,mBAAmB,GAAG,IAAA,qBAAW,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAw3BnG,CAAC,CAAC,CAAC;AAx3BQ,QAAA,aAAa,iBAw3BrB"} \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/module.js b/packages/schema/out/language-server/generated/module.js new file mode 100644 index 000000000..552e10fac --- /dev/null +++ b/packages/schema/out/language-server/generated/module.js @@ -0,0 +1,23 @@ +"use strict"; +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZModelGeneratedModule = exports.ZModelGeneratedSharedModule = exports.ZModelLanguageMetaData = void 0; +const ast_1 = require("./ast"); +const grammar_1 = require("./grammar"); +exports.ZModelLanguageMetaData = { + languageId: 'zmodel', + fileExtensions: ['.zmodel'], + caseInsensitive: false +}; +exports.ZModelGeneratedSharedModule = { + AstReflection: () => new ast_1.ZModelAstReflection() +}; +exports.ZModelGeneratedModule = { + Grammar: () => (0, grammar_1.ZModelGrammar)(), + LanguageMetaData: () => exports.ZModelLanguageMetaData, + parser: {} +}; +//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/generated/module.js.map b/packages/schema/out/language-server/generated/module.js.map new file mode 100644 index 000000000..9ee12c7f2 --- /dev/null +++ b/packages/schema/out/language-server/generated/module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/language-server/generated/module.ts"],"names":[],"mappings":";AAAA;;;gFAGgF;;;AAGhF,+BAA4C;AAC5C,uCAA0C;AAE7B,QAAA,sBAAsB,GAAqB;IACpD,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,CAAC,SAAS,CAAC;IAC3B,eAAe,EAAE,KAAK;CACzB,CAAC;AAEW,QAAA,2BAA2B,GAAkE;IACtG,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,yBAAmB,EAAE;CACjD,CAAC;AAEW,QAAA,qBAAqB,GAAsD;IACpF,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,uBAAa,GAAE;IAC9B,gBAAgB,EAAE,GAAG,EAAE,CAAC,8BAAsB;IAC9C,MAAM,EAAE,EAAE;CACb,CAAC"} \ No newline at end of file diff --git a/packages/schema/out/language-server/main.js b/packages/schema/out/language-server/main.js new file mode 100644 index 000000000..fd4549151 --- /dev/null +++ b/packages/schema/out/language-server/main.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const langium_1 = require("langium"); +const node_1 = require("vscode-languageserver/node"); +const zmodel_module_1 = require("./zmodel-module"); +// Create a connection to the client +const connection = (0, node_1.createConnection)(node_1.ProposedFeatures.all); +// Inject the shared services and language-specific services +const { shared } = (0, zmodel_module_1.createZModelServices)({ connection }); +// Start the language server with the shared services +(0, langium_1.startLanguageServer)(shared); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/main.js.map b/packages/schema/out/language-server/main.js.map new file mode 100644 index 000000000..4a761c11b --- /dev/null +++ b/packages/schema/out/language-server/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/language-server/main.ts"],"names":[],"mappings":";;AAAA,qCAA8C;AAC9C,qDAAgF;AAChF,mDAAuD;AAEvD,oCAAoC;AACpC,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,uBAAgB,CAAC,GAAG,CAAC,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,oCAAoB,EAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAExD,qDAAqD;AACrD,IAAA,6BAAmB,EAAC,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/schema/out/language-server/zmodel-module.js b/packages/schema/out/language-server/zmodel-module.js new file mode 100644 index 000000000..7ccb1d0de --- /dev/null +++ b/packages/schema/out/language-server/zmodel-module.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createZModelServices = exports.ZModelModule = void 0; +const langium_1 = require("langium"); +const module_1 = require("./generated/module"); +const zmodel_validator_1 = require("./zmodel-validator"); +/** + * Dependency injection module that overrides Langium default services and contributes the + * declared custom services. The Langium defaults can be partially specified to override only + * selected services, while the custom services must be fully specified. + */ +exports.ZModelModule = { + validation: { + ValidationRegistry: (services) => new zmodel_validator_1.ZModelValidationRegistry(services), + ZModelValidator: () => new zmodel_validator_1.ZModelValidator(), + }, +}; +/** + * Create the full set of services required by Langium. + * + * First inject the shared services by merging two modules: + * - Langium default shared services + * - Services generated by langium-cli + * + * Then inject the language-specific services by merging three modules: + * - Langium default language-specific services + * - Services generated by langium-cli + * - Services specified in this file + * + * @param context Optional module context with the LSP connection + * @returns An object wrapping the shared services and the language-specific services + */ +function createZModelServices(context) { + const shared = (0, langium_1.inject)((0, langium_1.createDefaultSharedModule)(context), module_1.ZModelGeneratedSharedModule); + const ZModel = (0, langium_1.inject)((0, langium_1.createDefaultModule)({ shared }), module_1.ZModelGeneratedModule, exports.ZModelModule); + shared.ServiceRegistry.register(ZModel); + return { shared, ZModel }; +} +exports.createZModelServices = createZModelServices; +//# sourceMappingURL=zmodel-module.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/zmodel-module.js.map b/packages/schema/out/language-server/zmodel-module.js.map new file mode 100644 index 000000000..fbe1336c4 --- /dev/null +++ b/packages/schema/out/language-server/zmodel-module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"zmodel-module.js","sourceRoot":"","sources":["../../src/language-server/zmodel-module.ts"],"names":[],"mappings":";;;AAAA,qCASiB;AACjB,+CAG4B;AAC5B,yDAA+E;AAiB/E;;;;GAIG;AACU,QAAA,YAAY,GAGrB;IACA,UAAU,EAAE;QACR,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC7B,IAAI,2CAAwB,CAAC,QAAQ,CAAC;QAC1C,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,kCAAe,EAAE;KAC/C;CACJ,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,SAAgB,oBAAoB,CAAC,OAAoC;IAIrE,MAAM,MAAM,GAAG,IAAA,gBAAM,EACjB,IAAA,mCAAyB,EAAC,OAAO,CAAC,EAClC,oCAA2B,CAC9B,CAAC;IACF,MAAM,MAAM,GAAG,IAAA,gBAAM,EACjB,IAAA,6BAAmB,EAAC,EAAE,MAAM,EAAE,CAAC,EAC/B,8BAAqB,EACrB,oBAAY,CACf,CAAC;IACF,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAfD,oDAeC"} \ No newline at end of file diff --git a/packages/schema/out/language-server/zmodel-validator.js b/packages/schema/out/language-server/zmodel-validator.js new file mode 100644 index 000000000..a474a1e0a --- /dev/null +++ b/packages/schema/out/language-server/zmodel-validator.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZModelValidator = exports.ZModelValidationRegistry = void 0; +const langium_1 = require("langium"); +/** + * Registry for validation checks. + */ +class ZModelValidationRegistry extends langium_1.ValidationRegistry { + constructor(services) { + super(services); + const validator = services.validation.ZModelValidator; + const checks = { + // Person: validator.checkPersonStartsWithCapital + }; + this.register(checks, validator); + } +} +exports.ZModelValidationRegistry = ZModelValidationRegistry; +/** + * Implementation of custom validations. + */ +class ZModelValidator { +} +exports.ZModelValidator = ZModelValidator; +//# sourceMappingURL=zmodel-validator.js.map \ No newline at end of file diff --git a/packages/schema/out/language-server/zmodel-validator.js.map b/packages/schema/out/language-server/zmodel-validator.js.map new file mode 100644 index 000000000..8554d5963 --- /dev/null +++ b/packages/schema/out/language-server/zmodel-validator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"zmodel-validator.js","sourceRoot":"","sources":["../../src/language-server/zmodel-validator.ts"],"names":[],"mappings":";;;AAAA,qCAIiB;AAIjB;;GAEG;AACH,MAAa,wBAAyB,SAAQ,4BAAkB;IAC5D,YAAY,QAAwB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;QACtD,MAAM,MAAM,GAAoC;QAC5C,iDAAiD;SACpD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;CACJ;AATD,4DASC;AAED;;GAEG;AACH,MAAa,eAAe;CAS3B;AATD,0CASC"} \ No newline at end of file diff --git a/packages/schema/package.json b/packages/schema/package.json new file mode 100644 index 000000000..48f4facc7 --- /dev/null +++ b/packages/schema/package.json @@ -0,0 +1,81 @@ +{ + "name": "@zenstackhq/schema", + "displayName": "ZenStack Data Modeling Schema Language", + "description": "Please enter a brief description here", + "version": "0.0.1", + "engines": { + "vscode": "^1.56.0" + }, + "categories": [ + "Programming Languages" + ], + "contributes": { + "languages": [ + { + "id": "zmodel", + "aliases": [ + "ZenStack Model", + "zmodel" + ], + "extensions": [ + ".zmodel" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "zmodel", + "scopeName": "source.zmodel", + "path": "./syntaxes/zmodel.tmLanguage.json" + } + ] + }, + "activationEvents": [ + "onLanguage:zmodel" + ], + "files": [ + "bin", + "out", + "src" + ], + "bin": { + "zmodel-cli": "./bin/cli" + }, + "main": "./out/extension.js", + "scripts": { + "vscode:prepublish": "npm run build && npm run lint", + "build": "tsc -b tsconfig.json", + "ts:watch": "tsc -b tsconfig.json --watch", + "lint": "eslint src --ext ts", + "langium:generate": "langium generate", + "langium:watch": "langium generate --watch", + "watch": "concurrently \"npm:langium:watch\" \"npm:ts:watch\"", + "test": "jest" + }, + "dependencies": { + "chevrotain": "^9.1.0", + "colors": "^1.4.0", + "commander": "^8.0.0", + "langium": "^0.4.0", + "uuid": "^9.0.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-uri": "^3.0.2" + }, + "devDependencies": { + "@types/jest": "^29.0.3", + "@types/node": "^14.17.3", + "@types/uuid": "^8.3.4", + "@types/vscode": "^1.56.0", + "@typescript-eslint/eslint-plugin": "^4.14.1", + "@typescript-eslint/parser": "^4.14.1", + "concurrently": "^7.4.0", + "eslint": "^7.19.0", + "jest": "^29.0.3", + "langium-cli": "^0.4.0", + "ts-jest": "^29.0.1", + "ts-node": "^10.9.1", + "typescript": "^4.6.2" + } +} diff --git a/packages/schema/src/cli/cli-util.ts b/packages/schema/src/cli/cli-util.ts new file mode 100644 index 000000000..53f6a949b --- /dev/null +++ b/packages/schema/src/cli/cli-util.ts @@ -0,0 +1,51 @@ +import colors from 'colors'; +import path from 'path'; +import fs from 'fs'; +import { AstNode, LangiumDocument, LangiumServices } from 'langium'; +import { URI } from 'vscode-uri'; + +export async function extractDocument(fileName: string, services: LangiumServices): Promise { + const extensions = services.LanguageMetaData.fileExtensions; + if (!extensions.includes(path.extname(fileName))) { + console.error(colors.yellow(`Please choose a file with one of these extensions: ${extensions}.`)); + process.exit(1); + } + + if (!fs.existsSync(fileName)) { + console.error(colors.red(`File ${fileName} does not exist.`)); + process.exit(1); + } + + const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName))); + await services.shared.workspace.DocumentBuilder.build([document], { validationChecks: 'all' }); + + const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); + if (validationErrors.length > 0) { + console.error(colors.red('There are validation errors:')); + for (const validationError of validationErrors) { + console.error(colors.red( + `line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]` + )); + } + process.exit(1); + } + + return document; +} + +export async function extractAstNode(fileName: string, services: LangiumServices): Promise { + return (await extractDocument(fileName, services)).parseResult?.value as T; +} + +interface FilePathData { + destination: string, + name: string +} + +export function extractDestinationAndName(filePath: string, destination: string | undefined): FilePathData { + filePath = filePath.replace(/\..*$/, '').replace(/[.-]/g, ''); + return { + destination: destination ?? path.join(path.dirname(filePath), 'generated'), + name: path.basename(filePath) + }; +} diff --git a/packages/schema/src/cli/generator.ts b/packages/schema/src/cli/generator.ts new file mode 100644 index 000000000..d6cf4f649 --- /dev/null +++ b/packages/schema/src/cli/generator.ts @@ -0,0 +1,24 @@ +import fs from 'fs'; +import { CompositeGeneratorNode, NL, processGeneratorNode } from 'langium'; +import path from 'path'; +import { Model } from '../language-server/generated/ast'; +import { extractDestinationAndName } from './cli-util'; + +export function generateJavaScript( + model: Model, + filePath: string, + destination: string | undefined +): string { + const data = extractDestinationAndName(filePath, destination); + const generatedFilePath = `${path.join(data.destination, data.name)}.js`; + + const fileNode = new CompositeGeneratorNode(); + fileNode.append('"use strict";', NL, NL); + // model.greetings.forEach(greeting => fileNode.append(`console.log('Hello, ${greeting.person.ref?.name}!');`, NL)); + + if (!fs.existsSync(data.destination)) { + fs.mkdirSync(data.destination, { recursive: true }); + } + fs.writeFileSync(generatedFilePath, processGeneratorNode(fileNode)); + return generatedFilePath; +} diff --git a/packages/schema/src/cli/index.ts b/packages/schema/src/cli/index.ts new file mode 100644 index 000000000..8088d41dc --- /dev/null +++ b/packages/schema/src/cli/index.ts @@ -0,0 +1,55 @@ +import colors from 'colors'; +import { Command } from 'commander'; +import { Model } from '../language-server/generated/ast'; +import { ZModelLanguageMetaData } from '../language-server/generated/module'; +import { createZModelServices } from '../language-server/zmodel-module'; +import { extractAstNode } from './cli-util'; +import { generateJavaScript } from './generator'; + +export const generateAction = async ( + fileName: string, + opts: GenerateOptions +): Promise => { + const services = createZModelServices().ZModel; + const model = await extractAstNode(fileName, services); + const generatedFilePath = generateJavaScript( + model, + fileName, + opts.destination + ); + console.log( + colors.green( + `JavaScript code generated successfully: ${generatedFilePath}` + ) + ); +}; + +export type GenerateOptions = { + destination?: string; +}; + +export default function (): void { + const program = new Command(); + + program + // eslint-disable-next-line @typescript-eslint/no-var-requires + .version(require('../../package.json').version); + + const fileExtensions = ZModelLanguageMetaData.fileExtensions.join(', '); + program + .command('generate') + .argument( + '', + `source file (possible file extensions: ${fileExtensions})` + ) + .option( + '-d, --destination ', + 'destination directory of generating' + ) + .description( + 'generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file' + ) + .action(generateAction); + + program.parse(process.argv); +} diff --git a/packages/schema/src/extension.ts b/packages/schema/src/extension.ts new file mode 100644 index 000000000..ce18d2b2a --- /dev/null +++ b/packages/schema/src/extension.ts @@ -0,0 +1,76 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind, +} from 'vscode-languageclient/node'; + +let client: LanguageClient; + +// This function is called when the extension is activated. +export function activate(context: vscode.ExtensionContext): void { + client = startLanguageClient(context); +} + +// This function is called when the extension is deactivated. +export function deactivate(): Thenable | undefined { + if (client) { + return client.stop(); + } + return undefined; +} + +function startLanguageClient(context: vscode.ExtensionContext): LanguageClient { + const serverModule = context.asAbsolutePath( + path.join('out', 'language-server', 'main') + ); + // The debug options for the server + // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging. + // By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached. + const debugOptions = { + execArgv: [ + '--nolazy', + `--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${ + process.env.DEBUG_SOCKET || '6009' + }`, + ], + }; + + // If the extension is launched in debug mode then the debug server options are used + // Otherwise the run options are used + const serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc }, + debug: { + module: serverModule, + transport: TransportKind.ipc, + options: debugOptions, + }, + }; + + const fileSystemWatcher = + vscode.workspace.createFileSystemWatcher('**/*.zmodel'); + context.subscriptions.push(fileSystemWatcher); + + // Options to control the language client + const clientOptions: LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'zmodel' }], + synchronize: { + // Notify the server about file changes to files contained in the workspace + fileEvents: fileSystemWatcher, + }, + }; + + // Create the language client and start the client. + const client = new LanguageClient( + 'zmodel', + 'ZenStack Model', + serverOptions, + clientOptions + ); + + // Start the client. This will also launch the server + client.start(); + return client; +} diff --git a/packages/schema/src/language-server/generated/ast.ts b/packages/schema/src/language-server/generated/ast.ts new file mode 100644 index 000000000..800ccd7e7 --- /dev/null +++ b/packages/schema/src/language-server/generated/ast.ts @@ -0,0 +1,320 @@ +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ + +/* eslint-disable @typescript-eslint/array-type */ +/* eslint-disable @typescript-eslint/no-empty-interface */ +import { AstNode, AstReflection, Reference, isAstNode, TypeMetaData } from 'langium'; + +export type Declaration = DataModel | Enum | Fragment; + +export const Declaration = 'Declaration'; + +export function isDeclaration(item: unknown): item is Declaration { + return reflection.isInstance(item, Declaration); +} + +export type SimpleExpr = LiteralExpr | SimpleInvocationExpr; + +export const SimpleExpr = 'SimpleExpr'; + +export function isSimpleExpr(item: unknown): item is SimpleExpr { + return reflection.isInstance(item, SimpleExpr); +} + +export interface DataModel extends AstNode { + readonly $container: Model; + fields: Array + fragments: Array + name: string +} + +export const DataModel = 'DataModel'; + +export function isDataModel(item: unknown): item is DataModel { + return reflection.isInstance(item, DataModel); +} + +export interface DataModelField extends AstNode { + readonly $container: DataModel | Fragment; + attributes: Array + fieldType: DataModelFieldType + name: string +} + +export const DataModelField = 'DataModelField'; + +export function isDataModelField(item: unknown): item is DataModelField { + return reflection.isInstance(item, DataModelField); +} + +export interface DataModelFieldAttribute extends AstNode { + readonly $container: DataModelField; + args: Array + name: string +} + +export const DataModelFieldAttribute = 'DataModelFieldAttribute'; + +export function isDataModelFieldAttribute(item: unknown): item is DataModelFieldAttribute { + return reflection.isInstance(item, DataModelFieldAttribute); +} + +export interface DataModelFieldType extends AstNode { + readonly $container: DataModelField; + array: boolean + optional: boolean + reference?: Reference + type?: 'Boolean' | 'DateTime' | 'Float' | 'Int' | 'JSON' | 'String' +} + +export const DataModelFieldType = 'DataModelFieldType'; + +export function isDataModelFieldType(item: unknown): item is DataModelFieldType { + return reflection.isInstance(item, DataModelFieldType); +} + +export interface DataSource extends AstNode { + readonly $container: Model; + fields: Array +} + +export const DataSource = 'DataSource'; + +export function isDataSource(item: unknown): item is DataSource { + return reflection.isInstance(item, DataSource); +} + +export interface DataSourceField extends AstNode { + readonly $container: DataSource; + name: string + value: SimpleExpr +} + +export const DataSourceField = 'DataSourceField'; + +export function isDataSourceField(item: unknown): item is DataSourceField { + return reflection.isInstance(item, DataSourceField); +} + +export interface Enum extends AstNode { + readonly $container: Model; + fields: Array + name: string +} + +export const Enum = 'Enum'; + +export function isEnum(item: unknown): item is Enum { + return reflection.isInstance(item, Enum); +} + +export interface EnumField extends AstNode { + readonly $container: Enum; + value: string +} + +export const EnumField = 'EnumField'; + +export function isEnumField(item: unknown): item is EnumField { + return reflection.isInstance(item, EnumField); +} + +export interface Fragment extends AstNode { + readonly $container: Model; + fields: Array + name: string +} + +export const Fragment = 'Fragment'; + +export function isFragment(item: unknown): item is Fragment { + return reflection.isInstance(item, Fragment); +} + +export interface FragmentExpansion extends AstNode { + readonly $container: DataModel; + value: Reference +} + +export const FragmentExpansion = 'FragmentExpansion'; + +export function isFragmentExpansion(item: unknown): item is FragmentExpansion { + return reflection.isInstance(item, FragmentExpansion); +} + +export interface LiteralExpr extends AstNode { + readonly $container: DataModelFieldAttribute | DataSourceField | SimpleInvocationExpr; + value: boolean | number | string +} + +export const LiteralExpr = 'LiteralExpr'; + +export function isLiteralExpr(item: unknown): item is LiteralExpr { + return reflection.isInstance(item, LiteralExpr); +} + +export interface Model extends AstNode { + datasources: Array + enums: Array + fragments: Array + models: Array +} + +export const Model = 'Model'; + +export function isModel(item: unknown): item is Model { + return reflection.isInstance(item, Model); +} + +export interface SimpleInvocationExpr extends AstNode { + readonly $container: DataModelFieldAttribute | DataSourceField | SimpleInvocationExpr; + args: Array + function: string +} + +export const SimpleInvocationExpr = 'SimpleInvocationExpr'; + +export function isSimpleInvocationExpr(item: unknown): item is SimpleInvocationExpr { + return reflection.isInstance(item, SimpleInvocationExpr); +} + +export type ZModelAstType = 'DataModel' | 'DataModelField' | 'DataModelFieldAttribute' | 'DataModelFieldType' | 'DataSource' | 'DataSourceField' | 'Declaration' | 'Enum' | 'EnumField' | 'Fragment' | 'FragmentExpansion' | 'LiteralExpr' | 'Model' | 'SimpleExpr' | 'SimpleInvocationExpr'; + +export type ZModelAstReference = 'DataModelFieldType:reference' | 'FragmentExpansion:value'; + +export class ZModelAstReflection implements AstReflection { + + getAllTypes(): string[] { + return ['DataModel', 'DataModelField', 'DataModelFieldAttribute', 'DataModelFieldType', 'DataSource', 'DataSourceField', 'Declaration', 'Enum', 'EnumField', 'Fragment', 'FragmentExpansion', 'LiteralExpr', 'Model', 'SimpleExpr', 'SimpleInvocationExpr']; + } + + isInstance(node: unknown, type: string): boolean { + return isAstNode(node) && this.isSubtype(node.$type, type); + } + + isSubtype(subtype: string, supertype: string): boolean { + if (subtype === supertype) { + return true; + } + switch (subtype) { + case DataModel: + case Enum: + case Fragment: { + return this.isSubtype(Declaration, supertype); + } + case LiteralExpr: + case SimpleInvocationExpr: { + return this.isSubtype(SimpleExpr, supertype); + } + default: { + return false; + } + } + } + + getReferenceType(referenceId: ZModelAstReference): string { + switch (referenceId) { + case 'DataModelFieldType:reference': { + return Declaration; + } + case 'FragmentExpansion:value': { + return Fragment; + } + default: { + throw new Error(`${referenceId} is not a valid reference id.`); + } + } + } + + getTypeMetaData(type: string): TypeMetaData { + switch (type) { + case 'DataModel': { + return { + name: 'DataModel', + mandatory: [ + { name: 'fields', type: 'array' }, + { name: 'fragments', type: 'array' } + ] + }; + } + case 'DataModelField': { + return { + name: 'DataModelField', + mandatory: [ + { name: 'attributes', type: 'array' } + ] + }; + } + case 'DataModelFieldAttribute': { + return { + name: 'DataModelFieldAttribute', + mandatory: [ + { name: 'args', type: 'array' } + ] + }; + } + case 'DataModelFieldType': { + return { + name: 'DataModelFieldType', + mandatory: [ + { name: 'array', type: 'boolean' }, + { name: 'optional', type: 'boolean' } + ] + }; + } + case 'DataSource': { + return { + name: 'DataSource', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Enum': { + return { + name: 'Enum', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Fragment': { + return { + name: 'Fragment', + mandatory: [ + { name: 'fields', type: 'array' } + ] + }; + } + case 'Model': { + return { + name: 'Model', + mandatory: [ + { name: 'datasources', type: 'array' }, + { name: 'enums', type: 'array' }, + { name: 'fragments', type: 'array' }, + { name: 'models', type: 'array' } + ] + }; + } + case 'SimpleInvocationExpr': { + return { + name: 'SimpleInvocationExpr', + mandatory: [ + { name: 'args', type: 'array' } + ] + }; + } + default: { + return { + name: type, + mandatory: [] + }; + } + } + } +} + +export const reflection = new ZModelAstReflection(); diff --git a/packages/schema/src/language-server/generated/grammar.ts b/packages/schema/src/language-server/generated/grammar.ts new file mode 100644 index 000000000..ac84c1365 --- /dev/null +++ b/packages/schema/src/language-server/generated/grammar.ts @@ -0,0 +1,897 @@ +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ + +import { loadGrammar, Grammar } from 'langium'; + +let loadedZModelGrammar: Grammar | undefined; +export const ZModelGrammar = (): Grammar => loadedZModelGrammar ||(loadedZModelGrammar = loadGrammar(`{ + "$type": "Grammar", + "isDeclared": true, + "name": "ZModel", + "rules": [ + { + "$type": "ParserRule", + "name": "Model", + "entry": true, + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "Assignment", + "feature": "datasources", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataSource" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "models", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModel" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "enums", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "Enum" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "fragments", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "Fragment" + }, + "arguments": [] + } + } + ], + "cardinality": "*" + }, + "definesHiddenTokens": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataSource", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "datasource" + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataSourceField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataSourceField", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "=" + }, + { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "SimpleExpr", + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleInvocationExpr" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "SimpleInvocationExpr", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "function", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "(" + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "," + } + ], + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "SimpleExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": ")" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "LiteralExpr", + "alternatives": { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "BOOLEAN" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "INT" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "STRING" + }, + "arguments": [] + } + ] + } + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Enum", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "enum" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "EnumField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "EnumField", + "alternatives": { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModel", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "model" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fragments", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "FragmentExpansion" + }, + "arguments": [] + }, + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "FragmentExpansion", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "..." + }, + { + "$type": "Assignment", + "feature": "value", + "operator": "=", + "terminal": { + "$type": "CrossReference", + "type": { + "$refText": "Fragment" + }, + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + }, + "deprecatedSyntax": false + } + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelField", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "fieldType", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelFieldType" + }, + "arguments": [] + } + }, + { + "$type": "Assignment", + "feature": "attributes", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelFieldAttribute" + }, + "arguments": [] + }, + "cardinality": "*" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelFieldType", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "FieldType" + }, + "arguments": [] + }, + { + "$type": "Assignment", + "feature": "reference", + "operator": "=", + "terminal": { + "$type": "CrossReference", + "type": { + "$refText": "Declaration" + }, + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + }, + "deprecatedSyntax": false + } + } + ] + }, + { + "$type": "Assignment", + "feature": "array", + "operator": "?=", + "terminal": { + "$type": "Keyword", + "value": "[]" + }, + "cardinality": "?" + }, + { + "$type": "Assignment", + "feature": "optional", + "operator": "?=", + "terminal": { + "$type": "Keyword", + "value": "?" + }, + "cardinality": "?" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Declaration", + "alternatives": { + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$refText": "DataModel" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "Fragment" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$refText": "Enum" + }, + "arguments": [] + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "DataModelFieldAttribute", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "@" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "(" + }, + { + "$type": "Group", + "elements": [ + { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "," + } + ], + "cardinality": "*" + }, + { + "$type": "Assignment", + "feature": "args", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "LiteralExpr" + }, + "arguments": [] + } + } + ], + "cardinality": "?" + }, + { + "$type": "Keyword", + "value": ")" + } + ], + "cardinality": "?" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "Fragment", + "alternatives": { + "$type": "Group", + "elements": [ + { + "$type": "Keyword", + "value": "fragment" + }, + { + "$type": "Assignment", + "feature": "name", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "ID" + }, + "arguments": [] + } + }, + { + "$type": "Keyword", + "value": "{" + }, + { + "$type": "Assignment", + "feature": "fields", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$refText": "DataModelField" + }, + "arguments": [] + }, + "cardinality": "+" + }, + { + "$type": "Keyword", + "value": "}" + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "ParserRule", + "name": "FieldType", + "fragment": true, + "alternatives": { + "$type": "Assignment", + "feature": "type", + "operator": "=", + "terminal": { + "$type": "Alternatives", + "elements": [ + { + "$type": "Keyword", + "value": "String" + }, + { + "$type": "Keyword", + "value": "Boolean" + }, + { + "$type": "Keyword", + "value": "Int" + }, + { + "$type": "Keyword", + "value": "Float" + }, + { + "$type": "Keyword", + "value": "DateTime" + }, + { + "$type": "Keyword", + "value": "JSON" + } + ] + } + }, + "definesHiddenTokens": false, + "entry": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "WS", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\s+" + }, + "fragment": false + }, + { + "$type": "TerminalRule", + "name": "BOOLEAN", + "type": { + "$type": "ReturnType", + "name": "boolean" + }, + "terminal": { + "$type": "RegexToken", + "regex": "true|false" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "ID", + "terminal": { + "$type": "RegexToken", + "regex": "[_a-zA-Z][\\\\w_]*" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "STRING", + "terminal": { + "$type": "RegexToken", + "regex": "\\"[^\\"]*\\"|'[^']*'" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "name": "INT", + "type": { + "$type": "ReturnType", + "name": "number" + }, + "terminal": { + "$type": "RegexToken", + "regex": "[0-9]+" + }, + "fragment": false, + "hidden": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "ML_COMMENT", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/" + }, + "fragment": false + }, + { + "$type": "TerminalRule", + "hidden": true, + "name": "SL_COMMENT", + "terminal": { + "$type": "RegexToken", + "regex": "\\\\/\\\\/[^\\\\n\\\\r]*" + }, + "fragment": false + } + ], + "definesHiddenTokens": false, + "hiddenTokens": [], + "imports": [], + "interfaces": [], + "types": [], + "usedGrammars": [] +}`)); diff --git a/packages/schema/src/language-server/generated/module.ts b/packages/schema/src/language-server/generated/module.ts new file mode 100644 index 000000000..4ce1978b8 --- /dev/null +++ b/packages/schema/src/language-server/generated/module.ts @@ -0,0 +1,24 @@ +/****************************************************************************** + * This file was generated by langium-cli 0.4.0. + * DO NOT EDIT MANUALLY! + ******************************************************************************/ + +import { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module } from 'langium'; +import { ZModelAstReflection } from './ast'; +import { ZModelGrammar } from './grammar'; + +export const ZModelLanguageMetaData: LanguageMetaData = { + languageId: 'zmodel', + fileExtensions: ['.zmodel'], + caseInsensitive: false +}; + +export const ZModelGeneratedSharedModule: Module = { + AstReflection: () => new ZModelAstReflection() +}; + +export const ZModelGeneratedModule: Module = { + Grammar: () => ZModelGrammar(), + LanguageMetaData: () => ZModelLanguageMetaData, + parser: {} +}; diff --git a/packages/schema/src/language-server/main.ts b/packages/schema/src/language-server/main.ts new file mode 100644 index 000000000..8abf8ee04 --- /dev/null +++ b/packages/schema/src/language-server/main.ts @@ -0,0 +1,12 @@ +import { startLanguageServer } from 'langium'; +import { createConnection, ProposedFeatures } from 'vscode-languageserver/node'; +import { createZModelServices } from './zmodel-module'; + +// Create a connection to the client +const connection = createConnection(ProposedFeatures.all); + +// Inject the shared services and language-specific services +const { shared } = createZModelServices({ connection }); + +// Start the language server with the shared services +startLanguageServer(shared); diff --git a/packages/schema/src/language-server/zmodel-module.ts b/packages/schema/src/language-server/zmodel-module.ts new file mode 100644 index 000000000..76fc332f6 --- /dev/null +++ b/packages/schema/src/language-server/zmodel-module.ts @@ -0,0 +1,78 @@ +import { + createDefaultModule, + createDefaultSharedModule, + DefaultSharedModuleContext, + inject, + LangiumServices, + LangiumSharedServices, + Module, + PartialLangiumServices, +} from 'langium'; +import { + ZModelGeneratedModule, + ZModelGeneratedSharedModule, +} from './generated/module'; +import { ZModelValidationRegistry, ZModelValidator } from './zmodel-validator'; + +/** + * Declaration of custom services - add your own service classes here. + */ +export type ZModelAddedServices = { + validation: { + ZModelValidator: ZModelValidator; + }; +}; + +/** + * Union of Langium default services and your custom services - use this as constructor parameter + * of custom service classes. + */ +export type ZModelServices = LangiumServices & ZModelAddedServices; + +/** + * Dependency injection module that overrides Langium default services and contributes the + * declared custom services. The Langium defaults can be partially specified to override only + * selected services, while the custom services must be fully specified. + */ +export const ZModelModule: Module< + ZModelServices, + PartialLangiumServices & ZModelAddedServices +> = { + validation: { + ValidationRegistry: (services) => + new ZModelValidationRegistry(services), + ZModelValidator: () => new ZModelValidator(), + }, +}; + +/** + * Create the full set of services required by Langium. + * + * First inject the shared services by merging two modules: + * - Langium default shared services + * - Services generated by langium-cli + * + * Then inject the language-specific services by merging three modules: + * - Langium default language-specific services + * - Services generated by langium-cli + * - Services specified in this file + * + * @param context Optional module context with the LSP connection + * @returns An object wrapping the shared services and the language-specific services + */ +export function createZModelServices(context?: DefaultSharedModuleContext): { + shared: LangiumSharedServices; + ZModel: ZModelServices; +} { + const shared = inject( + createDefaultSharedModule(context), + ZModelGeneratedSharedModule + ); + const ZModel = inject( + createDefaultModule({ shared }), + ZModelGeneratedModule, + ZModelModule + ); + shared.ServiceRegistry.register(ZModel); + return { shared, ZModel }; +} diff --git a/packages/schema/src/language-server/zmodel-validator.ts b/packages/schema/src/language-server/zmodel-validator.ts new file mode 100644 index 000000000..e7312c818 --- /dev/null +++ b/packages/schema/src/language-server/zmodel-validator.ts @@ -0,0 +1,35 @@ +import { + // ValidationAcceptor, + ValidationChecks, + ValidationRegistry, +} from 'langium'; +import { ZModelAstType } from './generated/ast'; +import type { ZModelServices } from './zmodel-module'; + +/** + * Registry for validation checks. + */ +export class ZModelValidationRegistry extends ValidationRegistry { + constructor(services: ZModelServices) { + super(services); + const validator = services.validation.ZModelValidator; + const checks: ValidationChecks = { + // Person: validator.checkPersonStartsWithCapital + }; + this.register(checks, validator); + } +} + +/** + * Implementation of custom validations. + */ +export class ZModelValidator { + // checkPersonStartsWithCapital(person: Person, accept: ValidationAcceptor): void { + // if (person.name) { + // const firstChar = person.name.substring(0, 1); + // if (firstChar.toUpperCase() !== firstChar) { + // accept('warning', 'Person name should start with a capital.', { node: person, property: 'name' }); + // } + // } + // } +} diff --git a/packages/schema/src/language-server/zmodel.langium b/packages/schema/src/language-server/zmodel.langium new file mode 100644 index 000000000..dc40d1a7d --- /dev/null +++ b/packages/schema/src/language-server/zmodel.langium @@ -0,0 +1,64 @@ +grammar ZModel + +entry Model: + (datasources+=DataSource | models+=DataModel | enums+=Enum | fragments+=Fragment )*; + +// datasource +DataSource: + 'datasource' '{' (fields+=DataSourceField)+ '}'; + +DataSourceField: + (name=ID '=' value=SimpleExpr); + +SimpleExpr: + SimpleInvocationExpr | LiteralExpr; + +SimpleInvocationExpr: + function=ID '(' (args+=SimpleExpr ',')* args+=SimpleExpr ')'; + +LiteralExpr: + value=(BOOLEAN | INT | STRING); + +// enum +Enum: + 'enum' name=ID '{' (fields+=EnumField)+ '}'; + +EnumField: + value=ID; + +// model +DataModel: + 'model' name=ID '{' (fragments+=FragmentExpansion)* (fields+=DataModelField)+ '}'; + +FragmentExpansion: + '...' value=[Fragment:ID]; + +DataModelField: + name=ID fieldType=DataModelFieldType (attributes+=DataModelFieldAttribute)*; + +DataModelFieldType: + (FieldType + | reference=[Declaration:ID] + ) (array?='[]')? (optional?='?')?; + +Declaration: + DataModel | Fragment | Enum; + +DataModelFieldAttribute: + '@' name=ID + ('(' ((args+=LiteralExpr ',')* args+=LiteralExpr)? ')')?; + +// fragment +Fragment: + 'fragment' name=ID '{' (fields+=DataModelField)+ '}'; + +fragment FieldType: + type=('String'|'Boolean'|'Int'|'Float'|'DateTime'|'JSON'); + +hidden terminal WS: /\s+/; +terminal BOOLEAN returns boolean: /true|false/; +terminal ID: /[_a-zA-Z][\w_]*/; +terminal STRING: /"[^"]*"|'[^']*'/; +terminal INT returns number: /[0-9]+/; +hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//; +hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; diff --git a/packages/schema/syntaxes/zmodel.json b/packages/schema/syntaxes/zmodel.json new file mode 100644 index 000000000..f8bc39300 --- /dev/null +++ b/packages/schema/syntaxes/zmodel.json @@ -0,0 +1,57 @@ +{ + "name": "zmodel", + "scopeName": "source.zmodel", + "fileTypes": [ + ".zmodel" + ], + "patterns": [ + { + "include": "#comments" + }, + { + "name": "keyword.control.zmodel", + "match": "\\b(Boolean|datasource|enum|model|String)\\b" + }, + { + "name": "string.quoted.double.zmodel", + "begin": "\"", + "end": "\"" + }, + { + "name": "string.quoted.single.zmodel", + "begin": "'", + "end": "'" + } + ], + "repository": { + "comments": { + "patterns": [ + { + "name": "comment.block.zmodel", + "begin": "/\\*", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.zmodel" + } + }, + "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.zmodel" + } + } + }, + { + "begin": "//", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.zmodel" + } + }, + "end": "(?=$)", + "name": "comment.line.zmodel" + } + ] + } + } +} \ No newline at end of file diff --git a/packages/schema/syntaxes/zmodel.tmLanguage.json b/packages/schema/syntaxes/zmodel.tmLanguage.json new file mode 100644 index 000000000..e21238bc3 --- /dev/null +++ b/packages/schema/syntaxes/zmodel.tmLanguage.json @@ -0,0 +1,57 @@ +{ + "name": "zmodel", + "scopeName": "source.zmodel", + "fileTypes": [ + ".zmodel" + ], + "patterns": [ + { + "include": "#comments" + }, + { + "name": "keyword.control.zmodel", + "match": "\\b(Boolean|datasource|DateTime|enum|Float|fragment|Int|JSON|model|String)\\b" + }, + { + "name": "string.quoted.double.zmodel", + "begin": "\"", + "end": "\"" + }, + { + "name": "string.quoted.single.zmodel", + "begin": "'", + "end": "'" + } + ], + "repository": { + "comments": { + "patterns": [ + { + "name": "comment.block.zmodel", + "begin": "/\\*", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.zmodel" + } + }, + "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.zmodel" + } + } + }, + { + "begin": "//", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.zmodel" + } + }, + "end": "(?=$)", + "name": "comment.line.zmodel" + } + ] + } + } +} \ No newline at end of file diff --git a/packages/schema/tests/basic.test.ts b/packages/schema/tests/basic.test.ts new file mode 100644 index 000000000..01fb32f69 --- /dev/null +++ b/packages/schema/tests/basic.test.ts @@ -0,0 +1,117 @@ +import { parse } from './utils'; + +describe('Basic Tests', () => { + it('functions', async () => { + const content = ` + function userInSpace(user, space) { + exists(SpaceUser, $.space == space && $.user == user) + } + `; + await parse(content); + }); + + it('feature coverage', async () => { + const content = ` + datasource { + provider = 'postgresql' + url = env('DATABASE_URL') + } + + fragment CommonFields { + id String @id + createdBy User @createdBy + updatedBy User @updatedBy + createdAt DateTime @createdAt + updatedAt DateTime @updatedAt + } + + model Space + @deny('all', auth() == null) + @allow('create', true) + @allow('read', userInSpace(auth(), $this)) + @allow('update,delete', userIsSpaceAdmin(auth(), $this)) { + ...CommonFields + name String + slug String @unique + members SpaceUser[] @cascade + todoLists TodoList[] @cascade + } + + enum SpaceUserRole { + USER + ADMIN + } + + model SpaceUser + @deny('all', auth() == null) + @allow('create,update,delete', userIsSpaceAdmin(auth(), $this.space)) + @allow('read', userInSpace(auth(), $this.space)) { + ...CommonFields + space Space + user User + role SpaceUserRole + } + + model User + @deny('all', auth() == null) + @allow('create', true) + @allow('read', userInAnySpace(auth(), spaces)) + @allow('update,delete', auth() == $this) { + ...CommonFields + email String @unique + name String? + todoList TodoList[] + spaces SpaceUser[] @cascade + profile Profile? @cascade + } + + model Profile + @deny('all', auth() == null) + @allow('read', userInAnySpace(auth(), $this.user.spaces)) + @allow('create,update,delete', $this.user == auth()) { + ...CommonFields + user User @unique + avatar String? + } + + model TodoList + @deny('all', auth() == null) + @allow('read', $this.owner == auth() || (userInSpace(auth(), $this.space) && !$this.private)) + @allow('create,update,delete', $this.owner == auth() && userInSpace(auth(), $this.space)) { + ...CommonFields + space Space + owner User + title String + content String + private Boolean @default(true) + todos Todo[] @cascade + } + + model Todo + @deny('all', auth() == null) + @allow('all', $this.todoList.owner == auth() || (userInSpace(auth(), $this.todoList.space) && !$this.todoList.private)) { + ...CommonFields + owner User + todoList TodoList + title String + completedAt DateTime? + } + + function userInSpace(user, space) { + exists(SpaceUser, $.space == space && $.user == user) + } + + function userIsSpaceAdmin(user, space) { + exists(SpaceUser, $.space == space && $.user == user && $.role == ADMIN) + } + + function userInAnySpace(user, spaces) { + find(spaces, $.user == user) + } + `; + + const model = await parse(content); + + console.log('Dump AST:', model); + }); +}); diff --git a/packages/schema/tests/utils.ts b/packages/schema/tests/utils.ts new file mode 100644 index 000000000..c8166a1ce --- /dev/null +++ b/packages/schema/tests/utils.ts @@ -0,0 +1,31 @@ +import { DefaultLangiumDocumentFactory } from 'langium'; +import { createZModelServices } from '../src/language-server/zmodel-module'; +import { URI } from 'vscode-uri'; +import { v4 as uuid } from 'uuid'; +import { Model } from '../src/language-server/generated/ast'; + +export async function parse(content: string) { + const { shared } = createZModelServices(); + const factory = new DefaultLangiumDocumentFactory(shared); + const doc = factory.fromString(content, URI.parse(`zmodel://${uuid()}`)); + await shared.workspace.DocumentBuilder.build([doc], { + validationChecks: 'all', + }); + + const validationErrors = (doc.diagnostics ?? []).filter( + (e) => e.severity === 1 + ); + if (validationErrors.length > 0) { + for (const validationError of validationErrors) { + console.error( + `line ${validationError.range.start.line + 1}: ${ + validationError.message + } [${doc.textDocument.getText(validationError.range)}]` + ); + } + throw new Error('Validation error'); + } + + const model = (await doc.parseResult.value) as Model; + return model; +} diff --git a/packages/schema/tsconfig.json b/packages/schema/tsconfig.json new file mode 100644 index 000000000..ca965e342 --- /dev/null +++ b/packages/schema/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "lib": ["ESNext"], + "sourceMap": true, + "outDir": "out", + "strict": true, + "noUnusedLocals": true, + "noImplicitReturns": true, + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "out", + "node_modules" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..c04dd7235 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3234 @@ +lockfileVersion: 5.4 + +importers: + + packages/schema: + specifiers: + '@types/jest': ^29.0.3 + '@types/node': ^14.17.3 + '@types/uuid': ^8.3.4 + '@types/vscode': ^1.56.0 + '@typescript-eslint/eslint-plugin': ^4.14.1 + '@typescript-eslint/parser': ^4.14.1 + chevrotain: ^9.1.0 + colors: ^1.4.0 + commander: ^8.0.0 + concurrently: ^7.4.0 + eslint: ^7.19.0 + jest: ^29.0.3 + langium: ^0.4.0 + langium-cli: ^0.4.0 + ts-jest: ^29.0.1 + ts-node: ^10.9.1 + typescript: ^4.6.2 + uuid: ^9.0.0 + vscode-languageclient: ^7.0.0 + vscode-languageserver: ^7.0.0 + vscode-uri: ^3.0.2 + dependencies: + chevrotain: 9.1.0 + colors: 1.4.0 + commander: 8.3.0 + langium: 0.4.0 + uuid: 9.0.0 + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-uri: 3.0.6 + devDependencies: + '@types/jest': 29.0.3 + '@types/node': 14.18.29 + '@types/uuid': 8.3.4 + '@types/vscode': 1.71.0 + '@typescript-eslint/eslint-plugin': 4.33.0_qkm6m2dvh7633pj2jigehwm774 + '@typescript-eslint/parser': 4.33.0_dyxdave6dwjbccc5dgiifcmuza + concurrently: 7.4.0 + eslint: 7.32.0 + jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + langium-cli: 0.4.0 + ts-jest: 29.0.1_jksntdpmkmo5cthob65gehuuvi + ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa + typescript: 4.8.3 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.15 + dev: true + + /@babel/code-frame/7.12.11: + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.19.1: + resolution: {integrity: sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.19.1: + resolution: {integrity: sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.0 + '@babel/helper-compilation-targets': 7.19.1_@babel+core@7.19.1 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helpers': 7.19.0 + '@babel/parser': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.1 + '@babel/types': 7.19.0 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.19.0: + resolution: {integrity: sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets/7.19.1_@babel+core@7.19.1: + resolution: {integrity: sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.1 + '@babel/core': 7.19.1 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.0 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/helper-module-transforms/7.19.0: + resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.1 + '@babel/types': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/helper-string-parser/7.18.10: + resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.19.0: + resolution: {integrity: sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.19.1 + '@babel/types': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.19.1: + resolution: {integrity: sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.19.1: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.19.1: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.1: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.1: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.19.1: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.19.1: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.19.1: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.19.1: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.1: + resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.19.1 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.19.1 + '@babel/types': 7.19.0 + dev: true + + /@babel/traverse/7.19.1: + resolution: {integrity: sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.19.0 + '@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.19.1 + '@babel/types': 7.19.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.18.10 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@chevrotain/types/9.1.0: + resolution: {integrity: sha512-3hbCD1CThkv9gnaSIPq0GUXwKni68e0ph6jIHwCvcWiQ4JB2xi8bFxBain0RF04qHUWuDjgnZLj4rLgimuGO+g==} + + /@chevrotain/utils/9.1.0: + resolution: {integrity: sha512-llLJZ8OAlZrjGlBvamm6Zdo/HmGAcCLq5gx7cSwUX8No+n/8ip+oaC4x33IdZIif8+Rh5dQUIZXmfbSghiOmNQ==} + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@eslint/eslintrc/0.4.3: + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 7.3.1 + globals: 13.17.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/29.0.3: + resolution: {integrity: sha512-cGg0r+klVHSYnfE977S9wmpuQ9L+iYuYgL+5bPXiUlUynLLYunRxswEmhBzvrSKGof5AKiHuTTmUKAqRcDY9dg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + chalk: 4.1.2 + jest-message-util: 29.0.3 + jest-util: 29.0.3 + slash: 3.0.0 + dev: true + + /@jest/core/29.0.3_ts-node@10.9.1: + resolution: {integrity: sha512-1d0hLbOrM1qQE3eP3DtakeMbKTcXiXP3afWxqz103xPyddS2NhnNghS7MaXx1dcDt4/6p4nlhmeILo2ofgi8cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.0.3 + '@jest/reporters': 29.0.3 + '@jest/test-result': 29.0.3 + '@jest/transform': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.4.0 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 29.0.0 + jest-config: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + jest-haste-map: 29.0.3 + jest-message-util: 29.0.3 + jest-regex-util: 29.0.0 + jest-resolve: 29.0.3 + jest-resolve-dependencies: 29.0.3 + jest-runner: 29.0.3 + jest-runtime: 29.0.3 + jest-snapshot: 29.0.3 + jest-util: 29.0.3 + jest-validate: 29.0.3 + jest-watcher: 29.0.3 + micromatch: 4.0.5 + pretty-format: 29.0.3 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment/29.0.3: + resolution: {integrity: sha512-iKl272NKxYNQNqXMQandAIwjhQaGw5uJfGXduu8dS9llHi8jV2ChWrtOAVPnMbaaoDhnI3wgUGNDvZgHeEJQCA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + jest-mock: 29.0.3 + dev: true + + /@jest/expect-utils/29.0.3: + resolution: {integrity: sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.0.0 + dev: true + + /@jest/expect/29.0.3: + resolution: {integrity: sha512-6W7K+fsI23FQ01H/BWccPyDZFrnU9QlzDcKOjrNVU5L8yUORFAJJIpmyxWPW70+X624KUNqzZwPThPMX28aXEQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.0.3 + jest-snapshot: 29.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers/29.0.3: + resolution: {integrity: sha512-tmbUIo03x0TdtcZCESQ0oQSakPCpo7+s6+9mU19dd71MptkP4zCwoeZqna23//pgbhtT1Wq02VmA9Z9cNtvtCQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 14.18.29 + jest-message-util: 29.0.3 + jest-mock: 29.0.3 + jest-util: 29.0.3 + dev: true + + /@jest/globals/29.0.3: + resolution: {integrity: sha512-YqGHT65rFY2siPIHHFjuCGUsbzRjdqkwbat+Of6DmYRg5shIXXrLdZoVE/+TJ9O1dsKsFmYhU58JvIbZRU1Z9w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.0.3 + '@jest/expect': 29.0.3 + '@jest/types': 29.0.3 + jest-mock: 29.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters/29.0.3: + resolution: {integrity: sha512-3+QU3d4aiyOWfmk1obDerie4XNCaD5Xo1IlKNde2yGEi02WQD+ZQD0i5Hgqm1e73sMV7kw6pMlCnprtEwEVwxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.0.3 + '@jest/test-result': 29.0.3 + '@jest/transform': 29.0.3 + '@jest/types': 29.0.3 + '@jridgewell/trace-mapping': 0.3.15 + '@types/node': 14.18.29 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.0.3 + jest-util: 29.0.3 + jest-worker: 29.0.3 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + terminal-link: 2.1.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas/29.0.0: + resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.24.42 + dev: true + + /@jest/source-map/29.0.0: + resolution: {integrity: sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.15 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + + /@jest/test-result/29.0.3: + resolution: {integrity: sha512-vViVnQjCgTmbhDKEonKJPtcFe9G/CJO4/Np4XwYJah+lF2oI7KKeRp8t1dFvv44wN2NdbDb/qC6pi++Vpp0Dlg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.0.3 + '@jest/types': 29.0.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/29.0.3: + resolution: {integrity: sha512-Hf4+xYSWZdxTNnhDykr8JBs0yBN/nxOXyUQWfotBUqqy0LF9vzcFB0jm/EDNZCx587znLWTIgxcokW7WeZMobQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.0.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.0.3 + slash: 3.0.0 + dev: true + + /@jest/transform/29.0.3: + resolution: {integrity: sha512-C5ihFTRYaGDbi/xbRQRdbo5ddGtI4VSpmL6AIcZxdhwLbXMa7PcXxxqyI91vGOFHnn5aVM3WYnYKCHEqmLVGzg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.19.1 + '@jest/types': 29.0.3 + '@jridgewell/trace-mapping': 0.3.15 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 29.0.3 + jest-regex-util: 29.0.0 + jest-util: 29.0.3 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/29.0.3: + resolution: {integrity: sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 14.18.29 + '@types/yargs': 17.0.12 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.15 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.15: + resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@sinclair/typebox/0.24.42: + resolution: {integrity: sha512-d+2AtrHGyWek2u2ITF0lHRIv6Tt7X0dEHW+0rP+5aDCEjC3fiN2RBjrLD0yU0at52BcZbRGxLbAtXiR0hFCjYw==} + dev: true + + /@sinonjs/commons/1.8.3: + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: true + + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/babel__core/7.1.19: + resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} + dependencies: + '@babel/parser': 7.19.1 + '@babel/types': 7.19.0 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.1 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.19.1 + '@babel/types': 7.19.0 + dev: true + + /@types/babel__traverse/7.18.1: + resolution: {integrity: sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==} + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@types/graceful-fs/4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 14.18.29 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest/29.0.3: + resolution: {integrity: sha512-F6ukyCTwbfsEX5F2YmVYmM5TcTHy1q9P5rWlRbrk56KyMh3v9xRGUO3aa8+SkvMi0SHXtASJv1283enXimC0Og==} + dependencies: + expect: 29.0.3 + pretty-format: 29.0.3 + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/node/14.18.29: + resolution: {integrity: sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==} + dev: true + + /@types/prettier/2.7.0: + resolution: {integrity: sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==} + dev: true + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/uuid/8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: true + + /@types/vscode/1.71.0: + resolution: {integrity: sha512-nB50bBC9H/x2CpwW9FzRRRDrTZ7G0/POttJojvN/LiVfzTGfLyQIje1L1QRMdFXK9G41k5UJN/1B9S4of7CSzA==} + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/17.0.12: + resolution: {integrity: sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin/4.33.0_qkm6m2dvh7633pj2jigehwm774: + resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 4.33.0_dyxdave6dwjbccc5dgiifcmuza + '@typescript-eslint/parser': 4.33.0_dyxdave6dwjbccc5dgiifcmuza + '@typescript-eslint/scope-manager': 4.33.0 + debug: 4.3.4 + eslint: 7.32.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.8.3 + typescript: 4.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils/4.33.0_dyxdave6dwjbccc5dgiifcmuza: + resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.8.3 + eslint: 7.32.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@7.32.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser/4.33.0_dyxdave6dwjbccc5dgiifcmuza: + resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.8.3 + debug: 4.3.4 + eslint: 7.32.0 + typescript: 4.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/4.33.0: + resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + dev: true + + /@typescript-eslint/types/4.33.0: + resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dev: true + + /@typescript-eslint/typescript-estree/4.33.0_typescript@4.8.3: + resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.8.3 + typescript: 4.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys/4.33.0: + resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /acorn-jsx/5.3.2_acorn@7.4.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /babel-jest/29.0.3_@babel+core@7.19.1: + resolution: {integrity: sha512-ApPyHSOhS/sVzwUOQIWJmdvDhBsMG01HX9z7ogtkp1TToHGGUWFlnXJUIzCgKPSfiYLn3ibipCYzsKSURHEwLg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.19.1 + '@jest/transform': 29.0.3 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.0.2_@babel+core@7.19.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.19.0 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/29.0.2: + resolution: {integrity: sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.0 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.18.1 + dev: true + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.19.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.19.1 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.1 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.1 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.1 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.1 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.1 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.1 + dev: true + + /babel-preset-jest/29.0.2_@babel+core@7.19.1: + resolution: {integrity: sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.19.1 + babel-plugin-jest-hoist: 29.0.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.1 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001409 + electron-to-chromium: 1.4.257 + node-releases: 2.0.6 + update-browserslist-db: 1.0.9_browserslist@4.21.4 + dev: true + + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite/1.0.30001409: + resolution: {integrity: sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chevrotain/9.1.0: + resolution: {integrity: sha512-A86/55so63HCfu0dgGg3j9u8uuuBOrSqly1OhBZxRu2x6sAKILLzfVjbGMw45kgier6lz45EzcjjWtTRgoT84Q==} + dependencies: + '@chevrotain/types': 9.1.0 + '@chevrotain/utils': 9.1.0 + regexp-to-ast: 0.5.0 + + /ci-info/3.4.0: + resolution: {integrity: sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==} + dev: true + + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + /concurrently/7.4.0: + resolution: {integrity: sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==} + engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.29.3 + lodash: 4.17.21 + rxjs: 7.5.6 + shell-quote: 1.7.3 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.5.1 + dev: true + + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /date-fns/2.29.3: + resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} + engines: {node: '>=0.11'} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-sequences/29.0.0: + resolution: {integrity: sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /electron-to-chromium/1.4.257: + resolution: {integrity: sha512-C65sIwHqNnPC2ADMfse/jWTtmhZMII+x6ADI9gENzrOiI7BpxmfKFE84WkIEl5wEg+7+SfIkwChDlsd1Erju2A==} + dev: true + + /emittery/0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /enquirer/2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@7.32.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint/7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + hasBin: true + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.17.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.7 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.0 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect/29.0.3: + resolution: {integrity: sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.0.3 + jest-get-type: 29.0.0 + jest-matcher-utils: 29.0.3 + jest-message-util: 29.0.3 + jest-util: 29.0.3 + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals/13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /ignore/4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.2.0: + resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.19.1 + '@babel/parser': 7.19.1 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files/29.0.0: + resolution: {integrity: sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus/29.0.3: + resolution: {integrity: sha512-QeGzagC6Hw5pP+df1+aoF8+FBSgkPmraC1UdkeunWh0jmrp7wC0Hr6umdUAOELBQmxtKAOMNC3KAdjmCds92Zg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.0.3 + '@jest/expect': 29.0.3 + '@jest/test-result': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.0.3 + jest-matcher-utils: 29.0.3 + jest-message-util: 29.0.3 + jest-runtime: 29.0.3 + jest-snapshot: 29.0.3 + jest-util: 29.0.3 + p-limit: 3.1.0 + pretty-format: 29.0.3 + slash: 3.0.0 + stack-utils: 2.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/29.0.3_johvxhudwcpndp4mle25vwrlq4: + resolution: {integrity: sha512-aUy9Gd/Kut1z80eBzG10jAn6BgS3BoBbXyv+uXEqBJ8wnnuZ5RpNfARoskSrTIy1GY4a8f32YGuCMwibtkl9CQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.0.3_ts-node@10.9.1 + '@jest/test-result': 29.0.3 + '@jest/types': 29.0.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + jest-util: 29.0.3 + jest-validate: 29.0.3 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config/29.0.3_johvxhudwcpndp4mle25vwrlq4: + resolution: {integrity: sha512-U5qkc82HHVYe3fNu2CRXLN4g761Na26rWKf7CjM8LlZB3In1jadEkZdMwsE37rd9RSPV0NfYaCjHdk/gu3v+Ew==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.19.1 + '@jest/test-sequencer': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + babel-jest: 29.0.3_@babel+core@7.19.1 + chalk: 4.1.2 + ci-info: 3.4.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.0.3 + jest-environment-node: 29.0.3 + jest-get-type: 29.0.0 + jest-regex-util: 29.0.0 + jest-resolve: 29.0.3 + jest-runner: 29.0.3 + jest-util: 29.0.3 + jest-validate: 29.0.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.0.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff/29.0.3: + resolution: {integrity: sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.0.0 + jest-get-type: 29.0.0 + pretty-format: 29.0.3 + dev: true + + /jest-docblock/29.0.0: + resolution: {integrity: sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/29.0.3: + resolution: {integrity: sha512-wILhZfESURHHBNvPMJ0lZlYZrvOQJxAo3wNHi+ycr90V7M+uGR9Gh4+4a/BmaZF0XTyZsk4OiYEf3GJN7Ltqzg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + chalk: 4.1.2 + jest-get-type: 29.0.0 + jest-util: 29.0.3 + pretty-format: 29.0.3 + dev: true + + /jest-environment-node/29.0.3: + resolution: {integrity: sha512-cdZqRCnmIlTXC+9vtvmfiY/40Cj6s2T0czXuq1whvQdmpzAnj4sbqVYuZ4zFHk766xTTJ+Ij3uUqkk8KCfXoyg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.0.3 + '@jest/fake-timers': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + jest-mock: 29.0.3 + jest-util: 29.0.3 + dev: true + + /jest-get-type/29.0.0: + resolution: {integrity: sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map/29.0.3: + resolution: {integrity: sha512-uMqR99+GuBHo0RjRhOE4iA6LmsxEwRdgiIAQgMU/wdT2XebsLDz5obIwLZm/Psj+GwSEQhw9AfAVKGYbh2G55A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + '@types/graceful-fs': 4.1.5 + '@types/node': 14.18.29 + anymatch: 3.1.2 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 29.0.0 + jest-util: 29.0.3 + jest-worker: 29.0.3 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector/29.0.3: + resolution: {integrity: sha512-YfW/G63dAuiuQ3QmQlh8hnqLDe25WFY3eQhuc/Ev1AGmkw5zREblTh7TCSKLoheyggu6G9gxO2hY8p9o6xbaRQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.0.0 + pretty-format: 29.0.3 + dev: true + + /jest-matcher-utils/29.0.3: + resolution: {integrity: sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.0.3 + jest-get-type: 29.0.0 + pretty-format: 29.0.3 + dev: true + + /jest-message-util/29.0.3: + resolution: {integrity: sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.0.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.0.3 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + + /jest-mock/29.0.3: + resolution: {integrity: sha512-ort9pYowltbcrCVR43wdlqfAiFJXBx8l4uJDsD8U72LgBcetvEp+Qxj1W9ZYgMRoeAo+ov5cnAGF2B6+Oth+ww==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + dev: true + + /jest-pnp-resolver/1.2.2_jest-resolve@29.0.3: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.0.3 + dev: true + + /jest-regex-util/29.0.0: + resolution: {integrity: sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies/29.0.3: + resolution: {integrity: sha512-KzuBnXqNvbuCdoJpv8EanbIGObk7vUBNt/PwQPPx2aMhlv/jaXpUJsqWYRpP/0a50faMBY7WFFP8S3/CCzwfDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.0.0 + jest-snapshot: 29.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/29.0.3: + resolution: {integrity: sha512-toVkia85Y/BPAjJasTC9zIPY6MmVXQPtrCk8SmiheC4MwVFE/CMFlOtMN6jrwPMC6TtNh8+sTMllasFeu1wMPg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 29.0.3 + jest-pnp-resolver: 1.2.2_jest-resolve@29.0.3 + jest-util: 29.0.3 + jest-validate: 29.0.3 + resolve: 1.22.1 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + + /jest-runner/29.0.3: + resolution: {integrity: sha512-Usu6VlTOZlCZoNuh3b2Tv/yzDpKqtiNAetG9t3kJuHfUyVMNW7ipCCJOUojzKkjPoaN7Bl1f7Buu6PE0sGpQxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.0.3 + '@jest/environment': 29.0.3 + '@jest/test-result': 29.0.3 + '@jest/transform': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + chalk: 4.1.2 + emittery: 0.10.2 + graceful-fs: 4.2.10 + jest-docblock: 29.0.0 + jest-environment-node: 29.0.3 + jest-haste-map: 29.0.3 + jest-leak-detector: 29.0.3 + jest-message-util: 29.0.3 + jest-resolve: 29.0.3 + jest-runtime: 29.0.3 + jest-util: 29.0.3 + jest-watcher: 29.0.3 + jest-worker: 29.0.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime/29.0.3: + resolution: {integrity: sha512-12gZXRQ7ozEeEHKTY45a+YLqzNDR/x4c//X6AqwKwKJPpWM8FY4vwn4VQJOcLRS3Nd1fWwgP7LU4SoynhuUMHQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.0.3 + '@jest/fake-timers': 29.0.3 + '@jest/globals': 29.0.3 + '@jest/source-map': 29.0.0 + '@jest/test-result': 29.0.3 + '@jest/transform': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.0.3 + jest-message-util: 29.0.3 + jest-mock: 29.0.3 + jest-regex-util: 29.0.0 + jest-resolve: 29.0.3 + jest-snapshot: 29.0.3 + jest-util: 29.0.3 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot/29.0.3: + resolution: {integrity: sha512-52q6JChm04U3deq+mkQ7R/7uy7YyfVIrebMi6ZkBoDJ85yEjm/sJwdr1P0LOIEHmpyLlXrxy3QP0Zf5J2kj0ew==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.19.1 + '@babel/generator': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.1 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.1 + '@babel/traverse': 7.19.1 + '@babel/types': 7.19.0 + '@jest/expect-utils': 29.0.3 + '@jest/transform': 29.0.3 + '@jest/types': 29.0.3 + '@types/babel__traverse': 7.18.1 + '@types/prettier': 2.7.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.1 + chalk: 4.1.2 + expect: 29.0.3 + graceful-fs: 4.2.10 + jest-diff: 29.0.3 + jest-get-type: 29.0.0 + jest-haste-map: 29.0.3 + jest-matcher-utils: 29.0.3 + jest-message-util: 29.0.3 + jest-util: 29.0.3 + natural-compare: 1.4.0 + pretty-format: 29.0.3 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/29.0.3: + resolution: {integrity: sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + chalk: 4.1.2 + ci-info: 3.4.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-validate/29.0.3: + resolution: {integrity: sha512-OebiqqT6lK8cbMPtrSoS3aZP4juID762lZvpf1u+smZnwTEBCBInan0GAIIhv36MxGaJvmq5uJm7dl5gVt+Zrw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.0.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.0.0 + leven: 3.1.0 + pretty-format: 29.0.3 + dev: true + + /jest-watcher/29.0.3: + resolution: {integrity: sha512-tQX9lU91A+9tyUQKUMp0Ns8xAcdhC9fo73eqA3LFxP2bSgiF49TNcc+vf3qgGYYK9qRjFpXW9+4RgF/mbxyOOw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.0.3 + '@jest/types': 29.0.3 + '@types/node': 14.18.29 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 29.0.3 + string-length: 4.0.2 + dev: true + + /jest-worker/29.0.3: + resolution: {integrity: sha512-Tl/YWUugQOjoTYwjKdfJWkSOfhufJHO5LhXTSZC3TRoQKO+fuXnZAdoXXBlpLXKGODBL3OvdUasfDD4PcMe6ng==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 14.18.29 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/29.0.3_johvxhudwcpndp4mle25vwrlq4: + resolution: {integrity: sha512-ElgUtJBLgXM1E8L6K1RW1T96R897YY/3lRYqq9uVcPWtP2AAl/nQ16IYDh/FzQOOQ12VEuLdcPU83mbhG2C3PQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.0.3_ts-node@10.9.1 + '@jest/types': 29.0.3 + import-local: 3.1.0 + jest-cli: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonschema/1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /langium-cli/0.4.0: + resolution: {integrity: sha512-4Q5QX7ChLbBRRqZwxdCxvYkKTpzDc1vKx/WdfooCssW2EWKdowRkLsGUXucMPvfegnMKkhchzoElPHQM0LU6RA==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + colors: 1.4.0 + commander: 7.2.0 + fs-extra: 9.1.0 + jsonschema: 1.4.1 + langium: 0.4.0 + lodash: 4.17.21 + dev: true + + /langium/0.4.0: + resolution: {integrity: sha512-VDwbcSdd4Uzektou73gcuqSt1eJcizHWJic7ZGIkTQyBIiRTP66YvMlxLUUE9T9p4/lCZGwf9D8CCBc7RiXZ7A==} + engines: {node: '>=12.0.0'} + dependencies: + chevrotain: 9.1.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.7 + vscode-uri: 3.0.6 + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.truncate/4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /pretty-format/29.0.3: + resolution: {integrity: sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /regexp-to-ast/0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.10.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs/7.5.6: + resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} + dependencies: + tslib: 2.4.0 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote/1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spawn-command/0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /table/6.8.0: + resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.11.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tree-kill/1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-jest/29.0.1_jksntdpmkmo5cthob65gehuuvi: + resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + jest-util: 29.0.3 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.8.3 + yargs-parser: 21.1.1 + dev: true + + /ts-node/10.9.1_ck2axrxkiif44rdbzjywaqjysa: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 14.18.29 + acorn: 8.8.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true + + /tsutils/3.21.0_typescript@4.8.3: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.8.3 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typescript/4.8.3: + resolution: {integrity: sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /update-browserslist-db/1.0.9_browserslist@4.21.4: + resolution: {integrity: sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /uuid/9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul/9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.15 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 + dev: true + + /vscode-jsonrpc/6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + /vscode-languageclient/7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + dependencies: + minimatch: 3.1.2 + semver: 7.3.7 + vscode-languageserver-protocol: 3.16.0 + dev: false + + /vscode-languageserver-protocol/3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + /vscode-languageserver-textdocument/1.0.7: + resolution: {integrity: sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==} + + /vscode-languageserver-types/3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + /vscode-languageserver/7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.16.0 + + /vscode-uri/3.0.6: + resolution: {integrity: sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==} + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs/17.5.1: + resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..18ec407ef --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*'