diff --git a/.gitignore b/.gitignore index c6bba59..5397395 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* -.pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -42,8 +41,8 @@ build/Release node_modules/ jspm_packages/ -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ +# TypeScript v1 declaration files +typings/ # TypeScript cache *.tsbuildinfo @@ -54,9 +53,6 @@ web_modules/ # Optional eslint cache .eslintcache -# Optional stylelint cache -.stylelintcache - # Microbundle cache .rpt2_cache/ .rts2_cache_cjs/ @@ -72,20 +68,16 @@ web_modules/ # Yarn Integrity file .yarn-integrity -# dotenv environment variable files +# dotenv environment variables file .env -.env.development.local -.env.test.local -.env.production.local +.env.test .env.local # parcel-bundler cache (https://parceljs.org/) .cache -.parcel-cache # Next.js build output .next -out # Nuxt.js build / generate output .nuxt @@ -93,20 +85,13 @@ dist # Gatsby files .cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js +# Comment in the public line in if your project uses Gatsby and *not* Next.js # https://nextjs.org/blog/next-9-1#public-directory-support # public # vuepress build output .vuepress/dist -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - # Serverless directories .serverless/ @@ -119,12 +104,41 @@ dist # TernJS port file .tern-port -# Stores VSCode versions used for testing VSCode extensions -.vscode-test +# production +build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel +.swc + +# typescript +*.tsbuildinfo +next-env.d.ts + +cache/ +archives/ +coverages/ + +*.dbg.json +Session.vim +*keypair.json + +#cockroachdb +cockroach-data -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +#custom +archives +example/src/enums.ts \ No newline at end of file diff --git a/docs/transform.md b/docs/transform.md index 95f7a08..f2195f4 100644 --- a/docs/transform.md +++ b/docs/transform.md @@ -266,7 +266,7 @@ export default function generate({ config, schema, cli }: PluginProps) { const lang = config.lang || 'ts'; // 2. Project //find the absolute path from the output config - const destination = Loader.absolute(config.output); + const destination = Loader.absolute(config.output as string); //output directory from the destination const dirname = path.dirname(destination); //file name from the destination @@ -313,7 +313,7 @@ export default function generate({ config, schema, cli }: PluginProps) { //get enum const enums = schema.enum as Record; //get all the possible enum members ("ADMIN", "MANAGER", "USER") - const members = Object.keys(enum[name]); + const members = Object.keys(enums[name]); //add enum using ts-morph source.addEnum({ name: name, diff --git a/example/my.idea b/example/my.idea new file mode 100644 index 0000000..796d8a7 --- /dev/null +++ b/example/my.idea @@ -0,0 +1,54 @@ +plugin "./dist/make-enums" { + ts true + output "./src/enums.ts" +} + +enum Roles { + ADMIN "ADMIN" + MANAGER "MANAGER" + USER "USER" +} + +prop RoleProps { + options [ + { label "Admin" value "ADMIN" } + { label "Manager" value "MANAGER" } + { label "User" value "USER" } + ] +} + +type Address @label("Address" "Addresses") { + street String @field.text @list.hide + city String? @field.text + country String @field.country @list.uppercase @view.uppercase + postal String @field.text +} + +model User @label("User" "Users") { + id String @label("ID") @db.char(21) @id @default("cuid()") + username String @label("Username") @db.varchar(255) @unique @searchable @field.text + companyId String? @label("Company") @db.char(21) @relation("Company" "id" "name") @field.modelcomplete("Company" "id" "name") + name String @label("Name") @db.varchar(255) @searchable @field.text + role Roles @label("Role") @db.varchar(255) @default("USER") @filterable @field.select(RoleProps) @list.lowercase @view.lowercase + active Boolean @label("Active") @default(true) @filterable @field.switch @list.yesno @view.yesno + lastLogin Datetime @label("Last Login") @default("now()") @list.date + created Datetime @label("Created") @default("now()") @filterable @sortable @list.date + updated Datetime @label("Updated") @default("now()") @updated @filterable @sortable @list.date +} + +model Company @label("Company" "Companies") { + id String @label("ID") @db.char(21) @id @default("cuid()") + name String @label("Name") @db.varchar(255) @unique @searchable @field.text + country String @label("Country") @db.char(2) @filterable @field.country + address Address @label("Address") @field.fieldset("Address" false) @list.hide @view.table + contact String? @label("Contact") @db.varchar(255) @field.text + email String? @label("Email") @db.varchar(255) @field.email @list.email @view.email + phone String? @label("Phone") @db.varchar(255) @field.phone @list.phone @view.phone + files String[] @label("Files") @field.filelist @list.hide @view.line + references Hash? @label("References") @field.metadata @list.hide @view.metadata + supplier Boolean @label("Supplier") @default(false) @field.switch @list.yesno @view.yesno + approved Boolean @label("Approved") @default(false) @field.switch @list.yesno @view.yesno + active Boolean @label("Active") @default(true) @filterable @field.switch @list.yesno @view.yesno + created Datetime @label("Created") @default("now()") @filterable @sortable @list.date + updated Datetime @label("Updated") @default("now()") @updated @filterable @sortable @list.date +} \ No newline at end of file diff --git a/example/package.json b/example/package.json new file mode 100644 index 0000000..b0f3db0 --- /dev/null +++ b/example/package.json @@ -0,0 +1,16 @@ +{ + "name": "idea-with-node", + "version": "0.1.0", + "private": true, + "scripts": { + "transform": "idea", + "build": "tsc" + }, + "devDependencies": { + "@types/node": "20.2.5", + "@ossph/idea": "0.1.0", + "ts-morph": "22.0.0", + "ts-node": "10.9.1", + "typescript": "5.0.4" + } +} diff --git a/example/src/make-enums.ts b/example/src/make-enums.ts new file mode 100644 index 0000000..457687d --- /dev/null +++ b/example/src/make-enums.ts @@ -0,0 +1,86 @@ +import type { PluginProps, EnumConfig } from '@ossph/idea'; + +import path from 'path'; +import { Project, IndentationText } from 'ts-morph'; +import { Loader } from '@ossph/idea'; + +export default function generate({ config, schema, cli }: PluginProps) { + // 1. Config + //we need to know where to put this code... + if (!config.output) { + return cli.terminal.error('No output directory specified'); + } + //code in typescript or javascript? + const lang = config.lang || 'ts'; + // 2. Project + //find the absolute path from the output config + const destination = Loader.absolute(config.output as string); + //output directory from the destination + const dirname = path.dirname(destination); + //file name from the destination + const filename = path.basename(destination); + //start a ts-morph project + const project = new Project({ + tsConfigFilePath: path.resolve(__dirname, '../tsconfig.json'), + skipAddingFilesFromTsConfig: true, + compilerOptions: { + outDir: dirname, + // Generates corresponding '.d.ts' file. + declaration: true, + // Generates a sourcemap for each corresponding '.d.ts' file. + declarationMap: true, + // Generates corresponding '.map' file. + sourceMap: true, + }, + manipulationSettings: { + indentationText: IndentationText.TwoSpaces + } + }); + //create the directory if it does not exist + const directory = project.createDirectory(dirname); + //create a source file to manually populate later... + const source = directory.createSourceFile(filename, '', { overwrite: true }); + // 3. Enum + //if there are enums... + if (typeof schema.enum === 'object') { + // Enums in schema object will look like this... + // { + // "plugin": { ... }, + // "enum": { + // "Roles": { + // "ADMIN": "Admin", + // "MANAGER": "Manager", + // "USER": "User" + // } + // }, + // "type": { ... }, + // "model": { ... } + // } + //loop through enums + for (const name in schema.enum) { + //get enum + const enums = schema.enum as Record; + //get all the possible enum members ("ADMIN", "MANAGER", "USER") + const members = Object.keys(enums[name]); + //add enum using ts-morph + source.addEnum({ + name: name, + isExported: true, + // { name: "ADMIN", value: "Admin" } + members: members.map(key => ({ + name: key, + value: enums[name][key] as string + })) + }); + } + } + // 4. Save + source.formatText(); + //if you want ts, tsx files + if (lang == 'ts') { + project.saveSync(); + //if you want js, d.ts files + } else { + project.emit(); + } +}; \ No newline at end of file diff --git a/example/tsconfig.json b/example/tsconfig.json new file mode 100644 index 0000000..29034a6 --- /dev/null +++ b/example/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ "es2021", "es7", "es6", "dom" ], + "module": "commonjs", + "noUnusedLocals": true, + "outDir": "./dist/", + "preserveConstEnums": true, + "resolveJsonModule": true, + "removeComments": true, + "sourceMap": false, + "strict": true, + "target": "es6", + "skipLibCheck": true + }, + "include": [ "src/**/*.ts" ], + "exclude": [ "dist", "docs", "node_modules", "test"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..98a4d45 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "private": true, + "workspaces": [ + "packages/*", + "example" + ], + "scripts": { + "build": "yarn build:parser && yarn build:transformer && yarn build:idea && yarn build:example", + "build:parser": "yarn --cwd packages/idea-parser build", + "build:language": "yarn --cwd packages/idea-language build", + "build:transformer": "yarn --cwd packages/idea-transformer build", + "build:idea": "yarn --cwd packages/idea build", + "build:example": "yarn --cwd example build", + "transform": "yarn --cwd example transform -i ./my.idea", + "test": "yarn --cwd packages/idea-parser test" + }, + "devDependencies": { + "concurrently": "7.6.0" + } +} \ No newline at end of file diff --git a/packages/idea-language/.eslintignore b/packages/idea-language/.eslintignore new file mode 100644 index 0000000..63239ea --- /dev/null +++ b/packages/idea-language/.eslintignore @@ -0,0 +1,5 @@ +node_modules/** +client/node_modules/** +client/out/** +server/node_modules/** +server/out/** \ No newline at end of file diff --git a/packages/idea-language/.eslintrc.js b/packages/idea-language/.eslintrc.js new file mode 100644 index 0000000..912f1f3 --- /dev/null +++ b/packages/idea-language/.eslintrc.js @@ -0,0 +1,22 @@ +/**@type {import('eslint').Linter.Config} */ +// eslint-disable-next-line no-undef +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + 'semi': [2, "always"], + 'no-useless-escape': 0, + '@typescript-eslint/no-extra-semi': 0, + '@typescript-eslint/no-unused-vars': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/no-non-null-assertion': 0, + } +}; \ No newline at end of file diff --git a/packages/idea-language/.gitignore b/packages/idea-language/.gitignore new file mode 100644 index 0000000..5ecce56 --- /dev/null +++ b/packages/idea-language/.gitignore @@ -0,0 +1,5 @@ +out +node_modules +client/server +.vscode-test +archives \ No newline at end of file diff --git a/packages/idea-language/.vscode/extensions.json b/packages/idea-language/.vscode/extensions.json new file mode 100644 index 0000000..af51550 --- /dev/null +++ b/packages/idea-language/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // 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": [ + "dbaeumer.vscode-eslint" + ] +} \ No newline at end of file diff --git a/packages/idea-language/.vscode/launch.json b/packages/idea-language/.vscode/launch.json new file mode 100644 index 0000000..db5cb2c --- /dev/null +++ b/packages/idea-language/.vscode/launch.json @@ -0,0 +1,30 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +{ + "version": "0.2.0", + "configurations": [ + { + "type": "extensionHost", + "request": "launch", + "name": "Launch Client", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}"], + "outFiles": ["${workspaceRoot}/client/out/**/*.js"], + "preLaunchTask": { + "type": "npm", + "script": "watch" + } + }, + { + "name": "Language Server E2E Test", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}", + "--extensionTestsPath=${workspaceRoot}/client/out/test/index", + "${workspaceRoot}/client/testFixture" + ], + "outFiles": ["${workspaceRoot}/client/out/test/**/*.js"] + } + ] +} \ No newline at end of file diff --git a/packages/idea-language/.vscode/settings.json b/packages/idea-language/.vscode/settings.json new file mode 100644 index 0000000..eb71540 --- /dev/null +++ b/packages/idea-language/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.insertSpaces": false, + "typescript.tsc.autoDetect": "off", + "typescript.preferences.quoteStyle": "single", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } +} \ No newline at end of file diff --git a/packages/idea-language/.vscode/tasks.json b/packages/idea-language/.vscode/tasks.json new file mode 100644 index 0000000..5efd804 --- /dev/null +++ b/packages/idea-language/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "compile", + "group": "build", + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc" + ] + }, + { + "type": "npm", + "script": "watch", + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc-watch" + ] + } + ] +} \ No newline at end of file diff --git a/packages/idea-language/.vscodeignore b/packages/idea-language/.vscodeignore new file mode 100644 index 0000000..2c0c790 --- /dev/null +++ b/packages/idea-language/.vscodeignore @@ -0,0 +1,16 @@ +.vscode/** +**/*.ts +**/*.map +.gitignore +**/tsconfig.json +**/tsconfig.base.json +contributing.md +.travis.yml +client/node_modules/** +!client/node_modules/vscode-jsonrpc/** +!client/node_modules/vscode-languageclient/** +!client/node_modules/vscode-languageserver-protocol/** +!client/node_modules/vscode-languageserver-types/** +!client/node_modules/{minimatch,brace-expansion,concat-map,balanced-match}/** +!client/node_modules/{semver,lru-cache,yallist}/** +archives diff --git a/packages/idea-language/LICENSE b/packages/idea-language/LICENSE new file mode 100644 index 0000000..b396d80 --- /dev/null +++ b/packages/idea-language/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Open Source Software PH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/idea-language/README.md b/packages/idea-language/README.md new file mode 100644 index 0000000..e06399b --- /dev/null +++ b/packages/idea-language/README.md @@ -0,0 +1,6 @@ +# Idea Language Server + +Adds syntax highlighting, formatting, auto-completion, jump-to-definition +and linting for idea files. + +See [https://github.com/OSSPhilippines/idea](https://github.com/OSSPhilippines/idea) for more info \ No newline at end of file diff --git a/packages/idea-language/client/package-lock.json b/packages/idea-language/client/package-lock.json new file mode 100644 index 0000000..6914a39 --- /dev/null +++ b/packages/idea-language/client/package-lock.json @@ -0,0 +1,546 @@ +{ + "name": "idea-language-client", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "idea-language-client", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "vscode-languageclient": "8.1.0" + }, + "devDependencies": { + "@types/vscode": "^1.75.1", + "@vscode/test-electron": "2.3.4" + }, + "engines": { + "vscode": "^1.75.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/vscode": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", + "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", + "dev": true + }, + "node_modules/@vscode/test-electron": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.4.tgz", + "integrity": "sha512-eWzIqXMhvlcoXfEFNWrVu/yYT5w6De+WZXR/bafUQhAp8+8GkQo95Oe14phwiRUPv8L+geAKl/QM2+PoT3YW3g==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vscode-jsonrpc": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "engines": { + "vscode": "^1.67.0" + } + }, + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "dependencies": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/vscode": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", + "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", + "dev": true + }, + "@vscode/test-electron": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.4.tgz", + "integrity": "sha512-eWzIqXMhvlcoXfEFNWrVu/yYT5w6De+WZXR/bafUQhAp8+8GkQo95Oe14phwiRUPv8L+geAKl/QM2+PoT3YW3g==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vscode-jsonrpc": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" + }, + "vscode-languageclient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "requires": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "requires": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/packages/idea-language/client/package.json b/packages/idea-language/client/package.json new file mode 100644 index 0000000..9107c48 --- /dev/null +++ b/packages/idea-language/client/package.json @@ -0,0 +1,22 @@ +{ + "name": "idea-language-client", + "description": "Implementation of idea language server in node.", + "author": "Chris ", + "license": "MIT", + "version": "0.1.0", + "publisher": "ossph", + "repository": { + "type": "git", + "url": "https://github.com/OSSPhilippines/idea" + }, + "engines": { + "vscode": "^1.75.0" + }, + "dependencies": { + "vscode-languageclient": "8.1.0" + }, + "devDependencies": { + "@types/vscode": "^1.75.1", + "@vscode/test-electron": "2.3.4" + } +} \ No newline at end of file diff --git a/packages/idea-language/client/src/extension.ts b/packages/idea-language/client/src/extension.ts new file mode 100644 index 0000000..7f253e3 --- /dev/null +++ b/packages/idea-language/client/src/extension.ts @@ -0,0 +1,61 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as path from 'path'; +import { workspace, ExtensionContext } from 'vscode'; + +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind +} from 'vscode-languageclient/node'; + +let client: LanguageClient; + +export function activate(context: ExtensionContext) { + // The server is implemented in node + const serverModule = context.asAbsolutePath( + path.join('server', 'out', 'server.js') + ); + + // 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 to control the language client + const clientOptions: LanguageClientOptions = { + // Register the server for plain text documents + documentSelector: [{ scheme: 'file', language: 'incept' }], + synchronize: { + // Notify the server about file changes to '.clientrc files contained in the workspace + fileEvents: workspace.createFileSystemWatcher('**/.clientrc') + } + }; + + // Create the language client and start the client. + client = new LanguageClient( + 'inceptLanguageServer', + 'Incept Language Server', + serverOptions, + clientOptions + ); + + // Start the client. This will also launch the server + client.start(); +} + +export function deactivate(): Thenable | undefined { + if (!client) { + return undefined; + } + return client.stop(); +} \ No newline at end of file diff --git a/packages/idea-language/client/src/test/completion.test.ts b/packages/idea-language/client/src/test/completion.test.ts new file mode 100644 index 0000000..c1d3ced --- /dev/null +++ b/packages/idea-language/client/src/test/completion.test.ts @@ -0,0 +1,43 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as vscode from 'vscode'; +import * as assert from 'assert'; +import { getDocUri, activate } from './helper'; + +suite('Should do completion', () => { + const docUri = getDocUri('completion.txt'); + + test('Completes JS/TS in txt file', async () => { + await testCompletion(docUri, new vscode.Position(0, 0), { + items: [ + { label: 'JavaScript', kind: vscode.CompletionItemKind.Text }, + { label: 'TypeScript', kind: vscode.CompletionItemKind.Text } + ] + }); + }); +}); + +async function testCompletion( + docUri: vscode.Uri, + position: vscode.Position, + expectedCompletionList: vscode.CompletionList +) { + await activate(docUri); + + // Executing the command `vscode.executeCompletionItemProvider` to simulate triggering completion + const actualCompletionList = (await vscode.commands.executeCommand( + 'vscode.executeCompletionItemProvider', + docUri, + position + )) as vscode.CompletionList; + + assert.ok(actualCompletionList.items.length >= 2); + expectedCompletionList.items.forEach((expectedItem, i) => { + const actualItem = actualCompletionList.items[i]; + assert.equal(actualItem.label, expectedItem.label); + assert.equal(actualItem.kind, expectedItem.kind); + }); +} \ No newline at end of file diff --git a/packages/idea-language/client/src/test/diagnostics.test.ts b/packages/idea-language/client/src/test/diagnostics.test.ts new file mode 100644 index 0000000..1aa8a36 --- /dev/null +++ b/packages/idea-language/client/src/test/diagnostics.test.ts @@ -0,0 +1,41 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as vscode from 'vscode'; +import * as assert from 'assert'; +import { getDocUri, activate } from './helper'; + +suite('Should get diagnostics', () => { + const docUri = getDocUri('diagnostics.txt'); + + test('Diagnoses uppercase texts', async () => { + await testDiagnostics(docUri, [ + { message: 'ANY is all uppercase.', range: toRange(0, 0, 0, 3), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, + { message: 'ANY is all uppercase.', range: toRange(0, 14, 0, 17), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, + { message: 'OS is all uppercase.', range: toRange(0, 18, 0, 20), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' } + ]); + }); +}); + +function toRange(sLine: number, sChar: number, eLine: number, eChar: number) { + const start = new vscode.Position(sLine, sChar); + const end = new vscode.Position(eLine, eChar); + return new vscode.Range(start, end); +} + +async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.Diagnostic[]) { + await activate(docUri); + + const actualDiagnostics = vscode.languages.getDiagnostics(docUri); + + assert.equal(actualDiagnostics.length, expectedDiagnostics.length); + + expectedDiagnostics.forEach((expectedDiagnostic, i) => { + const actualDiagnostic = actualDiagnostics[i]; + assert.equal(actualDiagnostic.message, expectedDiagnostic.message); + assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range); + assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity); + }); +} \ No newline at end of file diff --git a/packages/idea-language/client/src/test/helper.ts b/packages/idea-language/client/src/test/helper.ts new file mode 100644 index 0000000..87f0995 --- /dev/null +++ b/packages/idea-language/client/src/test/helper.ts @@ -0,0 +1,47 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as vscode from 'vscode'; +import * as path from 'path'; + +export let doc: vscode.TextDocument; +export let editor: vscode.TextEditor; +export let documentEol: string; +export let platformEol: string; + +/** + * Activates the vscode.lsp-sample extension + */ +export async function activate(docUri: vscode.Uri) { + // The extensionId is `publisher.name` from package.json + const ext = vscode.extensions.getExtension('vscode-samples.lsp-sample')!; + await ext.activate(); + try { + doc = await vscode.workspace.openTextDocument(docUri); + editor = await vscode.window.showTextDocument(doc); + await sleep(2000); // Wait for server activation + } catch (e) { + console.error(e); + } +} + +async function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export const getDocPath = (p: string) => { + return path.resolve(__dirname, '../../testFixture', p); +}; +export const getDocUri = (p: string) => { + return vscode.Uri.file(getDocPath(p)); +}; + +export async function setTestContent(content: string): Promise { + const all = new vscode.Range( + doc.positionAt(0), + doc.positionAt(doc.getText().length) + ); + return editor.edit(eb => eb.replace(all, content)); +} \ No newline at end of file diff --git a/packages/idea-language/client/src/test/index.ts b/packages/idea-language/client/src/test/index.ts new file mode 100644 index 0000000..b9de4dc --- /dev/null +++ b/packages/idea-language/client/src/test/index.ts @@ -0,0 +1,43 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + mocha.timeout(100000); + + const testsRoot = __dirname; + + return new Promise((resolve, reject) => { + glob('**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return reject(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); + } catch (err) { + console.error(err); + reject(err); + } + }); + }); +} \ No newline at end of file diff --git a/packages/idea-language/client/src/test/runTest.ts b/packages/idea-language/client/src/test/runTest.ts new file mode 100644 index 0000000..9d8189a --- /dev/null +++ b/packages/idea-language/client/src/test/runTest.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as path from 'path'; + +import { runTests } from '@vscode/test-electron'; + +async function main() { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../../'); + + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './index'); + + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } +} + +main(); diff --git a/packages/idea-language/client/testFixture/completion.txt b/packages/idea-language/client/testFixture/completion.txt new file mode 100644 index 0000000..e69de29 diff --git a/packages/idea-language/client/testFixture/diagnostics.txt b/packages/idea-language/client/testFixture/diagnostics.txt new file mode 100644 index 0000000..d910cfb --- /dev/null +++ b/packages/idea-language/client/testFixture/diagnostics.txt @@ -0,0 +1 @@ +ANY browsers, ANY OS. \ No newline at end of file diff --git a/packages/idea-language/client/tsconfig.json b/packages/idea-language/client/tsconfig.json new file mode 100644 index 0000000..bc08aa2 --- /dev/null +++ b/packages/idea-language/client/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": ["es2020"], + "outDir": "out", + "rootDir": "src", + "sourceMap": true + }, + "include": ["src"], + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/packages/idea-language/config/schema.grammar.json b/packages/idea-language/config/schema.grammar.json new file mode 100644 index 0000000..48ff139 --- /dev/null +++ b/packages/idea-language/config/schema.grammar.json @@ -0,0 +1,308 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "Idea", + "scopeName": "source.idea", + "fileTypes": [ "idea" ], + "patterns": [ + { + "include": "#block_plugin" + }, + { + "include": "#block_enum" + }, + { + "include": "#block_prop" + }, + { + "include": "#block_type" + }, + { + "include": "#block_model" + }, + { + "include": "#comment" + }, + { + "include": "#attribute" + }, + { + "include": "#attribute_function" + }, + { + "include": "#null" + }, + { + "include": "#boolean" + }, + { + "include": "#number" + }, + { + "include": "#string" + }, + { + "include": "#type" + } + ], + "repository": { + "punctuation": { + "patterns": [ + { + "name": "punctuation.definition.idea", + "match": "[\\{\\}\\[\\]\\(\\)]" + } + ] + }, + "comment": { + "begin": "//", + "end": "$\\n?", + "name": "comment.idea" + }, + "null": { + "match": "\\bnull\\b", + "name": "constant.language.null.idea" + }, + "boolean": { + "match": "\\b(true|false)\\b", + "name": "constant.language.boolean.idea" + }, + "number": { + "match": "((0(x|X)[0-9a-fA-F]*)|(\\+|-)?\\b(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDdg]|UL|ul)?\\b", + "name": "constant.numeric.idea" + }, + "string": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "string.quoted.double.start.idea" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "string.quoted.double.end.idea" + } + }, + "patterns": [ + { + "match": "([\\w\\-\\/\\._\\\\%@:\\?=]+)", + "name": "string.quoted.double.idea" + } + ], + "name": "unnamed" + }, + "type": { + "patterns": [ + { + "match": "\\b([A-Z][a-zA-Z0-9_]*)\\b", + "name": "entity.name.type.keyword.idea" + } + ] + }, + "functional": { + "name": "source.idea.functional", + "begin": "(\\w+)(\\()", + "beginCaptures": { + "1": { + "name": "support.function.functional.idea" + }, + "2": { + "name": "punctuation.definition.idea" + } + }, + "patterns": [ + { + "include": "#array" + }, + { + "include": "#object" + }, + { + "include": "#functional" + }, + { + "include": "#null" + }, + { + "include": "#boolean" + }, + { + "include": "#number" + }, + { + "include": "#string" + }, + { + "include": "#type" + } + ], + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.idea" + } + } + }, + "array": { + "name": "source.idea.array", + "begin": "\\[", + "beginCaptures": { + "1": { + "name": "punctuation.definition.idea" + } + }, + "patterns": [ + { + "include": "#value" + } + ], + "end": "\\]", + "endCaptures": { + "1": { + "name": "punctuation.definition.idea" + } + } + }, + "object": { + "name": "source.idea.object", + "begin": "\\{", + "beginCaptures": { + "1": { + "name": "punctuation.definition.idea" + } + }, + "patterns": [ + { + "include": "#value" + } + ], + "end": "\\}", + "endCaptures": { + "1": { + "name": "punctuation.definition.idea" + } + } + }, + "value": { + "name": "source.idea.value", + "patterns": [ + { + "include": "#array" + }, + { + "include": "#object" + }, + { + "include": "#functional" + }, + { + "include": "#null" + }, + { + "include": "#boolean" + }, + { + "include": "#number" + }, + { + "include": "#string" + }, + { + "include": "#type" + } + ] + }, + "attribute_function": { + "name": "source.idea.attribute.with_arguments", + "begin": "(@@?[\\w\\.]+)(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.attribute.idea" + }, + "2": { + "name": "punctuation.definition.idea" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.idea" + } + } + }, + "attribute": { + "name": "source.idea.attribute", + "match": "(@@?[\\w\\.]+)", + "captures": { + "1": { + "name": "entity.name.function.attribute.idea" + } + } + }, + "block_plugin": { + "name": "source.idea.embedded.source", + "begin": "^\\s*(plugin)\\s+(\"[^\"]*\")", + "beginCaptures": { + "1": { + "name": "storage.type.plugin.idea" + }, + "2": { + "name": "string.quoted.double.name.plugin.idea" + } + }, + "end": "\\s+" + }, + "block_enum": { + "name": "source.idea.embedded.source", + "begin": "^\\s*(enum)\\s+([A-Za-z][\\w]*)", + "beginCaptures": { + "1": { + "name": "storage.type.keyword.idea" + }, + "2": { + "name": "entity.name.type.keyword.idea" + } + }, + "end": "\\s+" + }, + "block_prop": { + "name": "source.idea.embedded.source", + "begin": "^\\s*(prop)\\s+([A-Za-z][\\w]*)", + "beginCaptures": { + "1": { + "name": "storage.type.keyword.idea" + }, + "2": { + "name": "entity.name.type.keyword.idea" + } + }, + "end": "\\s+" + }, + "block_type": { + "name": "source.idea.embedded.source", + "begin": "^\\s*(type)\\s+([A-Za-z][\\w]*)", + "beginCaptures": { + "1": { + "name": "storage.type.keyword.idea" + }, + "2": { + "name": "entity.name.type.keyword.idea" + } + }, + "end": "\\s+" + }, + "block_model": { + "name": "source.idea.embedded.source", + "begin": "^\\s*(model)\\s+([A-Za-z][\\w]*)", + "beginCaptures": { + "1": { + "name": "storage.type.keyword.idea" + }, + "2": { + "name": "entity.name.type.keyword.idea" + } + }, + "end": "\\s+" + } + } +} diff --git a/packages/idea-language/config/schema.language.json b/packages/idea-language/config/schema.language.json new file mode 100644 index 0000000..36d334f --- /dev/null +++ b/packages/idea-language/config/schema.language.json @@ -0,0 +1,30 @@ +{ + "fileTypes": ["idea"], + "comments": { + "lineComment": "//" + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""] + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""] + ], + "wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\#\\%\\^\\&\\*\\-\\=\\+\\{\\}\\(\\)\\[\\]\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\s]+)", + "folding": { + "markers": { + "start": "^\\s*//\\s*#?region\\b", + "end": "^\\s*//\\s*#?endregion\\b" + } + } +} \ No newline at end of file diff --git a/packages/idea-language/config/template.grammar.json b/packages/idea-language/config/template.grammar.json new file mode 100644 index 0000000..e69de29 diff --git a/packages/idea-language/config/template.language.json b/packages/idea-language/config/template.language.json new file mode 100644 index 0000000..e69de29 diff --git a/packages/idea-language/idea.png b/packages/idea-language/idea.png new file mode 100644 index 0000000..58b4538 Binary files /dev/null and b/packages/idea-language/idea.png differ diff --git a/packages/idea-language/idea.svg b/packages/idea-language/idea.svg new file mode 100644 index 0000000..79b86bd --- /dev/null +++ b/packages/idea-language/idea.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/idea-language/package-lock.json b/packages/idea-language/package-lock.json new file mode 100644 index 0000000..c2f558a --- /dev/null +++ b/packages/idea-language/package-lock.json @@ -0,0 +1,3079 @@ +{ + "name": "idea-langugage", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "idea-langugage", + "version": "0.1.0", + "hasInstallScript": true, + "license": "MIT", + "devDependencies": { + "@types/mocha": "^9.1.0", + "@types/node": "^16.18.34", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "eslint": "^8.35.0", + "mocha": "^9.2.1", + "typescript": "^5.1.3" + }, + "engines": { + "vscode": "^1.75.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.46.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "16.18.39", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.10.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "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" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.1", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.46.0", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "dev": true + }, + "@types/mocha": { + "version": "9.1.1", + "dev": true + }, + "@types/node": { + "version": "16.18.39", + "dev": true + }, + "@types/semver": { + "version": "7.5.0", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "7.0.4", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "dev": true + }, + "diff": { + "version": "5.0.0", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "eslint": { + "version": "8.46.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-scope": { + "version": "7.2.2", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.2", + "dev": true + }, + "espree": { + "version": "9.6.1", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "glob": { + "version": "7.2.0", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.20.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graphemer": { + "version": "1.4.0", + "dev": true + }, + "growl": { + "version": "1.10.5", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "he": { + "version": "1.2.0", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "9.2.2", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "dev": true + } + } + }, + "minimatch": { + "version": "4.2.1", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "nanoid": { + "version": "3.3.1", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "once": { + "version": "1.4.0", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "semver": { + "version": "7.5.4", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + }, + "typescript": { + "version": "5.1.6", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "workerpool": { + "version": "6.2.0", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.9", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "dev": true + } + } +} diff --git a/packages/idea-language/package.json b/packages/idea-language/package.json new file mode 100644 index 0000000..ef64bb2 --- /dev/null +++ b/packages/idea-language/package.json @@ -0,0 +1,88 @@ +{ + "name": "@ossph/idea-langugage", + "displayName": "Idea", + "description": "Adds syntax highlighting, formatting, auto-completion, jump-to-definition and linting for .idea files.", + "version": "0.1.0", + "license": "MIT", + "icon": "idea.png", + "repository": { + "type": "git", + "url": "https://github.com/OSSPhilippines/idea" + }, + "publisher": "ossph", + "categories": [ + "Programming Languages" + ], + "keywords": [ + "multi-root ready" + ], + "engines": { + "vscode": "^1.75.0" + }, + "main": "./client/out/extension.js", + "activationEvents": [], + "contributes": { + "configuration": { + "type": "object", + "title": "Basic configuration", + "properties": { + "languageServerExample.maxNumberOfProblems": { + "scope": "resource", + "type": "number", + "default": 100, + "description": "Controls the maximum number of problems produced by the server." + }, + "languageServerExample.trace.server": { + "scope": "window", + "type": "string", + "enum": [ + "off", + "messages", + "verbose" + ], + "default": "off", + "description": "Traces the communication between VS Code and the language server." + } + } + }, + "languages": [ + { + "id": "idea", + "aliases": [ "Idea", "idea" ], + "icon": { + "light": "./idea.svg", + "dark": "./idea.svg" + }, + "extensions": [ ".idea" ], + "configuration": "./config/schema.language.json" + } + ], + "grammars": [ + { + "language": "idea", + "scopeName": "source.idea", + "path": "./config/schema.grammar.json" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -b", + "watch": "tsc -b -w", + "lint": "eslint ./client/src ./server/src --ext .ts,.tsx", + "postinstall": "cd client && npm install && cd ../server && npm install && cd ..", + "test": "sh ./scripts/e2e.sh" + }, + "dependencies": { + "@ossph/idea-parser": "0.1.0" + }, + "devDependencies": { + "@types/mocha": "^9.1.0", + "@types/node": "^16.18.34", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "eslint": "^8.35.0", + "mocha": "^9.2.1", + "typescript": "^5.1.3" + } +} \ No newline at end of file diff --git a/packages/idea-language/scripts/e2e.sh b/packages/idea-language/scripts/e2e.sh new file mode 100755 index 0000000..860c62e --- /dev/null +++ b/packages/idea-language/scripts/e2e.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +export CODE_TESTS_PATH="$(pwd)/client/out/test" +export CODE_TESTS_WORKSPACE="$(pwd)/client/testFixture" + +node "$(pwd)/client/out/test/runTest" \ No newline at end of file diff --git a/packages/idea-language/server/package-lock.json b/packages/idea-language/server/package-lock.json new file mode 100644 index 0000000..095cad4 --- /dev/null +++ b/packages/idea-language/server/package-lock.json @@ -0,0 +1,92 @@ +{ + "name": "idea-language-server", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "idea-language-server", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "vscode-languageserver": "8.1.0", + "vscode-languageserver-textdocument": "1.0.8" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", + "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.3" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "dependencies": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + } + }, + "dependencies": { + "vscode-jsonrpc": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" + }, + "vscode-languageserver": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", + "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "requires": { + "vscode-languageserver-protocol": "3.17.3" + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "requires": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, + "vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + } + } +} diff --git a/packages/idea-language/server/package.json b/packages/idea-language/server/package.json new file mode 100644 index 0000000..ff887fb --- /dev/null +++ b/packages/idea-language/server/package.json @@ -0,0 +1,19 @@ +{ + "name": "idea-language-server", + "description": "Implementation of idea language server in node.", + "version": "0.1.0", + "author": "Chris ", + "license": "MIT", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/OSSPhilippines/idea" + }, + "dependencies": { + "@ossph/idea-parser": "0.1.0", + "vscode-languageserver": "8.1.0", + "vscode-languageserver-textdocument": "1.0.8" + } +} diff --git a/packages/idea-language/server/src/server.ts b/packages/idea-language/server/src/server.ts new file mode 100644 index 0000000..9bba3a7 --- /dev/null +++ b/packages/idea-language/server/src/server.ts @@ -0,0 +1,212 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +import { + createConnection, + TextDocuments, + Diagnostic, + DiagnosticSeverity, + ProposedFeatures, + InitializeParams, + DidChangeConfigurationNotification, + CompletionItem, + CompletionItemKind, + TextDocumentPositionParams, + TextDocumentSyncKind, + InitializeResult +} from 'vscode-languageserver/node'; + +import { + TextDocument +} from 'vscode-languageserver-textdocument'; + +import { Exception, parse } from '@ossph/idea-parser'; + +// Create a connection for the server, using Node's IPC as a transport. +// Also include all preview / proposed LSP features. +const connection = createConnection(ProposedFeatures.all); + +// Create a simple text document manager. +const documents: TextDocuments = new TextDocuments(TextDocument); + +let hasConfigurationCapability = false; +let hasWorkspaceFolderCapability = false; +let hasDiagnosticRelatedInformationCapability = false; + +connection.onInitialize((params: InitializeParams) => { + const capabilities = params.capabilities; + + // Does the client support the `workspace/configuration` request? + // If not, we fall back using global settings. + hasConfigurationCapability = !!( + capabilities.workspace && !!capabilities.workspace.configuration + ); + hasWorkspaceFolderCapability = !!( + capabilities.workspace && !!capabilities.workspace.workspaceFolders + ); + hasDiagnosticRelatedInformationCapability = !!( + capabilities.textDocument && + capabilities.textDocument.publishDiagnostics && + capabilities.textDocument.publishDiagnostics.relatedInformation + ); + + const result: InitializeResult = { + capabilities: { + textDocumentSync: TextDocumentSyncKind.Incremental, + // Tell the client that this server supports code completion. + completionProvider: { + resolveProvider: true + } + } + }; + if (hasWorkspaceFolderCapability) { + result.capabilities.workspace = { + workspaceFolders: { + supported: true + } + }; + } + return result; +}); + +connection.onInitialized(() => { + if (hasConfigurationCapability) { + // Register for all configuration changes. + connection.client.register(DidChangeConfigurationNotification.type, undefined); + } + if (hasWorkspaceFolderCapability) { + connection.workspace.onDidChangeWorkspaceFolders(_event => { + connection.console.log('Workspace folder change event received.'); + }); + } +}); + +// The example settings +interface ExampleSettings { + maxNumberOfProblems: number; +} + +// The global settings, used when the `workspace/configuration` request is not supported by the client. +// Please note that this is not the case when using this server with the client provided in this example +// but could happen with other clients. +const defaultSettings: ExampleSettings = { maxNumberOfProblems: 1000 }; +let globalSettings: ExampleSettings = defaultSettings; + +// Cache the settings of all open documents +const documentSettings: Map> = new Map(); + +connection.onDidChangeConfiguration(change => { + if (hasConfigurationCapability) { + // Reset all cached document settings + documentSettings.clear(); + } else { + globalSettings = ( + (change.settings.languageServerExample || defaultSettings) + ); + } + + // Revalidate all open text documents + documents.all().forEach(validateTextDocument); +}); + +function getDocumentSettings(resource: string): Thenable { + if (!hasConfigurationCapability) { + return Promise.resolve(globalSettings); + } + let result = documentSettings.get(resource); + if (!result) { + result = connection.workspace.getConfiguration({ + scopeUri: resource, + section: 'languageServerExample' + }); + documentSettings.set(resource, result); + } + return result; +} + +// Only keep settings for open documents +documents.onDidClose(e => { + documentSettings.delete(e.document.uri); +}); + +// The content of a text document has changed. This event is emitted +// when the text document first opened or when its content has changed. +documents.onDidChangeContent(change => { + validateTextDocument(change.document); +}); + +async function validateTextDocument(textDocument: TextDocument): Promise { + // In this simple example we get the settings for every validate run. + const settings = await getDocumentSettings(textDocument.uri); + + // The validator creates diagnostics for all uppercase words length 2 and more + const text = textDocument.getText(); + + const diagnostics: Diagnostic[] = []; + try { + parse(text); + } catch (e) { + const error = e as Exception; + const diagnostic: Diagnostic = { + severity: DiagnosticSeverity.Error, + message: error.message, + range: { + start: textDocument.positionAt(error.start), + end: textDocument.positionAt(error.end) + } + }; + diagnostics.push(diagnostic); + } + + // Send the computed diagnostics to VSCode. + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); +} + +connection.onDidChangeWatchedFiles(_change => { + // Monitored files have change in VSCode + connection.console.log('We received an file change event'); +}); + +// This handler provides the initial list of the completion items. +connection.onCompletion( + (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => { + // The pass parameter contains the position of the text document in + // which code complete got requested. For the example we ignore this + // info and always provide the same completion items. + return [ + { + label: 'TypeScript', + kind: CompletionItemKind.Text, + data: 1 + }, + { + label: 'JavaScript', + kind: CompletionItemKind.Text, + data: 2 + } + ]; + } +); + +// This handler resolves additional information for the item selected in +// the completion list. +connection.onCompletionResolve( + (item: CompletionItem): CompletionItem => { + if (item.data === 1) { + item.detail = 'TypeScript details'; + item.documentation = 'TypeScript documentation'; + } else if (item.data === 2) { + item.detail = 'JavaScript details'; + item.documentation = 'JavaScript documentation'; + } + return item; + } +); + +// Make the text document manager listen on the connection +// for open, change and close text document events +documents.listen(connection); + +// Listen on the connection +connection.listen(); \ No newline at end of file diff --git a/packages/idea-language/server/tsconfig.json b/packages/idea-language/server/tsconfig.json new file mode 100644 index 0000000..19b0775 --- /dev/null +++ b/packages/idea-language/server/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": ["es2020"], + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "strict": true, + "outDir": "out", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/packages/idea-language/tsconfig.json b/packages/idea-language/tsconfig.json new file mode 100644 index 0000000..9746b7c --- /dev/null +++ b/packages/idea-language/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": ["es2020"], + "outDir": "out", + "rootDir": "src", + "sourceMap": true + }, + "include": [ + "src" + ], + "exclude": [ + "archives", + "node_modules", + ".vscode-test" + ], + "references": [ + { "path": "./client" }, + { "path": "./server" } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/LICENSE b/packages/idea-parser/LICENSE new file mode 100644 index 0000000..b396d80 --- /dev/null +++ b/packages/idea-parser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Open Source Software PH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/idea-parser/README.md b/packages/idea-parser/README.md new file mode 100644 index 0000000..b899a85 --- /dev/null +++ b/packages/idea-parser/README.md @@ -0,0 +1,7 @@ +# Idea Parser + +Parses the ideas to AST and readable JSON. + +AST follows JS AST as described [here](https://astexplorer.net/#/gist/6e328cf76a27ca85e552c9cb583cdd74/1077c8842337972509a29bc9063d17bf90a1a492). + +See [https://github.com/OSSPhilippines/idea] for more info. \ No newline at end of file diff --git a/packages/idea-parser/index.d.ts b/packages/idea-parser/index.d.ts new file mode 100644 index 0000000..aa6bc3d --- /dev/null +++ b/packages/idea-parser/index.d.ts @@ -0,0 +1 @@ +export * from './dist/index' \ No newline at end of file diff --git a/packages/idea-parser/index.js b/packages/idea-parser/index.js new file mode 100644 index 0000000..d934e7a --- /dev/null +++ b/packages/idea-parser/index.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('./dist/index') +} \ No newline at end of file diff --git a/packages/idea-parser/package.json b/packages/idea-parser/package.json new file mode 100644 index 0000000..0c1d0f4 --- /dev/null +++ b/packages/idea-parser/package.json @@ -0,0 +1,34 @@ +{ + "name": "@ossph/idea-parser", + "version": "0.1.0", + "license": "MIT", + "description": "Parses ideas to AST and readable JSON.", + "author": "Chris ", + "homepage": "https://github.com/OSSPhilippines/idea", + "bugs": "https://github.com/OSSPhilippines/idea/issues", + "repository": "OSSPhilippines/idea", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "build": "npm run build:tsc && npm run build:files", + "build:tsc": "tsc", + "build:files": "cp ./README.md ./dist/ && cp ./package.json ./dist/ && cp ./LICENSE ./dist/", + "test": "cross-env DATABASE_URL=test ts-mocha tests/*.test.ts" + }, + "devDependencies": { + "@jest/globals": "29.5.0", + "@types/chai": "4.3.5", + "@types/deep-equal-in-any-order": "1.0.1", + "@types/expect": "24.3.0", + "@types/mocha": "10.0.1", + "@types/node": "20.2.5", + "chai": "4.3.7", + "cross-env": "7.0.3", + "deep-equal-in-any-order": "2.0.6", + "mocha": "10.2.0", + "ts-jest": "29.0.5", + "ts-mocha": "10.0.0", + "ts-node": "10.9.1", + "typescript": "5.0.4" + } +} diff --git a/packages/idea-parser/src/definitions.ts b/packages/idea-parser/src/definitions.ts new file mode 100644 index 0000000..508baf6 --- /dev/null +++ b/packages/idea-parser/src/definitions.ts @@ -0,0 +1,417 @@ +import type { + Reader, + DataToken, + UnknownToken, + IdentifierToken +} from './types'; +const definitions: Record = { + 'line': (code, index) => reader( + '_Line', + /^[\n\r]+$/, + code, + index + ), + 'space': (code, index) => reader( + '_Space', + /^[ ]+$/, + code, + index + ), + 'whitespace': (code, index) => reader( + '_Whitespace', + /^\s+$/, + code, + index + ), + 'note': (code, index) => reader( + '_Note', + /^\/\*(?:(?!\*\/).)+\*\/$/s, + code, + index + ), + 'comment': (code, index) => reader( + '_Comment', + /^\/\/[^\n\r]*$/, + code, + index + ), + ')': (code, index) => reader( + '_ParenClose', + /^\)$/, + code, + index + ), + '(': (code, index) => reader( + '_ParenOpen', + /^\($/, + code, + index + ), + '}': (code, index) => reader( + '_BraceClose', + /^\}$/, + code, + index + ), + '{': (code, index) => reader( + '_BraceOpen', + /^\{$/, + code, + index + ), + ']': (code, index) => reader( + '_SquareClose', + /^\]$/, + code, + index + ), + '[': (code, index) => reader( + '_SquareOpen', + /^\[$/, + code, + index + ), + 'Null': (code: string, index: number) => { + return code.substring(index, index + 4) === 'null' + ? { + type: 'Literal', + start: index, + end: index + 4, + value: null, + raw: 'null' + } : undefined; + }, + 'Boolean': (code, index) => { + if (code.substring(index, index + 4) === 'true') { + return { + type: 'Literal', + start: index, + end: index + 4, + value: true, + raw: 'true' + }; + } + if (code.substring(index, index + 5) === 'false') { + return { + type: 'Literal', + start: index, + end: index + 5, + value: false, + raw: 'false' + }; + } + return undefined; + }, + 'String': (code, index) => { + if (code.charAt(index) !== '"') { + return undefined; + } + + const end = code.indexOf('"', index + 1) + 1; + if (end < index) { + return undefined; + } + + const value = code.slice(index + 1, end - 1); + + return { + type: 'Literal', + start: index, + end, + value, + raw: `'${value}'` + }; + }, + 'Float': (code, index) => { + let value = ''; + let matched = false; + const start = index; + while (index < code.length) { + //get the character (and increment index afterwards) + const char = code.charAt(index++); + if (!/^\d+\.\d+$/.test(value + char)) { + //if number then dot (optional) + if (/^\d+\.{0,1}$/.test(value + char)) { + //add character to value anyways + value += char; + //let it keep parsing + continue; + } + //if we do not have a value + if (value.length === 0) { + return undefined; + } + //return where we ended + return { + type: 'Literal', + start, + end: index - 1, + value: parseFloat(value), + raw: `${value}` + }; + } + //add character to value + value += char; + //remember last match + matched = true; + } + //no more code... + //did it end with a match? + return matched && value.length + ? { + type: 'Literal', + start, + end: index, + value: parseFloat(value), + raw: `${value}` + } : undefined; + }, + 'Integer': (code, index) => { + if (!/^[0-9]$/.test(code.charAt(index))) { + return undefined; + } + const start = index; + let value = code.charAt(index); + while (index < code.length) { + const char = code.charAt(++index); + if (!/^[0-9]+$/.test(value + char)) { + return { + type: 'Literal', + start, + end: index - 1, + value: parseInt(value), + raw: `${value}` + }; + } + value += char; + } + + if (/^[0-9]+$/.test(value)) { + return { + type: 'Literal', + start, + end: index, + value: parseInt(value), + raw: `${value}` + }; + } + return undefined; + }, + 'Array': (code, index, lexer) => { + const elements: DataToken[] = []; + const subparser = lexer.clone().load(code, index); + try { + subparser.expect('['); + subparser.optional('whitespace'); + while (subparser.next(data)) { + const value = subparser.expect(data) as DataToken; + subparser.optional('whitespace'); + elements.push(value); + } + subparser.expect(']'); + } catch(e) { + return undefined; + } + + return { + type: 'ArrayExpression', + start: index, + end: subparser.index, + elements + }; + }, + 'Object': (code, index, lexer) => { + const properties: any[] = []; + const subparser = lexer.clone().load(code, index); + try { + subparser.expect('{'); + subparser.optional('whitespace'); + while (subparser.next('AnyIdentifier')) { + const key = subparser.expect('AnyIdentifier'); + subparser.expect('whitespace'); + const value = subparser.expect(data); + subparser.optional('whitespace'); + properties.push({ + type: 'Property', + start: key.start, + end: value.end, + key: { + type: 'Identifier', + start: key.start, + end: key.end, + name: key.name + }, + value: value + }); + } + subparser.expect('}'); + } catch(e) { + return undefined; + } + return { + type: 'ObjectExpression', + start: index, + end: subparser.index, + properties + }; + }, + 'Environment': (code, index) => { + if (code.substring(index, index + 5) !== 'env("') { + return undefined; + } + + const end = code.indexOf('")', index + 5) + 2; + if (end < index) { + return undefined; + } + + const value = process.env[code.slice(index + 5, end - 2)] || ''; + + return { + type: 'Literal', + start: index, + end, + value, + raw: `'${value}'` + }; + }, + 'AnyIdentifier': (code, index) => identifier( + /^[a-z_][a-z0-9_]*$/i, + code, + index + ), + 'UpperIdentifier': (code, index) => identifier( + /^[A-Z_][A-Z0-9_]*$/i, + code, + index + ), + 'CapitalIdentifier': (code, index) => identifier( + /^[A-Z_][a-zA-Z0-9_]*$/i, + code, + index + ), + 'CamelIdentifier': (code, index) => identifier( + /^[a-z_][a-zA-Z0-9_]*$/, + code, + index + ), + 'LowerIdentifier': (code, index) => identifier( + /^[a-z_][a-z0-9_]*$/i, + code, + index + ), + 'AttributeIdentifier': (code, index) => { + let name = ''; + let matched = false; + const start = index; + const regexp = /^@[a-z](\.?[a-z0-9_]+)*$/; + while (index < code.length) { + //get the character (and increment index afterwards) + const char = code.charAt(index++); + if (!regexp.test(name + char)) { + //if attr then dot (optional) + if (/^@$/.test(name + char) + || /^@[a-z][a-z0-9_\.]*\.$/.test(name + char) + ) { + //add character to value anyways + name += char; + //let it keep parsing + continue; + } + //if we do not have a value + if (name.length === 0 || !regexp.test(name)) { + return undefined; + } + //return where we ended + return { + type: 'Identifier', + start, + end: index - 1, + name + }; + } + //add character to value + name += char; + //remember last match + matched = true; + } + + if (!matched) { + return undefined; + } + //no more code... + //did it end with a match? + return regexp.test(name) ? { + type: 'Identifier', + start, + end: index, + name + } : undefined; + } +}; + +export const scalar = [ + 'Null', 'Boolean', 'String', + 'Float', 'Integer', 'Environment' +]; + +export const data = [ ...scalar, 'Object', 'Array' ]; + +export function reader( + type: string, + regexp: RegExp, + code: string, + index: number +): UnknownToken | undefined { + let value = ''; + let matched = false; + const start = index; + while (index < code.length) { + //get the character (and increment index afterwards) + const char = code.charAt(index++); + if (!regexp.test(value + char)) { + //if we never had a match + if (!matched) { + //add character to value anyways + value += char; + //let it keep parsing + continue; + } + //if we do not have a value + if (value.length === 0) { + return undefined; + } + //return where we ended + return { type, start, end: index - 1, value, raw: value }; + } + //add character to value + value += char; + //remember last match + matched = true; + } + //no more code... + //did it end with a match? + return matched && value.length + ? { type, start, end: index, value, raw: value } + : undefined; +} + +export function identifier( + regexp: RegExp, + code: string, + index: number +): IdentifierToken | undefined { + const results = reader('Identifier', regexp, code, index); + if (results) { + return { + type: 'Identifier', + start: results.start, + end: results.end, + name: results.value + }; + } + + return undefined; +} + +export default definitions; \ No newline at end of file diff --git a/packages/idea-parser/src/index.ts b/packages/idea-parser/src/index.ts new file mode 100644 index 0000000..5a28414 --- /dev/null +++ b/packages/idea-parser/src/index.ts @@ -0,0 +1,32 @@ +import Exception from './types/Exception'; +import Lexer from './types/Lexer'; +import Compiler from './types/Compiler'; +import AbstractTree from './trees/AbstractTree'; +import EnumTree from './trees/EnumTree'; +import PropTree from './trees/PropTree'; +import TypeTree from './trees/TypeTree'; +import ModelTree from './trees/ModelTree'; +import SchemaTree from './trees/SchemaTree'; +import PluginTree from './trees/PluginTree'; + +export type * from './types'; +export { + Exception, + Lexer, + Compiler, + AbstractTree, + EnumTree, + PropTree, + TypeTree, + ModelTree, + SchemaTree, + PluginTree +}; + +export function final(code: string) { + return Compiler.final(SchemaTree.parse(code)); +} + +export function parse(code: string) { + return Compiler.schema(SchemaTree.parse(code)); +} \ No newline at end of file diff --git a/packages/idea-parser/src/trees/AbstractTree.ts b/packages/idea-parser/src/trees/AbstractTree.ts new file mode 100644 index 0000000..c264cfc --- /dev/null +++ b/packages/idea-parser/src/trees/AbstractTree.ts @@ -0,0 +1,42 @@ +//types +import type { DeclarationToken } from '../types'; + +import Lexer from '../types/Lexer'; + +import definitions from '../definitions'; + +export default abstract class AbstractTree { + //the language used + static definitions(lexer: Lexer) { + Object.keys(definitions).forEach((key) => { + lexer.define(key, definitions[key]); + }); + return lexer; + } + + //the parser + protected _lexer: Lexer; + + /** + * Creates a new parser + */ + constructor(lexer?: Lexer) { + this._lexer = lexer || ( + this.constructor as typeof AbstractTree + ).definitions(new Lexer()); + } + + /** + * Consumes non code + */ + noncode() { + while(this._lexer.next(['whitespace', 'comment', 'note'])) { + this._lexer.expect(['whitespace', 'comment', 'note']); + } + } + + /** + * Builds the object syntax + */ + abstract parse(code: string, start: number): DeclarationToken; +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/EnumTree.ts b/packages/idea-parser/src/trees/EnumTree.ts new file mode 100644 index 0000000..55ca077 --- /dev/null +++ b/packages/idea-parser/src/trees/EnumTree.ts @@ -0,0 +1,113 @@ +//types +import type { + LiteralToken, + PropertyToken, + IdentifierToken, + DeclarationToken +} from '../types'; + +import Lexer from '../types/Lexer'; +import { scalar, reader } from '../definitions'; + +import AbstractTree from './AbstractTree'; + +export default class TypeTree extends AbstractTree { + //the language used + static definitions(lexer: Lexer) { + super.definitions(lexer); + lexer.define('EnumWord', (code, index) => reader( + '_EnumWord', + /^enum$/, + code, + index + )); + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string, start = 0) { + return new this().parse(code, start); + } + + /** + * Builds the enum syntax + */ + parse(code: string, start = 0) { + this._lexer.load(code, start); + return this.enum(); + } + + /** + * Builds the enum syntax + */ + enum(): DeclarationToken { + //enum + const type = this._lexer.expect('EnumWord'); + this._lexer.expect('whitespace'); + //enum Foobar + const id = this._lexer.expect('CapitalIdentifier'); + this._lexer.expect('whitespace'); + //enum Foobar { + this._lexer.expect('{'); + this.noncode(); + const props: PropertyToken[] = []; + //enum Foobar { + // FOO "bar" + // ... + while(this._lexer.next('UpperIdentifier')) { + props.push(this.property()); + } + //enum Foobar { + // FOO "bar" + // ... + //} + this._lexer.expect('}'); + + return { + type: 'VariableDeclaration', + kind: 'enum', + start: type.start, + end: this._lexer.index, + declarations: [ + { + type: 'VariableDeclarator', + start: id.start, + end: this._lexer.index, + id, + init: { + type: 'ObjectExpression', + start: type.start, + end: this._lexer.index, + properties: props + } + } + ] + }; + } + + /** + * Builds the property syntax + */ + property(): PropertyToken { + //FOO + const key = this._lexer.expect('UpperIdentifier'); + this._lexer.expect('whitespace'); + //FOO "bar" + const value = this._lexer.expect(scalar); + this._lexer.expect('whitespace'); + this.noncode(); + return { + type: 'Property', + kind: 'init', + start: key.start, + end: value.end, + method: false, + shorthand: false, + computed: false, + key, + value + }; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/ModelTree.ts b/packages/idea-parser/src/trees/ModelTree.ts new file mode 100644 index 0000000..d4607b1 --- /dev/null +++ b/packages/idea-parser/src/trees/ModelTree.ts @@ -0,0 +1,132 @@ +//models +import { DeclarationToken, IdentifierToken, PropertyToken } from '../types'; + +import Lexer from '../types/Lexer'; +import TypeTree from './TypeTree'; + +import { reader } from '../definitions'; + +export default class ModelTree extends TypeTree { + //the language used + static definitions(lexer: Lexer) { + super.definitions(lexer); + lexer.define('ModelWord', (code, index) => reader( + '_ModelWord', + /^model$/, + code, + index + )); + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string, start = 0) { + return new ModelTree().parse(code, start); + } + + /** + * Builds the model syntax + */ + model(): DeclarationToken { + //model + const type = this._lexer.expect('ModelWord'); + this._lexer.expect('whitespace'); + //model Foobar + const id = this._lexer.expect('CapitalIdentifier'); + this._lexer.expect('whitespace'); + const properties: PropertyToken[] = []; + //model Foobar @id("foo" "bar") + while(this._lexer.next('AttributeIdentifier')) { + properties.push(this.parameter()); + this.noncode(); + } + this.noncode(); + //model Foobar @id("foo" "bar") { + this._lexer.expect('{'); + this.noncode(); + const columns: PropertyToken[] = []; + //model Foobar @id("foo" "bar") { + // foo String @id("foo" "bar") + // ... + while(this._lexer.next('CamelIdentifier')) { + columns.push(this.property()); + } + //model Foobar @id("foo" "bar") { + // foo String @id("foo" "bar") + // ... + //} + this._lexer.expect('}'); + + return { + type: 'VariableDeclaration', + kind: 'model', + start: type.start, + end: this._lexer.index, + declarations: [{ + type: 'VariableDeclarator', + start: type.start, + end: this._lexer.index, + id, + init: { + type: 'ObjectExpression', + start: type.start, + end: this._lexer.index, + properties: [ + { + type: 'Property', + kind: 'init', + start: type.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: type.start, + end: type.end, + name: 'attributes', + }, + value: { + type: 'ObjectExpression', + start: type.start, + end: type.end, + properties + } + }, + { + type: 'Property', + kind: 'init', + start: type.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: type.start, + end: type.end, + name: 'columns', + }, + value: { + type: 'ObjectExpression', + start: type.start, + end: type.end, + properties: columns + } + } + ] + } + }] + }; + } + + /** + * Builds the model syntax + */ + parse(code: string, start = 0) { + this._lexer.load(code, start); + return this.model(); + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/PluginTree.ts b/packages/idea-parser/src/trees/PluginTree.ts new file mode 100644 index 0000000..c00f2d0 --- /dev/null +++ b/packages/idea-parser/src/trees/PluginTree.ts @@ -0,0 +1,71 @@ +//types +import type { LiteralToken, DeclarationToken, ObjectToken } from '../types'; + +import Lexer from '../types/Lexer'; +import { reader } from '../definitions'; + +import AbstractTree from './AbstractTree'; + +export default class PluginTree extends AbstractTree { + //the language used + static definitions(lexer: Lexer) { + super.definitions(lexer); + lexer.define('PluginWord', (code, index) => reader( + '_PluginWord', + /^plugin$/, + code, + index + )); + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string, start = 0) { + return new this().parse(code, start); + } + + /** + * Builds the enum syntax + */ + parse(code: string, start = 0) { + this._lexer.load(code, start); + return this.plugin(); + } + + /** + * Builds the plugin syntax + */ + plugin(): DeclarationToken { + //plugin + const type = this._lexer.expect('PluginWord'); + this._lexer.expect('whitespace'); + //plugin "Foobar" + const id = this._lexer.expect('String'); + this._lexer.expect('whitespace'); + //plugin "Foobar" {...} + const init = this._lexer.expect('Object'); + + return { + type: 'VariableDeclaration', + kind: 'plugin', + start: type.start, + end: this._lexer.index, + declarations: [ + { + type: 'VariableDeclarator', + start: id.start, + end: this._lexer.index, + id: { + type: 'Identifier', + start: id.start, + end: id.end, + name: id.value + }, + init + } + ] + }; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/PropTree.ts b/packages/idea-parser/src/trees/PropTree.ts new file mode 100644 index 0000000..c2e3cfd --- /dev/null +++ b/packages/idea-parser/src/trees/PropTree.ts @@ -0,0 +1,70 @@ +import type { + DeclarationToken, + IdentifierToken, + ObjectToken +} from '../types'; + +import Lexer from '../types/Lexer'; +import { reader } from '../definitions'; + +import AbstractTree from './AbstractTree'; + + +export default class PropTree extends AbstractTree { + //the language used + static definitions(lexer: Lexer) { + super.definitions(lexer); + lexer.define('PropWord', (code, index) => reader( + '_PropWord', + /^prop$/, + code, + index + )); + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string, start = 0) { + return new this().parse(code, start); + } + + /** + * Builds the enum syntax + */ + parse(code: string, start = 0) { + this._lexer.load(code, start); + return this.prop(); + } + + /** + * Builds the prop syntax + */ + prop(): DeclarationToken { + //prop + const type = this._lexer.expect('PropWord'); + this._lexer.expect('whitespace'); + //prop Foobar + const id = this._lexer.expect('CapitalIdentifier'); + this._lexer.expect('whitespace'); + //prop Foobar { + const init = this._lexer.expect('Object'); + + return { + type: 'VariableDeclaration', + kind: 'prop', + start: type.start, + end: init.end, + declarations: [ + { + type: 'VariableDeclarator', + start: id.start, + end: init.end, + id, + init + } + ] + }; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/SchemaTree.ts b/packages/idea-parser/src/trees/SchemaTree.ts new file mode 100644 index 0000000..d467381 --- /dev/null +++ b/packages/idea-parser/src/trees/SchemaTree.ts @@ -0,0 +1,120 @@ +//types +import type { SchemaToken, DeclarationToken } from '../types'; + +import Exception from '../types/Exception'; +import Lexer from '../types/Lexer'; + +import EnumTree from './EnumTree'; +import PropTree from './PropTree'; +import TypeTree from './TypeTree'; +import ModelTree from './ModelTree'; +import PluginTree from './PluginTree'; + +export default class SchemaTree { + //the language used + static definitions(lexer: Lexer) { + EnumTree.definitions(lexer); + PropTree.definitions(lexer); + TypeTree.definitions(lexer); + ModelTree.definitions(lexer); + PluginTree.definitions(lexer); + + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string) { + return new this().parse(code); + } + + //the parser + protected _lexer: Lexer; + + //placeholder for trees + protected _enumTree: EnumTree; + protected _propTree: PropTree; + protected _typeTree: TypeTree; + protected _modelTree: ModelTree; + protected _pluginTree: PluginTree; + + /** + * Creates a new parser + */ + constructor(lexer?: Lexer) { + this._lexer = lexer || ( + this.constructor as typeof SchemaTree + ).definitions(new Lexer()); + this._enumTree = new EnumTree(this._lexer); + this._propTree = new PropTree(this._lexer); + this._typeTree = new TypeTree(this._lexer); + this._modelTree = new ModelTree(this._lexer); + this._pluginTree = new PluginTree(this._lexer); + } + + /** + * Consumes non code + */ + noncode() { + while(this._lexer.next(['whitespace', 'comment', 'note'])) { + this._lexer.expect(['whitespace', 'comment', 'note']); + } + } + + /** + * Builds the type syntax + */ + parse(code: string, start = 0): SchemaToken { + this._lexer.load(code, start); + const entries = [ + 'EnumWord', + 'PropWord', + 'TypeWord', + 'ModelWord', + 'PluginWord' + ]; + this._lexer.optional('whitespace'); + const body: DeclarationToken[] = []; + while (this._lexer.next(entries)) { + switch(true) { + case this._lexer.next('EnumWord'): + body.push(this._enumTree.enum()); + break; + case this._lexer.next('PropWord'): + body.push(this._propTree.prop()); + break; + case this._lexer.next('TypeWord'): + body.push(this._typeTree.type()); + break; + case this._lexer.next('ModelWord'): + body.push(this._modelTree.model()); + break; + case this._lexer.next('PluginWord'): + body.push(this._pluginTree.plugin()); + break; + } + this.noncode(); + } + + if (this._lexer.index < code.length) { + const remainder = code.substring( + this._lexer.index, + this._lexer.nextSpace() + ).trim(); + if (remainder.length) { + throw Exception + .for(`Unexpected token %s`, remainder.replace(/[\n\r]/g, ' ').trim()) + .withPosition(this._lexer.index, this._lexer.nextSpace()); + } + } + + return { + type: 'Program', + kind: 'schema', + start: 0, + end: this._lexer.index, + body + }; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/trees/TypeTree.ts b/packages/idea-parser/src/trees/TypeTree.ts new file mode 100644 index 0000000..864a47e --- /dev/null +++ b/packages/idea-parser/src/trees/TypeTree.ts @@ -0,0 +1,273 @@ +import type { + DataToken, + DeclarationToken, + IdentifierToken, + LiteralToken, + PropertyToken +} from '../types'; + +import Lexer from '../types/Lexer'; +import { data, reader } from '../definitions'; + +import AbstractTree from './AbstractTree'; + +export default class TypeTree extends AbstractTree { + static data = [ ...data, 'CapitalIdentifier' ]; + + //the language used + static definitions(lexer: Lexer) { + super.definitions(lexer); + lexer.define('Type', (code, index) => { + const regexp = /^[A-Z][a-zA-Z0-9_]*((\[\])|\?)?$/; + const results = reader('Literal', regexp, code, index); + if (results) { + const square = code.substring( + results.end, + results.end + 2 + ); + if (results.end > index && square === '[]') { + results.end += 2; + results.value += square; + } + results.raw = `"${results.value}"`; + } + return results; + }); + lexer.define('TypeWord', (code, index) => reader( + '_TypeWord', + /^type$/, + code, + index + )); + return lexer; + } + + /** + * (Main) Builds the syntax tree + */ + static parse(code: string, start = 0) { + return new this().parse(code, start); + } + + /** + * Builds the type syntax + */ + parse(code: string, start = 0) { + this._lexer.load(code, start); + return this.type(); + } + + /** + * Builds the parameter syntax + */ + parameter(): PropertyToken { + // @id + const key = this._lexer.expect('AttributeIdentifier'); + key.name = key.name.slice(1); + const elements: DataToken[] = []; + if (this._lexer.next('(')) { + // @id( + this._lexer.expect('('); + this.noncode(); + // @id("foo" "bar" + const data = (this.constructor as typeof TypeTree).data; + while(this._lexer.next(data)) { + elements.push(this._lexer.expect(data)); + this.noncode(); + } + // @id("foo" "bar") + this._lexer.expect(')'); + } + //assuming no args + return { + type: 'Property', + kind: 'init', + start: key.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key, + value: elements.length ? { + type: 'ArrayExpression', + start: key.start, + end: this._lexer.index, + elements + } : { + type: 'Literal', + start: key.start, + end: this._lexer.index, + value: true, + raw: 'true' + } + }; + } + + /** + * Builds the property syntax + */ + property(): PropertyToken { + //foo + const key = this._lexer.expect('CamelIdentifier'); + this._lexer.expect('whitespace'); + //foo String + const value = this._lexer.expect('Type'); + this._lexer.expect('whitespace'); + const properties: PropertyToken[] = []; + //foo String @id("foo" "bar") ... + while(this._lexer.next('AttributeIdentifier')) { + properties.push(this.parameter()); + this.noncode(); + } + return { + type: 'Property', + kind: 'init', + start: key.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key, + value: { + type: 'ObjectExpression', + start: value.start, + end: this._lexer.index, + properties: [ + { + type: 'Property', + kind: 'init', + start: value.start, + end: value.end, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: value.start, + end: value.end, + name: 'type', + }, + value + }, + { + type: 'Property', + kind: 'init', + start: value.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: value.start, + end: value.end, + name: 'attributes', + }, + value: { + type: 'ObjectExpression', + start: value.start, + end: value.end, + properties + } + } + ] + } + }; + } + + /** + * Builds the type syntax + */ + type(): DeclarationToken { + //type + const type = this._lexer.expect('TypeWord'); + this._lexer.expect('whitespace'); + //type Foobar + const id = this._lexer.expect('CapitalIdentifier'); + this._lexer.expect('whitespace'); + const properties: PropertyToken[] = []; + //type Foobar @id("foo" "bar") + while(this._lexer.next('AttributeIdentifier')) { + properties.push(this.parameter()); + this.noncode(); + } + this.noncode(); + //type Foobar @id("foo" "bar") { + this._lexer.expect('{'); + this.noncode(); + const columns: PropertyToken[] = []; + //type Foobar @id("foo" "bar") { + // foo String @id("foo" "bar") + // ... + while(this._lexer.next('CamelIdentifier')) { + columns.push(this.property()); + } + //type Foobar @id("foo" "bar") { + // foo String @id("foo" "bar") + // ... + //} + this._lexer.expect('}'); + + return { + type: 'VariableDeclaration', + kind: 'type', + start: type.start, + end: this._lexer.index, + declarations: [{ + type: 'VariableDeclarator', + start: type.start, + end: this._lexer.index, + id, + init: { + type: 'ObjectExpression', + start: type.start, + end: this._lexer.index, + properties: [ + { + type: 'Property', + kind: 'init', + start: type.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: type.start, + end: type.end, + name: 'attributes', + }, + value: { + type: 'ObjectExpression', + start: type.start, + end: type.end, + properties + } + }, + { + type: 'Property', + kind: 'init', + start: type.start, + end: this._lexer.index, + method: false, + shorthand: false, + computed: false, + key: { + type: 'Identifier', + start: type.start, + end: type.end, + name: 'columns', + }, + value: { + type: 'ObjectExpression', + start: type.start, + end: type.end, + properties: columns + } + } + ] + } + }] + }; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/types.ts b/packages/idea-parser/src/types.ts new file mode 100644 index 0000000..5b78b72 --- /dev/null +++ b/packages/idea-parser/src/types.ts @@ -0,0 +1,131 @@ +export type Reader = ( + code: string, + start: number, + lexer: Parser +) => Token|undefined; + +export type Definition = { key: string, reader: Reader }; + +export type UnknownToken = { + type: string; + start: number; + end: number; + value: any; + raw: string; +}; + +export type SchemaToken = { + type: 'Program'; + kind: 'schema'; + start: number; + end: number; + body: DeclarationToken[]; +}; + +export type DeclarationToken = { + type: 'VariableDeclaration'; + kind: string; + start: number; + end: number; + declarations: [ DeclaratorToken ]; +}; + +export type DeclaratorToken = { + type: 'VariableDeclarator'; + start: number; + end: number; + id: IdentifierToken; + init: ObjectToken; +}; + +export type IdentifierToken = { + type: 'Identifier'; + name: string; + start: number; + end: number; +}; + +export type ObjectToken = { + type: 'ObjectExpression'; + start: number; + end: number; + properties: PropertyToken[]; +}; + +export type PropertyToken = { + type: 'Property'; + kind: 'init'; + start: number; + end: number; + key: IdentifierToken; + value: DataToken; + method: boolean; + shorthand: boolean; + computed: boolean; +}; + +export type ArrayToken = { + type: 'ArrayExpression'; + start: number; + end: number; + elements: DataToken[]; +}; + +export type LiteralToken = { + type: 'Literal'; + start: number; + end: number; + value: any; + raw: string; +}; + +export type Token = DataToken|UnknownToken; +export type DataToken = IdentifierToken|LiteralToken|ObjectToken|ArrayToken; +export type UseReferences = Record|false; + +export type Scalar = string|number|null|boolean; +export type Data = Scalar|Data[]|{ [key: string]: Data }; + +export interface Parser { + get dictionary(): Record; + get index(): number; + clone(): Parser; + define(key: string, reader: Reader, type?: string): void; + expect(keys: string | string[]): T; + get(key: string): Definition|undefined; + load(code: string, index: number): this; + match(code: string, start: number, keys?: string[]): Token[]; + next(keys: string | string[]): boolean; + optional(keys: string | string[]): T | undefined; + read(): Token | undefined +} + +export type EnumConfig = Record; +export type PluginConfig = Record; +export type PropConfig = Record; +export type ColumnConfig = { + name: string, + type: string, + attributes: Record, + required: boolean, + multiple: boolean +}; + +export type TypeConfig = { + name: string, + attributes: Record, + columns: ColumnConfig[] +}; + +export type ModelConfig = TypeConfig; + +export type FinalSchemaConfig = { + enum?: Record, + type?: Record, + model?: Record, + plugin?: Record +}; + +export type SchemaConfig = FinalSchemaConfig & { + prop?: Record +}; \ No newline at end of file diff --git a/packages/idea-parser/src/types/Compiler.ts b/packages/idea-parser/src/types/Compiler.ts new file mode 100644 index 0000000..ae92f31 --- /dev/null +++ b/packages/idea-parser/src/types/Compiler.ts @@ -0,0 +1,284 @@ +//types +import type { + Data, + DataToken, + ArrayToken, + EnumConfig, + PropConfig, + TypeConfig, + ModelConfig, + ObjectToken, + SchemaToken, + ColumnConfig, + SchemaConfig, + LiteralToken, + UseReferences, + PluginConfig, + IdentifierToken, + DeclarationToken, + FinalSchemaConfig +} from '../types'; + +import Exception from './Exception'; + +export default class Compiler { + /** + * Compiles an array tree into an actual array + */ + static array(token: ArrayToken, references: UseReferences = false) { + return token.elements.map(element => this.data(element, references)) as T; + } + + /** + * Compiles an array, object or scalar tree into the actual value + */ + static data(token: DataToken, references: UseReferences = false): Data { + if (token.type === 'ObjectExpression') { + return this.object(token, references); + } else if (token.type === 'ArrayExpression') { + return this.array(token, references); + } else if (token.type === 'Literal') { + return this.literal(token); + } else if (token.type === 'Identifier') { + return this.identifier(token, references); + } + throw Exception.for('Invalid data token type'); + } + + /** + * Converts an enum tree into a json version + */ + static enum(token: DeclarationToken) { + if (token.kind !== 'enum') { + throw Exception.for('Invalid Enum'); + } + //ex. Roles + const name = token.declarations?.[0].id?.name as string; + const options: EnumConfig = {}; + token.declarations[0].init.properties.forEach(property => { + options[property.key.name] = (property.value as LiteralToken).value; + }); + return [ name, options ] as [ string, EnumConfig ]; + } + + /** + * Converts a schema tree into a final json version + * (Removes prop references) + */ + static final(token: SchemaToken) { + const schema = this.schema(token, true); + delete schema.prop; + return schema as FinalSchemaConfig; + } + + /** + * Converts an plugin tree into a json version + */ + static plugin(token: DeclarationToken) { + if (token.kind !== 'plugin') { + throw Exception.for('Invalid Plugin'); + } + //ex. ./custom-plugin + const name = token.declarations?.[0].id?.name as string; + const value: PluginConfig = {}; + token.declarations[0].init.properties.forEach(property => { + value[property.key.name] = this.data(property.value); + }); + return [ name, value ] as [ string, PluginConfig ]; + } + + /** + * Compiles an identifier into the actual value it's referencing + */ + static identifier(token: IdentifierToken, references: UseReferences = false) { + if (references && token.name in references) { + return references[token.name]; + } else if (references === false) { + return '${' + token.name + '}'; + } + + throw Exception.for(`Unknown reference ${token.name}`); + } + + /** + * Compiles a literal into the actual value + */ + static literal(token: LiteralToken) { + return token.value; + } + + /** + * Converts a model tree into a json version + */ + static model(token: DeclarationToken, references: UseReferences = false) { + //ex. Foobar + const name = token.declarations[0].id?.name; + const value: Record = {}; + token.declarations[0].init.properties.forEach(property => { + value[property.key.name] = this.data(property.value, references); + }); + + if (typeof value.columns !== 'object') { + throw Exception.for('Expecting a columns property'); + } + + //change from key/value to array to preserve the order + const columns: ColumnConfig[] = []; + for (const name in value.columns) { + const column = value.columns[name]; + column.name = name; + if (typeof column.type === 'string') { + column.required = !column.type.endsWith('?'); + column.type = column.type.replace(/\?$/, ''); + column.multiple = column.type.endsWith('[]'); + column.type = column.type.replace(/\[\]$/, ''); + } + columns.push({ + type: column.type, + name: column.name, + required: column.required, + multiple: column.multiple, + attributes: column.attributes, + ...column + }); + } + value.columns = columns; + + return [ name, { name, ...value } ] as [ string, ModelConfig ]; + } + + /** + * Compiles an object tree into the actual object + */ + static object(token: ObjectToken, references: UseReferences = false) { + return Object.fromEntries(token.properties.map(property => [ + property.key.name, + this.data(property.value, references) + ])) as Record; + } + + /** + * Converts a prop tree into a json version + */ + static prop(token: DeclarationToken, references: UseReferences = false) { + if (token.kind !== 'prop') { + throw Exception.for('Invalid Prop'); + } + //ex. Foobar + const name = token.declarations[0].id.name; + const value: PropConfig = {}; + token.declarations[0].init.properties.forEach(property => { + value[property.key.name] = this.data(property.value, references); + }); + return [ name, value ] as [ string, PropConfig ]; + } + + /** + * Converts a schema tree into a json version + */ + static schema(token: SchemaToken, finalize = false) { + if (token.kind !== 'schema') { + throw Exception.for('Invalid Schema'); + } + + const schema: SchemaConfig = {}; + const references: Record = {}; + token.body.forEach(declaration => { + if (declaration.kind === 'enum') { + schema.enum = schema.enum || {}; + const [ key, value ] = this.enum(declaration); + schema.enum[key] = value; + if (references[key]) { + throw Exception.for('Duplicate %s', key); + } + references[key] = value; + } else if (declaration.kind === 'prop') { + schema.prop = schema.prop || {}; + const [ key, value ] = this.prop( + declaration, + finalize ? references: false + ); + schema.prop[key] = value; + if (references[key]) { + throw Exception.for('Duplicate %s', key); + } + references[key] = value; + } else if (declaration.kind === 'type') { + schema.type = schema.type || {}; + const [ key, value ] = this.type( + declaration, + finalize ? references: false + ); + schema.type[key] = value; + if (references[key]) { + throw Exception.for('Duplicate %s', key); + } + references[key] = value; + } else if (declaration.kind === 'model') { + schema.model = schema.model || {}; + const [ key, value ] = this.model( + declaration, + finalize ? references: false + ); + schema.model[key] = value; + if (references[key]) { + throw Exception.for('Duplicate %s', key); + } + references[key] = value; + } else if (declaration.kind === 'plugin') { + schema.plugin = schema.plugin || {}; + const [ key, value ] = this.plugin(declaration); + schema.plugin[key] = value; + if (references[key]) { + throw Exception.for('Duplicate %s', key); + } + references[key] = value; + } + }); + + return schema; + } + + /** + * Converts a type tree into a json version + */ + static type(token: DeclarationToken, references: UseReferences = false) { + if (token.kind !== 'type') { + throw Exception.for('Invalid Type'); + } + //ex. Foobar + const name = token.declarations[0].id.name; + const value: Record = {}; + token.declarations[0].init.properties.forEach(property => { + value[property.key.name] = this.data(property.value, references); + }); + + if (typeof value.columns !== 'object') { + throw Exception.for('Expecting a columns property'); + } + + //change from key/value to array to preserve the order + const columns: ColumnConfig[] = []; + for (const name in value.columns) { + const column = value.columns[name]; + column.name = name; + if (typeof column.type === 'string') { + column.required = !column.type.endsWith('?'); + column.type = column.type.replace(/\?$/, ''); + column.multiple = column.type.endsWith('[]'); + column.type = column.type.replace(/\[\]$/, ''); + } + columns.push({ + type: column.type, + name: column.name, + required: column.required, + multiple: column.multiple, + attributes: column.attributes, + ...column + }); + } + value.columns = columns; + + return [ name, { name, ...value } ] as [ string, TypeConfig ]; + } +}; \ No newline at end of file diff --git a/packages/idea-parser/src/types/Exception.ts b/packages/idea-parser/src/types/Exception.ts new file mode 100644 index 0000000..143ec30 --- /dev/null +++ b/packages/idea-parser/src/types/Exception.ts @@ -0,0 +1,69 @@ +/** + * Exceptions are used to give more information + * of an error that has occured + */ +export default class Exception extends Error { + /** + * Error code + */ + public code: number; + + /** + * Starting index + */ + public start = 0; + + /** + * ending index + */ + public end = 0; + + /** + * General use expressive reasons + */ + static for(message: string, ...values: string[]): Exception { + values.forEach(function(value) { + message = message.replace('%s', value); + }); + + return new this(message); + } + + /** + * An exception should provide a message and a name + */ + constructor(message: string, code = 500) { + super(); + this.message = message; + this.name = this.constructor.name; + this.code = code; + } + + /** + * Expressive way to set an error code + */ + withCode(code: number): Exception { + this.code = code; + return this; + } + + /** + * Expressive way to set syntax position + */ + withPosition(start: number, end: number): Exception { + this.start = start; + this.end = end; + return this; + } + + /** + * Converts error to JSON + */ + toJSON(): Record { + return { + error: true, + code: this.code, + message: this.message + }; + } +} \ No newline at end of file diff --git a/packages/idea-parser/src/types/Lexer.ts b/packages/idea-parser/src/types/Lexer.ts new file mode 100644 index 0000000..1ec2dbb --- /dev/null +++ b/packages/idea-parser/src/types/Lexer.ts @@ -0,0 +1,193 @@ +//types +import type { Definition, Reader, Parser, Token } from '../types'; + +import Exception from './Exception'; + +export default class Lexer implements Parser { + //the code to parse + protected _code = ''; + //the current index + protected _index = 0; + //a collection of definitions + protected _dictionary: Record = {}; + + /** + * Returns the shallow copy of the dictionary + */ + get dictionary() { + return { ...this._dictionary }; + } + + /** + * Returns the current index + */ + get index() { + return this._index; + } + + /** + * Clones the lexer at it's exact state + */ + public clone() { + const lexer = new Lexer(); + lexer.load(this._code, this._index); + for (const key in this._dictionary) { + lexer.define(key, this._dictionary[key].reader); + } + return lexer; + } + + /** + * Makes a new definition + */ + public define(key: string, reader: Reader) { + this._dictionary[key] = { key, reader }; + } + + /** + * Returns a token that matches any of the given names + */ + public expect(keys: string|string[]) { + if (!Array.isArray(keys)) { + keys = [keys]; + } + //get definition + const definitions = keys.map(key => { + const reader = this.get(key); + if (!reader) { + throw Exception.for('Unknown definition %s', key); + } + return reader; + }).filter(Boolean); + //throw if no definition + if (!definitions.length) { + throw Exception.for( + 'Unknown definitions %s', + keys.join(', ') + ); + } + //get match (sorted by names defined above) + const match = this.match(this._code, this._index, keys)[0]; + //if no match + if (!match) { + //throw exception + if (this._code[this._index + 10]) { + throw Exception.for( + 'Unexpected %s ... expecting %s', + this._code + .substring(this._index, this._index + 10) + .replace(/[\n\r]/g, ' ') + .trim(), + keys.join(' or ') + ).withPosition(this._index, this.nextSpace()); + } else { + throw Exception.for( + 'Unexpected %s expecting %s', + this._code.substring(this._index, this._index + 10), + keys.join(' or ') + ).withPosition(this._index, this.nextSpace()); + } + } + //fast forward index + this._index = match.end; + return match as T; + } + + /** + * Returns the test for a given definition + */ + public get(key: string) { + return this._dictionary[key]; + } + + /** + * Loads the code + */ + public load(code: string, index = 0) { + this._code = code; + this._index = index; + return this; + } + + /** + * Returns all the matching definitions for a given value + */ + public match(code: string, start: number, keys?: string[]) { + //if no names, get all names + keys = keys || Object.keys(this._dictionary); + //make the dictionary based on the order of names + const dictionary = keys + //add the definitions to dictionary + .map(key => { + const reader = this.get(key); + if (!reader) { + throw Exception.for('Unknown definition %s', key); + } + return reader; + }) + //filter out undefined definitions + .filter(Boolean); + //storage for matches + const matches: Token[] = []; + //loop through dictionary + for (const { reader } of dictionary) { + const results = reader(code, start, this); + //end is greater than start + if (results && results.end > start) { + //add to matches + matches.push(results); + } + } + return matches; + } + + /** + * Tests to see if the next set of characters match the given names + */ + public next(names: string|string[]) { + const start = this._index; + try { + this.expect(names); + this._index = start; + return true; + } catch (error) { + this._index = start; + return false; + } + } + + /** + * Possible returns a token that matches any of the given names + */ + public optional(names: string|string[]) { + const start = this._index; + try { + return this.expect(names); + } catch (error) { + this._index = start; + return undefined; + } + } + + /** + * Reads ahead and tries determines the next token + */ + public read() { + return this.optional(Object.keys(this.dictionary)); + } + + /** + * Allows to read a substring of the code + */ + public substring(start: number, end: number) { + return this._code.substring(start, end); + } + + /** + * Finds the next space (for language server) + */ + public nextSpace() { + const index = this._code.indexOf(' ', this._index); + return index === -1 ? this._code.length : index; + } +} \ No newline at end of file diff --git a/packages/idea-parser/tests/EnumTree.test.ts b/packages/idea-parser/tests/EnumTree.test.ts new file mode 100644 index 0000000..dd6fdd0 --- /dev/null +++ b/packages/idea-parser/tests/EnumTree.test.ts @@ -0,0 +1,16 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect, use } from 'chai'; +import deepEqualInAnyOrder from 'deep-equal-in-any-order'; +import EnumTree from '../src/trees/EnumTree'; + +use(deepEqualInAnyOrder); + +describe('Enum Tree', () => { + it('Should parse Enums', async () => { + const actual = EnumTree.parse(fs.readFileSync(`${__dirname}/fixtures/enum.idea`, 'utf8')); + const expected = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/enum.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(expected); + }); +}); diff --git a/packages/idea-parser/tests/Lexer.test.ts b/packages/idea-parser/tests/Lexer.test.ts new file mode 100644 index 0000000..2e912e0 --- /dev/null +++ b/packages/idea-parser/tests/Lexer.test.ts @@ -0,0 +1,257 @@ +import type { + LiteralToken, + ObjectToken, + ArrayToken, + UnknownToken +} from '../src/types'; + +import { describe, it } from 'mocha'; +import { expect } from 'chai'; +import Lexer from '../src/types/Lexer'; +import Compiler from '../src/types/Compiler'; +import definitions, { data } from '../src/definitions'; + +describe('Lexer/Compiler', () => { + it('Should parse Args', async () => { + const lexer = new Lexer(); + Object.keys(definitions).forEach((key) => { + lexer.define(key, definitions[key]); + }); + + //float + (() => { + lexer.load('4.4'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal(4.4); + expect(token.start).to.equal(0); + expect(token.end).to.equal(3); + })(); + //int + (() => { + lexer.load('44'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal(44); + expect(token.start).to.equal(0); + expect(token.end).to.equal(2); + })(); + //null + (() => { + lexer.load('null'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal(null); + expect(token.start).to.equal(0); + expect(token.end).to.equal(4); + })(); + //true + (() => { + lexer.load('true'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal(true); + expect(token.start).to.equal(0); + expect(token.end).to.equal(4); + })(); + //false + (() => { + lexer.load('false'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal(false); + expect(token.start).to.equal(0); + expect(token.end).to.equal(5); + })(); + //string + (() => { + lexer.load('"foobar"'); + const token = lexer.expect(data); + expect(token.type).to.equal('Literal'); + expect(token.value).to.equal('foobar'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(8); + })(); + //basic object + (() => { + lexer.load('{ foo "bar" bar 4.4 }'); + const token = lexer.expect(data); + expect(token.type).to.equal('ObjectExpression'); + + const actual = Compiler.object(token); + expect(actual.foo).to.equal('bar'); + expect(actual.bar).to.equal(4.4); + })(); + //object object + (() => { + lexer.load('{ foo "bar" bar 4.4 zoo { foo false bar null } }'); + const token = lexer.expect(data); + expect(token.type).to.equal('ObjectExpression'); + + const actual = Compiler.object<{ + foo: string; + bar: number; + zoo: { foo: boolean, bar: null }; + }>(token); + expect(actual.foo).to.equal('bar'); + expect(actual.bar).to.equal(4.4); + expect(actual.zoo.foo).to.equal(false); + expect(actual.zoo.bar).to.equal(null); + })(); + //object array + (() => { + lexer.load('{ foo "bar" bar 4.4 zoo [ 4 true ] }'); + const token = lexer.expect(data); + expect(token.type).to.equal('ObjectExpression'); + + const actual = Compiler.object<{ + foo: string; + bar: number; + zoo: [number, boolean]; + }>(token); + expect(actual.foo).to.equal('bar'); + expect(actual.bar).to.equal(4.4); + expect(actual.zoo[0]).to.equal(4); + expect(actual.zoo[1]).to.equal(true); + })(); + //basic array + (() => { + lexer.load('[ 4.4 "bar" false null ]'); + const token = lexer.expect(data); + expect(token.type).to.equal('ArrayExpression'); + + const actual = Compiler.array(token); + expect(actual[0]).to.equal(4.4); + expect(actual[1]).to.equal('bar'); + expect(actual[2]).to.equal(false); + expect(actual[3]).to.equal(null); + })(); + //array array + (() => { + lexer.load('[ 4.4 "bar" false null [ 4 true ] ]'); + const token = lexer.expect(data); + expect(token.type).to.equal('ArrayExpression'); + + const actual = Compiler.array<[ + number, + string, + boolean, + null, + [number, boolean] + ]>(token); + expect(actual[0]).to.equal(4.4); + expect(actual[1]).to.equal('bar'); + expect(actual[2]).to.equal(false); + expect(actual[3]).to.equal(null); + expect(actual[4][0]).to.equal(4); + expect(actual[4][1]).to.equal(true); + })(); + //array object + (() => { + lexer.load('[ 4.4 "bar" false null { foo false bar null } ]'); + const token = lexer.expect(data); + expect(token.type).to.equal('ArrayExpression'); + + const actual = Compiler.array<[ + number, + string, + boolean, + null, + { foo: boolean, bar: null } + ]>(token); + expect(actual[0]).to.equal(4.4); + expect(actual[1]).to.equal('bar'); + expect(actual[2]).to.equal(false); + expect(actual[3]).to.equal(null); + expect(actual[4].foo).to.equal(false); + expect(actual[4].bar).to.equal(null); + })(); + //array object + (() => { + lexer.load('[ { label "United States" value "US" } { label "Mexico" value "MX" } { label "Canada" value "CA" } ]'); + const token = lexer.expect(data); + expect(token.type).to.equal('ArrayExpression'); + + const actual = Compiler.array<{ label: string, value: string }[]>(token); + expect(actual[0].label).to.equal('United States'); + expect(actual[0].value).to.equal('US'); + expect(actual[1].label).to.equal('Mexico'); + expect(actual[1].value).to.equal('MX'); + expect(actual[2].label).to.equal('Canada'); + expect(actual[2].value).to.equal('CA'); + })(); + }); + + it('Should parse comments', async () => { + const lexer = new Lexer(); + Object.keys(definitions).forEach((key) => { + lexer.define(key, definitions[key]); + }); + + (() => { + lexer.load('/* some comment */'); + const token = lexer.expect('note'); + expect(token.type).to.equal('_Note'); + expect(token.value).to.equal('/* some comment */'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(18); + })(); + + (() => { + lexer.load('//some comment'); + const token = lexer.expect('comment'); + expect(token.type).to.equal('_Comment'); + expect(token.value).to.equal('//some comment'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(14); + })(); + + (() => { + lexer.load('/* some // comment */'); + const token = lexer.expect('note'); + expect(token.type).to.equal('_Note'); + expect(token.value).to.equal('/* some // comment */'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(21); + })(); + + (() => { + lexer.load('/* some // comment */'); + const token = lexer.expect([ 'note', 'comment' ]); + expect(token.type).to.equal('_Note'); + expect(token.value).to.equal('/* some // comment */'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(21); + })(); + + (() => { + lexer.load('//so/*me com*/ment'); + const token = lexer.expect('comment'); + expect(token.type).to.equal('_Comment'); + expect(token.value).to.equal('//so/*me com*/ment'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(18); + })(); + + (() => { + lexer.load('//so/*me com*/ment'); + const token = lexer.expect([ 'note', 'comment' ]); + expect(token.type).to.equal('_Comment'); + expect(token.value).to.equal('//so/*me com*/ment'); + expect(token.start).to.equal(0); + expect(token.end).to.equal(18); + })(); + + (() => { + lexer.load(`/* + some + // comment + */`); + const token = lexer.expect('note'); + expect(token.type).to.equal('_Note'); + expect(token.value).to.equal("/* \n some \n // comment\n */"); + expect(token.start).to.equal(0); + expect(token.end).to.equal(45); + })(); + }); +}); diff --git a/packages/idea-parser/tests/ModelTree.test.ts b/packages/idea-parser/tests/ModelTree.test.ts new file mode 100644 index 0000000..5611cab --- /dev/null +++ b/packages/idea-parser/tests/ModelTree.test.ts @@ -0,0 +1,16 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect, use } from 'chai'; +import deepEqualInAnyOrder from 'deep-equal-in-any-order'; +import ModelTree from '../src/trees/ModelTree'; + +use(deepEqualInAnyOrder); + +describe('Model Tree', () => { + it('Should parse Model', async () => { + const actual = ModelTree.parse(fs.readFileSync(`${__dirname}/fixtures/model.idea`, 'utf8')); + const expected = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/model.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(expected); + }); +}); diff --git a/packages/idea-parser/tests/PluginTree.test.ts b/packages/idea-parser/tests/PluginTree.test.ts new file mode 100644 index 0000000..0e0c266 --- /dev/null +++ b/packages/idea-parser/tests/PluginTree.test.ts @@ -0,0 +1,16 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect, use } from 'chai'; +import deepEqualInAnyOrder from 'deep-equal-in-any-order'; +import PluginTree from '../src/trees/PluginTree'; + +use(deepEqualInAnyOrder); + +describe('Plugin Tree', () => { + it('Should parse Plugin', async () => { + const actual = PluginTree.parse(fs.readFileSync(`${__dirname}/fixtures/plugin.idea`, 'utf8')); + const expected = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/plugin.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(expected); + }); +}); diff --git a/packages/idea-parser/tests/PropTree.test.ts b/packages/idea-parser/tests/PropTree.test.ts new file mode 100644 index 0000000..ac1c96a --- /dev/null +++ b/packages/idea-parser/tests/PropTree.test.ts @@ -0,0 +1,13 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect } from 'chai'; +import PropTree from '../src/trees/PropTree'; + +describe('Prop Tree', () => { + it('Should parse Prop', async () => { + const actual = PropTree.parse(fs.readFileSync(`${__dirname}/fixtures/prop.idea`, 'utf8')); + const expected = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/prop.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(expected); + }); +}); diff --git a/packages/idea-parser/tests/Schema.test.ts b/packages/idea-parser/tests/Schema.test.ts new file mode 100644 index 0000000..401e6ea --- /dev/null +++ b/packages/idea-parser/tests/Schema.test.ts @@ -0,0 +1,24 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect, use } from 'chai'; +import deepEqualInAnyOrder from 'deep-equal-in-any-order'; +import SchemaTree from '../src/trees/SchemaTree'; +import Compiler from '../src/types/Compiler'; + +use(deepEqualInAnyOrder); + +describe('Schema Tree', () => { + it('Should parse Schema', async () => { + const actual = SchemaTree.parse(fs.readFileSync(`${__dirname}/fixtures/schema.idea`, 'utf8')); + const schema = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/schema.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(schema); + + //console.log(JSON.stringify(Compiler.schema(actual), null, 2)); + const references = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/references.json`, 'utf8')); + expect(Compiler.schema(actual)).to.deep.equalInAnyOrder(references); + //console.log(JSON.stringify(Compiler.final(actual), null, 2)); + const final = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/final.json`, 'utf8')); + expect(Compiler.final(actual)).to.deep.equalInAnyOrder(final); + }); +}); diff --git a/packages/idea-parser/tests/TypeTree.test.ts b/packages/idea-parser/tests/TypeTree.test.ts new file mode 100644 index 0000000..1f15a53 --- /dev/null +++ b/packages/idea-parser/tests/TypeTree.test.ts @@ -0,0 +1,16 @@ +import fs from 'fs'; +import { describe, it } from 'mocha'; +import { expect, use } from 'chai'; +import deepEqualInAnyOrder from 'deep-equal-in-any-order'; +import TypeTree from '../src/trees/TypeTree'; + +use(deepEqualInAnyOrder); + +describe('Type Tree', () => { + it('Should parse Type', async () => { + const actual = TypeTree.parse(fs.readFileSync(`${__dirname}/fixtures/type.idea`, 'utf8')); + const expected = JSON.parse(fs.readFileSync(`${__dirname}/fixtures/type.json`, 'utf8')); + //console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equalInAnyOrder(expected); + }); +}); diff --git a/packages/idea-parser/tests/fixtures/enum.idea b/packages/idea-parser/tests/fixtures/enum.idea new file mode 100644 index 0000000..a67caed --- /dev/null +++ b/packages/idea-parser/tests/fixtures/enum.idea @@ -0,0 +1,5 @@ +enum Roles { + ADMIN "Admin" + MANAGER "Manager" + USER "User" +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/enum.json b/packages/idea-parser/tests/fixtures/enum.json new file mode 100644 index 0000000..d6ac025 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/enum.json @@ -0,0 +1,92 @@ +{ + "type": "VariableDeclaration", + "kind": "enum", + "start": 0, + "end": 64, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 5, + "end": 64, + "id": { + "type": "Identifier", + "start": 5, + "end": 10, + "name": "Roles" + }, + "init": { + "type": "ObjectExpression", + "start": 0, + "end": 64, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 15, + "end": 28, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 15, + "end": 20, + "name": "ADMIN" + }, + "value": { + "type": "Literal", + "start": 21, + "end": 28, + "value": "Admin", + "raw": "'Admin'" + } + }, + { + "type": "Property", + "kind": "init", + "start": 31, + "end": 48, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 31, + "end": 38, + "name": "MANAGER" + }, + "value": { + "type": "Literal", + "start": 39, + "end": 48, + "value": "Manager", + "raw": "'Manager'" + } + }, + { + "type": "Property", + "kind": "init", + "start": 51, + "end": 62, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 51, + "end": 55, + "name": "USER" + }, + "value": { + "type": "Literal", + "start": 56, + "end": 62, + "value": "User", + "raw": "'User'" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/final.json b/packages/idea-parser/tests/fixtures/final.json new file mode 100644 index 0000000..b0ecb2c --- /dev/null +++ b/packages/idea-parser/tests/fixtures/final.json @@ -0,0 +1,376 @@ +{ + "plugin": { + "./custom-plugin": { + "provider": "custom-client-js", + "url": "test", + "previewFeatures": [ + "fullTextSearch" + ] + } + }, + "enum": { + "Roles": { + "ADMIN": "Admin", + "MANAGER": "Manager", + "USER": "User" + } + }, + "type": { + "Address": { + "name": "Address", + "attributes": { + "label": [ + "Address", + "Addresses" + ] + }, + "columns": [ + { + "type": "String", + "name": "street", + "required": true, + "multiple": false, + "attributes": { + "field.input": [ + { + "type": "text" + } + ], + "is.required": true, + "list.hide": true + } + }, + { + "type": "String", + "name": "city", + "required": false, + "multiple": false, + "attributes": { + "field.input": [ + { + "type": "text" + } + ], + "is.required": true + } + }, + { + "type": "String", + "name": "country", + "required": true, + "multiple": false, + "attributes": { + "field.select": [ + { + "options": [ + { + "label": "United States", + "value": "US" + }, + { + "label": "Mexico", + "value": "MX" + }, + { + "label": "Canada", + "value": "CA" + } + ] + } + ], + "is.option": [ + { + "options": [ + { + "label": "United States", + "value": "US" + }, + { + "label": "Mexico", + "value": "MX" + }, + { + "label": "Canada", + "value": "CA" + } + ] + } + ], + "list.text": [ + { + "format": "uppercase" + } + ], + "view.text": [ + { + "format": "uppercase" + } + ] + } + }, + { + "type": "String", + "name": "postal", + "required": true, + "multiple": false, + "attributes": { + "field.input": [ + { + "type": "text" + } + ], + "is.required": true + } + } + ] + } + }, + "model": { + "User": { + "name": "User", + "attributes": { + "label": [ + "User", + "Users" + ] + }, + "columns": [ + { + "type": "String", + "name": "id", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "ID" + ], + "id": true, + "default": [ + "nanoid(20)" + ] + } + }, + { + "type": "String", + "name": "username", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Username" + ], + "searchable": true, + "field.input": [ + { + "type": "text" + } + ], + "is.required": true + } + }, + { + "type": "String", + "name": "password", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Password" + ], + "field.password": true, + "is.clt": [ + 80 + ], + "is.cgt": [ + 8 + ], + "is.required": true, + "list.hide": true, + "view.hide": true + } + }, + { + "type": "Roles", + "name": "role", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Role" + ], + "filterable": true, + "field.select": true, + "list.text": [ + { + "format": "uppercase" + } + ], + "view.text": [ + { + "format": "uppercase" + } + ] + } + }, + { + "type": "Address", + "name": "address", + "required": false, + "multiple": false, + "attributes": { + "label": [ + "Address" + ], + "list.hide": true + } + }, + { + "type": "Number", + "name": "age", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Age" + ], + "unsigned": true, + "filterable": true, + "sortable": true, + "field.number": [ + { + "min": 0, + "max": 110 + } + ], + "is.gt": [ + 0 + ], + "is.lt": [ + 150 + ] + } + }, + { + "type": "Number", + "name": "salary", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Salary" + ], + "insigned": true, + "filterable": true, + "sortable": true, + "field.number": [ + { + "min": 0 + } + ], + "list.number": true, + "view.number": true + } + }, + { + "type": "Number", + "name": "balance", + "required": true, + "multiple": true, + "attributes": { + "label": [ + "Balance" + ], + "filterable": true, + "sortable": true, + "field.number": true, + "list.number": true, + "view.number": true + } + }, + { + "type": "Text", + "name": "bio", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Bio" + ], + "field.markdown": true + } + }, + { + "type": "Boolean", + "name": "active", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Active" + ], + "default": [ + true + ], + "filterable": true, + "field.switch": true, + "list.yesno": true, + "view.yesno": true + } + }, + { + "type": "Date", + "name": "created", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Created" + ], + "default": [ + "now()" + ], + "filterable": true, + "sortable": true, + "list.date": [ + { + "format": "pretty" + } + ] + } + }, + { + "type": "Date", + "name": "updated", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Updated" + ], + "default": [ + "updated()" + ], + "filterable": true, + "sortable": true, + "list.date": [ + { + "format": "pretty" + } + ] + } + }, + { + "type": "Company", + "name": "company", + "required": false, + "multiple": false, + "attributes": { + "label": [ + "My Company" + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/model.idea b/packages/idea-parser/tests/fixtures/model.idea new file mode 100644 index 0000000..7eb12b7 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/model.idea @@ -0,0 +1,15 @@ +model User @label("User" "Users") { + id String @label("ID") @id @default("nanoid(20)") + username String @label("Username") @searchable @field.input(Text) @is.required + password String @label("Password") @field.password @is.clt(80) @is.cgt(8) @is.required @list.hide @view.hide + role Roles @label("Role") @filterable @field.select @list.text(Uppercase) @view.text(Uppercase) + address Address? @label("Address") @list.hide + age Number @label("Age") @unsigned @filterable @sortable @field.number(Age) @is.gt(0) @is.lt(150) + salary Number @label("Salary") @insigned @filterable @sortable @field.number(Price) @list.number @view.number + balance Number[] @label("Balance") @filterable @sortable @field.number() @list.number() @view.number + bio Text @label("Bio") @field.markdown + active Boolean @label("Active") @default(true) @filterable @field.switch @list.yesno @view.yesno + created Date @label("Created") @default("now()") @filterable @sortable @list.date(Pretty) + updated Date @label("Updated") @default("updated()") @filterable @sortable @list.date(Pretty) + company Company? @label("My Company") +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/model.json b/packages/idea-parser/tests/fixtures/model.json new file mode 100644 index 0000000..f52450f --- /dev/null +++ b/packages/idea-parser/tests/fixtures/model.json @@ -0,0 +1,2473 @@ +{ + "type": "VariableDeclaration", + "kind": "model", + "start": 0, + "end": 1270, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 0, + "end": 1270, + "id": { + "type": "Identifier", + "start": 6, + "end": 10, + "name": "User" + }, + "init": { + "type": "ObjectExpression", + "start": 0, + "end": 1270, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 0, + "end": 1270, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 0, + "end": 5, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 0, + "end": 5, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 11, + "end": 33, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 11, + "end": 17, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 11, + "end": 33, + "elements": [ + { + "type": "Literal", + "start": 18, + "end": 24, + "value": "User", + "raw": "'User'" + }, + { + "type": "Literal", + "start": 25, + "end": 32, + "value": "Users", + "raw": "'Users'" + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 0, + "end": 1270, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 0, + "end": 5, + "name": "columns" + }, + "value": { + "type": "ObjectExpression", + "start": 0, + "end": 5, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 38, + "end": 110, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 38, + "end": 40, + "name": "id" + }, + "value": { + "type": "ObjectExpression", + "start": 47, + "end": 110, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 47, + "end": 53, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 47, + "end": 53, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 47, + "end": 53, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 47, + "end": 110, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 47, + "end": 53, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 47, + "end": 53, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 60, + "end": 72, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 60, + "end": 66, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 60, + "end": 72, + "elements": [ + { + "type": "Literal", + "start": 67, + "end": 71, + "value": "ID", + "raw": "'ID'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 81, + "end": 84, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 81, + "end": 84, + "name": "id" + }, + "value": { + "type": "Literal", + "start": 81, + "end": 84, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 85, + "end": 107, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 85, + "end": 93, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 85, + "end": 107, + "elements": [ + { + "type": "Literal", + "start": 94, + "end": 106, + "value": "nanoid(20)", + "raw": "'nanoid(20)'" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 110, + "end": 199, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 110, + "end": 118, + "name": "username" + }, + "value": { + "type": "ObjectExpression", + "start": 119, + "end": 199, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 119, + "end": 125, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 119, + "end": 125, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 119, + "end": 125, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 119, + "end": 199, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 119, + "end": 125, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 119, + "end": 125, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 132, + "end": 150, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 132, + "end": 138, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 132, + "end": 150, + "elements": [ + { + "type": "Literal", + "start": 139, + "end": 149, + "value": "Username", + "raw": "'Username'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 153, + "end": 164, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 153, + "end": 164, + "name": "searchable" + }, + "value": { + "type": "Literal", + "start": 153, + "end": 164, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 165, + "end": 183, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 165, + "end": 177, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 165, + "end": 183, + "elements": [ + { + "type": "Identifier", + "start": 178, + "end": 182, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 184, + "end": 196, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 184, + "end": 196, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 184, + "end": 196, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 199, + "end": 318, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 199, + "end": 207, + "name": "password" + }, + "value": { + "type": "ObjectExpression", + "start": 208, + "end": 318, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 208, + "end": 214, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 208, + "end": 214, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 208, + "end": 214, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 208, + "end": 318, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 208, + "end": 214, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 208, + "end": 214, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 221, + "end": 239, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 221, + "end": 227, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 221, + "end": 239, + "elements": [ + { + "type": "Literal", + "start": 228, + "end": 238, + "value": "Password", + "raw": "'Password'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 242, + "end": 257, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 242, + "end": 257, + "name": "field.password" + }, + "value": { + "type": "Literal", + "start": 242, + "end": 257, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 258, + "end": 269, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 258, + "end": 265, + "name": "is.clt" + }, + "value": { + "type": "ArrayExpression", + "start": 258, + "end": 269, + "elements": [ + { + "type": "Literal", + "start": 266, + "end": 268, + "value": 80, + "raw": "80" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 270, + "end": 280, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 270, + "end": 277, + "name": "is.cgt" + }, + "value": { + "type": "ArrayExpression", + "start": 270, + "end": 280, + "elements": [ + { + "type": "Literal", + "start": 278, + "end": 279, + "value": 8, + "raw": "8" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 281, + "end": 293, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 281, + "end": 293, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 281, + "end": 293, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 294, + "end": 304, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 294, + "end": 304, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 294, + "end": 304, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 305, + "end": 315, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 305, + "end": 315, + "name": "view.hide" + }, + "value": { + "type": "Literal", + "start": 305, + "end": 315, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 318, + "end": 433, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 318, + "end": 322, + "name": "role" + }, + "value": { + "type": "ObjectExpression", + "start": 327, + "end": 433, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 327, + "end": 332, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 327, + "end": 332, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 327, + "end": 332, + "value": "Roles", + "raw": "\"Roles\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 327, + "end": 433, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 327, + "end": 332, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 327, + "end": 332, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 340, + "end": 354, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 340, + "end": 346, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 340, + "end": 354, + "elements": [ + { + "type": "Literal", + "start": 347, + "end": 353, + "value": "Role", + "raw": "'Role'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 361, + "end": 372, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 361, + "end": 372, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 361, + "end": 372, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 373, + "end": 386, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 373, + "end": 386, + "name": "field.select" + }, + "value": { + "type": "Literal", + "start": 373, + "end": 386, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 387, + "end": 408, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 387, + "end": 397, + "name": "list.text" + }, + "value": { + "type": "ArrayExpression", + "start": 387, + "end": 408, + "elements": [ + { + "type": "Identifier", + "start": 398, + "end": 407, + "name": "Uppercase" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 409, + "end": 430, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 409, + "end": 419, + "name": "view.text" + }, + "value": { + "type": "ArrayExpression", + "start": 409, + "end": 430, + "elements": [ + { + "type": "Identifier", + "start": 420, + "end": 429, + "name": "Uppercase" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 433, + "end": 489, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 433, + "end": 440, + "name": "address" + }, + "value": { + "type": "ObjectExpression", + "start": 442, + "end": 489, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 442, + "end": 450, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 442, + "end": 450, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 442, + "end": 450, + "value": "Address?", + "raw": "\"Address?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 442, + "end": 489, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 442, + "end": 450, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 442, + "end": 450, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 455, + "end": 472, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 455, + "end": 461, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 455, + "end": 472, + "elements": [ + { + "type": "Literal", + "start": 462, + "end": 471, + "value": "Address", + "raw": "'Address'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 476, + "end": 486, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 476, + "end": 486, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 476, + "end": 486, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 489, + "end": 607, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 489, + "end": 492, + "name": "age" + }, + "value": { + "type": "ObjectExpression", + "start": 498, + "end": 607, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 498, + "end": 504, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 498, + "end": 504, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 498, + "end": 504, + "value": "Number", + "raw": "\"Number\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 498, + "end": 607, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 498, + "end": 504, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 498, + "end": 504, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 511, + "end": 524, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 511, + "end": 517, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 511, + "end": 524, + "elements": [ + { + "type": "Literal", + "start": 518, + "end": 523, + "value": "Age", + "raw": "'Age'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 532, + "end": 541, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 532, + "end": 541, + "name": "unsigned" + }, + "value": { + "type": "Literal", + "start": 532, + "end": 541, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 542, + "end": 553, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 542, + "end": 553, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 542, + "end": 553, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 554, + "end": 563, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 554, + "end": 563, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 554, + "end": 563, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 564, + "end": 582, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 564, + "end": 577, + "name": "field.number" + }, + "value": { + "type": "ArrayExpression", + "start": 564, + "end": 582, + "elements": [ + { + "type": "Identifier", + "start": 578, + "end": 581, + "name": "Age" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 583, + "end": 592, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 583, + "end": 589, + "name": "is.gt" + }, + "value": { + "type": "ArrayExpression", + "start": 583, + "end": 592, + "elements": [ + { + "type": "Literal", + "start": 590, + "end": 591, + "value": 0, + "raw": "0" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 593, + "end": 604, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 593, + "end": 599, + "name": "is.lt" + }, + "value": { + "type": "ArrayExpression", + "start": 593, + "end": 604, + "elements": [ + { + "type": "Literal", + "start": 600, + "end": 603, + "value": 150, + "raw": "150" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 607, + "end": 731, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 607, + "end": 613, + "name": "salary" + }, + "value": { + "type": "ObjectExpression", + "start": 616, + "end": 731, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 616, + "end": 622, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 616, + "end": 622, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 616, + "end": 622, + "value": "Number", + "raw": "\"Number\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 616, + "end": 731, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 616, + "end": 622, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 616, + "end": 622, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 629, + "end": 645, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 629, + "end": 635, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 629, + "end": 645, + "elements": [ + { + "type": "Literal", + "start": 636, + "end": 644, + "value": "Salary", + "raw": "'Salary'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 650, + "end": 659, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 650, + "end": 659, + "name": "insigned" + }, + "value": { + "type": "Literal", + "start": 650, + "end": 659, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 660, + "end": 671, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 660, + "end": 671, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 660, + "end": 671, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 672, + "end": 681, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 672, + "end": 681, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 672, + "end": 681, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 682, + "end": 702, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 682, + "end": 695, + "name": "field.number" + }, + "value": { + "type": "ArrayExpression", + "start": 682, + "end": 702, + "elements": [ + { + "type": "Identifier", + "start": 696, + "end": 701, + "name": "Price" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 703, + "end": 715, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 703, + "end": 715, + "name": "list.number" + }, + "value": { + "type": "Literal", + "start": 703, + "end": 715, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 716, + "end": 728, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 716, + "end": 728, + "name": "view.number" + }, + "value": { + "type": "Literal", + "start": 716, + "end": 728, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 731, + "end": 842, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 731, + "end": 738, + "name": "balance" + }, + "value": { + "type": "ObjectExpression", + "start": 740, + "end": 842, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 740, + "end": 748, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 740, + "end": 748, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 740, + "end": 748, + "value": "Number[]", + "raw": "\"Number[]\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 740, + "end": 842, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 740, + "end": 748, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 740, + "end": 748, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 753, + "end": 770, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 753, + "end": 759, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 753, + "end": 770, + "elements": [ + { + "type": "Literal", + "start": 760, + "end": 769, + "value": "Balance", + "raw": "'Balance'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 774, + "end": 785, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 774, + "end": 785, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 774, + "end": 785, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 786, + "end": 795, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 786, + "end": 795, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 786, + "end": 795, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 796, + "end": 811, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 796, + "end": 809, + "name": "field.number" + }, + "value": { + "type": "Literal", + "start": 796, + "end": 811, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 812, + "end": 826, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 812, + "end": 824, + "name": "list.number" + }, + "value": { + "type": "Literal", + "start": 812, + "end": 826, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 827, + "end": 839, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 827, + "end": 839, + "name": "view.number" + }, + "value": { + "type": "Literal", + "start": 827, + "end": 839, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 842, + "end": 903, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 842, + "end": 845, + "name": "bio" + }, + "value": { + "type": "ObjectExpression", + "start": 851, + "end": 903, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 851, + "end": 855, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 851, + "end": 855, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 851, + "end": 855, + "value": "Text", + "raw": "\"Text\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 851, + "end": 903, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 851, + "end": 855, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 851, + "end": 855, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 864, + "end": 877, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 864, + "end": 870, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 864, + "end": 877, + "elements": [ + { + "type": "Literal", + "start": 871, + "end": 876, + "value": "Bio", + "raw": "'Bio'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 885, + "end": 900, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 885, + "end": 900, + "name": "field.markdown" + }, + "value": { + "type": "Literal", + "start": 885, + "end": 900, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 903, + "end": 1013, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 903, + "end": 909, + "name": "active" + }, + "value": { + "type": "ObjectExpression", + "start": 912, + "end": 1013, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 912, + "end": 919, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 912, + "end": 919, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 912, + "end": 919, + "value": "Boolean", + "raw": "\"Boolean\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 912, + "end": 1013, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 912, + "end": 919, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 912, + "end": 919, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 925, + "end": 941, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 925, + "end": 931, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 925, + "end": 941, + "elements": [ + { + "type": "Literal", + "start": 932, + "end": 940, + "value": "Active", + "raw": "'Active'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 946, + "end": 960, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 946, + "end": 954, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 946, + "end": 960, + "elements": [ + { + "type": "Literal", + "start": 955, + "end": 959, + "value": true, + "raw": "true" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 961, + "end": 972, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 961, + "end": 972, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 961, + "end": 972, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 973, + "end": 986, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 973, + "end": 986, + "name": "field.switch" + }, + "value": { + "type": "Literal", + "start": 973, + "end": 986, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 987, + "end": 998, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 987, + "end": 998, + "name": "list.yesno" + }, + "value": { + "type": "Literal", + "start": 987, + "end": 998, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 999, + "end": 1010, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 999, + "end": 1010, + "name": "view.yesno" + }, + "value": { + "type": "Literal", + "start": 999, + "end": 1010, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1013, + "end": 1117, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1013, + "end": 1020, + "name": "created" + }, + "value": { + "type": "ObjectExpression", + "start": 1022, + "end": 1117, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1022, + "end": 1026, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1022, + "end": 1026, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1022, + "end": 1026, + "value": "Date", + "raw": "\"Date\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1022, + "end": 1117, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1022, + "end": 1026, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1022, + "end": 1026, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1035, + "end": 1052, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1035, + "end": 1041, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1035, + "end": 1052, + "elements": [ + { + "type": "Literal", + "start": 1042, + "end": 1051, + "value": "Created", + "raw": "'Created'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1056, + "end": 1073, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1056, + "end": 1064, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 1056, + "end": 1073, + "elements": [ + { + "type": "Literal", + "start": 1065, + "end": 1072, + "value": "now()", + "raw": "'now()'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1074, + "end": 1085, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1074, + "end": 1085, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1074, + "end": 1085, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1086, + "end": 1095, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1086, + "end": 1095, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1086, + "end": 1095, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1096, + "end": 1114, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1096, + "end": 1106, + "name": "list.date" + }, + "value": { + "type": "ArrayExpression", + "start": 1096, + "end": 1114, + "elements": [ + { + "type": "Identifier", + "start": 1107, + "end": 1113, + "name": "Pretty" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1117, + "end": 1225, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1117, + "end": 1124, + "name": "updated" + }, + "value": { + "type": "ObjectExpression", + "start": 1126, + "end": 1225, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1126, + "end": 1130, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1126, + "end": 1130, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1126, + "end": 1130, + "value": "Date", + "raw": "\"Date\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1126, + "end": 1225, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1126, + "end": 1130, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1126, + "end": 1130, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1139, + "end": 1156, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1139, + "end": 1145, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1139, + "end": 1156, + "elements": [ + { + "type": "Literal", + "start": 1146, + "end": 1155, + "value": "Updated", + "raw": "'Updated'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1160, + "end": 1181, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1160, + "end": 1168, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 1160, + "end": 1181, + "elements": [ + { + "type": "Literal", + "start": 1169, + "end": 1180, + "value": "updated()", + "raw": "'updated()'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1182, + "end": 1193, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1182, + "end": 1193, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1182, + "end": 1193, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1194, + "end": 1203, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1194, + "end": 1203, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1194, + "end": 1203, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1204, + "end": 1222, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1204, + "end": 1214, + "name": "list.date" + }, + "value": { + "type": "ArrayExpression", + "start": 1204, + "end": 1222, + "elements": [ + { + "type": "Identifier", + "start": 1215, + "end": 1221, + "name": "Pretty" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1225, + "end": 1269, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1225, + "end": 1232, + "name": "company" + }, + "value": { + "type": "ObjectExpression", + "start": 1234, + "end": 1269, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1234, + "end": 1242, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1234, + "end": 1242, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1234, + "end": 1242, + "value": "Company?", + "raw": "\"Company?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1234, + "end": 1269, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1234, + "end": 1242, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1234, + "end": 1242, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1247, + "end": 1267, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1247, + "end": 1253, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1247, + "end": 1267, + "elements": [ + { + "type": "Literal", + "start": 1254, + "end": 1266, + "value": "My Company", + "raw": "'My Company'" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] +} diff --git a/packages/idea-parser/tests/fixtures/plugin.idea b/packages/idea-parser/tests/fixtures/plugin.idea new file mode 100644 index 0000000..cc7e489 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/plugin.idea @@ -0,0 +1,4 @@ +plugin "./custom-plugin" { + provider "custom-client-js" + previewFeatures ["fullTextSearch"] +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/plugin.json b/packages/idea-parser/tests/fixtures/plugin.json new file mode 100644 index 0000000..8dbe2e0 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/plugin.json @@ -0,0 +1,69 @@ +{ + "type": "VariableDeclaration", + "kind": "plugin", + "start": 0, + "end": 95, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 7, + "end": 95, + "id": { + "type": "Identifier", + "start": 7, + "end": 24, + "name": "./custom-plugin" + }, + "init": { + "type": "ObjectExpression", + "start": 25, + "end": 95, + "properties": [ + { + "type": "Property", + "start": 29, + "end": 56, + "key": { + "type": "Identifier", + "start": 29, + "end": 37, + "name": "provider" + }, + "value": { + "type": "Literal", + "start": 38, + "end": 56, + "value": "custom-client-js", + "raw": "'custom-client-js'" + } + }, + { + "type": "Property", + "start": 59, + "end": 93, + "key": { + "type": "Identifier", + "start": 59, + "end": 74, + "name": "previewFeatures" + }, + "value": { + "type": "ArrayExpression", + "start": 75, + "end": 93, + "elements": [ + { + "type": "Literal", + "start": 76, + "end": 92, + "value": "fullTextSearch", + "raw": "'fullTextSearch'" + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/prop.idea b/packages/idea-parser/tests/fixtures/prop.idea new file mode 100644 index 0000000..8b4b6cf --- /dev/null +++ b/packages/idea-parser/tests/fixtures/prop.idea @@ -0,0 +1,10 @@ +prop Sample { + type "text" + options [ + { label "United States" value "US" } + { label "Mexico" value "MX" } + { label "Canada" value "CA" } + ] + sizes ["xl" "sm" "md"] +} + diff --git a/packages/idea-parser/tests/fixtures/prop.json b/packages/idea-parser/tests/fixtures/prop.json new file mode 100644 index 0000000..18837c2 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/prop.json @@ -0,0 +1,230 @@ +{ + "type": "VariableDeclaration", + "kind": "prop", + "start": 0, + "end": 179, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 5, + "end": 179, + "id": { + "type": "Identifier", + "name": "Sample", + "start": 5, + "end": 11 + }, + "init": { + "type": "ObjectExpression", + "start": 12, + "end": 179, + "properties": [ + { + "type": "Property", + "start": 16, + "end": 27, + "key": { + "type": "Identifier", + "start": 16, + "end": 20, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 21, + "end": 27, + "value": "text", + "raw": "'text'" + } + }, + { + "type": "Property", + "start": 30, + "end": 152, + "key": { + "type": "Identifier", + "start": 30, + "end": 37, + "name": "options" + }, + "value": { + "type": "ArrayExpression", + "start": 38, + "end": 152, + "elements": [ + { + "type": "ObjectExpression", + "start": 44, + "end": 80, + "properties": [ + { + "type": "Property", + "start": 46, + "end": 67, + "key": { + "type": "Identifier", + "start": 46, + "end": 51, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 52, + "end": 67, + "value": "United States", + "raw": "'United States'" + } + }, + { + "type": "Property", + "start": 68, + "end": 78, + "key": { + "type": "Identifier", + "start": 68, + "end": 73, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 74, + "end": 78, + "value": "US", + "raw": "'US'" + } + } + ] + }, + { + "type": "ObjectExpression", + "start": 85, + "end": 114, + "properties": [ + { + "type": "Property", + "start": 87, + "end": 101, + "key": { + "type": "Identifier", + "start": 87, + "end": 92, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 93, + "end": 101, + "value": "Mexico", + "raw": "'Mexico'" + } + }, + { + "type": "Property", + "start": 102, + "end": 112, + "key": { + "type": "Identifier", + "start": 102, + "end": 107, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 108, + "end": 112, + "value": "MX", + "raw": "'MX'" + } + } + ] + }, + { + "type": "ObjectExpression", + "start": 119, + "end": 148, + "properties": [ + { + "type": "Property", + "start": 121, + "end": 135, + "key": { + "type": "Identifier", + "start": 121, + "end": 126, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 127, + "end": 135, + "value": "Canada", + "raw": "'Canada'" + } + }, + { + "type": "Property", + "start": 136, + "end": 146, + "key": { + "type": "Identifier", + "start": 136, + "end": 141, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 142, + "end": 146, + "value": "CA", + "raw": "'CA'" + } + } + ] + } + ] + } + }, + { + "type": "Property", + "start": 155, + "end": 177, + "key": { + "type": "Identifier", + "start": 155, + "end": 160, + "name": "sizes" + }, + "value": { + "type": "ArrayExpression", + "start": 161, + "end": 177, + "elements": [ + { + "type": "Literal", + "start": 162, + "end": 166, + "value": "xl", + "raw": "'xl'" + }, + { + "type": "Literal", + "start": 167, + "end": 171, + "value": "sm", + "raw": "'sm'" + }, + { + "type": "Literal", + "start": 172, + "end": 176, + "value": "md", + "raw": "'md'" + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/references.json b/packages/idea-parser/tests/fixtures/references.json new file mode 100644 index 0000000..c777e82 --- /dev/null +++ b/packages/idea-parser/tests/fixtures/references.json @@ -0,0 +1,362 @@ +{ + "plugin": { + "./custom-plugin": { + "provider": "custom-client-js", + "url": "test", + "previewFeatures": [ + "fullTextSearch" + ] + } + }, + "prop": { + "Text": { + "type": "text" + }, + "Uppercase": { + "format": "uppercase" + }, + "Pretty": { + "format": "pretty" + }, + "Shirts": { + "sizes": [ + "xl", + "sm", + "md" + ] + }, + "Age": { + "min": 0, + "max": 110 + }, + "Price": { + "min": 0 + }, + "Countries": { + "options": [ + { + "label": "United States", + "value": "US" + }, + { + "label": "Mexico", + "value": "MX" + }, + { + "label": "Canada", + "value": "CA" + } + ] + } + }, + "enum": { + "Roles": { + "ADMIN": "Admin", + "MANAGER": "Manager", + "USER": "User" + } + }, + "type": { + "Address": { + "name": "Address", + "attributes": { + "label": [ + "Address", + "Addresses" + ] + }, + "columns": [ + { + "type": "String", + "name": "street", + "required": true, + "multiple": false, + "attributes": { + "field.input": [ + "${Text}" + ], + "is.required": true, + "list.hide": true + } + }, + { + "type": "String", + "name": "city", + "required": false, + "multiple": false, + "attributes": { + "field.input": [ + "${Text}" + ], + "is.required": true + } + }, + { + "type": "String", + "name": "country", + "required": true, + "multiple": false, + "attributes": { + "field.select": [ + "${Countries}" + ], + "is.option": [ + "${Countries}" + ], + "list.text": [ + "${Uppercase}" + ], + "view.text": [ + "${Uppercase}" + ] + } + }, + { + "type": "String", + "name": "postal", + "required": true, + "multiple": false, + "attributes": { + "field.input": [ + "${Text}" + ], + "is.required": true + } + } + ] + } + }, + "model": { + "User": { + "name": "User", + "attributes": { + "label": [ + "User", + "Users" + ] + }, + "columns": [ + { + "type": "String", + "name": "id", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "ID" + ], + "id": true, + "default": [ + "nanoid(20)" + ] + } + }, + { + "type": "String", + "name": "username", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Username" + ], + "searchable": true, + "field.input": [ + "${Text}" + ], + "is.required": true + } + }, + { + "type": "String", + "name": "password", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Password" + ], + "field.password": true, + "is.clt": [ + 80 + ], + "is.cgt": [ + 8 + ], + "is.required": true, + "list.hide": true, + "view.hide": true + } + }, + { + "type": "Roles", + "name": "role", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Role" + ], + "filterable": true, + "field.select": true, + "list.text": [ + "${Uppercase}" + ], + "view.text": [ + "${Uppercase}" + ] + } + }, + { + "type": "Address", + "name": "address", + "required": false, + "multiple": false, + "attributes": { + "label": [ + "Address" + ], + "list.hide": true + } + }, + { + "type": "Number", + "name": "age", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Age" + ], + "unsigned": true, + "filterable": true, + "sortable": true, + "field.number": [ + "${Age}" + ], + "is.gt": [ + 0 + ], + "is.lt": [ + 150 + ] + } + }, + { + "type": "Number", + "name": "salary", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Salary" + ], + "insigned": true, + "filterable": true, + "sortable": true, + "field.number": [ + "${Price}" + ], + "list.number": true, + "view.number": true + } + }, + { + "type": "Number", + "name": "balance", + "required": true, + "multiple": true, + "attributes": { + "label": [ + "Balance" + ], + "filterable": true, + "sortable": true, + "field.number": true, + "list.number": true, + "view.number": true + } + }, + { + "type": "Text", + "name": "bio", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Bio" + ], + "field.markdown": true + } + }, + { + "type": "Boolean", + "name": "active", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Active" + ], + "default": [ + true + ], + "filterable": true, + "field.switch": true, + "list.yesno": true, + "view.yesno": true + } + }, + { + "type": "Date", + "name": "created", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Created" + ], + "default": [ + "now()" + ], + "filterable": true, + "sortable": true, + "list.date": [ + "${Pretty}" + ] + } + }, + { + "type": "Date", + "name": "updated", + "required": true, + "multiple": false, + "attributes": { + "label": [ + "Updated" + ], + "default": [ + "updated()" + ], + "filterable": true, + "sortable": true, + "list.date": [ + "${Pretty}" + ] + } + }, + { + "type": "Company", + "name": "company", + "required": false, + "multiple": false, + "attributes": { + "label": [ + "My Company" + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/schema.idea b/packages/idea-parser/tests/fixtures/schema.idea new file mode 100644 index 0000000..f0330df --- /dev/null +++ b/packages/idea-parser/tests/fixtures/schema.idea @@ -0,0 +1,49 @@ +plugin "./custom-plugin" { + provider "custom-client-js" + url env("DATABASE_URL") + previewFeatures ["fullTextSearch"] +} + +prop Text { type "text" } +prop Uppercase { format "uppercase" } +prop Pretty { format "pretty" } +prop Shirts { sizes ["xl" "sm" "md"] } +prop Age { min 0 max 110 } +prop Price { min 0 } + +prop Countries { + options [ + { label "United States" value "US" } + { label "Mexico" value "MX" } + { label "Canada" value "CA" } + ] +} + +enum Roles { + ADMIN "Admin" + MANAGER "Manager" + USER "User" +} + +type Address @label("Address" "Addresses") { + street String @field.input(Text) @is.required @list.hide + city String? @field.input(Text) @is.required + country String @field.select(Countries) @is.option(Countries) @list.text(Uppercase) @view.text(Uppercase) + postal String @field.input(Text) @is.required +} + +model User @label("User" "Users") { + id String @label("ID") @id @default("nanoid(20)") + username String @label("Username") @searchable @field.input(Text) @is.required + password String @label("Password") @field.password @is.clt(80) @is.cgt(8) @is.required @list.hide @view.hide + role Roles @label("Role") @filterable @field.select @list.text(Uppercase) @view.text(Uppercase) + address Address? @label("Address") @list.hide + age Number @label("Age") @unsigned @filterable @sortable @field.number(Age) @is.gt(0) @is.lt(150) + salary Number @label("Salary") @insigned @filterable @sortable @field.number(Price) @list.number @view.number + balance Number[] @label("Balance") @filterable @sortable @field.number() @list.number() @view.number + bio Text @label("Bio") @field.markdown + active Boolean @label("Active") @default(true) @filterable @field.switch @list.yesno @view.yesno + created Date @label("Created") @default("now()") @filterable @sortable @list.date(Pretty) + updated Date @label("Updated") @default("updated()") @filterable @sortable @list.date(Pretty) + company Company? @label("My Company") +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/schema.json b/packages/idea-parser/tests/fixtures/schema.json new file mode 100644 index 0000000..d2d39ba --- /dev/null +++ b/packages/idea-parser/tests/fixtures/schema.json @@ -0,0 +1,3790 @@ +{ + "type": "Program", + "kind": "schema", + "start": 0, + "end": 2114, + "body": [ + { + "type": "VariableDeclaration", + "kind": "plugin", + "start": 0, + "end": 121, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 7, + "end": 121, + "id": { + "type": "Identifier", + "start": 7, + "end": 24, + "name": "./custom-plugin" + }, + "init": { + "type": "ObjectExpression", + "start": 25, + "end": 121, + "properties": [ + { + "type": "Property", + "start": 29, + "end": 56, + "key": { + "type": "Identifier", + "start": 29, + "end": 37, + "name": "provider" + }, + "value": { + "type": "Literal", + "start": 38, + "end": 56, + "value": "custom-client-js", + "raw": "'custom-client-js'" + } + }, + { + "type": "Property", + "start": 59, + "end": 82, + "key": { + "type": "Identifier", + "start": 59, + "end": 62, + "name": "url" + }, + "value": { + "type": "Literal", + "start": 63, + "end": 82, + "value": "test", + "raw": "'test'" + } + }, + { + "type": "Property", + "start": 85, + "end": 119, + "key": { + "type": "Identifier", + "start": 85, + "end": 100, + "name": "previewFeatures" + }, + "value": { + "type": "ArrayExpression", + "start": 101, + "end": 119, + "elements": [ + { + "type": "Literal", + "start": 102, + "end": 118, + "value": "fullTextSearch", + "raw": "'fullTextSearch'" + } + ] + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 123, + "end": 148, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 128, + "end": 148, + "id": { + "type": "Identifier", + "start": 128, + "end": 132, + "name": "Text" + }, + "init": { + "type": "ObjectExpression", + "start": 133, + "end": 148, + "properties": [ + { + "type": "Property", + "start": 135, + "end": 146, + "key": { + "type": "Identifier", + "start": 135, + "end": 139, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 140, + "end": 146, + "value": "text", + "raw": "'text'" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 149, + "end": 186, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 154, + "end": 186, + "id": { + "type": "Identifier", + "start": 154, + "end": 163, + "name": "Uppercase" + }, + "init": { + "type": "ObjectExpression", + "start": 164, + "end": 186, + "properties": [ + { + "type": "Property", + "start": 166, + "end": 184, + "key": { + "type": "Identifier", + "start": 166, + "end": 172, + "name": "format" + }, + "value": { + "type": "Literal", + "start": 173, + "end": 184, + "value": "uppercase", + "raw": "'uppercase'" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 187, + "end": 218, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 192, + "end": 218, + "id": { + "type": "Identifier", + "start": 192, + "end": 198, + "name": "Pretty" + }, + "init": { + "type": "ObjectExpression", + "start": 199, + "end": 218, + "properties": [ + { + "type": "Property", + "start": 201, + "end": 216, + "key": { + "type": "Identifier", + "start": 201, + "end": 207, + "name": "format" + }, + "value": { + "type": "Literal", + "start": 208, + "end": 216, + "value": "pretty", + "raw": "'pretty'" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 219, + "end": 257, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 224, + "end": 257, + "id": { + "type": "Identifier", + "start": 224, + "end": 230, + "name": "Shirts" + }, + "init": { + "type": "ObjectExpression", + "start": 231, + "end": 257, + "properties": [ + { + "type": "Property", + "start": 233, + "end": 255, + "key": { + "type": "Identifier", + "start": 233, + "end": 238, + "name": "sizes" + }, + "value": { + "type": "ArrayExpression", + "start": 239, + "end": 255, + "elements": [ + { + "type": "Literal", + "start": 240, + "end": 244, + "value": "xl", + "raw": "'xl'" + }, + { + "type": "Literal", + "start": 245, + "end": 249, + "value": "sm", + "raw": "'sm'" + }, + { + "type": "Literal", + "start": 250, + "end": 254, + "value": "md", + "raw": "'md'" + } + ] + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 258, + "end": 284, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 263, + "end": 284, + "id": { + "type": "Identifier", + "start": 263, + "end": 266, + "name": "Age" + }, + "init": { + "type": "ObjectExpression", + "start": 267, + "end": 284, + "properties": [ + { + "type": "Property", + "start": 269, + "end": 274, + "key": { + "type": "Identifier", + "start": 269, + "end": 272, + "name": "min" + }, + "value": { + "type": "Literal", + "start": 273, + "end": 274, + "value": 0, + "raw": "0" + } + }, + { + "type": "Property", + "start": 275, + "end": 282, + "key": { + "type": "Identifier", + "start": 275, + "end": 278, + "name": "max" + }, + "value": { + "type": "Literal", + "start": 279, + "end": 282, + "value": 110, + "raw": "110" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 285, + "end": 305, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 290, + "end": 305, + "id": { + "type": "Identifier", + "start": 290, + "end": 295, + "name": "Price" + }, + "init": { + "type": "ObjectExpression", + "start": 296, + "end": 305, + "properties": [ + { + "type": "Property", + "start": 298, + "end": 303, + "key": { + "type": "Identifier", + "start": 298, + "end": 301, + "name": "min" + }, + "value": { + "type": "Literal", + "start": 302, + "end": 303, + "value": 0, + "raw": "0" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "prop", + "start": 307, + "end": 450, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 312, + "end": 450, + "id": { + "type": "Identifier", + "start": 312, + "end": 321, + "name": "Countries" + }, + "init": { + "type": "ObjectExpression", + "start": 322, + "end": 450, + "properties": [ + { + "type": "Property", + "start": 326, + "end": 448, + "key": { + "type": "Identifier", + "start": 326, + "end": 333, + "name": "options" + }, + "value": { + "type": "ArrayExpression", + "start": 334, + "end": 448, + "elements": [ + { + "type": "ObjectExpression", + "start": 340, + "end": 376, + "properties": [ + { + "type": "Property", + "start": 342, + "end": 363, + "key": { + "type": "Identifier", + "start": 342, + "end": 347, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 348, + "end": 363, + "value": "United States", + "raw": "'United States'" + } + }, + { + "type": "Property", + "start": 364, + "end": 374, + "key": { + "type": "Identifier", + "start": 364, + "end": 369, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 370, + "end": 374, + "value": "US", + "raw": "'US'" + } + } + ] + }, + { + "type": "ObjectExpression", + "start": 381, + "end": 410, + "properties": [ + { + "type": "Property", + "start": 383, + "end": 397, + "key": { + "type": "Identifier", + "start": 383, + "end": 388, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 389, + "end": 397, + "value": "Mexico", + "raw": "'Mexico'" + } + }, + { + "type": "Property", + "start": 398, + "end": 408, + "key": { + "type": "Identifier", + "start": 398, + "end": 403, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 404, + "end": 408, + "value": "MX", + "raw": "'MX'" + } + } + ] + }, + { + "type": "ObjectExpression", + "start": 415, + "end": 444, + "properties": [ + { + "type": "Property", + "start": 417, + "end": 431, + "key": { + "type": "Identifier", + "start": 417, + "end": 422, + "name": "label" + }, + "value": { + "type": "Literal", + "start": 423, + "end": 431, + "value": "Canada", + "raw": "'Canada'" + } + }, + { + "type": "Property", + "start": 432, + "end": 442, + "key": { + "type": "Identifier", + "start": 432, + "end": 437, + "name": "value" + }, + "value": { + "type": "Literal", + "start": 438, + "end": 442, + "value": "CA", + "raw": "'CA'" + } + } + ] + } + ] + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "enum", + "start": 452, + "end": 516, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 457, + "end": 516, + "id": { + "type": "Identifier", + "start": 457, + "end": 462, + "name": "Roles" + }, + "init": { + "type": "ObjectExpression", + "start": 452, + "end": 516, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 467, + "end": 480, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 467, + "end": 472, + "name": "ADMIN" + }, + "value": { + "type": "Literal", + "start": 473, + "end": 480, + "value": "Admin", + "raw": "'Admin'" + } + }, + { + "type": "Property", + "kind": "init", + "start": 483, + "end": 500, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 483, + "end": 490, + "name": "MANAGER" + }, + "value": { + "type": "Literal", + "start": 491, + "end": 500, + "value": "Manager", + "raw": "'Manager'" + } + }, + { + "type": "Property", + "kind": "init", + "start": 503, + "end": 514, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 503, + "end": 507, + "name": "USER" + }, + "value": { + "type": "Literal", + "start": 508, + "end": 514, + "value": "User", + "raw": "'User'" + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "type", + "start": 518, + "end": 842, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 518, + "end": 842, + "id": { + "type": "Identifier", + "start": 523, + "end": 530, + "name": "Address" + }, + "init": { + "type": "ObjectExpression", + "start": 518, + "end": 842, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 518, + "end": 842, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 518, + "end": 522, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 518, + "end": 522, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 531, + "end": 560, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 531, + "end": 537, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 531, + "end": 560, + "elements": [ + { + "type": "Literal", + "start": 538, + "end": 547, + "value": "Address", + "raw": "'Address'" + }, + { + "type": "Literal", + "start": 548, + "end": 559, + "value": "Addresses", + "raw": "'Addresses'" + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 518, + "end": 842, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 518, + "end": 522, + "name": "columns" + }, + "value": { + "type": "ObjectExpression", + "start": 518, + "end": 522, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 565, + "end": 628, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 565, + "end": 571, + "name": "street" + }, + "value": { + "type": "ObjectExpression", + "start": 573, + "end": 628, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 573, + "end": 579, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 573, + "end": 579, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 573, + "end": 579, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 573, + "end": 628, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 573, + "end": 579, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 573, + "end": 579, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 583, + "end": 601, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 583, + "end": 595, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 583, + "end": 601, + "elements": [ + { + "type": "Identifier", + "start": 596, + "end": 600, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 602, + "end": 614, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 602, + "end": 614, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 602, + "end": 614, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 615, + "end": 625, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 615, + "end": 625, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 615, + "end": 625, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 628, + "end": 680, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 628, + "end": 632, + "name": "city" + }, + "value": { + "type": "ObjectExpression", + "start": 636, + "end": 680, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 636, + "end": 643, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 636, + "end": 643, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 636, + "end": 643, + "value": "String?", + "raw": "\"String?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 636, + "end": 680, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 636, + "end": 643, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 636, + "end": 643, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 646, + "end": 664, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 646, + "end": 658, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 646, + "end": 664, + "elements": [ + { + "type": "Identifier", + "start": 659, + "end": 663, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 665, + "end": 677, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 665, + "end": 677, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 665, + "end": 677, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 680, + "end": 791, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 680, + "end": 687, + "name": "country" + }, + "value": { + "type": "ObjectExpression", + "start": 688, + "end": 791, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 688, + "end": 694, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 688, + "end": 694, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 688, + "end": 694, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 688, + "end": 791, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 688, + "end": 694, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 688, + "end": 694, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 698, + "end": 722, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 698, + "end": 711, + "name": "field.select" + }, + "value": { + "type": "ArrayExpression", + "start": 698, + "end": 722, + "elements": [ + { + "type": "Identifier", + "start": 712, + "end": 721, + "name": "Countries" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 723, + "end": 744, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 723, + "end": 733, + "name": "is.option" + }, + "value": { + "type": "ArrayExpression", + "start": 723, + "end": 744, + "elements": [ + { + "type": "Identifier", + "start": 734, + "end": 743, + "name": "Countries" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 745, + "end": 766, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 745, + "end": 755, + "name": "list.text" + }, + "value": { + "type": "ArrayExpression", + "start": 745, + "end": 766, + "elements": [ + { + "type": "Identifier", + "start": 756, + "end": 765, + "name": "Uppercase" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 767, + "end": 788, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 767, + "end": 777, + "name": "view.text" + }, + "value": { + "type": "ArrayExpression", + "start": 767, + "end": 788, + "elements": [ + { + "type": "Identifier", + "start": 778, + "end": 787, + "name": "Uppercase" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 791, + "end": 841, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 791, + "end": 797, + "name": "postal" + }, + "value": { + "type": "ObjectExpression", + "start": 799, + "end": 841, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 799, + "end": 805, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 799, + "end": 805, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 799, + "end": 805, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 799, + "end": 841, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 799, + "end": 805, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 799, + "end": 805, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 809, + "end": 827, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 809, + "end": 821, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 809, + "end": 827, + "elements": [ + { + "type": "Identifier", + "start": 822, + "end": 826, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 828, + "end": 840, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 828, + "end": 840, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 828, + "end": 840, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + }, + { + "type": "VariableDeclaration", + "kind": "model", + "start": 844, + "end": 2114, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 844, + "end": 2114, + "id": { + "type": "Identifier", + "start": 850, + "end": 854, + "name": "User" + }, + "init": { + "type": "ObjectExpression", + "start": 844, + "end": 2114, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 844, + "end": 2114, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 844, + "end": 849, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 844, + "end": 849, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 855, + "end": 877, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 855, + "end": 861, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 855, + "end": 877, + "elements": [ + { + "type": "Literal", + "start": 862, + "end": 868, + "value": "User", + "raw": "'User'" + }, + { + "type": "Literal", + "start": 869, + "end": 876, + "value": "Users", + "raw": "'Users'" + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 844, + "end": 2114, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 844, + "end": 849, + "name": "columns" + }, + "value": { + "type": "ObjectExpression", + "start": 844, + "end": 849, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 882, + "end": 954, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 882, + "end": 884, + "name": "id" + }, + "value": { + "type": "ObjectExpression", + "start": 891, + "end": 954, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 891, + "end": 897, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 891, + "end": 897, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 891, + "end": 897, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 891, + "end": 954, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 891, + "end": 897, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 891, + "end": 897, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 904, + "end": 916, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 904, + "end": 910, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 904, + "end": 916, + "elements": [ + { + "type": "Literal", + "start": 911, + "end": 915, + "value": "ID", + "raw": "'ID'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 925, + "end": 928, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 925, + "end": 928, + "name": "id" + }, + "value": { + "type": "Literal", + "start": 925, + "end": 928, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 929, + "end": 951, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 929, + "end": 937, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 929, + "end": 951, + "elements": [ + { + "type": "Literal", + "start": 938, + "end": 950, + "value": "nanoid(20)", + "raw": "'nanoid(20)'" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 954, + "end": 1043, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 954, + "end": 962, + "name": "username" + }, + "value": { + "type": "ObjectExpression", + "start": 963, + "end": 1043, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 963, + "end": 969, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 963, + "end": 969, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 963, + "end": 969, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 963, + "end": 1043, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 963, + "end": 969, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 963, + "end": 969, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 976, + "end": 994, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 976, + "end": 982, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 976, + "end": 994, + "elements": [ + { + "type": "Literal", + "start": 983, + "end": 993, + "value": "Username", + "raw": "'Username'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 997, + "end": 1008, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 997, + "end": 1008, + "name": "searchable" + }, + "value": { + "type": "Literal", + "start": 997, + "end": 1008, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1009, + "end": 1027, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1009, + "end": 1021, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 1009, + "end": 1027, + "elements": [ + { + "type": "Identifier", + "start": 1022, + "end": 1026, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1028, + "end": 1040, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1028, + "end": 1040, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 1028, + "end": 1040, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1043, + "end": 1162, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1043, + "end": 1051, + "name": "password" + }, + "value": { + "type": "ObjectExpression", + "start": 1052, + "end": 1162, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1052, + "end": 1058, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1052, + "end": 1058, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1052, + "end": 1058, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1052, + "end": 1162, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1052, + "end": 1058, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1052, + "end": 1058, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1065, + "end": 1083, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1065, + "end": 1071, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1065, + "end": 1083, + "elements": [ + { + "type": "Literal", + "start": 1072, + "end": 1082, + "value": "Password", + "raw": "'Password'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1086, + "end": 1101, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1086, + "end": 1101, + "name": "field.password" + }, + "value": { + "type": "Literal", + "start": 1086, + "end": 1101, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1102, + "end": 1113, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1102, + "end": 1109, + "name": "is.clt" + }, + "value": { + "type": "ArrayExpression", + "start": 1102, + "end": 1113, + "elements": [ + { + "type": "Literal", + "start": 1110, + "end": 1112, + "value": 80, + "raw": "80" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1114, + "end": 1124, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1114, + "end": 1121, + "name": "is.cgt" + }, + "value": { + "type": "ArrayExpression", + "start": 1114, + "end": 1124, + "elements": [ + { + "type": "Literal", + "start": 1122, + "end": 1123, + "value": 8, + "raw": "8" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1125, + "end": 1137, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1125, + "end": 1137, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 1125, + "end": 1137, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1138, + "end": 1148, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1138, + "end": 1148, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 1138, + "end": 1148, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1149, + "end": 1159, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1149, + "end": 1159, + "name": "view.hide" + }, + "value": { + "type": "Literal", + "start": 1149, + "end": 1159, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1162, + "end": 1277, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1162, + "end": 1166, + "name": "role" + }, + "value": { + "type": "ObjectExpression", + "start": 1171, + "end": 1277, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1171, + "end": 1176, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1171, + "end": 1176, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1171, + "end": 1176, + "value": "Roles", + "raw": "\"Roles\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1171, + "end": 1277, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1171, + "end": 1176, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1171, + "end": 1176, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1184, + "end": 1198, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1184, + "end": 1190, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1184, + "end": 1198, + "elements": [ + { + "type": "Literal", + "start": 1191, + "end": 1197, + "value": "Role", + "raw": "'Role'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1205, + "end": 1216, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1205, + "end": 1216, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1205, + "end": 1216, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1217, + "end": 1230, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1217, + "end": 1230, + "name": "field.select" + }, + "value": { + "type": "Literal", + "start": 1217, + "end": 1230, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1231, + "end": 1252, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1231, + "end": 1241, + "name": "list.text" + }, + "value": { + "type": "ArrayExpression", + "start": 1231, + "end": 1252, + "elements": [ + { + "type": "Identifier", + "start": 1242, + "end": 1251, + "name": "Uppercase" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1253, + "end": 1274, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1253, + "end": 1263, + "name": "view.text" + }, + "value": { + "type": "ArrayExpression", + "start": 1253, + "end": 1274, + "elements": [ + { + "type": "Identifier", + "start": 1264, + "end": 1273, + "name": "Uppercase" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1277, + "end": 1333, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1277, + "end": 1284, + "name": "address" + }, + "value": { + "type": "ObjectExpression", + "start": 1286, + "end": 1333, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1286, + "end": 1294, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1286, + "end": 1294, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1286, + "end": 1294, + "value": "Address?", + "raw": "\"Address?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1286, + "end": 1333, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1286, + "end": 1294, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1286, + "end": 1294, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1299, + "end": 1316, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1299, + "end": 1305, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1299, + "end": 1316, + "elements": [ + { + "type": "Literal", + "start": 1306, + "end": 1315, + "value": "Address", + "raw": "'Address'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1320, + "end": 1330, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1320, + "end": 1330, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 1320, + "end": 1330, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1333, + "end": 1451, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1333, + "end": 1336, + "name": "age" + }, + "value": { + "type": "ObjectExpression", + "start": 1342, + "end": 1451, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1342, + "end": 1348, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1342, + "end": 1348, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1342, + "end": 1348, + "value": "Number", + "raw": "\"Number\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1342, + "end": 1451, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1342, + "end": 1348, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1342, + "end": 1348, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1355, + "end": 1368, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1355, + "end": 1361, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1355, + "end": 1368, + "elements": [ + { + "type": "Literal", + "start": 1362, + "end": 1367, + "value": "Age", + "raw": "'Age'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1376, + "end": 1385, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1376, + "end": 1385, + "name": "unsigned" + }, + "value": { + "type": "Literal", + "start": 1376, + "end": 1385, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1386, + "end": 1397, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1386, + "end": 1397, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1386, + "end": 1397, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1398, + "end": 1407, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1398, + "end": 1407, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1398, + "end": 1407, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1408, + "end": 1426, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1408, + "end": 1421, + "name": "field.number" + }, + "value": { + "type": "ArrayExpression", + "start": 1408, + "end": 1426, + "elements": [ + { + "type": "Identifier", + "start": 1422, + "end": 1425, + "name": "Age" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1427, + "end": 1436, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1427, + "end": 1433, + "name": "is.gt" + }, + "value": { + "type": "ArrayExpression", + "start": 1427, + "end": 1436, + "elements": [ + { + "type": "Literal", + "start": 1434, + "end": 1435, + "value": 0, + "raw": "0" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1437, + "end": 1448, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1437, + "end": 1443, + "name": "is.lt" + }, + "value": { + "type": "ArrayExpression", + "start": 1437, + "end": 1448, + "elements": [ + { + "type": "Literal", + "start": 1444, + "end": 1447, + "value": 150, + "raw": "150" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1451, + "end": 1575, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1451, + "end": 1457, + "name": "salary" + }, + "value": { + "type": "ObjectExpression", + "start": 1460, + "end": 1575, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1460, + "end": 1466, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1460, + "end": 1466, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1460, + "end": 1466, + "value": "Number", + "raw": "\"Number\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1460, + "end": 1575, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1460, + "end": 1466, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1460, + "end": 1466, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1473, + "end": 1489, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1473, + "end": 1479, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1473, + "end": 1489, + "elements": [ + { + "type": "Literal", + "start": 1480, + "end": 1488, + "value": "Salary", + "raw": "'Salary'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1494, + "end": 1503, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1494, + "end": 1503, + "name": "insigned" + }, + "value": { + "type": "Literal", + "start": 1494, + "end": 1503, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1504, + "end": 1515, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1504, + "end": 1515, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1504, + "end": 1515, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1516, + "end": 1525, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1516, + "end": 1525, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1516, + "end": 1525, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1526, + "end": 1546, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1526, + "end": 1539, + "name": "field.number" + }, + "value": { + "type": "ArrayExpression", + "start": 1526, + "end": 1546, + "elements": [ + { + "type": "Identifier", + "start": 1540, + "end": 1545, + "name": "Price" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1547, + "end": 1559, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1547, + "end": 1559, + "name": "list.number" + }, + "value": { + "type": "Literal", + "start": 1547, + "end": 1559, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1560, + "end": 1572, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1560, + "end": 1572, + "name": "view.number" + }, + "value": { + "type": "Literal", + "start": 1560, + "end": 1572, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1575, + "end": 1686, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1575, + "end": 1582, + "name": "balance" + }, + "value": { + "type": "ObjectExpression", + "start": 1584, + "end": 1686, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1584, + "end": 1592, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1584, + "end": 1592, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1584, + "end": 1592, + "value": "Number[]", + "raw": "\"Number[]\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1584, + "end": 1686, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1584, + "end": 1592, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1584, + "end": 1592, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1597, + "end": 1614, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1597, + "end": 1603, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1597, + "end": 1614, + "elements": [ + { + "type": "Literal", + "start": 1604, + "end": 1613, + "value": "Balance", + "raw": "'Balance'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1618, + "end": 1629, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1618, + "end": 1629, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1618, + "end": 1629, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1630, + "end": 1639, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1630, + "end": 1639, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1630, + "end": 1639, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1640, + "end": 1655, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1640, + "end": 1653, + "name": "field.number" + }, + "value": { + "type": "Literal", + "start": 1640, + "end": 1655, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1656, + "end": 1670, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1656, + "end": 1668, + "name": "list.number" + }, + "value": { + "type": "Literal", + "start": 1656, + "end": 1670, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1671, + "end": 1683, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1671, + "end": 1683, + "name": "view.number" + }, + "value": { + "type": "Literal", + "start": 1671, + "end": 1683, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1686, + "end": 1747, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1686, + "end": 1689, + "name": "bio" + }, + "value": { + "type": "ObjectExpression", + "start": 1695, + "end": 1747, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1695, + "end": 1699, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1695, + "end": 1699, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1695, + "end": 1699, + "value": "Text", + "raw": "\"Text\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1695, + "end": 1747, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1695, + "end": 1699, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1695, + "end": 1699, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1708, + "end": 1721, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1708, + "end": 1714, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1708, + "end": 1721, + "elements": [ + { + "type": "Literal", + "start": 1715, + "end": 1720, + "value": "Bio", + "raw": "'Bio'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1729, + "end": 1744, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1729, + "end": 1744, + "name": "field.markdown" + }, + "value": { + "type": "Literal", + "start": 1729, + "end": 1744, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1747, + "end": 1857, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1747, + "end": 1753, + "name": "active" + }, + "value": { + "type": "ObjectExpression", + "start": 1756, + "end": 1857, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1756, + "end": 1763, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1756, + "end": 1763, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1756, + "end": 1763, + "value": "Boolean", + "raw": "\"Boolean\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1756, + "end": 1857, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1756, + "end": 1763, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1756, + "end": 1763, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1769, + "end": 1785, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1769, + "end": 1775, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1769, + "end": 1785, + "elements": [ + { + "type": "Literal", + "start": 1776, + "end": 1784, + "value": "Active", + "raw": "'Active'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1790, + "end": 1804, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1790, + "end": 1798, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 1790, + "end": 1804, + "elements": [ + { + "type": "Literal", + "start": 1799, + "end": 1803, + "value": true, + "raw": "true" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1805, + "end": 1816, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1805, + "end": 1816, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1805, + "end": 1816, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1817, + "end": 1830, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1817, + "end": 1830, + "name": "field.switch" + }, + "value": { + "type": "Literal", + "start": 1817, + "end": 1830, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1831, + "end": 1842, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1831, + "end": 1842, + "name": "list.yesno" + }, + "value": { + "type": "Literal", + "start": 1831, + "end": 1842, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1843, + "end": 1854, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1843, + "end": 1854, + "name": "view.yesno" + }, + "value": { + "type": "Literal", + "start": 1843, + "end": 1854, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1857, + "end": 1961, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1857, + "end": 1864, + "name": "created" + }, + "value": { + "type": "ObjectExpression", + "start": 1866, + "end": 1961, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1866, + "end": 1870, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1866, + "end": 1870, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1866, + "end": 1870, + "value": "Date", + "raw": "\"Date\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1866, + "end": 1961, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1866, + "end": 1870, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1866, + "end": 1870, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1879, + "end": 1896, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1879, + "end": 1885, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1879, + "end": 1896, + "elements": [ + { + "type": "Literal", + "start": 1886, + "end": 1895, + "value": "Created", + "raw": "'Created'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1900, + "end": 1917, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1900, + "end": 1908, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 1900, + "end": 1917, + "elements": [ + { + "type": "Literal", + "start": 1909, + "end": 1916, + "value": "now()", + "raw": "'now()'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1918, + "end": 1929, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1918, + "end": 1929, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 1918, + "end": 1929, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1930, + "end": 1939, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1930, + "end": 1939, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 1930, + "end": 1939, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1940, + "end": 1958, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1940, + "end": 1950, + "name": "list.date" + }, + "value": { + "type": "ArrayExpression", + "start": 1940, + "end": 1958, + "elements": [ + { + "type": "Identifier", + "start": 1951, + "end": 1957, + "name": "Pretty" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 1961, + "end": 2069, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1961, + "end": 1968, + "name": "updated" + }, + "value": { + "type": "ObjectExpression", + "start": 1970, + "end": 2069, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1970, + "end": 1974, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1970, + "end": 1974, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 1970, + "end": 1974, + "value": "Date", + "raw": "\"Date\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 1970, + "end": 2069, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1970, + "end": 1974, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 1970, + "end": 1974, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 1983, + "end": 2000, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 1983, + "end": 1989, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 1983, + "end": 2000, + "elements": [ + { + "type": "Literal", + "start": 1990, + "end": 1999, + "value": "Updated", + "raw": "'Updated'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 2004, + "end": 2025, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2004, + "end": 2012, + "name": "default" + }, + "value": { + "type": "ArrayExpression", + "start": 2004, + "end": 2025, + "elements": [ + { + "type": "Literal", + "start": 2013, + "end": 2024, + "value": "updated()", + "raw": "'updated()'" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 2026, + "end": 2037, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2026, + "end": 2037, + "name": "filterable" + }, + "value": { + "type": "Literal", + "start": 2026, + "end": 2037, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 2038, + "end": 2047, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2038, + "end": 2047, + "name": "sortable" + }, + "value": { + "type": "Literal", + "start": 2038, + "end": 2047, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 2048, + "end": 2066, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2048, + "end": 2058, + "name": "list.date" + }, + "value": { + "type": "ArrayExpression", + "start": 2048, + "end": 2066, + "elements": [ + { + "type": "Identifier", + "start": 2059, + "end": 2065, + "name": "Pretty" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 2069, + "end": 2113, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2069, + "end": 2076, + "name": "company" + }, + "value": { + "type": "ObjectExpression", + "start": 2078, + "end": 2113, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 2078, + "end": 2086, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2078, + "end": 2086, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 2078, + "end": 2086, + "value": "Company?", + "raw": "\"Company?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 2078, + "end": 2113, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2078, + "end": 2086, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 2078, + "end": 2086, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 2091, + "end": 2111, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 2091, + "end": 2097, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 2091, + "end": 2111, + "elements": [ + { + "type": "Literal", + "start": 2098, + "end": 2110, + "value": "My Company", + "raw": "'My Company'" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/type.idea b/packages/idea-parser/tests/fixtures/type.idea new file mode 100644 index 0000000..d9e1b0d --- /dev/null +++ b/packages/idea-parser/tests/fixtures/type.idea @@ -0,0 +1,6 @@ +type Address @label("Address" "Addresses") { + street String @field.input(Text) @is.required @list.hide + city String? @field.input(Text) @is.required + country String @field.select(Countries) @is.option(Countries) @list.text(Uppercase) @view.text(Uppercase) + postal String @field.input(Text) @is.required +} \ No newline at end of file diff --git a/packages/idea-parser/tests/fixtures/type.json b/packages/idea-parser/tests/fixtures/type.json new file mode 100644 index 0000000..5260c4c --- /dev/null +++ b/packages/idea-parser/tests/fixtures/type.json @@ -0,0 +1,654 @@ +{ + "type": "VariableDeclaration", + "kind": "type", + "start": 0, + "end": 324, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 0, + "end": 324, + "id": { + "type": "Identifier", + "start": 5, + "end": 12, + "name": "Address" + }, + "init": { + "type": "ObjectExpression", + "start": 0, + "end": 324, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 0, + "end": 324, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 0, + "end": 4, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 0, + "end": 4, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 13, + "end": 42, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 13, + "end": 19, + "name": "label" + }, + "value": { + "type": "ArrayExpression", + "start": 13, + "end": 42, + "elements": [ + { + "type": "Literal", + "start": 20, + "end": 29, + "value": "Address", + "raw": "'Address'" + }, + { + "type": "Literal", + "start": 30, + "end": 41, + "value": "Addresses", + "raw": "'Addresses'" + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 0, + "end": 324, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 0, + "end": 4, + "name": "columns" + }, + "value": { + "type": "ObjectExpression", + "start": 0, + "end": 4, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 47, + "end": 110, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 47, + "end": 53, + "name": "street" + }, + "value": { + "type": "ObjectExpression", + "start": 55, + "end": 110, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 55, + "end": 61, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 55, + "end": 61, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 55, + "end": 61, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 55, + "end": 110, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 55, + "end": 61, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 55, + "end": 61, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 65, + "end": 83, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 65, + "end": 77, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 65, + "end": 83, + "elements": [ + { + "type": "Identifier", + "start": 78, + "end": 82, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 84, + "end": 96, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 84, + "end": 96, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 84, + "end": 96, + "value": true, + "raw": "true" + } + }, + { + "type": "Property", + "kind": "init", + "start": 97, + "end": 107, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 97, + "end": 107, + "name": "list.hide" + }, + "value": { + "type": "Literal", + "start": 97, + "end": 107, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 110, + "end": 162, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 110, + "end": 114, + "name": "city" + }, + "value": { + "type": "ObjectExpression", + "start": 118, + "end": 162, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 118, + "end": 125, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 118, + "end": 125, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 118, + "end": 125, + "value": "String?", + "raw": "\"String?\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 118, + "end": 162, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 118, + "end": 125, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 118, + "end": 125, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 128, + "end": 146, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 128, + "end": 140, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 128, + "end": 146, + "elements": [ + { + "type": "Identifier", + "start": 141, + "end": 145, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 147, + "end": 159, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 147, + "end": 159, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 147, + "end": 159, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 162, + "end": 273, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 162, + "end": 169, + "name": "country" + }, + "value": { + "type": "ObjectExpression", + "start": 170, + "end": 273, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 170, + "end": 176, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 170, + "end": 176, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 170, + "end": 176, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 170, + "end": 273, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 170, + "end": 176, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 170, + "end": 176, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 180, + "end": 204, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 180, + "end": 193, + "name": "field.select" + }, + "value": { + "type": "ArrayExpression", + "start": 180, + "end": 204, + "elements": [ + { + "type": "Identifier", + "start": 194, + "end": 203, + "name": "Countries" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 205, + "end": 226, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 205, + "end": 215, + "name": "is.option" + }, + "value": { + "type": "ArrayExpression", + "start": 205, + "end": 226, + "elements": [ + { + "type": "Identifier", + "start": 216, + "end": 225, + "name": "Countries" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 227, + "end": 248, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 227, + "end": 237, + "name": "list.text" + }, + "value": { + "type": "ArrayExpression", + "start": 227, + "end": 248, + "elements": [ + { + "type": "Identifier", + "start": 238, + "end": 247, + "name": "Uppercase" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 249, + "end": 270, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 249, + "end": 259, + "name": "view.text" + }, + "value": { + "type": "ArrayExpression", + "start": 249, + "end": 270, + "elements": [ + { + "type": "Identifier", + "start": 260, + "end": 269, + "name": "Uppercase" + } + ] + } + } + ] + } + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 273, + "end": 323, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 273, + "end": 279, + "name": "postal" + }, + "value": { + "type": "ObjectExpression", + "start": 281, + "end": 323, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 281, + "end": 287, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 281, + "end": 287, + "name": "type" + }, + "value": { + "type": "Literal", + "start": 281, + "end": 287, + "value": "String", + "raw": "\"String\"" + } + }, + { + "type": "Property", + "kind": "init", + "start": 281, + "end": 323, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 281, + "end": 287, + "name": "attributes" + }, + "value": { + "type": "ObjectExpression", + "start": 281, + "end": 287, + "properties": [ + { + "type": "Property", + "kind": "init", + "start": 291, + "end": 309, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 291, + "end": 303, + "name": "field.input" + }, + "value": { + "type": "ArrayExpression", + "start": 291, + "end": 309, + "elements": [ + { + "type": "Identifier", + "start": 304, + "end": 308, + "name": "Text" + } + ] + } + }, + { + "type": "Property", + "kind": "init", + "start": 310, + "end": 322, + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 310, + "end": 322, + "name": "is.required" + }, + "value": { + "type": "Literal", + "start": 310, + "end": 322, + "value": true, + "raw": "true" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/idea-parser/tsconfig.json b/packages/idea-parser/tsconfig.json new file mode 100644 index 0000000..6dbb21e --- /dev/null +++ b/packages/idea-parser/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ "es2021", "es7", "es6", "dom" ], + "module": "commonjs", + "noUnusedLocals": true, + "outDir": "./dist/", + "preserveConstEnums": true, + "resolveJsonModule": true, + "removeComments": true, + "sourceMap": false, + "strict": true, + "target": "es6", + "skipLibCheck": true + }, + "include": [ "src/**/*.ts" ], + "exclude": [ "dist", "docs", "node_modules", "tests" ] +} diff --git a/packages/idea-transformer/LICENSE b/packages/idea-transformer/LICENSE new file mode 100644 index 0000000..b396d80 --- /dev/null +++ b/packages/idea-transformer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Open Source Software PH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/idea-transformer/README.md b/packages/idea-transformer/README.md new file mode 100644 index 0000000..def9185 --- /dev/null +++ b/packages/idea-transformer/README.md @@ -0,0 +1,53 @@ +# Idea Transform + +A programmatical command line interface used by projects and that calls +on external transformers to make relevant code. + +## Install + +```bash +$ npm install @ossph/idea-transform + +... or ... + +$ yarn add @ossph/idea-transform +``` + +## Usage + +Create a bin file and paste this basic example. + +```js +#!/usr/bin/env node + +const { Terminal } = require('@ossph/idea-transform'); +new Terminal().run(); +``` + +You can whitelabel `idea` like the following. This will prefix all +outputs with `[MY LIB]` and schema files now need to have the +extension `.mylib`. + +```js +#!/usr/bin/env node + +const { Terminal } = require('@ossph/idea-transform'); +Terminal.brand = '[MY LIB]'; +Terminal.extension = 'mylib'; +new Terminal().run(); +``` + +You can also manually trigger generators that were not included in the +schema file like the following. + +```js +#!/usr/bin/env node + +const { Terminal } = require('@ossph/idea-transform'); +const terminal = new Terminal(); +terminal.generate('/location/to/generator.js', { custom: 'config' }); +``` + +> Not calling `run()` wont trigger any of the generators in the schema file. + +See [https://github.com/OSSPhilippines/idea] for more info. diff --git a/packages/idea-transformer/index.d.ts b/packages/idea-transformer/index.d.ts new file mode 100644 index 0000000..aa6bc3d --- /dev/null +++ b/packages/idea-transformer/index.d.ts @@ -0,0 +1 @@ +export * from './dist/index' \ No newline at end of file diff --git a/packages/idea-transformer/index.js b/packages/idea-transformer/index.js new file mode 100644 index 0000000..d934e7a --- /dev/null +++ b/packages/idea-transformer/index.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('./dist/index') +} \ No newline at end of file diff --git a/packages/idea-transformer/package.json b/packages/idea-transformer/package.json new file mode 100644 index 0000000..4878d3e --- /dev/null +++ b/packages/idea-transformer/package.json @@ -0,0 +1,25 @@ +{ + "name": "@ossph/idea-transformer", + "version": "0.1.0", + "license": "MIT", + "description": "A programmatical command line interface used by projects and that calls on external transformers to make relevant code", + "author": "Chris ", + "homepage": "https://github.com/OSSPhilippines/idea", + "bugs": "https://github.com/OSSPhilippines/idea/issues", + "repository": "OSSPhilippines/idea", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "build": "npm run build:tsc && npm run build:files", + "build:tsc": "tsc", + "build:files": "cp ./README.md ./dist/ && cp ./package.json ./dist/ && cp ./LICENSE ./dist/" + }, + "dependencies": { + "@ossph/idea-parser": "0.1.0" + }, + "devDependencies": { + "@types/node": "20.2.5", + "ts-node": "10.9.1", + "typescript": "5.0.4" + } +} diff --git a/packages/idea-transformer/src/index.ts b/packages/idea-transformer/src/index.ts new file mode 100644 index 0000000..84597e3 --- /dev/null +++ b/packages/idea-transformer/src/index.ts @@ -0,0 +1,9 @@ +import Exception from './types/Exception'; +import Terminal from './types/Terminal'; +import Loader from './types/Loader'; + +export { + Exception, + Terminal, + Loader +}; \ No newline at end of file diff --git a/packages/idea-transformer/src/types/Exception.ts b/packages/idea-transformer/src/types/Exception.ts new file mode 100644 index 0000000..997e6d7 --- /dev/null +++ b/packages/idea-transformer/src/types/Exception.ts @@ -0,0 +1,50 @@ +/** + * Exceptions are used to give more information + * of an error that has occured + */ +export default class Exception extends Error { + /** + * Error code + */ + public code: number; + + /** + * General use expressive reasons + */ + static for(message: string, ...values: string[]): Exception { + values.forEach(function(value) { + message = message.replace('%s', value); + }); + + return new this(message); + } + + /** + * An exception should provide a message and a name + */ + constructor(message: string, code: number = 500) { + super(); + this.message = message; + this.name = this.constructor.name; + this.code = code; + } + + /** + * Expressive way to set an error code + */ + withCode(code: number): Exception { + this.code = code; + return this; + } + + /** + * Converts error to JSON + */ + toJSON(): Record { + return { + error: true, + code: this.code, + message: this.message + }; + } +} \ No newline at end of file diff --git a/packages/idea-transformer/src/types/Loader.ts b/packages/idea-transformer/src/types/Loader.ts new file mode 100644 index 0000000..50d0047 --- /dev/null +++ b/packages/idea-transformer/src/types/Loader.ts @@ -0,0 +1,125 @@ +import fs from 'fs'; +import path from 'path'; + +import Exception from './Exception'; + +/** + * Loader + */ +export default class Loader { + /** + * Returns the absolute path to the file + */ + static absolute(pathname: string, cwd?: string) { + cwd = cwd || this.cwd(); + if (/^\.{1,2}\//.test(pathname)) { + pathname = path.resolve(cwd, pathname); + } + //if the pathname does not start with /, + //the path should start with modules + if (!pathname.startsWith('/')) { + pathname = path.resolve(this.modules(cwd), pathname); + } + return pathname; + } + + /** + * Returns the current working directory + */ + static cwd() { + return process.cwd(); + } + + /** + * Should locate the node_modules directory + * where idea is actually installed + */ + static modules(cwd?: string): string { + cwd = cwd || this.cwd(); + if (cwd === '/') { + throw new Error('Could not find node_modules'); + } + if (fs.existsSync(path.resolve(cwd, 'node_modules/@idea/generator'))) { + return path.resolve(cwd, 'node_modules'); + } + return this.modules(path.dirname(cwd)); + } + + /** + * require() should be monitored separately from the code + */ + static require(file: string) { + //if JSON, safely require it + if (path.extname(file) === '.json') { + const contents = fs.readFileSync(file, 'utf8'); + try { + return JSON.parse(contents) || {}; + } catch(e) {} + return {}; + } + + return require(file); + } + + /** + * Resolves the path name to a path that can be required + */ + static resolve(pathname?: string, cwd?: string): string { + cwd = cwd || this.cwd(); + //if no pathname + if (!pathname) { + pathname = cwd; + //ex. plugin/foo -> node_modules/plugin + //ex. ./plugin or ../plugin -> [cwd] / plugin + } else { + pathname = this.absolute(pathname, cwd); + } + //ex. /plugin/foo + //it's already absolute... + + //1. Check if pathname is literally a file + let file = pathname; + //2. check for [pathname].js + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file += '.js'; + } + //3. check for [pathname].json + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file += 'on'; + } + //4. Check for plugin.js + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = path.resolve(pathname, 'plugin.js'); + } + //5. Check for plugin.json + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file += 'on'; + } + //6. Check for package.json + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = path.resolve(pathname, 'package.json'); + } + //7. Check for index.js + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = path.resolve(pathname, 'index.js'); + } + //8. Check for index.ts + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = path.resolve(pathname, 'index.ts'); + } + //9. Check for plugin.ts + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = path.resolve(pathname, 'plugin.ts'); + } + //10. Check for [pathname].ts + if (!fs.existsSync(file) || !fs.lstatSync(file).isFile()) { + file = pathname + '.ts'; + } + + if (!fs.existsSync(file) && fs.lstatSync(file).isFile()) { + throw Exception.for('Could not resolve `%s`', pathname); + } + + return file; + } +} \ No newline at end of file diff --git a/packages/idea-transformer/src/types/Terminal.ts b/packages/idea-transformer/src/types/Terminal.ts new file mode 100644 index 0000000..f820acc --- /dev/null +++ b/packages/idea-transformer/src/types/Terminal.ts @@ -0,0 +1,319 @@ +import fs from 'fs'; + +import { final } from '@ossph/idea-parser'; + +import Loader from './Loader'; +import Exception from './Exception'; + +export default class Terminal { + // brand to prefix in all logs + public static brand: string = '[IDEA]'; + // you can use a custom extension + public static extension: string = 'idea'; + + /** + * Outputs an error log + */ + public static error(message: string, variables: string[] = []) { + this.output(message, variables, '\x1b[31m%s\x1b[0m'); + } + + /** + * Outputs an info log + */ + public static info(message: string, variables: string[] = []) { + this.output(message, variables, '\x1b[34m%s\x1b[0m'); + } + + /** + * Outputs a log + */ + public static output( + message: string, + variables: string[] = [], + color?: string + ) { + //add variables to message + for (const variable of variables) { + message = message.replace('%s', variable); + } + //add brand to message + message = `${this.brand} ${message}`; + //colorize the message + if (color) { + console.log(color, message); + return; + } + //or just output the message + console.log(message); + } + + /** + * Creates the name space given the space + * and sets the value to that name space + */ + public static params(...args: string[]) { + + const params: Record = {}; + + const format = ( + key: string|number, + value: any, + override?: boolean + ) => { + //parse value + switch (true) { + case typeof value !== 'string': + break; + case value === 'true': + value = true; + break; + case value === 'false': + value = false; + break; + case !isNaN(value) && !isNaN(parseFloat(value)): + value = parseFloat(value); + break; + case !isNaN(value) && !isNaN(parseInt(value)): + value = parseInt(value); + break; + } + + key = String(key); + + //if it's not set yet + if (typeof params[key] === 'undefined' || override) { + //just set it + params[key] = value; + return; + } + + //it is set + const current = params[key]; + //if it's not an array + if (!Array.isArray(current)) { + //make it into an array + params[key] = [current, value]; + return; + } + + //push the value + current.push(value); + params[key] = current; + return; + }; + + let key, index = 0, i = 0, j = args.length; + for (; i < j; i++) { + const arg = args[i]; + const equalPosition = arg.indexOf('='); + // --foo --bar=baz + if (arg.substr(0, 2) === '--') { + // --foo --foo baz + if (equalPosition === -1) { + key = arg.substr(2); + // --foo value + if ((i + 1) < j && args[i + 1][0] !== '-') { + format(key, args[i + 1]); + i++; + continue; + } + // --foo + format(key, true); + continue; + } + + // --bar=baz + format( + arg.substr(2, equalPosition - 2), + arg.substr(equalPosition + 1) + ); + continue; + } + + // -k=value -abc + if (arg.substr(0, 1) === '-') { + // -k=value + if (arg.substr(2, 1) === '=') { + format(arg.substr(1, 1), arg.substr(3)); + continue; + } + + // -abc + const chars = arg.substr(1); + for (let k = 0; k < chars.length; k++) { + key = chars[k]; + format(key, true); + } + + // -a value1 -abc value2 + if ((i + 1) < j && args[i + 1][0] !== '-') { + format(key as string, args[i + 1], true); + i++; + } + + continue; + } + + if (equalPosition !== -1) { + format( + arg.substr(0, equalPosition), + arg.substr(equalPosition + 1) + ); + continue; + } + + if (arg.length) { + // plain-arg + format(index++, arg); + } + } + + return params; + } + + /** + * Outputs a success log + */ + public static success(message: string, variables: string[] = []) { + this.output(message, variables, '\x1b[32m%s\x1b[0m'); + } + + /** + * Outputs a system log + */ + public static system(message: string, variables: string[] = []) { + this.output(message, variables, '\x1b[35m%s\x1b[0m'); + } + + /** + * Outputs a warning log + */ + public static warning(message: string, variables: string[] = []) { + this.output(message, variables, '\x1b[33m%s\x1b[0m'); + } + + //access to static methods from the instance + protected _terminal: typeof Terminal; + //cached cli args + protected _args: string[]; + //cached input file + protected _input = ''; + //cached terminal params (parsed argv) + protected _params: Record|null = null; + //cached schema + protected _schema: Record|null = null; + + /** + * Creates the loader instance + */ + get params() { + if (!this._params) { + this._params = this.terminal.params(...this._args); + } + return this._params; + } + + /** + * Tries to load the schema file + */ + get schema() { + if (!this._schema) { + //check if input file exists + if (!fs.existsSync(this._input)) { + throw Exception.for('Input file %s does not exist', this._input); + } + this._schema = final(fs.readFileSync(this._input, 'utf8')); + } + + return this._schema as Record; + } + + /** + * Returns the static terminal interface + */ + get terminal() { + return this._terminal; + } + + /** + * Sets the input file + */ + set input(input: string) { + //check input file for relative pathing, then make it absolute + this._input = Loader.absolute(input); + this._schema = null; + } + + /** + * Preloads the input and output settings + */ + constructor() { + //find cwd + const cwd = Loader.cwd(); + //get params + this._args = process.argv.slice(2); + this._terminal = this.constructor as typeof Terminal; + //get io from commandline + this.input = this.expect( + [ 'input', 'i' ], + `${cwd}/schema.${this._terminal.extension}` + ); + } + + /** + * Retrieves the first value found from the given flag/s in cli + */ + public expect(flags: string[], defaults: any) { + for (const flag of flags) { + if (this.params[flag]) { + return this.params[flag]; + } + } + return defaults; + } + + /** + * Calls the generator plugin + */ + public generate(callback: Function, config: Record = {}) { + //if no plugins defined throw error + if (!this.schema.plugin) { + throw Exception.for('No plugins defined in schema file'); + } + const { plugin, prop, ...schema } = this.schema; + //call the callback + callback({ config, schema, cli: this }); + } + + /** + * Runs the cli + */ + public run() { + //if no plugins defined throw error + if (!this.schema.plugin) { + throw Exception.for('No plugins defined in schema file'); + } + //extract plugins from the schema + const { plugin: plugins, ...schema } = this.schema; + //loop through plugins + for (const plugin in plugins) { + //determine the module path + const module = Loader.absolute(plugin, Loader.cwd()); + //get the plugin config + const config = this.schema.plugin[plugin] as Record; + //load the callback + let callback = Loader.require(module); + //check for default + if (callback.default) { + callback = callback.default; + } + //check if it's a function + if (typeof callback === 'function') { + //call the callback + callback({ config, schema, cli: this }); + } + //dont do anything else if it's not a function + } + } +} \ No newline at end of file diff --git a/packages/idea-transformer/tsconfig.json b/packages/idea-transformer/tsconfig.json new file mode 100644 index 0000000..29034a6 --- /dev/null +++ b/packages/idea-transformer/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ "es2021", "es7", "es6", "dom" ], + "module": "commonjs", + "noUnusedLocals": true, + "outDir": "./dist/", + "preserveConstEnums": true, + "resolveJsonModule": true, + "removeComments": true, + "sourceMap": false, + "strict": true, + "target": "es6", + "skipLibCheck": true + }, + "include": [ "src/**/*.ts" ], + "exclude": [ "dist", "docs", "node_modules", "test"] +} diff --git a/packages/idea/LICENSE b/packages/idea/LICENSE new file mode 100644 index 0000000..b396d80 --- /dev/null +++ b/packages/idea/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Open Source Software PH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/idea/README.md b/packages/idea/README.md new file mode 100644 index 0000000..89bd292 --- /dev/null +++ b/packages/idea/README.md @@ -0,0 +1,85 @@ +# 💡 Idea + +A meta language to express and transform your ideas to reality. +It all starts with an idea... + +## Install + +```bash +$ npm i -D @ossph/idea +``` + +## Usage + +This is an example idea schema. + +```js +//my.idea +model Product @label("Product" "Products") @suggested("[name]") @icon("gift") { + name String @label("Name") + @field.text + @is.required("Name is required") + @list.detail @view.text + + image String @label("Image") + @field.image + @list.image({ width 20 height 20 }) + @view.image({ width 100 height 100 }) + + description String @label("Description") + @field.textarea + @list.none @view.text + + currency String @label("Currency") + @filterable @default("USD") + @field.currency + @is.ceq(3 "Should be valid currency prefix") + @list.text @view.text + + srp Float? @label("SRP") + @min(0.00) @step(0.01) + @field.number({ min 0.00 step 0.01 }) + @list.price @view.price + + price Float? @label("Offer Price") + @min(0.00) @step(0.01) + @field.number({ min 0.00 step 0.01 }) + @list.price @view.price +} +``` + +> "Ideas are worthless without execution" - Many People + +To transform an idea, you need to plugin a transformer like the +following example. + +```js +//my.idea +plugin "@ossph/idea-typescript" { + ts true + output "./src/types.ts" +} +// ... your idea ... +// model Product ... +``` + +You can use other ideas, just import them like the following example. + +```js +//my.idea +use "./another.idea" +// ... your idea ... +// model Product ... +``` + +To execute an idea, you just need to run the following command. + +```bash +$ npx idea -i my.idea +``` + +Learn more: + + - [Form an Idea](//github.com/OSSPhilippines/idea/blob/main/docs/schema.md) + - [Transform an Idea](//github.com/OSSPhilippines/idea/blob/main/docs/transform.md) + - [Contribute to Idea](//github.com/OSSPhilippines/idea/blob/main/docs/contribute.md) \ No newline at end of file diff --git a/packages/idea/bin.js b/packages/idea/bin.js new file mode 100755 index 0000000..21d805d --- /dev/null +++ b/packages/idea/bin.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +"use strict"; + +require("./dist/bin"); \ No newline at end of file diff --git a/packages/idea/index.d.ts b/packages/idea/index.d.ts new file mode 100644 index 0000000..aa6bc3d --- /dev/null +++ b/packages/idea/index.d.ts @@ -0,0 +1 @@ +export * from './dist/index' \ No newline at end of file diff --git a/packages/idea/index.js b/packages/idea/index.js new file mode 100644 index 0000000..d934e7a --- /dev/null +++ b/packages/idea/index.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('./dist/index') +} \ No newline at end of file diff --git a/packages/idea/package.json b/packages/idea/package.json new file mode 100644 index 0000000..8c301cf --- /dev/null +++ b/packages/idea/package.json @@ -0,0 +1,27 @@ +{ + "name": "@ossph/idea", + "version": "0.1.0", + "license": "MIT", + "description": "An open source schema file standard and generator", + "author": "Chris ", + "homepage": "https://github.com/OSSPhilippines/idea", + "bugs": "https://github.com/OSSPhilippines/idea/issues", + "repository": "OSSPhilippines/idea", + "bin": { + "idea": "./bin.js" + }, + "scripts": { + "build": "npm run build:tsc && npm run build:files", + "build:tsc": "tsc", + "build:files": "cp ./README.md ./dist/ && cp ./package.json ./dist/ && cp ./LICENSE ./dist/" + }, + "dependencies": { + "@ossph/idea-parser": "0.1.0", + "@ossph/idea-transformer": "0.1.0" + }, + "devDependencies": { + "@types/node": "20.2.5", + "ts-node": "10.9.1", + "typescript": "5.0.4" + } +} diff --git a/packages/idea/src/bin.ts b/packages/idea/src/bin.ts new file mode 100644 index 0000000..c8de2e6 --- /dev/null +++ b/packages/idea/src/bin.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env node +import { Terminal } from '@ossph/idea-transformer'; +new Terminal().run(); \ No newline at end of file diff --git a/packages/idea/src/index.ts b/packages/idea/src/index.ts new file mode 100644 index 0000000..8c3305e --- /dev/null +++ b/packages/idea/src/index.ts @@ -0,0 +1,10 @@ +import type { PluginConfig, SchemaConfig } from '@ossph/idea-parser'; +import { Terminal, Loader } from '@ossph/idea-transformer'; + +export * from '@ossph/idea-parser'; +export { Terminal, Loader }; +export type PluginProps = { + config: PluginConfig, + schema: SchemaConfig, + cli: Terminal +}; \ No newline at end of file diff --git a/packages/idea/tsconfig.json b/packages/idea/tsconfig.json new file mode 100644 index 0000000..29034a6 --- /dev/null +++ b/packages/idea/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ "es2021", "es7", "es6", "dom" ], + "module": "commonjs", + "noUnusedLocals": true, + "outDir": "./dist/", + "preserveConstEnums": true, + "resolveJsonModule": true, + "removeComments": true, + "sourceMap": false, + "strict": true, + "target": "es6", + "skipLibCheck": true + }, + "include": [ "src/**/*.ts" ], + "exclude": [ "dist", "docs", "node_modules", "test"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..925207e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2730 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.23.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.4" + "@babel/parser" "^7.24.4" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" + integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.14.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/runtime@^7.21.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== + dependencies: + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/environment@^29.5.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.5.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.5.0", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@ts-morph/common@~0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.23.0.tgz#bd4ddbd3f484f29476c8bd985491592ae5fc147e" + integrity sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA== + dependencies: + fast-glob "^3.3.2" + minimatch "^9.0.3" + mkdirp "^3.0.1" + path-browserify "^1.0.1" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/chai@4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + +"@types/deep-equal-in-any-order@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/deep-equal-in-any-order/-/deep-equal-in-any-order-1.0.1.tgz#0559d855797a5034e187f248b23a4490e5444f2e" + integrity sha512-hUWUUE53WjKfcCncSmWmNXVNNT+0Iz7gYFnov3zdCXrX3Thxp1Cnmfd5LwWOeCVUV5LhpiFgS05vaAG72doo9w== + +"@types/expect@24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@types/expect/-/expect-24.3.0.tgz#d7cab8b3c10c2d92a0cbb31981feceb81d3486f1" + integrity sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ== + dependencies: + expect "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + +"@types/mocha@^9.1.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +"@types/node@20.2.5": + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + +"@types/node@^16.18.34": + version "16.18.96" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.96.tgz#eb0012d23ff53d14d64ec8a352bf89792de6aade" + integrity sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ== + +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.54.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.54.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001587: + version "1.0.30001609" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz#fc34fad75c0c6d6d6303bdbceec2da8f203dabd6" + integrity sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA== + +chai@4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +code-block-writer@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-13.0.1.tgz#52ac60ca6076d8700b88a45bd71e06a577158405" + integrity sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concurrently@7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a" + integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw== + dependencies: + chalk "^4.1.0" + date-fns "^2.29.1" + lodash "^4.17.21" + rxjs "^7.0.0" + shell-quote "^1.7.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^17.3.1" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^2.29.1: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@4.3.4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-equal-in-any-order@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/deep-equal-in-any-order/-/deep-equal-in-any-order-2.0.6.tgz#9fb208dfc6836e35e2d4c942db85fc291820318a" + integrity sha512-RfnWHQzph10YrUjvWwhd15Dne8ciSJcZ3U6OD7owPwiVwsdE5IFSoZGg8rlwJD11ES+9H5y8j3fCofviRHOqLQ== + dependencies: + lodash.mapvalues "^4.6.0" + sort-any "^2.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.4.668: + version "1.4.736" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz#ecb4348f4d5c70fb1e31c347e5bad6b751066416" + integrity sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.35.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + 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.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +expect@*, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0, get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0, jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.1: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mocha@10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mocha@^9.2.1: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.0.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@7.x, semver@^7.3.7, semver@^7.5.3: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sort-any@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-any/-/sort-any-2.0.0.tgz#62a5409c9905c9483f03e41e17f46cc451aa7c55" + integrity sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA== + dependencies: + lodash "^4.17.21" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-jest@29.0.5: + version "29.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" + integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-mocha@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-morph@22.0.0: + version "22.0.0" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-22.0.0.tgz#5532c592fb6dddae08846f12c9ab0fc590b1d42e" + integrity sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw== + dependencies: + "@ts-morph/common" "~0.23.0" + code-block-writer "^13.0.1" + +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + +typescript@^5.1.3: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==