From 688efe7265c5e01588a43e1cf5a9e28089f5b350 Mon Sep 17 00:00:00 2001 From: Silvia Chen <40706003+silviac98@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:59:24 -0800 Subject: [PATCH] Migrate unit tests to jest (#162) * Migrate test framework to Jest * Format source files with prettify * Bump CI node version to 20.x --------- Co-authored-by: Silvia Chen --- .eslintrc.js | 31 +- .github/workflows/compile-lint-test.yml | 10 +- .gitignore | 1 + .husky/pre-commit | 1 + .lintstagedrc | 4 + .mocharc.yml | 3 - .prettierrc.json | 9 + babel.config.js | 3 + jest.config.ts | 29 + package-lock.json | 17404 +++++++++++----- package.json | 102 +- scripts/transform.js | 3 +- src/completion/completeAsl.ts | 68 +- src/completion/completeSnippets.ts | 118 +- src/completion/completeStateNames.ts | 299 +- src/constants/constants.ts | 8 +- src/constants/diagnosticStrings.ts | 22 +- src/json-schema/bundled.json | 5143 +++-- src/json-schema/partial/base.json | 59 +- src/json-schema/partial/choice_state.json | 3714 ++-- src/json-schema/partial/common.json | 514 +- src/json-schema/partial/fail_state.json | 80 +- src/json-schema/partial/map_state.json | 720 +- src/json-schema/partial/parallel_state.json | 131 +- src/json-schema/partial/pass_state.json | 60 +- src/json-schema/partial/states.json | 68 +- src/json-schema/partial/succeed_state.json | 46 +- src/json-schema/partial/task_state.json | 256 +- src/json-schema/partial/wait_state.json | 142 +- src/service.ts | 134 +- src/snippets/error_handling.json | 80 +- src/snippets/states.json | 482 +- src/tests/aslUtilityFunctions.test.ts | 182 +- src/tests/completion.test.ts | 666 +- src/tests/json-strings/completionStrings.ts | 207 + src/tests/jsonSchemaAsl.test.ts | 36 +- src/tests/utils/testUtilities.ts | 28 +- src/tests/validation.test.ts | 2216 +- src/tests/yaml-strings/completionStrings.ts | 322 + .../validationStrings.ts | 0 src/tests/yamlCompletion.test.ts | 1098 +- src/tests/yamlFormat.test.ts | 52 +- src/tests/yamlValidation.test.ts | 1446 +- src/utils/astUtilityFunctions.ts | 130 +- src/validation/utils/getDiagnosticsForNode.ts | 215 +- .../utils/getPropertyNodeDiagnostic.ts | 20 +- src/validation/validateProperties.ts | 46 +- src/validation/validateStates.ts | 579 +- src/validation/validationSchema.ts | 470 +- src/yaml/aslYamlLanguageService.ts | 427 +- src/yaml/yamlUtils.ts | 755 +- 51 files changed, 22998 insertions(+), 15641 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 .lintstagedrc delete mode 100644 .mocharc.yml create mode 100644 .prettierrc.json create mode 100644 babel.config.js create mode 100644 jest.config.ts create mode 100644 src/tests/json-strings/completionStrings.ts create mode 100644 src/tests/yaml-strings/completionStrings.ts rename src/tests/{yasl-strings => yaml-strings}/validationStrings.ts (100%) diff --git a/.eslintrc.js b/.eslintrc.js index c4afbdf51..2f5261346 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,7 @@ +/*! + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT + */ module.exports = { extends: [ @@ -6,14 +10,25 @@ module.exports = { 'plugin:@typescript-eslint/recommended', ], plugins: ['@typescript-eslint'], - + rules: { - "@typescript-eslint/return-await": 'off', - "@typescript-eslint/no-inferrable-types": 'warn', - "@typescript-eslint/no-explicit-any": 'warn', + '@typescript-eslint/no-explicit-any': 'off', 'no-console': 'warn', - 'prefer-const': 'warn', - 'no-useless-escape': 'warn' + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + caughtErrors: 'none', + argsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-unused-expressions': [ + 'error', + { + allowShortCircuit: true, + allowTernary: true, + }, + ], }, - ignorePatterns: ['*.js', '*.d.ts', 'node_modules/'], -} \ No newline at end of file + ignorePatterns: ['*.js', '*.d.ts', 'node_modules/', 'src/tests/yaml-strings', 'src/tests/json-strings'], + } + \ No newline at end of file diff --git a/.github/workflows/compile-lint-test.yml b/.github/workflows/compile-lint-test.yml index 1ef57c589..f40861136 100644 --- a/.github/workflows/compile-lint-test.yml +++ b/.github/workflows/compile-lint-test.yml @@ -2,18 +2,20 @@ name: compile-lint-test on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] jobs: build: - runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x] + # To avoid compatibility problems, pin the CI node.js version to node version used by VSCode Electron + # so integration testing will not rely on a later version of node than exists in the default VS Code execution env. + # Full table with details here: https://github.com/ewanharris/vscode-versions + node-version: [20.x] steps: - uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index e126fe310..dfaaad5f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store node_modules out +coverage \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..af5adff9d --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +lint-staged \ No newline at end of file diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 000000000..4e2714d3c --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,4 @@ +{ + "*.{js,yml,json,md}": "prettier --write", + "*.ts": ["eslint --fix", "prettier --write"] +} \ No newline at end of file diff --git a/.mocharc.yml b/.mocharc.yml deleted file mode 100644 index 2aa36ffae..000000000 --- a/.mocharc.yml +++ /dev/null @@ -1,3 +0,0 @@ -spec: ./out/tests/**/*.js -ui: tdd -color: true \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..49562ed25 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json.schemastore.org/prettierrc", + "tabWidth": 2, + "trailingComma": "all", + "semi": false, + "useTabs": false, + "singleQuote": true, + "printWidth": 120 +} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000..a76dfe630 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [['@babel/preset-env', { targets: { node: 'current' } }]], +} diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 000000000..27cfd73cc --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,29 @@ +/*! + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT + */ + +/** @type {import('ts-jest').JestConfigWithTsJest} */ + +const transformCodeInPackages = [] + +module.exports = { + preset: 'ts-jest', + testMatch: ['**/src/**/?(*.)+(spec|test).ts'], + + coverageReporters: ['cobertura', 'html', 'text'], + collectCoverageFrom: ['src/**/*.ts'], + coveragePathIgnorePatterns: ['^.*/scripts/.*$', '^.*/schema/.*$', '^.*/tests/.*$', 'interface.ts'], + transformIgnorePatterns: [`/node_modules/(?!${transformCodeInPackages.join('|')}).+\\.js$`], + transform: { + '^.+\\.(ts|tsx)?$': 'ts-jest', + '^.+\\.(js|jsx)$': [ + 'babel-jest', + { + presets: ['@babel/preset-env'], + plugins: [['@babel/transform-runtime']], + }, + ], + }, + clearMocks: true, +} diff --git a/package-lock.json b/package-lock.json index d6b9f55d7..4a970325a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4699 +1,12709 @@ { - "name": "amazon-states-language-service", - "version": "1.14.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "amazon-states-language-service", - "version": "1.14.0", - "license": "MIT", - "dependencies": { - "js-yaml": "^4.1.0", - "vscode-json-languageservice": "5.3.5", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.0", - "vscode-languageserver-types": "^3.15.1", - "yaml-language-server": "0.15.0" - }, - "devDependencies": { - "@types/js-yaml": "^4.0.5", - "@types/mocha": "^10.0.1", - "@types/node": "^20.2.5", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "eslint": "^8.57.0", - "json-schema-ref-parser": "^7.1.3", - "mocha": "^10.2.0", - "typescript": "^5.0.4" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "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/eslintrc/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/js-yaml": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", - "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "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/eslint-plugin/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "peer": true, - "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/parser/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "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/type-utils/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "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/typescript-estree/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "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/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "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/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", - "dev": true - }, - "node_modules/@vscode/l10n": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.13.tgz", - "integrity": "sha512-A3uY356uOU9nGa+TQIT/i3ziWUgJjVMUrGGXSrtRiTwklyCFjGVWIOHoEIHbJpiyhDkJd9kvIWUOfXK1IkK8XQ==" - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@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" - }, - "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": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "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/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dependencies": { - "agent-base": "4", - "debug": "3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-ref-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-7.1.4.tgz", - "integrity": "sha512-AD7bvav0vak1/63w3jH8F7eHId/4E4EPdMAEZhGxtjktteUv9dnNB/cJy6nVnMyoTPBJnLwFK6tiQPSTeleCtQ==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1", - "ono": "^6.0.0" - } - }, - "node_modules/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonc-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", - "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "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" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/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/mocha/node_modules/debug/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/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/ono": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ono/-/ono-6.0.1.tgz", - "integrity": "sha512-5rdYW/106kHqLeG22GE2MHKq+FlsxMERZev9DCzQX1zwkxnFwBivSn5i17a5O/rDmOJOdf4Wyt80UZljzx9+DA==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/request-light": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.5.tgz", - "integrity": "sha512-eBEh+GzJAftUnex6tcL6eV2JCifY0+sZMIUpUPOVXbs2nV5hla4ZMmO3icYKGuGVuQ2zHE9evh4OrRcH4iyYYw==", - "dependencies": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "vscode-nls": "^4.1.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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" - } - ] - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vscode-json-languageservice": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.3.5.tgz", - "integrity": "sha512-DasT+bKtpaS2rTPEB4VMROnvO1WES2KD8RZZxXbumnk9sk5wco10VdB6sJgTlsKQN14tHQLZDXuHnSoSAlE8LQ==", - "dependencies": { - "@vscode/l10n": "^0.0.13", - "jsonc-parser": "^3.2.0", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.3", - "vscode-uri": "^3.0.7" - } - }, - "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - }, - "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==" - }, - "node_modules/vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml-language-server": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.15.0.tgz", - "integrity": "sha512-idaCYstdGoV5Pi7PKxbUkGHt6jAI3l+nxNWrsVCetxrEgfH6T7qytfT0pF3n4NdfDNPHPHcqnl69FzCFDVfHnQ==", - "dependencies": { - "js-yaml": "^3.13.1", - "jsonc-parser": "^2.2.1", - "request-light": "^0.2.4", - "vscode-json-languageservice": "^3.10.0", - "vscode-languageserver": "^5.2.1", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-nls": "^4.1.2", - "vscode-uri": "^2.1.1", - "yaml-language-server-parser": "0.1.2" - }, - "bin": { - "yaml-language-server": "bin/yaml-language-server" - }, - "engines": { - "node": "*" - }, - "optionalDependencies": { - "prettier": "2.0.5" - } - }, - "node_modules/yaml-language-server-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yaml-language-server-parser/-/yaml-language-server-parser-0.1.2.tgz", - "integrity": "sha512-GQ2eRE5GcKBK8XVKBIcMyOfC8WMZmEs6gogtVc6knLKE6pG+e5L/lOMfBxZzAt2lqye5itMggQ9+6stXAVhMsw==" - }, - "node_modules/yaml-language-server/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/yaml-language-server/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/yaml-language-server/node_modules/prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "optional": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz", - "integrity": "sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA==", - "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "3.16.0-next.2", - "vscode-nls": "^5.0.0", - "vscode-uri": "^2.1.2" - } - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-languageserver-types": { - "version": "3.16.0-next.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", - "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.1.tgz", - "integrity": "sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A==" - }, - "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==", - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", - "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", - "dependencies": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", - "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", - "dependencies": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" - } - }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", - "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" - }, - "node_modules/yaml-language-server/node_modules/vscode-nls": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz", - "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" - }, - "node_modules/yaml-language-server/node_modules/vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.4.3" - } - }, - "@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "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" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - } - } - }, - "@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/js-yaml": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", - "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "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" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "peer": 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" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.3" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - } - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "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" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "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": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", - "dev": true - }, - "@vscode/l10n": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.13.tgz", - "integrity": "sha512-A3uY356uOU9nGa+TQIT/i3ziWUgJjVMUrGGXSrtRiTwklyCFjGVWIOHoEIHbJpiyhDkJd9kvIWUOfXK1IkK8XQ==" - }, - "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@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" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "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.8" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "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", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-schema-ref-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-7.1.4.tgz", - "integrity": "sha512-AD7bvav0vak1/63w3jH8F7eHId/4E4EPdMAEZhGxtjktteUv9dnNB/cJy6nVnMyoTPBJnLwFK6tiQPSTeleCtQ==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1", - "ono": "^6.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "jsonc-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", - "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "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" - }, - "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==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "ono": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ono/-/ono-6.0.1.tgz", - "integrity": "sha512-5rdYW/106kHqLeG22GE2MHKq+FlsxMERZev9DCzQX1zwkxnFwBivSn5i17a5O/rDmOJOdf4Wyt80UZljzx9+DA==", - "dev": true - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "request-light": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.5.tgz", - "integrity": "sha512-eBEh+GzJAftUnex6tcL6eV2JCifY0+sZMIUpUPOVXbs2nV5hla4ZMmO3icYKGuGVuQ2zHE9evh4OrRcH4iyYYw==", - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "vscode-nls": "^4.1.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "vscode-json-languageservice": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.3.5.tgz", - "integrity": "sha512-DasT+bKtpaS2rTPEB4VMROnvO1WES2KD8RZZxXbumnk9sk5wco10VdB6sJgTlsKQN14tHQLZDXuHnSoSAlE8LQ==", - "requires": { - "@vscode/l10n": "^0.0.13", - "jsonc-parser": "^3.2.0", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.3", - "vscode-uri": "^3.0.7" - }, - "dependencies": { - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - } - } - }, - "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==" - }, - "vscode-nls": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", - "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaml-language-server": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.15.0.tgz", - "integrity": "sha512-idaCYstdGoV5Pi7PKxbUkGHt6jAI3l+nxNWrsVCetxrEgfH6T7qytfT0pF3n4NdfDNPHPHcqnl69FzCFDVfHnQ==", - "requires": { - "js-yaml": "^3.13.1", - "jsonc-parser": "^2.2.1", - "prettier": "2.0.5", - "request-light": "^0.2.4", - "vscode-json-languageservice": "^3.10.0", - "vscode-languageserver": "^5.2.1", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-nls": "^4.1.2", - "vscode-uri": "^2.1.1", - "yaml-language-server-parser": "0.1.2" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "optional": true - }, - "vscode-json-languageservice": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz", - "integrity": "sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA==", - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "3.16.0-next.2", - "vscode-nls": "^5.0.0", - "vscode-uri": "^2.1.2" - }, - "dependencies": { - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" - }, - "vscode-languageserver-types": { - "version": "3.16.0-next.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", - "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" - }, - "vscode-nls": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.1.tgz", - "integrity": "sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A==" - } - } - }, - "vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" - }, - "vscode-languageserver": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", - "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", - "requires": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" - }, - "dependencies": { - "vscode-uri": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", - "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" - } - } - }, - "vscode-languageserver-protocol": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", - "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", - "requires": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" - }, - "dependencies": { - "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - } - } - }, - "vscode-nls": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz", - "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" - }, - "vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" - } - } - }, - "yaml-language-server-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yaml-language-server-parser/-/yaml-language-server-parser-0.1.2.tgz", - "integrity": "sha512-GQ2eRE5GcKBK8XVKBIcMyOfC8WMZmEs6gogtVc6knLKE6pG+e5L/lOMfBxZzAt2lqye5itMggQ9+6stXAVhMsw==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "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" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "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", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } + "name": "amazon-states-language-service", + "version": "1.14.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "amazon-states-language-service", + "version": "1.14.0", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0", + "vscode-json-languageservice": "3.4.9", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.17.5", + "yaml-language-server": "0.15.0" + }, + "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^11.7.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "@types/jest": "^29.5.14", + "@types/js-yaml": "^4.0.5", + "@types/node": "^20.2.5", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "babel-jest": "^29.7.0", + "eslint": "^8.57.1", + "husky": "^9.1.7", + "jest": "^29.7.0", + "lint-staged": "^15.4.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.3", + "ts-node": "^10.9.2", + "typescript": "^5.0.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.0.tgz", + "integrity": "sha512-8Q/r5mXLa8Rfyh6r4SgEEFJgISVN5cDNFlcfSWLgFn3odzQhTfHAqzI3hMGdcROViL+8NrDNVVFQtEUrYOksDg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz", + "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "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/eslintrc/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", + "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz", + "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/type-utils": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", + "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", + "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz", + "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", + "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", + "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz", + "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", + "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.22.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.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=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@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" + }, + "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-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "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/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz", + "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==", + "dev": true, + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ] + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/request-light": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.5.tgz", + "integrity": "sha512-eBEh+GzJAftUnex6tcL6eV2JCifY0+sZMIUpUPOVXbs2nV5hla4ZMmO3icYKGuGVuQ2zHE9evh4OrRcH4iyYYw==", + "dependencies": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "vscode-nls": "^4.1.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "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" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.4.9.tgz", + "integrity": "sha512-4VCpZ9ooea/Zc/MTnj1ccc9C7rqcoinKVQLhLoi6jw6yueSf4y4tg/YIUiPPVMlEAG7ZCPS+NVmqxisQ+mOsSw==", + "dependencies": { + "jsonc-parser": "^2.2.0", + "vscode-languageserver-textdocument": "^1.0.0-next.4", + "vscode-languageserver-types": "^3.15.0-next.6", + "vscode-nls": "^4.1.1", + "vscode-uri": "^2.1.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/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.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/vscode-nls": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", + "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" + }, + "node_modules/vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-language-server": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.15.0.tgz", + "integrity": "sha512-idaCYstdGoV5Pi7PKxbUkGHt6jAI3l+nxNWrsVCetxrEgfH6T7qytfT0pF3n4NdfDNPHPHcqnl69FzCFDVfHnQ==", + "dependencies": { + "js-yaml": "^3.13.1", + "jsonc-parser": "^2.2.1", + "request-light": "^0.2.4", + "vscode-json-languageservice": "^3.10.0", + "vscode-languageserver": "^5.2.1", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-nls": "^4.1.2", + "vscode-uri": "^2.1.1", + "yaml-language-server-parser": "0.1.2" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + }, + "engines": { + "node": "*" + }, + "optionalDependencies": { + "prettier": "2.0.5" + } + }, + "node_modules/yaml-language-server-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yaml-language-server-parser/-/yaml-language-server-parser-0.1.2.tgz", + "integrity": "sha512-GQ2eRE5GcKBK8XVKBIcMyOfC8WMZmEs6gogtVc6knLKE6pG+e5L/lOMfBxZzAt2lqye5itMggQ9+6stXAVhMsw==" + }, + "node_modules/yaml-language-server/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/yaml-language-server/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/yaml-language-server/node_modules/prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz", + "integrity": "sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA==", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.16.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", + "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.1.tgz", + "integrity": "sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A==" + }, + "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", + "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", + "dependencies": { + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "dependencies": { + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", + "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" + }, + "node_modules/yaml-language-server/node_modules/vscode-nls": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz", + "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@apidevtools/json-schema-ref-parser": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.0.tgz", + "integrity": "sha512-8Q/r5mXLa8Rfyh6r4SgEEFJgISVN5cDNFlcfSWLgFn3odzQhTfHAqzI3hMGdcROViL+8NrDNVVFQtEUrYOksDg==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + } + }, + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true + }, + "@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.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" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "requires": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "requires": { + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "requires": { + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "requires": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "requires": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + } + }, + "@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dev": true, + "requires": { + "@babel/types": "^7.26.5" + } + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.26.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/preset-env": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz", + "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.4.3" + } + }, + "@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + } + }, + "@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "requires": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" + } + }, + "@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "requires": { + "@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": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + } + }, + "@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "requires": { + "@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": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "requires": { + "@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": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/js-yaml": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", + "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/node": { + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz", + "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/type-utils": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", + "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", + "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz", + "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "@typescript-eslint/types": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", + "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", + "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "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==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz", + "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", + "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.22.0", + "eslint-visitor-keys": "^4.2.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true + } + } + }, + "@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true + }, + "acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "requires": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@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" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + } + }, + "babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "requires": { + "restore-cursor": "^5.0.0" + } + }, + "cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "core-js-compat": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "dev": true, + "requires": { + "browserslist": "^4.24.3" + } + }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "requires": {} + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@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" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "requires": { + "@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": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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.8" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + } + }, + "jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + } + }, + "jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + } + }, + "jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + } + }, + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true + }, + "jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "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" + } + }, + "jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + } + }, + "jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "requires": { + "@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": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true + }, + "jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + } + }, + "jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "requires": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + } + } + }, + "jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "requires": { + "@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-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + } + }, + "jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "requires": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz", + "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==", + "dev": true, + "requires": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "dependencies": { + "chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "requires": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "requires": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "requires": { + "environment": "^1.0.0" + } + }, + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.0.0" + } + }, + "slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + } + }, + "string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "requires": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + } + } + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "requires": { + "jsesc": "~3.0.2" + }, + "dependencies": { + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true + } + } + }, + "request-light": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.5.tgz", + "integrity": "sha512-eBEh+GzJAftUnex6tcL6eV2JCifY0+sZMIUpUPOVXbs2nV5hla4ZMmO3icYKGuGVuQ2zHE9evh4OrRcH4iyYYw==", + "requires": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "vscode-nls": "^4.1.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true + }, + "restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "requires": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "dependencies": { + "onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "requires": { + "mimic-function": "^5.0.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "requires": {} + }, + "ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "requires": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "requires": { + "@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" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + } + }, + "vscode-json-languageservice": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.4.9.tgz", + "integrity": "sha512-4VCpZ9ooea/Zc/MTnj1ccc9C7rqcoinKVQLhLoi6jw6yueSf4y4tg/YIUiPPVMlEAG7ZCPS+NVmqxisQ+mOsSw==", + "requires": { + "jsonc-parser": "^2.2.0", + "vscode-languageserver-textdocument": "^1.0.0-next.4", + "vscode-languageserver-types": "^3.15.0-next.6", + "vscode-nls": "^4.1.1", + "vscode-uri": "^2.1.0" + } + }, + "vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==" + }, + "vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "requires": { + "vscode-languageserver-protocol": "3.17.5" + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "requires": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "vscode-nls": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.1.tgz", + "integrity": "sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==" + }, + "vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true + }, + "yaml-language-server": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-0.15.0.tgz", + "integrity": "sha512-idaCYstdGoV5Pi7PKxbUkGHt6jAI3l+nxNWrsVCetxrEgfH6T7qytfT0pF3n4NdfDNPHPHcqnl69FzCFDVfHnQ==", + "requires": { + "js-yaml": "^3.13.1", + "jsonc-parser": "^2.2.1", + "prettier": "2.0.5", + "request-light": "^0.2.4", + "vscode-json-languageservice": "^3.10.0", + "vscode-languageserver": "^5.2.1", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-nls": "^4.1.2", + "vscode-uri": "^2.1.1", + "yaml-language-server-parser": "0.1.2" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "optional": true + }, + "vscode-json-languageservice": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz", + "integrity": "sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA==", + "requires": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + }, + "dependencies": { + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "vscode-languageserver-types": { + "version": "3.16.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", + "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" + }, + "vscode-nls": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.1.tgz", + "integrity": "sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A==" + } + } + }, + "vscode-jsonrpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" + }, + "vscode-languageserver": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", + "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", + "requires": { + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" + }, + "dependencies": { + "vscode-uri": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", + "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" + } + } + }, + "vscode-languageserver-protocol": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "requires": { + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" + }, + "dependencies": { + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" + } + } + }, + "vscode-nls": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz", + "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" + } + } + }, + "yaml-language-server-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yaml-language-server-parser/-/yaml-language-server-parser-0.1.2.tgz", + "integrity": "sha512-GQ2eRE5GcKBK8XVKBIcMyOfC8WMZmEs6gogtVc6knLKE6pG+e5L/lOMfBxZzAt2lqye5itMggQ9+6stXAVhMsw==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } } diff --git a/package.json b/package.json index a0a404fe8..00d78fffc 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,59 @@ { - "name": "amazon-states-language-service", - "description": "Amazon States Language Service", - "author": "Amazon Web Services", - "main": "out/service.js", - "types": "out/service.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/aws/amazon-states-language-service" - }, - "bugs": { - "url": "https://github.com/aws/amazon-states-language-service" - }, - "license": "MIT", - "version": "1.14.0", - "publisher": "aws", - "categories": [ - "Programming Languages" - ], - "scripts": { - "prepublish": "npm run compile", - "lint": "eslint --ext .ts . --config .eslintrc.js", - "lint:fix": "eslint --ext .ts . --fix --config .eslintrc.js", - "compile": "npm run lint && rm -rf out/* && npm run bundle-schema && tsc -b", - "watch": "tsc -b -w", - "test": "npm run compile && mocha", - "bundle-schema": "node ./scripts/transform.js" - }, - "devDependencies": { - "@types/js-yaml": "^4.0.5", - "@types/mocha": "^10.0.1", - "@types/node": "^20.2.5", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "eslint": "^8.57.0", - "json-schema-ref-parser": "^7.1.3", - "mocha": "^10.2.0", - "typescript": "^5.0.4" - }, - "dependencies": { - "js-yaml": "^4.1.0", - "vscode-json-languageservice": "5.3.5", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.0", - "vscode-languageserver-types": "^3.15.1", - "yaml-language-server": "0.15.0" - } + "name": "amazon-states-language-service", + "description": "Amazon States Language Service", + "author": "Amazon Web Services", + "main": "out/service.js", + "types": "out/service.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/aws/amazon-states-language-service" + }, + "bugs": { + "url": "https://github.com/aws/amazon-states-language-service" + }, + "license": "MIT", + "version": "1.14.0", + "publisher": "aws", + "categories": [ + "Programming Languages" + ], + "scripts": { + "prepare": "husky", + "prettify": "prettier 'src/**/*' --write", + "prepublish": "npm run compile", + "clean": "rm -rf build out node_modules", + "lint": "eslint --ext .ts .", + "lint:fix": "eslint --ext .ts . --fix", + "compile": "npm run lint && rm -rf out/* && npm run bundle-schema && tsc -b", + "watch": "tsc -b -w", + "test-watch": " NODE_OPTIONS=--experimental-vm-modules jest --watch", + "test": "jest --collectCoverage", + "bundle-schema": "node ./scripts/transform.js" + }, + "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^11.7.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "@types/jest": "^29.5.14", + "@types/js-yaml": "^4.0.5", + "@types/node": "^20.2.5", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "babel-jest": "^29.7.0", + "eslint": "^8.57.1", + "husky": "^9.1.7", + "jest": "^29.7.0", + "lint-staged": "^15.4.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.3", + "ts-node": "^10.9.2", + "typescript": "^5.0.4" + }, + "dependencies": { + "js-yaml": "^4.1.0", + "vscode-json-languageservice": "3.4.9", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.17.5", + "yaml-language-server": "0.15.0" + } } diff --git a/scripts/transform.js b/scripts/transform.js index 258a28131..126168f7e 100644 --- a/scripts/transform.js +++ b/scripts/transform.js @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -const $RefParser = require('json-schema-ref-parser'); +const $RefParser = require('@apidevtools/json-schema-ref-parser'); const path = require('path'); const fs = require('fs'); const util = require('util'); @@ -14,7 +14,6 @@ const SCHEMA_PATH = '../src/json-schema/'; const BUNDLED_FILE_NAME = 'bundled.json'; async function parseSchema() { - const parser = new $RefParser() try { const bundled = await $RefParser.bundle(path.resolve(__dirname, SCHEMA_PATH, 'partial/base.json')); diff --git a/src/completion/completeAsl.ts b/src/completion/completeAsl.ts index 3b13bdc0c..088b6aab2 100644 --- a/src/completion/completeAsl.ts +++ b/src/completion/completeAsl.ts @@ -3,51 +3,47 @@ * SPDX-License-Identifier: MIT */ -import { - CompletionList, - JSONDocument, - Position, - TextDocument -} from 'vscode-json-languageservice' - -import { - ASLOptions, - ASTTree, - findNodeAtLocation, -} from '../utils/astUtilityFunctions' +import { CompletionList, JSONDocument, Position, TextDocument } from 'vscode-json-languageservice' + +import { ASLOptions, ASTTree, findNodeAtLocation } from '../utils/astUtilityFunctions' import completeSnippets from './completeSnippets' import completeStateNames from './completeStateNames' -export default function completeAsl(document: TextDocument, position: Position, doc: JSONDocument, jsonCompletions: CompletionList | null, aslOptions?: ASLOptions): CompletionList { - - const offset = document.offsetAt(position) - const rootNode = (doc as ASTTree).root - - if (!rootNode) { - return { - isIncomplete: false, - items: [] - } +export default function completeAsl( + document: TextDocument, + position: Position, + doc: JSONDocument, + jsonCompletions: CompletionList | null, + aslOptions?: ASLOptions, +): CompletionList { + const offset = document.offsetAt(position) + const rootNode = (doc as ASTTree).root + + if (!rootNode) { + return { + isIncomplete: false, + items: [], } + } - const node = findNodeAtLocation(rootNode, offset) + const node = findNodeAtLocation(rootNode, offset) - const snippetsList = completeSnippets(node, offset, aslOptions) - let completionList = completeStateNames(node, offset, document, aslOptions) ?? jsonCompletions + const snippetsList = completeSnippets(node, offset, aslOptions) + let completionList = completeStateNames(node, offset, document, aslOptions) ?? jsonCompletions - if (completionList?.items) { - completionList.items = completionList.items.concat(snippetsList) - } else { - completionList = { - isIncomplete: false, - items: snippetsList - } + if (completionList?.items) { + completionList.items = completionList.items.concat(snippetsList) + } else { + completionList = { + isIncomplete: false, + items: snippetsList, } + } - // Assign sort order for the completion items so we maintain order - // and snippets are shown near the end of the completion list - completionList.items.map((item,index) => ({ ...item, sortText: index.toString()})) + // Assign sort order for the completion items so we maintain order + // and snippets are shown near the end of the completion list + completionList.items.map((item, index) => ({ ...item, sortText: index.toString() })) - return completionList + return completionList } diff --git a/src/completion/completeSnippets.ts b/src/completion/completeSnippets.ts index a282344d9..c8e9efddf 100644 --- a/src/completion/completeSnippets.ts +++ b/src/completion/completeSnippets.ts @@ -4,27 +4,22 @@ */ import { - ASTNode, - CompletionItem, - CompletionItemKind, - InsertTextFormat, - PropertyASTNode + ASTNode, + CompletionItem, + CompletionItemKind, + InsertTextFormat, + PropertyASTNode, } from 'vscode-json-languageservice' -import { - findPropChildByName, - insideStateNode, - isChildOfStates, - isObjectNode, -} from '../utils/astUtilityFunctions' +import { findPropChildByName, insideStateNode, isChildOfStates, isObjectNode } from '../utils/astUtilityFunctions' import errorHandlingSnippetsRaw from '../snippets/error_handling.json' import stateSnippetsRaw from '../snippets/states.json' interface Snippet { - name: string, - body: string[], - description: string + name: string + body: string[] + description: string } const ERROR_HANDLING_STATES = ['Task', 'Parallel', 'Map'] @@ -32,66 +27,71 @@ export const stateSnippets = parseSnippetsFromJson(stateSnippetsRaw) export const errorHandlingSnippets = parseSnippetsFromJson(errorHandlingSnippetsRaw) function parseSnippetsFromJson(json: Snippet[]): CompletionItem[] { - return json.map(snippet => { - const item = CompletionItem.create(snippet.name) - item.kind = CompletionItemKind.Snippet - item.insertTextFormat = InsertTextFormat.Snippet - item.insertText = snippet.body.join('\n') - item.documentation = snippet.description - - return item - }) + return json.map((snippet) => { + const item = CompletionItem.create(snippet.name) + item.kind = CompletionItemKind.Snippet + item.insertTextFormat = InsertTextFormat.Snippet + item.insertText = snippet.body.join('\n') + item.documentation = snippet.description + + return item + }) } function doesStateSupportErrorHandling(node: ASTNode): boolean { - let typeNode: PropertyASTNode | undefined + let typeNode: PropertyASTNode | undefined - if(isObjectNode(node)) { - typeNode = findPropChildByName(node, 'Type') - } + if (isObjectNode(node)) { + typeNode = findPropChildByName(node, 'Type') + } - return ERROR_HANDLING_STATES.includes(typeNode?.valueNode?.value as string) + return ERROR_HANDLING_STATES.includes(typeNode?.valueNode?.value as string) } interface CompleteSnippetsOptions { - shouldShowStateSnippets?: boolean, - shouldShowErrorSnippets?: { - retry: boolean, - catch: boolean - } + shouldShowStateSnippets?: boolean + shouldShowErrorSnippets?: { + retry: boolean + catch: boolean + } } -export default function completeSnippets(node: ASTNode | undefined, offset: number, options?: CompleteSnippetsOptions): CompletionItem[] { - if (node) { - const errorSnippetOptionsNotDefined = options?.shouldShowErrorSnippets === undefined - // If the value of shouldShowStateSnippets is false prevent the snippets from being displayed - const showStateSnippets = options?.shouldShowStateSnippets || (options?.shouldShowStateSnippets === undefined && isChildOfStates(node)) - - if (showStateSnippets) { - return stateSnippets - } +export default function completeSnippets( + node: ASTNode | undefined, + offset: number, + options?: CompleteSnippetsOptions, +): CompletionItem[] { + if (node) { + const errorSnippetOptionsNotDefined = options?.shouldShowErrorSnippets === undefined + // If the value of shouldShowStateSnippets is false prevent the snippets from being displayed + const showStateSnippets = + options?.shouldShowStateSnippets || (options?.shouldShowStateSnippets === undefined && isChildOfStates(node)) + + if (showStateSnippets) { + return stateSnippets + } - if (errorSnippetOptionsNotDefined) { - if (insideStateNode(node) && doesStateSupportErrorHandling(node)) { - return errorHandlingSnippets - } + if (errorSnippetOptionsNotDefined) { + if (insideStateNode(node) && doesStateSupportErrorHandling(node)) { + return errorHandlingSnippets + } - return [] - } + return [] + } - const errorSnippetsToShow: string[] = [] + const errorSnippetsToShow: string[] = [] - if (options?.shouldShowErrorSnippets?.catch) { - errorSnippetsToShow.push('Catch') - } + if (options?.shouldShowErrorSnippets?.catch) { + errorSnippetsToShow.push('Catch') + } - if (options?.shouldShowErrorSnippets?.retry) { - errorSnippetsToShow.push('Retry') - } + if (options?.shouldShowErrorSnippets?.retry) { + errorSnippetsToShow.push('Retry') + } - if (errorSnippetsToShow.length) { - return errorHandlingSnippets.filter(snippet => errorSnippetsToShow.includes(snippet.label)) - } + if (errorSnippetsToShow.length) { + return errorHandlingSnippets.filter((snippet) => errorSnippetsToShow.includes(snippet.label)) } + } - return [] + return [] } diff --git a/src/completion/completeStateNames.ts b/src/completion/completeStateNames.ts index eb3a8fb6e..875e624c6 100644 --- a/src/completion/completeStateNames.ts +++ b/src/completion/completeStateNames.ts @@ -4,180 +4,181 @@ */ import { - ASTNode, - CompletionItem, - CompletionItemKind, - CompletionList, - PropertyASTNode, - Range, - TextDocument, - TextEdit, -} from 'vscode-json-languageservice'; -import { LANGUAGE_IDS } from '../constants/constants'; + ASTNode, + CompletionItem, + CompletionItemKind, + CompletionList, + PropertyASTNode, + Range, + TextDocument, + TextEdit, +} from 'vscode-json-languageservice' +import { LANGUAGE_IDS } from '../constants/constants' import { - ASLOptions, - CompleteStateNameOptions, - findClosestAncestorStateNode, - getListOfStateNamesFromStateNode, - isObjectNode, - isPropertyNode, - isStringNode + ASLOptions, + CompleteStateNameOptions, + findClosestAncestorStateNode, + getListOfStateNamesFromStateNode, + isObjectNode, + isPropertyNode, + isStringNode, } from '../utils/astUtilityFunctions' -import { isStateNameReservedYamlKeyword } from '../yaml/yamlUtils'; +import { isStateNameReservedYamlKeyword } from '../yaml/yamlUtils' function getStatesFromStartAtNode(node: PropertyASTNode, options?: ASLOptions): string[] { - if (node.keyNode.value === 'StartAt') { - if (node.parent && isObjectNode(node.parent)) { - const statesNode = node.parent.properties.find(propNode => propNode.keyNode.value === 'States') + if (node.keyNode.value === 'StartAt') { + if (node.parent && isObjectNode(node.parent)) { + const statesNode = node.parent.properties.find((propNode) => propNode.keyNode.value === 'States') - if (statesNode) { - return getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset) - } - } + if (statesNode) { + return getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset) + } } + } - return [] + return [] } function getListOfItems(node: PropertyASTNode, options?: ASLOptions): string[] { - const keyVal = node.keyNode.value - - switch (keyVal) { - case 'StartAt': { - return getStatesFromStartAtNode(node, options) - } - case 'Next': - case 'Default': { - const statesNode = findClosestAncestorStateNode(node) + const keyVal = node.keyNode.value - const stateItemNode = node.parent?.parent + switch (keyVal) { + case 'StartAt': { + return getStatesFromStartAtNode(node, options) + } + case 'Next': + case 'Default': { + const statesNode = findClosestAncestorStateNode(node) - let stateItemName: string | undefined + const stateItemNode = node.parent?.parent - if (stateItemNode && isPropertyNode(stateItemNode)) { - // The state name under cursor shouldn't be suggested - find the value - stateItemName = stateItemNode.keyNode.value - // If stateItemNode is not a property node go 3 levels up as it is Next within Choice state - } else if (stateItemNode?.parent?.parent?.parent && isPropertyNode(stateItemNode.parent.parent.parent)) { - stateItemName = stateItemNode.parent.parent.parent.keyNode.value - } + let stateItemName: string | undefined - if (statesNode) { - return getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset).filter(name => name !== stateItemName) - } + if (stateItemNode && isPropertyNode(stateItemNode)) { + // The state name under cursor shouldn't be suggested - find the value + stateItemName = stateItemNode.keyNode.value + // If stateItemNode is not a property node go 3 levels up as it is Next within Choice state + } else if (stateItemNode?.parent?.parent?.parent && isPropertyNode(stateItemNode.parent.parent.parent)) { + stateItemName = stateItemNode.parent.parent.parent.keyNode.value + } - return [] - } - default: { - return [] - } + if (statesNode) { + return getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset).filter( + (name) => name !== stateItemName, + ) + } + return [] } + default: { + return [] + } + } } function getCompletionList( - items: string[], - replaceRange: Range, - languageId: string, - options: CompleteStateNameOptions + items: string[], + replaceRange: Range, + languageId: string, + options: CompleteStateNameOptions, ) { - const { - shouldAddLeftQuote, - shouldAddRightQuote, - shouldAddLeadingSpace, - shoudlAddTrailingComma - } = options - - const list: CompletionList = { - isIncomplete: false, - items: items.map(name => { - const shouldWrapStateNameInQuotes = languageId === LANGUAGE_IDS.YAML && isStateNameReservedYamlKeyword(name) - const item = CompletionItem.create(name) - item.commitCharacters = [','] - - item.kind = CompletionItemKind.Value - - const newText = (shouldAddLeadingSpace ? ' ' : '') + - (shouldAddLeftQuote ? '"' : '') + - (shouldWrapStateNameInQuotes ? "'" : '') + - name + - (shouldWrapStateNameInQuotes ? "'" : '') + - (shouldAddRightQuote ? '"' : '') + - (shoudlAddTrailingComma ? ',' : '') - item.textEdit = TextEdit.replace(replaceRange, newText) - item.filterText = name - - return item - }) - } - - return list + const { shouldAddLeftQuote, shouldAddRightQuote, shouldAddLeadingSpace, shoudlAddTrailingComma } = options + + const list: CompletionList = { + isIncomplete: false, + items: items.map((name) => { + const shouldWrapStateNameInQuotes = languageId === LANGUAGE_IDS.YAML && isStateNameReservedYamlKeyword(name) + const item = CompletionItem.create(name) + item.commitCharacters = [','] + + item.kind = CompletionItemKind.Value + + const newText = + (shouldAddLeadingSpace ? ' ' : '') + + (shouldAddLeftQuote ? '"' : '') + + (shouldWrapStateNameInQuotes ? "'" : '') + + name + + (shouldWrapStateNameInQuotes ? "'" : '') + + (shouldAddRightQuote ? '"' : '') + + (shoudlAddTrailingComma ? ',' : '') + item.textEdit = TextEdit.replace(replaceRange, newText) + item.filterText = name + + return item + }), + } + + return list } -export default function completeStateNames(node: ASTNode | undefined, offset: number, document: TextDocument, options?: ASLOptions): CompletionList | undefined { - // For property nodes - if (node && isPropertyNode(node) && node.colonOffset) { - const states = getListOfItems(node, options) - - if (states.length) { - const colonPosition = document.positionAt(node.colonOffset + 1) - let endPosition = document.positionAt(node.offset + node.length) - - // The range shouldn't span multiple lines, if lines are different it is due to - // lack of comma and text should be inserted in place - if (colonPosition.line !== endPosition.line) { - endPosition = colonPosition - } - - const range = Range.create(colonPosition, endPosition) - - const completeStateNameOptions = { - shouldAddLeftQuote: true, - shouldAddRightQuote: true, - shouldAddLeadingSpace: true, - shoudlAddTrailingComma: true - } - - return getCompletionList(states, range, document.languageId, completeStateNameOptions) - } +export default function completeStateNames( + node: ASTNode | undefined, + offset: number, + document: TextDocument, + options?: ASLOptions, +): CompletionList | undefined { + // For property nodes + if (node && isPropertyNode(node) && node.colonOffset) { + const states = getListOfItems(node, options) + + if (states.length) { + const colonPosition = document.positionAt(node.colonOffset + 1) + let endPosition = document.positionAt(node.offset + node.length) + + // The range shouldn't span multiple lines, if lines are different it is due to + // lack of comma and text should be inserted in place + if (colonPosition.line !== endPosition.line) { + endPosition = colonPosition + } + + const range = Range.create(colonPosition, endPosition) + + const completeStateNameOptions = { + shouldAddLeftQuote: true, + shouldAddRightQuote: true, + shouldAddLeadingSpace: true, + shoudlAddTrailingComma: true, + } + + return getCompletionList(states, range, document.languageId, completeStateNameOptions) } - - // For string nodes that have a parent that is a property node - if (node && node.parent && isPropertyNode(node.parent)) { - const propNode = node.parent - - if (isStringNode(node)) { - const states = getListOfItems(propNode, options) - - if (states.length) { - // Text edit will only work when start position is higher than the node offset - const startPosition = document.positionAt(node.offset + 1) - const endPosition = document.positionAt(node.offset + node.length) - - const range = Range.create(startPosition, endPosition) - if (document.languageId === LANGUAGE_IDS.YAML) { - const completeStateNameOptions = { - shouldAddLeftQuote: false, - shouldAddRightQuote: false, - shouldAddLeadingSpace: false, - shoudlAddTrailingComma: false - } - - return getCompletionList(states, range, document.languageId, completeStateNameOptions) - } else { - const isCursorAtTheBeginning = offset === node.offset - const completeStateNameOptions = { - shouldAddLeftQuote: isCursorAtTheBeginning, - shouldAddRightQuote: true, - shouldAddLeadingSpace: false, - shoudlAddTrailingComma: false - } - - return getCompletionList(states, range, document.languageId, completeStateNameOptions) - } - - } + } + + // For string nodes that have a parent that is a property node + if (node && node.parent && isPropertyNode(node.parent)) { + const propNode = node.parent + + if (isStringNode(node)) { + const states = getListOfItems(propNode, options) + + if (states.length) { + // Text edit will only work when start position is higher than the node offset + const startPosition = document.positionAt(node.offset + 1) + const endPosition = document.positionAt(node.offset + node.length) + + const range = Range.create(startPosition, endPosition) + if (document.languageId === LANGUAGE_IDS.YAML) { + const completeStateNameOptions = { + shouldAddLeftQuote: false, + shouldAddRightQuote: false, + shouldAddLeadingSpace: false, + shoudlAddTrailingComma: false, + } + + return getCompletionList(states, range, document.languageId, completeStateNameOptions) + } else { + const isCursorAtTheBeginning = offset === node.offset + const completeStateNameOptions = { + shouldAddLeftQuote: isCursorAtTheBeginning, + shouldAddRightQuote: true, + shouldAddLeadingSpace: false, + shoudlAddTrailingComma: false, + } + + return getCompletionList(states, range, document.languageId, completeStateNameOptions) } + } } + } } diff --git a/src/constants/constants.ts b/src/constants/constants.ts index 4013a2307..f86bba229 100644 --- a/src/constants/constants.ts +++ b/src/constants/constants.ts @@ -4,11 +4,11 @@ */ export const LANGUAGE_IDS = { - YAML: 'asl-yaml', - JSON: 'asl' + YAML: 'asl-yaml', + JSON: 'asl', } as const export const FILE_EXTENSIONS = { - YAML: 'asl.yaml', - JSON: 'asl' + YAML: 'asl.yaml', + JSON: 'asl', } as const diff --git a/src/constants/diagnosticStrings.ts b/src/constants/diagnosticStrings.ts index 36652e936..1bdd1b805 100644 --- a/src/constants/diagnosticStrings.ts +++ b/src/constants/diagnosticStrings.ts @@ -4,17 +4,19 @@ */ export const MESSAGES = { - INVALID_NEXT: 'The value of "Next" property must be the name of an existing state.', - INVALID_DEFAULT: 'The value of "Default" property must be the name of an existing state.', - INVALID_START_AT: 'The value of "StartAt" property must be the name of an existing state.', - INVALID_JSON_PATH_OR_INTRINSIC: 'The value for the field must be a valid JSONPath or intrinsic function expression.', - INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY: 'The value for the field must be a valid JSONPath or an intrinsic function expression that returns a string (ArrayGetItem, Base64Encode, Base64Decode, Format, JsonToString, Hash, or UUID).', - UNREACHABLE_STATE: 'The state cannot be reached. It must be referenced by at least one other state.', - NO_TERMINAL_STATE: 'No terminal state. The state machine must have at least one terminal state (a state in which the "End" property is set to true).', - INVALID_PROPERTY_NAME: 'Field is not supported.', - MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES: 'Each Choice Rule can only have one comparison operator.' + INVALID_NEXT: 'The value of "Next" property must be the name of an existing state.', + INVALID_DEFAULT: 'The value of "Default" property must be the name of an existing state.', + INVALID_START_AT: 'The value of "StartAt" property must be the name of an existing state.', + INVALID_JSON_PATH_OR_INTRINSIC: 'The value for the field must be a valid JSONPath or intrinsic function expression.', + INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY: + 'The value for the field must be a valid JSONPath or an intrinsic function expression that returns a string (ArrayGetItem, Base64Encode, Base64Decode, Format, JsonToString, Hash, or UUID).', + UNREACHABLE_STATE: 'The state cannot be reached. It must be referenced by at least one other state.', + NO_TERMINAL_STATE: + 'No terminal state. The state machine must have at least one terminal state (a state in which the "End" property is set to true).', + INVALID_PROPERTY_NAME: 'Field is not supported.', + MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES: 'Each Choice Rule can only have one comparison operator.', } as const export const YAML_PARSER_MESSAGES = { - DUPLICATE_KEY: 'duplicate key' + DUPLICATE_KEY: 'duplicate key', } as const diff --git a/src/json-schema/bundled.json b/src/json-schema/bundled.json index de27480bd..2d5ad0435 100644 --- a/src/json-schema/bundled.json +++ b/src/json-schema/bundled.json @@ -1,2778 +1,2367 @@ { - "type": "object", - "properties": { - "Version": { - "type": "string", - "description": "The version of the Amazon States Language used in the state machine.", - "enum": [ - "1.0" - ] - }, - "Comment": { - "type": "string", - "description": "A human-readable comment or description.", - "minLength": 1 - }, - "TimeoutSeconds": { - "description": "The maximum number of seconds an execution of the state machine can run. If it runs longer than the specified time, the execution fails with a States.Timeout error.", - "type": "integer", - "minimum": 0, - "maximum": 99999999 - }, - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of a state.", - "minLength": 1 - }, - "States": { - "type": "object", - "description": "An object containing a comma-delimited set of states.", - "additionalProperties": { - "oneOf": [ - { - "description": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.", - "allOf": [ - { - "type": "object", - "properties": { - "Type": { - "type": "string", - "description": "The state's type.", - "minLength": 1, - "enum": [ - "Pass", - "Succeed", - "Fail", - "Task", - "Choice", - "Wait", - "Parallel", - "Map" - ] - }, - "QueryLanguage": { - "$ref": "#/properties/QueryLanguage" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Type" - ] - }, - { - "properties": { - "InputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ResultPath": { - "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary.", - "oneOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "null" - } - ] - }, - "OutputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - } - }, - { - "oneOf": [ - { - "required": [ - "Next" - ] - }, - { - "required": [ - "End" - ] - } - ], - "properties": { - "Next": { - "type": "string", - "description": "The name of the next state that is run when the current state finishes.", - "minLength": 1 - }, - "End": { - "type": "boolean", - "description": "Designates this state as a terminal state (ends the execution) if set to true. There can be any number of terminal states per state machine." - } - } - }, - { - "properties": { - "Type": { - "enum": [ - "Pass" - ] - }, - "Parameters": { - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions.", - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ] - }, - "Output": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "A value to define the Output configuration of this task state." - } - } - } - ] - }, - { - "description": "A Succeed state stops an execution successfully. The Succeed state is a useful target for Choice state branches that don't do anything but stop the execution.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "properties": { - "InputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "OutputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - } - }, - { - "properties": { - "Type": { - "enum": [ - "Succeed" - ] - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - } - } - } - ] - }, - { - "description": "A Fail state stops the execution of the state machine and marks it as a failure.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "properties": { - "Type": { - "enum": [ - "Fail" - ] - }, - "Comment": { - "$ref": "#/properties/Comment" - }, - "Error": { - "type": "string", - "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes.", - "minLength": 1 - }, - "Cause": { - "type": "string", - "description": "Provides a custom failure string that can be used for operational or diagnostic purposes.", - "minLength": 1 - }, - "ErrorPath": { - "type": "string", - "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", - "minLength": 1 - }, - "CausePath": { - "type": "string", - "description": "Provides a custom failure string that can be used for operational or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", - "minLength": 1 - } - } - } - ] - }, - { - "description": "A Task state represents a single unit of work performed by a state machine.\nAll work in your state machine is done by tasks. A task performs work identified by the state’s Resource field, which is often an AWS Lambda function or other Step Functions service integrations.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" - }, - { - "properties": { - "Type": { - "enum": [ - "Task" - ] - }, - "Resource": { - "type": "string", - "description": "A URI, especially an ARN that uniquely identifies the specific task to execute.", - "examples": [ - "arn:aws:states:::batch:submitJob", - "arn:aws:states:::batch:submitJob.sync", - "arn:aws:states:::dynamodb:deleteItem", - "arn:aws:states:::dynamodb:getItem", - "arn:aws:states:::dynamodb:putItem", - "arn:aws:states:::dynamodb:updateItem", - "arn:aws:states:::ecs:runTask", - "arn:aws:states:::ecs:runTask.sync", - "arn:aws:states:::ecs:runTask.waitForTaskToken", - "arn:aws:states:::elasticmapreduce:addStep", - "arn:aws:states:::elasticmapreduce:addStep.sync", - "arn:aws:states:::elasticmapreduce:cancelStep", - "arn:aws:states:::elasticmapreduce:createCluster", - "arn:aws:states:::elasticmapreduce:createCluster.sync", - "arn:aws:states:::elasticmapreduce:modifyInstanceFleetByName", - "arn:aws:states:::elasticmapreduce:modifyInstanceGroupByName", - "arn:aws:states:::elasticmapreduce:setClusterTerminationProtection", - "arn:aws:states:::elasticmapreduce:terminateCluster", - "arn:aws:states:::elasticmapreduce:terminateCluster.sync", - "arn:aws:states:::events:putEvents", - "arn:aws:states:::events:putEvents.waitForTaskToken", - "arn:aws:states:::glue:startJobRun", - "arn:aws:states:::glue:startJobRun.sync", - "arn:aws:states:::lambda:invoke", - "arn:aws:states:::lambda:invoke.waitForTaskToken", - "arn:aws:states:::mediaconvert:createJob", - "arn:aws:states:::mediaconvert:createJob.sync", - "arn:aws:states:::sagemaker:createEndpoint", - "arn:aws:states:::sagemaker:createEndpointConfig", - "arn:aws:states:::sagemaker:createHyperParameterTuningJob", - "arn:aws:states:::sagemaker:createHyperParameterTuningJob.sync", - "arn:aws:states:::sagemaker:createLabelingJob", - "arn:aws:states:::sagemaker:createLabelingJob.sync", - "arn:aws:states:::sagemaker:createModel", - "arn:aws:states:::sagemaker:createTrainingJob", - "arn:aws:states:::sagemaker:createTrainingJob.sync", - "arn:aws:states:::sagemaker:createTransformJob", - "arn:aws:states:::sagemaker:createTransformJob.sync", - "arn:aws:states:::sagemaker:updateEndpoint", - "arn:aws:states:::sns:publish", - "arn:aws:states:::sns:publish.waitForTaskToken", - "arn:aws:states:::sqs:sendMessage", - "arn:aws:states:::sqs:sendMessage.waitForTaskToken", - "arn:aws:states:::states:startExecution", - "arn:aws:states:::states:startExecution.sync", - "arn:aws:states:::states:startExecution.waitForTaskToken" - ] - }, - "Parameters": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions.", - "type": "object" - }, - "TimeoutSeconds": { - "oneOf": [ - { - "$ref": "#/properties/TimeoutSeconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error name. Must be a positive, non-zero integer, or a jsonata expression. If not provided, the default value is 99999999. The count begins after the task has been started, for example, when ActivityStarted or LambdaFunctionStarted are logged in the Execution event history." - }, - "TimeoutSecondsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath", - "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." - }, - "HeartbeatSeconds": { - "oneOf": [ - { - "$ref": "#/properties/TimeoutSeconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error name. Must be a positive, non-zero integer less than the number of seconds specified in the TimeoutSeconds field, or a jsonata expression. If not provided, the default value is 99999999. For Activities, the count begins when GetActivityTask receives a token and ActivityStarted is logged in the Execution event history." - }, - "HeartbeatSecondsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath", - "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." - }, - "Retry": { - "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ErrorEquals": { - "description": "A non-empty array of Error Names. The retry policy for this Retrier is implemented if the reported error matches one of the Error Names.", - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - }, - "IntervalSeconds": { - "$ref": "#/properties/TimeoutSeconds", - "description": "A positive integer representing the number of seconds before the first retry attempt. (Default: 1, Maximum: 99999999)" - }, - "MaxAttempts": { - "type": "integer", - "description": "A non-negative integer representing the maximum number of retry attempts. (Default: 3, Maximum: 99999999)", - "minimum": 0, - "maximum": 99999999 - }, - "BackoffRate": { - "type": "number", - "description": "A number (>= 1) which is the multiplier that increases the retry interval on each attempt. (Default: 2.0)", - "minimum": 1 - }, - "Comment": { - "$ref": "#/properties/Comment" - }, - "MaxDelaySeconds": { - "type": "integer", - "description": "A positive integer representing the maximum number of seconds to wait before a retry attempt. If not specified, the limit is the maximum duration a state machine can run. (Maximum: 31622400)", - "minimum": 1, - "maximum": 31622400 - }, - "JitterStrategy": { - "type": "string", - "description": "The Jitter Strategy to apply to the retry interval.", - "minLength": 1, - "enum": [ - "FULL", - "NONE" - ] - } - }, - "required": [ - "ErrorEquals" - ] - } - }, - "Catch": { - "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined.", - "type": "array", - "items": { - "type": "object", - "properties": { - "ErrorEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry/items/properties/ErrorEquals", - "description": "A non-empty array of Error Names. The state machine transitions to this Catcher's fallback state if the reported error matches one of the Error Names." - }, - "Next": { - "type": "string", - "description": "The state to transition to on Error Name match.", - "minLength": 1 - }, - "ResultPath": { - "oneOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary." - }, - { - "type": "null" - } - ] - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - }, - "Comment": { - "$ref": "#/properties/Comment" - }, - "Assign": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign" - } - }, - "required": [ - "ErrorEquals", - "Next" - ] - } - }, - "Arguments": { - "oneOf": [ - { - "type": "object", - "errorMessage": "Incorrect type. Expected one of object, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An object or JSONata expression to define the Argument of this task state." - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - }, - "Assign": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign", - "description": "An object to define the variables to be assigned." - } - }, - "required": [ - "Resource" - ] - } - ] - }, - { - "description": "A Choice state adds branching logic to a state machine.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/1/allOf/1" - }, - { - "properties": { - "Type": { - "enum": [ - "Choice" - ] - }, - "Choices": { - "type": "array", - "description": "An array of Choice Rules that determines which state the state machine transitions to next.", - "minItems": 1, - "items": { - "oneOf": [ - { - "errorMessage": "Incorrect type. Expected a valid choice state condition.", - "type": "object", - "properties": { - "Condition": { - "oneOf": [ - { - "type": "boolean", - "errorMessage": "Incorrect type. Expected one of boolean, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ] - }, - "Assign": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign" - }, - "Next": { - "type": "string", - "description": "The state to transition to if there is an exact match between the input value and the comparison operator for this Choice Rule.", - "minLength": 1 - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Condition", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringEquals": { - "type": "string" - }, - "Variable": { - "type": "string", - "description": "A reference path specifying the input value to apply the comparison operator to.", - "minLength": 1 - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringLessThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "BooleanEquals": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "BooleanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampEquals": { - "type": "string", - "format": "date-time" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThan": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThan": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThan", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanEquals", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "And": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "And", - "Next" - ] - }, - { - "type": "object", - "properties": { - "Or": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/19/properties/Not" - } - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Or", - "Next" - ] - }, - { - "type": "object", - "properties": { - "Not": { - "oneOf": [ - { - "type": "object", - "properties": { - "StringEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringLessThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "BooleanEquals": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "BooleanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThan": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThan": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThan", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanEquals": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanEquals", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "And": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "And" - ] - }, - { - "type": "object", - "properties": { - "Or": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Or" - ] - }, - { - "type": "object", - "properties": { - "Not": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/19/properties/Not" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Not" - ] - }, - { - "type": "object", - "properties": { - "StringEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "BooleanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "BooleanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanEqualsPath", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsNull": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsNull", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsPresent": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsPresent", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsNumeric": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsNumeric", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsString": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsString", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsBoolean": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsBoolean", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "IsTimestamp": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsTimestamp", - "Variable" - ] - }, - { - "type": "object", - "properties": { - "StringMatches": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringMatches", - "Variable" - ] - } - ] - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "Not", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringEqualsPath": { - "type": "string", - "pattern": "\\$.*" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringLessThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "NumericLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "NumericLessThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "BooleanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "BooleanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampGreaterThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "TimestampLessThanEqualsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "TimestampLessThanEqualsPath", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsNull": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsNull", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsPresent": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsPresent", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsNumeric": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsNumeric", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsString": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsString", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsBoolean": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsBoolean", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "IsTimestamp": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "IsTimestamp", - "Variable", - "Next" - ] - }, - { - "type": "object", - "properties": { - "StringMatches": { - "type": "string" - }, - "Variable": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" - }, - "Next": { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" - }, - "Comment": { - "$ref": "#/properties/Comment" - } - }, - "required": [ - "StringMatches", - "Variable", - "Next" - ] - } - ] - }, - "additionalItems": false - }, - "Default": { - "type": "string", - "description": "The name of the state to transition to if none of the Choice Rules match." - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - }, - "Assign": { - "type": "object", - "description": "An object to define the variables to be assigned." - } - }, - "required": [ - "Choices" - ] - } - ] - }, - { - "description": "A Wait state delays the state machine from continuing for a specified time. You can choose either a relative time, specified in seconds from when the state begins, or an absolute end time, specified as a timestamp.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/1/allOf/1" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" - }, - { - "properties": { - "Type": { - "enum": [ - "Wait" - ] - }, - "Seconds": { - "oneOf": [ - { - "$ref": "#/properties/TimeoutSeconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field." - }, - "Timestamp": { - "oneOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals", - "errorMessage": "Incorrect type. Expected one of timestamp, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An absolute time to wait until beginning the state specified in the \"Next\" field.\n\nTimestamps must conform to the RFC3339 profile of ISO 8601, with the further restrictions that an uppercase T must separate the date and time portions, and an uppercase Z must denote that a numeric time zone offset is not present, for example, 2016-08-18T17:33:00Z." - }, - "SecondsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field, specified using a path from the state's input data." - }, - "TimestampPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "An absolute time to wait until beginning the state specified in the \"Next\" field, specified using a path from the state's input data." - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - } - }, - "oneOf": [ - { - "required": [ - "Type", - "Seconds" - ] - }, - { - "required": [ - "Type", - "Timestamp" - ] - }, - { - "required": [ - "Type", - "SecondsPath" - ] - }, - { - "required": [ - "Type", - "TimestampPath" - ] - } - ] - } - ] - }, - { - "description": "The Parallel state can be used to create parallel branches of execution in your state machine.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" - }, - { - "properties": { - "Type": { - "enum": [ - "Parallel" - ] - }, - "Parameters": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/ResultSelector", - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "Branches": { - "type": "array", - "description": "An array of objects that specifies state machines to execute in parallel.", - "minItems": 1, - "items": { - "type": "object", - "properties": { - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects." - }, - "States": { - "$ref": "#/properties/States" - } - }, - "required": [ - "StartAt", - "States" - ] - } - }, - "Retry": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry", - "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." - }, - "Catch": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Catch", - "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." - }, - "Arguments": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments" - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - } - }, - "required": [ - "Branches" - ] - } - ] - }, - { - "description": "The Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input.", - "allOf": [ - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" - }, - { - "properties": { - "Type": { - "enum": [ - "Map" - ] - }, - "Parameters": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/ResultSelector", - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ItemsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "Reference path identifying where in the effective input the array field is found." - }, - "Iterator": { - "type": "object", - "description": "A state machine which will process each element of the array.", - "properties": { - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", - "minLength": 1 - }, - "States": { - "$ref": "#/properties/States" - } - }, - "required": [ - "StartAt", - "States" - ] - }, - "ItemReader": { - "type": "object", - "description": "Specifies the location of the dataset from which the Map state reads its input data.", - "properties": { - "ReaderConfig": { - "type": "object", - "description": "A JSON object that specifies where to read the items instead of from the effective input.", - "properties": { - "InputType": { - "type": "string", - "description": "A string that specifies the type of Amazon S3 data source.", - "minLength": 1, - "enum": [ - "CSV", - "JSON", - "MANIFEST" - ] - }, - "CSVHeaders": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - }, - "CSVHeaderLocation": { - "type": "string", - "description": "A string that specifies the location of the CSV column header.", - "minLength": 1, - "enum": [ - "FIRST_ROW", - "GIVEN" - ] - }, - "MaxItems": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An integer or JSONata expression that limits the number of data items passed to the Map state.", - "minimum": 0 - }, - "MaxItemsPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that limits the number of data items passed to the Map state." - } - } - }, - "Resource": { - "type": "string", - "description": "The Amazon S3 API action Step Functions must invoke depending on the specified dataset.", - "examples": [ - "arn:aws:states:::s3:getObject", - "arn:aws:states:::s3:listObjectsV2" - ] - }, - "Arguments": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments", - "description": "A JSON object or JSONata expression that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", - "minLength": 1 - }, - "Key": { - "type": "string", - "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", - "minLength": 1 - } - } - }, - "Parameters": { - "type": "object", - "description": "A JSON object that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", - "minLength": 1 - }, - "Key": { - "type": "string", - "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", - "minLength": 1 - }, - "Bucket.$": { - "type": "string", - "description": "", - "minLength": 1 - }, - "Prefix.$": { - "type": "string", - "description": "", - "minLength": 1 - } - } - } - } - }, - "ItemSelector": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "A JSON object or value that overrides each single element of the item array." - }, - "ItemBatcher": { - "type": "object", - "description": "A JSON object that specifies how to batch the items for the ItemProcessor.", - "properties": { - "BatchInput": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "Specifies a fixed JSON input to include in each batch passed to each child workflow execution." - }, - "MaxItemsPerBatch": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An integer or JSONata expression that limits the maximum number of items of each sub-array.", - "minimum": 1 - }, - "MaxItemsPerBatchPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that limits the maximum number of items of each sub-array." - }, - "MaxInputBytesPerBatch": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An integer or JSONata expression that limits the maximum size in bytes of each sub-array.", - "minimum": 1 - }, - "MaxInputBytesPerBatchPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that limits the maximum size in bytes of each sub-array." - } - } - }, - "ResultWriter": { - "type": "object", - "description": "A JSON object that specifies where to write the results instead of to the Map state's result.", - "properties": { - "Resource": { - "type": "string", - "description": "A string that specifies the Amazon S3 API action Step Functions must invoke depending on the specified dataset.", - "examples": [ - "arn:aws:states:::s3:putObject" - ] - }, - "Arguments": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments", - "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name to export the results to.", - "minLength": 1 - }, - "Prefix": { - "type": "string", - "description": "A string that specifies the Amazon S3 object prefix to export the results to.", - "minLength": 1 - } - } - }, - "Parameters": { - "type": "object", - "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name to export the results to.", - "minLength": 1 - }, - "Prefix": { - "type": "string", - "description": "A string that specifies the Amazon S3 object prefix to export the results to.", - "minLength": 1 - } - } - } - } - }, - "ItemProcessor": { - "type": "object", - "description": "A JSON object that defines a state machine which will process each item or batch of items of the array.", - "properties": { - "ProcessorConfig": { - "type": "object", - "description": "A JSON object that specifies the Map state processing mode and definition.", - "properties": { - "Mode": { - "type": "string", - "description": "The Map state processing mode.", - "minLength": 1, - "enum": [ - "DISTRIBUTED", - "INLINE" - ] - }, - "ExecutionType": { - "type": "string", - "description": "The execution type for the Map workflow.", - "minLength": 1, - "enum": [ - "EXPRESS", - "STANDARD" - ] - } - } - }, - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", - "minLength": 1 - }, - "States": { - "$ref": "#/properties/States" - } - }, - "required": [ - "StartAt", - "States" - ] - }, - "Label": { - "type": "string", - "description": "A string that uniquely identifies a Map state.", - "minLength": 1 - }, - "ToleratedFailurePercentage": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An integer or JSONata expression that provides an upper bound on the percentage of items that may fail.", - "minimum": 0, - "maximum": 100 - }, - "ToleratedFailurePercentagePath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that provides an upper bound on the percentage of items that may fail." - }, - "ToleratedFailureCount": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "An integer or JSONata expression that provides an upper bound on how many items may fail.", - "minimum": 0 - }, - "ToleratedFailureCountPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that provides an upper bound on how many items may fail." - }, - "MaxConcurrency": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" - } - ], - "description": "Provides an upper bound on how many invocations of the Iterator may run in parallel.\n\nThe default value is 0, which places no limit on parallelism and iterations are invoked as concurrently as possible.", - "minimum": 0 - }, - "MaxConcurrencyPath": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", - "description": "A reference path to an integer that provides an upper bound on how many invocations of the Iterator may run in parallel.", - "minimum": 0 - }, - "Retry": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry", - "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." - }, - "Catch": { - "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Catch", - "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." - }, - "Items": { - "oneOf": [ - { - "type": "array", - "errorMessage": "Incorrect type. Expected one of array, JSONata expression." - }, - { - "type": "string", - "pattern": "^{%(.*)%}$" - } - ], - "description": "An array or JSONata expression identifying where in the state input the array field is found." - }, - "Output": { - "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" - } - } - } - ] - } - ] - } - }, - "QueryLanguage": { - "type": "string", - "description": "ASL mode configuration. Specify either JSONata or JSONPath.", - "minLength": 1, - "enum": [ - "JSONata", - "JSONPath" - ] - } - }, - "required": [ - "States", - "StartAt" - ] -} \ No newline at end of file + "type": "object", + "properties": { + "Version": { + "type": "string", + "description": "The version of the Amazon States Language used in the state machine.", + "enum": ["1.0"] + }, + "Comment": { + "type": "string", + "description": "A human-readable comment or description.", + "minLength": 1 + }, + "TimeoutSeconds": { + "description": "The maximum number of seconds an execution of the state machine can run. If it runs longer than the specified time, the execution fails with a States.Timeout error.", + "type": "integer", + "minimum": 0, + "maximum": 99999999 + }, + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of a state.", + "minLength": 1 + }, + "States": { + "type": "object", + "description": "An object containing a comma-delimited set of states.", + "additionalProperties": { + "oneOf": [ + { + "description": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.", + "allOf": [ + { + "type": "object", + "properties": { + "Type": { + "type": "string", + "description": "The state's type.", + "minLength": 1, + "enum": ["Pass", "Succeed", "Fail", "Task", "Choice", "Wait", "Parallel", "Map"] + }, + "QueryLanguage": { + "$ref": "#/properties/QueryLanguage" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Type"] + }, + { + "properties": { + "InputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ResultPath": { + "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "OutputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + } + }, + { + "oneOf": [ + { + "required": ["Next"] + }, + { + "required": ["End"] + } + ], + "properties": { + "Next": { + "type": "string", + "description": "The name of the next state that is run when the current state finishes.", + "minLength": 1 + }, + "End": { + "type": "boolean", + "description": "Designates this state as a terminal state (ends the execution) if set to true. There can be any number of terminal states per state machine." + } + } + }, + { + "properties": { + "Type": { + "enum": ["Pass"] + }, + "Parameters": { + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions.", + "type": ["number", "string", "boolean", "object", "array", "null"] + }, + "Output": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "A value to define the Output configuration of this task state." + } + } + } + ] + }, + { + "description": "A Succeed state stops an execution successfully. The Succeed state is a useful target for Choice state branches that don't do anything but stop the execution.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "properties": { + "InputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "OutputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + } + }, + { + "properties": { + "Type": { + "enum": ["Succeed"] + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + } + } + } + ] + }, + { + "description": "A Fail state stops the execution of the state machine and marks it as a failure.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "properties": { + "Type": { + "enum": ["Fail"] + }, + "Comment": { + "$ref": "#/properties/Comment" + }, + "Error": { + "type": "string", + "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes.", + "minLength": 1 + }, + "Cause": { + "type": "string", + "description": "Provides a custom failure string that can be used for operational or diagnostic purposes.", + "minLength": 1 + }, + "ErrorPath": { + "type": "string", + "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", + "minLength": 1 + }, + "CausePath": { + "type": "string", + "description": "Provides a custom failure string that can be used for operational or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", + "minLength": 1 + } + } + } + ] + }, + { + "description": "A Task state represents a single unit of work performed by a state machine.\nAll work in your state machine is done by tasks. A task performs work identified by the state’s Resource field, which is often an AWS Lambda function or other Step Functions service integrations.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" + }, + { + "properties": { + "Type": { + "enum": ["Task"] + }, + "Resource": { + "type": "string", + "description": "A URI, especially an ARN that uniquely identifies the specific task to execute.", + "examples": [ + "arn:aws:states:::batch:submitJob", + "arn:aws:states:::batch:submitJob.sync", + "arn:aws:states:::dynamodb:deleteItem", + "arn:aws:states:::dynamodb:getItem", + "arn:aws:states:::dynamodb:putItem", + "arn:aws:states:::dynamodb:updateItem", + "arn:aws:states:::ecs:runTask", + "arn:aws:states:::ecs:runTask.sync", + "arn:aws:states:::ecs:runTask.waitForTaskToken", + "arn:aws:states:::elasticmapreduce:addStep", + "arn:aws:states:::elasticmapreduce:addStep.sync", + "arn:aws:states:::elasticmapreduce:cancelStep", + "arn:aws:states:::elasticmapreduce:createCluster", + "arn:aws:states:::elasticmapreduce:createCluster.sync", + "arn:aws:states:::elasticmapreduce:modifyInstanceFleetByName", + "arn:aws:states:::elasticmapreduce:modifyInstanceGroupByName", + "arn:aws:states:::elasticmapreduce:setClusterTerminationProtection", + "arn:aws:states:::elasticmapreduce:terminateCluster", + "arn:aws:states:::elasticmapreduce:terminateCluster.sync", + "arn:aws:states:::events:putEvents", + "arn:aws:states:::events:putEvents.waitForTaskToken", + "arn:aws:states:::glue:startJobRun", + "arn:aws:states:::glue:startJobRun.sync", + "arn:aws:states:::lambda:invoke", + "arn:aws:states:::lambda:invoke.waitForTaskToken", + "arn:aws:states:::mediaconvert:createJob", + "arn:aws:states:::mediaconvert:createJob.sync", + "arn:aws:states:::sagemaker:createEndpoint", + "arn:aws:states:::sagemaker:createEndpointConfig", + "arn:aws:states:::sagemaker:createHyperParameterTuningJob", + "arn:aws:states:::sagemaker:createHyperParameterTuningJob.sync", + "arn:aws:states:::sagemaker:createLabelingJob", + "arn:aws:states:::sagemaker:createLabelingJob.sync", + "arn:aws:states:::sagemaker:createModel", + "arn:aws:states:::sagemaker:createTrainingJob", + "arn:aws:states:::sagemaker:createTrainingJob.sync", + "arn:aws:states:::sagemaker:createTransformJob", + "arn:aws:states:::sagemaker:createTransformJob.sync", + "arn:aws:states:::sagemaker:updateEndpoint", + "arn:aws:states:::sns:publish", + "arn:aws:states:::sns:publish.waitForTaskToken", + "arn:aws:states:::sqs:sendMessage", + "arn:aws:states:::sqs:sendMessage.waitForTaskToken", + "arn:aws:states:::states:startExecution", + "arn:aws:states:::states:startExecution.sync", + "arn:aws:states:::states:startExecution.waitForTaskToken" + ] + }, + "Parameters": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions.", + "type": "object" + }, + "TimeoutSeconds": { + "oneOf": [ + { + "$ref": "#/properties/TimeoutSeconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error name. Must be a positive, non-zero integer, or a jsonata expression. If not provided, the default value is 99999999. The count begins after the task has been started, for example, when ActivityStarted or LambdaFunctionStarted are logged in the Execution event history." + }, + "TimeoutSecondsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath", + "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." + }, + "HeartbeatSeconds": { + "oneOf": [ + { + "$ref": "#/properties/TimeoutSeconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error name. Must be a positive, non-zero integer less than the number of seconds specified in the TimeoutSeconds field, or a jsonata expression. If not provided, the default value is 99999999. For Activities, the count begins when GetActivityTask receives a token and ActivityStarted is logged in the Execution event history." + }, + "HeartbeatSecondsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath", + "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." + }, + "Retry": { + "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ErrorEquals": { + "description": "A non-empty array of Error Names. The retry policy for this Retrier is implemented if the reported error matches one of the Error Names.", + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "IntervalSeconds": { + "$ref": "#/properties/TimeoutSeconds", + "description": "A positive integer representing the number of seconds before the first retry attempt. (Default: 1, Maximum: 99999999)" + }, + "MaxAttempts": { + "type": "integer", + "description": "A non-negative integer representing the maximum number of retry attempts. (Default: 3, Maximum: 99999999)", + "minimum": 0, + "maximum": 99999999 + }, + "BackoffRate": { + "type": "number", + "description": "A number (>= 1) which is the multiplier that increases the retry interval on each attempt. (Default: 2.0)", + "minimum": 1 + }, + "Comment": { + "$ref": "#/properties/Comment" + }, + "MaxDelaySeconds": { + "type": "integer", + "description": "A positive integer representing the maximum number of seconds to wait before a retry attempt. If not specified, the limit is the maximum duration a state machine can run. (Maximum: 31622400)", + "minimum": 1, + "maximum": 31622400 + }, + "JitterStrategy": { + "type": "string", + "description": "The Jitter Strategy to apply to the retry interval.", + "minLength": 1, + "enum": ["FULL", "NONE"] + } + }, + "required": ["ErrorEquals"] + } + }, + "Catch": { + "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined.", + "type": "array", + "items": { + "type": "object", + "properties": { + "ErrorEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry/items/properties/ErrorEquals", + "description": "A non-empty array of Error Names. The state machine transitions to this Catcher's fallback state if the reported error matches one of the Error Names." + }, + "Next": { + "type": "string", + "description": "The state to transition to on Error Name match.", + "minLength": 1 + }, + "ResultPath": { + "oneOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary." + }, + { + "type": "null" + } + ] + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + }, + "Comment": { + "$ref": "#/properties/Comment" + }, + "Assign": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign" + } + }, + "required": ["ErrorEquals", "Next"] + } + }, + "Arguments": { + "oneOf": [ + { + "type": "object", + "errorMessage": "Incorrect type. Expected one of object, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An object or JSONata expression to define the Argument of this task state." + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + }, + "Assign": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign", + "description": "An object to define the variables to be assigned." + } + }, + "required": ["Resource"] + } + ] + }, + { + "description": "A Choice state adds branching logic to a state machine.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/1/allOf/1" + }, + { + "properties": { + "Type": { + "enum": ["Choice"] + }, + "Choices": { + "type": "array", + "description": "An array of Choice Rules that determines which state the state machine transitions to next.", + "minItems": 1, + "items": { + "oneOf": [ + { + "errorMessage": "Incorrect type. Expected a valid choice state condition.", + "type": "object", + "properties": { + "Condition": { + "oneOf": [ + { + "type": "boolean", + "errorMessage": "Incorrect type. Expected one of boolean, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ] + }, + "Assign": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Assign" + }, + "Next": { + "type": "string", + "description": "The state to transition to if there is an exact match between the input value and the comparison operator for this Choice Rule.", + "minLength": 1 + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Condition", "Next"] + }, + { + "type": "object", + "properties": { + "StringEquals": { + "type": "string" + }, + "Variable": { + "type": "string", + "description": "A reference path specifying the input value to apply the comparison operator to.", + "minLength": 1 + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringGreaterThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringLessThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringLessThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericLessThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericLessThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "BooleanEquals": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["BooleanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampEquals": { + "type": "string", + "format": "date-time" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThan": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampLessThan": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThan", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanEquals", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "And": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["And", "Next"] + }, + { + "type": "object", + "properties": { + "Or": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/19/properties/Not" + } + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Or", "Next"] + }, + { + "type": "object", + "properties": { + "Not": { + "oneOf": [ + { + "type": "object", + "properties": { + "StringEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "StringLessThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThan", "Variable"] + }, + { + "type": "object", + "properties": { + "StringGreaterThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThan", "Variable"] + }, + { + "type": "object", + "properties": { + "StringLessThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericLessThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThan", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThan", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericLessThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "BooleanEquals": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["BooleanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampLessThan": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThan", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThan": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThan", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanEquals": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanEquals", "Variable"] + }, + { + "type": "object", + "properties": { + "And": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["And"] + }, + { + "type": "object", + "properties": { + "Or": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/18/properties/Or" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Or"] + }, + { + "type": "object", + "properties": { + "Not": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/19/properties/Not" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Not"] + }, + { + "type": "object", + "properties": { + "StringEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "StringLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "StringLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "BooleanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["BooleanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanPath", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanEqualsPath", "Variable"] + }, + { + "type": "object", + "properties": { + "IsNull": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsNull", "Variable"] + }, + { + "type": "object", + "properties": { + "IsPresent": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsPresent", "Variable"] + }, + { + "type": "object", + "properties": { + "IsNumeric": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsNumeric", "Variable"] + }, + { + "type": "object", + "properties": { + "IsString": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsString", "Variable"] + }, + { + "type": "object", + "properties": { + "IsBoolean": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsBoolean", "Variable"] + }, + { + "type": "object", + "properties": { + "IsTimestamp": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsTimestamp", "Variable"] + }, + { + "type": "object", + "properties": { + "StringMatches": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringMatches", "Variable"] + } + ] + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["Not", "Next"] + }, + { + "type": "object", + "properties": { + "StringEqualsPath": { + "type": "string", + "pattern": "\\$.*" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringGreaterThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringLessThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericGreaterThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "NumericLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["NumericLessThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "BooleanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["BooleanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampGreaterThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampGreaterThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "TimestampLessThanEqualsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/20/properties/StringEqualsPath" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/1/properties/Variable" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["TimestampLessThanEqualsPath", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsNull": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsNull", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsPresent": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsPresent", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsNumeric": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsNumeric", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsString": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsString", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsBoolean": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsBoolean", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "IsTimestamp": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["IsTimestamp", "Variable", "Next"] + }, + { + "type": "object", + "properties": { + "StringMatches": { + "type": "string" + }, + "Variable": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0" + }, + "Next": { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/0/properties/Next" + }, + "Comment": { + "$ref": "#/properties/Comment" + } + }, + "required": ["StringMatches", "Variable", "Next"] + } + ] + }, + "additionalItems": false + }, + "Default": { + "type": "string", + "description": "The name of the state to transition to if none of the Choice Rules match." + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + }, + "Assign": { + "type": "object", + "description": "An object to define the variables to be assigned." + } + }, + "required": ["Choices"] + } + ] + }, + { + "description": "A Wait state delays the state machine from continuing for a specified time. You can choose either a relative time, specified in seconds from when the state begins, or an absolute end time, specified as a timestamp.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/1/allOf/1" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" + }, + { + "properties": { + "Type": { + "enum": ["Wait"] + }, + "Seconds": { + "oneOf": [ + { + "$ref": "#/properties/TimeoutSeconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field." + }, + "Timestamp": { + "oneOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/4/allOf/2/properties/Choices/items/oneOf/12/properties/TimestampEquals", + "errorMessage": "Incorrect type. Expected one of timestamp, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An absolute time to wait until beginning the state specified in the \"Next\" field.\n\nTimestamps must conform to the RFC3339 profile of ISO 8601, with the further restrictions that an uppercase T must separate the date and time portions, and an uppercase Z must denote that a numeric time zone offset is not present, for example, 2016-08-18T17:33:00Z." + }, + "SecondsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field, specified using a path from the state's input data." + }, + "TimestampPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "An absolute time to wait until beginning the state specified in the \"Next\" field, specified using a path from the state's input data." + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + } + }, + "oneOf": [ + { + "required": ["Type", "Seconds"] + }, + { + "required": ["Type", "Timestamp"] + }, + { + "required": ["Type", "SecondsPath"] + }, + { + "required": ["Type", "TimestampPath"] + } + ] + } + ] + }, + { + "description": "The Parallel state can be used to create parallel branches of execution in your state machine.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" + }, + { + "properties": { + "Type": { + "enum": ["Parallel"] + }, + "Parameters": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/ResultSelector", + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "Branches": { + "type": "array", + "description": "An array of objects that specifies state machines to execute in parallel.", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects." + }, + "States": { + "$ref": "#/properties/States" + } + }, + "required": ["StartAt", "States"] + } + }, + "Retry": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry", + "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." + }, + "Catch": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Catch", + "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." + }, + "Arguments": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments" + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + } + }, + "required": ["Branches"] + } + ] + }, + { + "description": "The Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input.", + "allOf": [ + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/0" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1" + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/2" + }, + { + "properties": { + "Type": { + "enum": ["Map"] + }, + "Parameters": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/ResultSelector", + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ItemsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "Reference path identifying where in the effective input the array field is found." + }, + "Iterator": { + "type": "object", + "description": "A state machine which will process each element of the array.", + "properties": { + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", + "minLength": 1 + }, + "States": { + "$ref": "#/properties/States" + } + }, + "required": ["StartAt", "States"] + }, + "ItemReader": { + "type": "object", + "description": "Specifies the location of the dataset from which the Map state reads its input data.", + "properties": { + "ReaderConfig": { + "type": "object", + "description": "A JSON object that specifies where to read the items instead of from the effective input.", + "properties": { + "InputType": { + "type": "string", + "description": "A string that specifies the type of Amazon S3 data source.", + "minLength": 1, + "enum": ["CSV", "JSON", "MANIFEST"] + }, + "CSVHeaders": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "CSVHeaderLocation": { + "type": "string", + "description": "A string that specifies the location of the CSV column header.", + "minLength": 1, + "enum": ["FIRST_ROW", "GIVEN"] + }, + "MaxItems": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An integer or JSONata expression that limits the number of data items passed to the Map state.", + "minimum": 0 + }, + "MaxItemsPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that limits the number of data items passed to the Map state." + } + } + }, + "Resource": { + "type": "string", + "description": "The Amazon S3 API action Step Functions must invoke depending on the specified dataset.", + "examples": ["arn:aws:states:::s3:getObject", "arn:aws:states:::s3:listObjectsV2"] + }, + "Arguments": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments", + "description": "A JSON object or JSONata expression that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", + "minLength": 1 + }, + "Key": { + "type": "string", + "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", + "minLength": 1 + } + } + }, + "Parameters": { + "type": "object", + "description": "A JSON object that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", + "minLength": 1 + }, + "Key": { + "type": "string", + "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", + "minLength": 1 + }, + "Bucket.$": { + "type": "string", + "description": "", + "minLength": 1 + }, + "Prefix.$": { + "type": "string", + "description": "", + "minLength": 1 + } + } + } + } + }, + "ItemSelector": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "A JSON object or value that overrides each single element of the item array." + }, + "ItemBatcher": { + "type": "object", + "description": "A JSON object that specifies how to batch the items for the ItemProcessor.", + "properties": { + "BatchInput": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "Specifies a fixed JSON input to include in each batch passed to each child workflow execution." + }, + "MaxItemsPerBatch": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An integer or JSONata expression that limits the maximum number of items of each sub-array.", + "minimum": 1 + }, + "MaxItemsPerBatchPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that limits the maximum number of items of each sub-array." + }, + "MaxInputBytesPerBatch": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An integer or JSONata expression that limits the maximum size in bytes of each sub-array.", + "minimum": 1 + }, + "MaxInputBytesPerBatchPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that limits the maximum size in bytes of each sub-array." + } + } + }, + "ResultWriter": { + "type": "object", + "description": "A JSON object that specifies where to write the results instead of to the Map state's result.", + "properties": { + "Resource": { + "type": "string", + "description": "A string that specifies the Amazon S3 API action Step Functions must invoke depending on the specified dataset.", + "examples": ["arn:aws:states:::s3:putObject"] + }, + "Arguments": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Arguments", + "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name to export the results to.", + "minLength": 1 + }, + "Prefix": { + "type": "string", + "description": "A string that specifies the Amazon S3 object prefix to export the results to.", + "minLength": 1 + } + } + }, + "Parameters": { + "type": "object", + "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name to export the results to.", + "minLength": 1 + }, + "Prefix": { + "type": "string", + "description": "A string that specifies the Amazon S3 object prefix to export the results to.", + "minLength": 1 + } + } + } + } + }, + "ItemProcessor": { + "type": "object", + "description": "A JSON object that defines a state machine which will process each item or batch of items of the array.", + "properties": { + "ProcessorConfig": { + "type": "object", + "description": "A JSON object that specifies the Map state processing mode and definition.", + "properties": { + "Mode": { + "type": "string", + "description": "The Map state processing mode.", + "minLength": 1, + "enum": ["DISTRIBUTED", "INLINE"] + }, + "ExecutionType": { + "type": "string", + "description": "The execution type for the Map workflow.", + "minLength": 1, + "enum": ["EXPRESS", "STANDARD"] + } + } + }, + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", + "minLength": 1 + }, + "States": { + "$ref": "#/properties/States" + } + }, + "required": ["StartAt", "States"] + }, + "Label": { + "type": "string", + "description": "A string that uniquely identifies a Map state.", + "minLength": 1 + }, + "ToleratedFailurePercentage": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An integer or JSONata expression that provides an upper bound on the percentage of items that may fail.", + "minimum": 0, + "maximum": 100 + }, + "ToleratedFailurePercentagePath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that provides an upper bound on the percentage of items that may fail." + }, + "ToleratedFailureCount": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "An integer or JSONata expression that provides an upper bound on how many items may fail.", + "minimum": 0 + }, + "ToleratedFailureCountPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that provides an upper bound on how many items may fail." + }, + "MaxConcurrency": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "#/properties/States/additionalProperties/oneOf/7/allOf/3/properties/Items/oneOf/1" + } + ], + "description": "Provides an upper bound on how many invocations of the Iterator may run in parallel.\n\nThe default value is 0, which places no limit on parallelism and iterations are invoked as concurrently as possible.", + "minimum": 0 + }, + "MaxConcurrencyPath": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/1/properties/ResultPath/oneOf/0", + "description": "A reference path to an integer that provides an upper bound on how many invocations of the Iterator may run in parallel.", + "minimum": 0 + }, + "Retry": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Retry", + "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." + }, + "Catch": { + "$ref": "#/properties/States/additionalProperties/oneOf/3/allOf/3/properties/Catch", + "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." + }, + "Items": { + "oneOf": [ + { + "type": "array", + "errorMessage": "Incorrect type. Expected one of array, JSONata expression." + }, + { + "type": "string", + "pattern": "^{%(.*)%}$" + } + ], + "description": "An array or JSONata expression identifying where in the state input the array field is found." + }, + "Output": { + "$ref": "#/properties/States/additionalProperties/oneOf/0/allOf/3/properties/Output" + } + } + } + ] + } + ] + } + }, + "QueryLanguage": { + "type": "string", + "description": "ASL mode configuration. Specify either JSONata or JSONPath.", + "minLength": 1, + "enum": ["JSONata", "JSONPath"] + } + }, + "required": ["States", "StartAt"] +} diff --git a/src/json-schema/partial/base.json b/src/json-schema/partial/base.json index e3ad15f2e..c43962ede 100755 --- a/src/json-schema/partial/base.json +++ b/src/json-schema/partial/base.json @@ -1,34 +1,29 @@ { - "type": "object", - "properties": { - "Version": { - "type": "string", - "description": "The version of the Amazon States Language used in the state machine.", - "enum": [ - "1.0" - ] - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - }, - "TimeoutSeconds": { - "$ref": "common.json#/definitions/seconds", - "description": "The maximum number of seconds an execution of the state machine can run. If it runs longer than the specified time, the execution fails with a States.Timeout error." - }, - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of a state.", - "minLength": 1 - }, - "States": { - "$ref": "states.json#/definitions/states" - }, - "QueryLanguage": { - "$ref": "common.json#/definitions/queryLanguage" - } + "type": "object", + "properties": { + "Version": { + "type": "string", + "description": "The version of the Amazon States Language used in the state machine.", + "enum": ["1.0"] }, - "required": [ - "States", - "StartAt" - ] -} \ No newline at end of file + "Comment": { + "$ref": "common.json#/definitions/comment" + }, + "TimeoutSeconds": { + "$ref": "common.json#/definitions/seconds", + "description": "The maximum number of seconds an execution of the state machine can run. If it runs longer than the specified time, the execution fails with a States.Timeout error." + }, + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of a state.", + "minLength": 1 + }, + "States": { + "$ref": "states.json#/definitions/states" + }, + "QueryLanguage": { + "$ref": "common.json#/definitions/queryLanguage" + } + }, + "required": ["States", "StartAt"] +} diff --git a/src/json-schema/partial/choice_state.json b/src/json-schema/partial/choice_state.json index 2bd6edf93..a0276f695 100755 --- a/src/json-schema/partial/choice_state.json +++ b/src/json-schema/partial/choice_state.json @@ -1,2014 +1,1716 @@ { - "definitions": { - "choiceState": { - "description": "A Choice state adds branching logic to a state machine.", - "allOf": [ - { - "$ref": "common.json#/definitions/basics" - }, - { - "$ref": "common.json#/definitions/inputOutput" - }, - { - "properties": { - "Type": { - "enum": [ - "Choice" - ] - }, - "Choices": { - "type": "array", - "description": "An array of Choice Rules that determines which state the state machine transitions to next.", - "minItems": 1, - "items": { - "oneOf": [ - { - "$ref": "#/definitions/jsonataCondition", - "errorMessage": "Incorrect type. Expected a valid choice state condition." - }, - { - "$ref": "#/definitions/topStringEquals" - }, - { - "$ref": "#/definitions/topStringGreaterThan" - }, - { - "$ref": "#/definitions/topStringGreaterThanEquals" - }, - { - "$ref": "#/definitions/topStringLessThan" - }, - { - "$ref": "#/definitions/topStringLessThanEquals" - }, - { - "$ref": "#/definitions/topNumericEquals" - }, - { - "$ref": "#/definitions/topNumericGreaterThan" - }, - { - "$ref": "#/definitions/topNumericGreaterThanEquals" - }, - { - "$ref": "#/definitions/topNumericLessThan" - }, - { - "$ref": "#/definitions/topNumericLessThanEquals" - }, - { - "$ref": "#/definitions/topBooleanEquals" - }, - { - "$ref": "#/definitions/topTimestampEquals" - }, - { - "$ref": "#/definitions/topTimestampGreaterThan" - }, - { - "$ref": "#/definitions/topTimestampGreaterThanEquals" - }, - { - "$ref": "#/definitions/topTimestampLessThan" - }, - { - "$ref": "#/definitions/topTimestampLessThanEquals" - }, - { - "$ref": "#/definitions/topAnd" - }, - { - "$ref": "#/definitions/topOr" - }, - { - "$ref": "#/definitions/topNot" - }, - { - "$ref": "#/definitions/topStringEqualsPath" - }, - { - "$ref": "#/definitions/topStringGreaterThanPath" - }, - { - "$ref": "#/definitions/topStringGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/topStringLessThanPath" - }, - { - "$ref": "#/definitions/topStringLessThanEqualsPath" - }, - { - "$ref": "#/definitions/topNumericEqualsPath" - }, - { - "$ref": "#/definitions/topNumericGreaterThanPath" - }, - { - "$ref": "#/definitions/topNumericGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/topNumericLessThanPath" - }, - { - "$ref": "#/definitions/topNumericLessThanEqualsPath" - }, - { - "$ref": "#/definitions/topBooleanEqualsPath" - }, - { - "$ref": "#/definitions/topTimestampEqualsPath" - }, - { - "$ref": "#/definitions/topTimestampGreaterThanPath" - }, - { - "$ref": "#/definitions/topTimestampGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/topTimestampLessThanPath" - }, - { - "$ref": "#/definitions/topTimestampLessThanEqualsPath" - }, - { - "$ref": "#/definitions/topIsNull" - }, - { - "$ref": "#/definitions/topIsPresent" - }, - { - "$ref": "#/definitions/topIsNumeric" - }, - { - "$ref": "#/definitions/topIsString" - }, - { - "$ref": "#/definitions/topIsBoolean" - }, - { - "$ref": "#/definitions/topIsTimestamp" - }, - { - "$ref": "#/definitions/topStringMatches" - } - ] - }, - "additionalItems": false - }, - "Default": { - "type": "string", - "description": "The name of the state to transition to if none of the Choice Rules match." - }, - "Output": { - "$ref": "common.json#/definitions/output" - }, - "Assign": { - "$ref": "common.json#/definitions/assign" - } - }, - "required": [ - "Choices" - ] - } - ] - }, - "variable": { - "type": "string", - "description": "A reference path specifying the input value to apply the comparison operator to.", - "minLength": 1 - }, - "next": { - "type": "string", - "description": "The state to transition to if there is an exact match between the input value and the comparison operator for this Choice Rule.", - "minLength": 1 - }, - "jsonataCondition": { - "type": "object", - "properties": { - "Condition": { - "oneOf": [ - { - "type": "boolean", - "errorMessage": "Incorrect type. Expected one of boolean, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ] - }, - "Assign": { - "$ref": "common.json#/definitions/assign" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "Condition", - "Next" - ] - }, - "topStringEquals": { - "type": "object", - "properties": { - "StringEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringEquals", - "Variable", - "Next" - ] - }, - "topStringLessThan": { - "type": "object", - "properties": { - "StringLessThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThan", - "Variable", - "Next" - ] - }, - "topStringGreaterThan": { - "type": "object", - "properties": { - "StringGreaterThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThan", - "Variable", - "Next" - ] - }, - "topStringLessThanEquals": { - "type": "object", - "properties": { - "StringLessThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanEquals", - "Variable", - "Next" - ] - }, - "topStringGreaterThanEquals": { - "type": "object", - "properties": { - "StringGreaterThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanEquals", - "Variable", - "Next" - ] - }, - "topNumericEquals": { - "type": "object", - "properties": { - "NumericEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericEquals", - "Variable", - "Next" - ] - }, - "topNumericLessThan": { - "type": "object", - "properties": { - "NumericLessThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThan", - "Variable", - "Next" - ] - }, - "topNumericGreaterThan": { - "type": "object", - "properties": { - "NumericGreaterThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThan", - "Variable", - "Next" - ] - }, - "topNumericLessThanEquals": { - "type": "object", - "properties": { - "NumericLessThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanEquals", - "Variable", - "Next" - ] - }, - "topNumericGreaterThanEquals": { - "type": "object", - "properties": { - "NumericGreaterThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanEquals", - "Variable", - "Next" - ] - }, - "topBooleanEquals": { - "type": "object", - "properties": { - "BooleanEquals": { - "type": "boolean" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "BooleanEquals", - "Variable", - "Next" - ] - }, - "topTimestampEquals": { - "type": "object", - "properties": { - "TimestampEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampEquals", - "Variable", - "Next" - ] - }, - "topTimestampLessThan": { - "type": "object", - "properties": { - "TimestampLessThan": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThan", - "Variable", - "Next" - ] - }, - "topTimestampGreaterThan": { - "type": "object", - "properties": { - "TimestampGreaterThan": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThan", - "Variable", - "Next" - ] - }, - "topTimestampLessThanEquals": { - "type": "object", - "properties": { - "TimestampLessThanEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanEquals", - "Variable", - "Next" - ] - }, - "topTimestampGreaterThanEquals": { - "type": "object", - "properties": { - "TimestampGreaterThanEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanEquals", - "Variable", - "Next" - ] - }, - "topAnd": { - "type": "object", - "properties": { - "And": { - "$ref": "#/definitions/lowerConditions" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "And", - "Next" - ] - }, - "topOr": { - "type": "object", - "properties": { - "Or": { - "$ref": "#/definitions/lowerConditions" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "Or", - "Next" - ] - }, - "topNot": { - "type": "object", - "properties": { - "Not": { - "$ref": "#/definitions/lowerCondition" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "Not", - "Next" - ] - }, - "topStringEqualsPath": { - "type": "object", - "properties": { - "StringEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringEqualsPath", - "Variable", - "Next" - ] - }, - "topStringLessThanPath": { - "type": "object", - "properties": { - "StringLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanPath", - "Variable", - "Next" - ] - }, - "topStringGreaterThanPath": { - "type": "object", - "properties": { - "StringGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanPath", - "Variable", - "Next" - ] - }, - "topStringLessThanEqualsPath": { - "type": "object", - "properties": { - "StringLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanEqualsPath", - "Variable", - "Next" - ] - }, - "topStringGreaterThanEqualsPath": { - "type": "object", - "properties": { - "StringGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - "topNumericEqualsPath": { - "type": "object", - "properties": { - "NumericEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericEqualsPath", - "Variable", - "Next" - ] - }, - "topNumericLessThanPath": { - "type": "object", - "properties": { - "NumericLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanPath", - "Variable", - "Next" - ] - }, - "topNumericGreaterThanPath": { - "type": "object", - "properties": { - "NumericGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanPath", - "Variable", - "Next" - ] - }, - "topNumericLessThanEqualsPath": { - "type": "object", - "properties": { - "NumericLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanEqualsPath", - "Variable", - "Next" - ] - }, - "topNumericGreaterThanEqualsPath": { - "type": "object", - "properties": { - "NumericGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - "topBooleanEqualsPath": { - "type": "object", - "properties": { - "BooleanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "BooleanEqualsPath", - "Variable", - "Next" - ] - }, - "topTimestampEqualsPath": { - "type": "object", - "properties": { - "TimestampEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampEqualsPath", - "Variable", - "Next" - ] - }, - "topTimestampLessThanPath": { - "type": "object", - "properties": { - "TimestampLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanPath", - "Variable", - "Next" - ] - }, - "topTimestampGreaterThanPath": { - "type": "object", - "properties": { - "TimestampGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanPath", - "Variable", - "Next" - ] - }, - "topTimestampLessThanEqualsPath": { - "type": "object", - "properties": { - "TimestampLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanEqualsPath", - "Variable", - "Next" - ] - }, - "topTimestampGreaterThanEqualsPath": { - "type": "object", - "properties": { - "TimestampGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanEqualsPath", - "Variable", - "Next" - ] - }, - "topIsNull": { - "type": "object", - "properties": { - "IsNull": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsNull", - "Variable", - "Next" - ] - }, - "topIsPresent": { - "type": "object", - "properties": { - "IsPresent": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsPresent", - "Variable", - "Next" - ] - }, - "topIsNumeric": { - "type": "object", - "properties": { - "IsNumeric": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsNumeric", - "Variable", - "Next" - ] - }, - "topIsString": { - "type": "object", - "properties": { - "IsString": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsString", - "Variable", - "Next" - ] - }, - "topIsBoolean": { - "type": "object", - "properties": { - "IsBoolean": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsBoolean", - "Variable", - "Next" - ] - }, - "topIsTimestamp": { - "type": "object", - "properties": { - "IsTimestamp": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsTimestamp", - "Variable", - "Next" - ] - }, - "topStringMatches": { - "type": "object", - "properties": { - "StringMatches": { - "type": "string" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Next": { - "$ref": "#/definitions/next" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringMatches", - "Variable", - "Next" - ] - }, - - "lowerConditions": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/lowerCondition" + "definitions": { + "choiceState": { + "description": "A Choice state adds branching logic to a state machine.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutput" + }, + { + "properties": { + "Type": { + "enum": ["Choice"] + }, + "Choices": { + "type": "array", + "description": "An array of Choice Rules that determines which state the state machine transitions to next.", + "minItems": 1, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/jsonataCondition", + "errorMessage": "Incorrect type. Expected a valid choice state condition." + }, + { + "$ref": "#/definitions/topStringEquals" + }, + { + "$ref": "#/definitions/topStringGreaterThan" + }, + { + "$ref": "#/definitions/topStringGreaterThanEquals" + }, + { + "$ref": "#/definitions/topStringLessThan" + }, + { + "$ref": "#/definitions/topStringLessThanEquals" + }, + { + "$ref": "#/definitions/topNumericEquals" + }, + { + "$ref": "#/definitions/topNumericGreaterThan" + }, + { + "$ref": "#/definitions/topNumericGreaterThanEquals" + }, + { + "$ref": "#/definitions/topNumericLessThan" + }, + { + "$ref": "#/definitions/topNumericLessThanEquals" + }, + { + "$ref": "#/definitions/topBooleanEquals" + }, + { + "$ref": "#/definitions/topTimestampEquals" + }, + { + "$ref": "#/definitions/topTimestampGreaterThan" + }, + { + "$ref": "#/definitions/topTimestampGreaterThanEquals" + }, + { + "$ref": "#/definitions/topTimestampLessThan" + }, + { + "$ref": "#/definitions/topTimestampLessThanEquals" + }, + { + "$ref": "#/definitions/topAnd" + }, + { + "$ref": "#/definitions/topOr" + }, + { + "$ref": "#/definitions/topNot" + }, + { + "$ref": "#/definitions/topStringEqualsPath" + }, + { + "$ref": "#/definitions/topStringGreaterThanPath" + }, + { + "$ref": "#/definitions/topStringGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/topStringLessThanPath" + }, + { + "$ref": "#/definitions/topStringLessThanEqualsPath" + }, + { + "$ref": "#/definitions/topNumericEqualsPath" + }, + { + "$ref": "#/definitions/topNumericGreaterThanPath" + }, + { + "$ref": "#/definitions/topNumericGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/topNumericLessThanPath" + }, + { + "$ref": "#/definitions/topNumericLessThanEqualsPath" + }, + { + "$ref": "#/definitions/topBooleanEqualsPath" + }, + { + "$ref": "#/definitions/topTimestampEqualsPath" + }, + { + "$ref": "#/definitions/topTimestampGreaterThanPath" + }, + { + "$ref": "#/definitions/topTimestampGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/topTimestampLessThanPath" + }, + { + "$ref": "#/definitions/topTimestampLessThanEqualsPath" + }, + { + "$ref": "#/definitions/topIsNull" + }, + { + "$ref": "#/definitions/topIsPresent" + }, + { + "$ref": "#/definitions/topIsNumeric" + }, + { + "$ref": "#/definitions/topIsString" + }, + { + "$ref": "#/definitions/topIsBoolean" + }, + { + "$ref": "#/definitions/topIsTimestamp" + }, + { + "$ref": "#/definitions/topStringMatches" + } + ] + }, + "additionalItems": false + }, + "Default": { + "type": "string", + "description": "The name of the state to transition to if none of the Choice Rules match." + }, + "Output": { + "$ref": "common.json#/definitions/output" + }, + "Assign": { + "$ref": "common.json#/definitions/assign" } + }, + "required": ["Choices"] + } + ] + }, + "variable": { + "type": "string", + "description": "A reference path specifying the input value to apply the comparison operator to.", + "minLength": 1 + }, + "next": { + "type": "string", + "description": "The state to transition to if there is an exact match between the input value and the comparison operator for this Choice Rule.", + "minLength": 1 + }, + "jsonataCondition": { + "type": "object", + "properties": { + "Condition": { + "oneOf": [ + { + "type": "boolean", + "errorMessage": "Incorrect type. Expected one of boolean, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" + } + ] }, - "lowerCondition": { - "oneOf": [ - { - "$ref": "#/definitions/nestedStringEquals" - }, - { - "$ref": "#/definitions/nestedStringLessThan" - }, - { - "$ref": "#/definitions/nestedStringGreaterThan" - }, - { - "$ref": "#/definitions/nestedStringLessThanEquals" - }, - { - "$ref": "#/definitions/nestedStringGreaterThanEquals" - }, - { - "$ref": "#/definitions/nestedNumericEquals" - }, - { - "$ref": "#/definitions/nestedNumericLessThan" - }, - { - "$ref": "#/definitions/nestedNumericGreaterThan" - }, - { - "$ref": "#/definitions/nestedNumericLessThanEquals" - }, - { - "$ref": "#/definitions/nestedNumericGreaterThanEquals" - }, - { - "$ref": "#/definitions/nestedBooleanEquals" - }, - { - "$ref": "#/definitions/nestedTimestampEquals" - }, - { - "$ref": "#/definitions/nestedTimestampLessThan" - }, - { - "$ref": "#/definitions/nestedTimestampGreaterThan" - }, - { - "$ref": "#/definitions/nestedTimestampLessThanEquals" - }, - { - "$ref": "#/definitions/nestedTimestampGreaterThanEquals" - }, - { - "$ref": "#/definitions/nestedAnd" - }, - { - "$ref": "#/definitions/nestedOr" - }, - { - "$ref": "#/definitions/nestedNot" - }, - { - "$ref": "#/definitions/nestedStringEqualsPath" - }, - { - "$ref": "#/definitions/nestedStringLessThanPath" - }, - { - "$ref": "#/definitions/nestedStringGreaterThanPath" - }, - { - "$ref": "#/definitions/nestedStringLessThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedStringGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedNumericEqualsPath" - }, - { - "$ref": "#/definitions/nestedNumericLessThanPath" - }, - { - "$ref": "#/definitions/nestedNumericGreaterThanPath" - }, - { - "$ref": "#/definitions/nestedNumericLessThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedNumericGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedBooleanEqualsPath" - }, - { - "$ref": "#/definitions/nestedTimestampEqualsPath" - }, - { - "$ref": "#/definitions/nestedTimestampLessThanPath" - }, - { - "$ref": "#/definitions/nestedTimestampGreaterThanPath" - }, - { - "$ref": "#/definitions/nestedTimestampLessThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedTimestampGreaterThanEqualsPath" - }, - { - "$ref": "#/definitions/nestedIsNull" - }, - { - "$ref": "#/definitions/nestedIsPresent" - }, - { - "$ref": "#/definitions/nestedIsNumeric" - }, - { - "$ref": "#/definitions/nestedIsString" - }, - { - "$ref": "#/definitions/nestedIsBoolean" - }, - { - "$ref": "#/definitions/nestedIsTimestamp" - }, - { - "$ref": "#/definitions/nestedStringMatches" - } - ] - }, - "nestedStringEquals": { - "type": "object", - "properties": { - "StringEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringEquals", - "Variable" - ] - }, - "nestedStringLessThan": { - "type": "object", - "properties": { - "StringLessThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThan", - "Variable" - ] - }, - "nestedStringGreaterThan": { - "type": "object", - "properties": { - "StringGreaterThan": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThan", - "Variable" - ] - }, - "nestedStringLessThanEquals": { - "type": "object", - "properties": { - "StringLessThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanEquals", - "Variable" - ] - }, - "nestedStringGreaterThanEquals": { - "type": "object", - "properties": { - "StringGreaterThanEquals": { - "type": "string" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanEquals", - "Variable" - ] - }, - "nestedNumericEquals": { - "type": "object", - "properties": { - "NumericEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericEquals", - "Variable" - ] - }, - "nestedNumericLessThan": { - "type": "object", - "properties": { - "NumericLessThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThan", - "Variable" - ] - }, - "nestedNumericGreaterThan": { - "type": "object", - "properties": { - "NumericGreaterThan": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThan", - "Variable" - ] - }, - "nestedNumericLessThanEquals": { - "type": "object", - "properties": { - "NumericLessThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanEquals", - "Variable" - ] - }, - "nestedNumericGreaterThanEquals": { - "type": "object", - "properties": { - "NumericGreaterThanEquals": { - "type": "number" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanEquals", - "Variable" - ] - }, - "nestedBooleanEquals": { - "type": "object", - "properties": { - "BooleanEquals": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "BooleanEquals", - "Variable" - ] - }, - "nestedTimestampEquals": { - "type": "object", - "properties": { - "TimestampEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampEquals", - "Variable" - ] - }, - "nestedTimestampLessThan": { - "type": "object", - "properties": { - "TimestampLessThan": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThan", - "Variable" - ] - }, - "nestedTimestampGreaterThan": { - "type": "object", - "properties": { - "TimestampGreaterThan": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThan", - "Variable" - ] - }, - "nestedTimestampLessThanEquals": { - "type": "object", - "properties": { - "TimestampLessThanEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanEquals", - "Variable" - ] - }, - "nestedTimestampGreaterThanEquals": { - "type": "object", - "properties": { - "TimestampGreaterThanEquals": { - "$ref": "common.json#/definitions/timestamp" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanEquals", - "Variable" - ] - }, - "nestedAnd": { - "type": "object", - "properties": { - "And": { - "$ref": "#/definitions/lowerConditions" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "And" - ] - }, - "nestedOr": { - "type": "object", - "properties": { - "Or": { - "$ref": "#/definitions/lowerConditions" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "Or" - ] - }, - "nestedNot": { - "type": "object", - "properties": { - "Not": { - "$ref": "#/definitions/lowerCondition" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "Not" - ] + "Assign": { + "$ref": "common.json#/definitions/assign" }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["Condition", "Next"] + }, + "topStringEquals": { + "type": "object", + "properties": { + "StringEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringEquals", "Variable", "Next"] + }, + "topStringLessThan": { + "type": "object", + "properties": { + "StringLessThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThan", "Variable", "Next"] + }, + "topStringGreaterThan": { + "type": "object", + "properties": { + "StringGreaterThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThan", "Variable", "Next"] + }, + "topStringLessThanEquals": { + "type": "object", + "properties": { + "StringLessThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanEquals", "Variable", "Next"] + }, + "topStringGreaterThanEquals": { + "type": "object", + "properties": { + "StringGreaterThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanEquals", "Variable", "Next"] + }, + "topNumericEquals": { + "type": "object", + "properties": { + "NumericEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericEquals", "Variable", "Next"] + }, + "topNumericLessThan": { + "type": "object", + "properties": { + "NumericLessThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThan", "Variable", "Next"] + }, + "topNumericGreaterThan": { + "type": "object", + "properties": { + "NumericGreaterThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThan", "Variable", "Next"] + }, + "topNumericLessThanEquals": { + "type": "object", + "properties": { + "NumericLessThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanEquals", "Variable", "Next"] + }, + "topNumericGreaterThanEquals": { + "type": "object", + "properties": { + "NumericGreaterThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanEquals", "Variable", "Next"] + }, + "topBooleanEquals": { + "type": "object", + "properties": { + "BooleanEquals": { + "type": "boolean" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["BooleanEquals", "Variable", "Next"] + }, + "topTimestampEquals": { + "type": "object", + "properties": { + "TimestampEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampEquals", "Variable", "Next"] + }, + "topTimestampLessThan": { + "type": "object", + "properties": { + "TimestampLessThan": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThan", "Variable", "Next"] + }, + "topTimestampGreaterThan": { + "type": "object", + "properties": { + "TimestampGreaterThan": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThan", "Variable", "Next"] + }, + "topTimestampLessThanEquals": { + "type": "object", + "properties": { + "TimestampLessThanEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanEquals", "Variable", "Next"] + }, + "topTimestampGreaterThanEquals": { + "type": "object", + "properties": { + "TimestampGreaterThanEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanEquals", "Variable", "Next"] + }, + "topAnd": { + "type": "object", + "properties": { + "And": { + "$ref": "#/definitions/lowerConditions" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["And", "Next"] + }, + "topOr": { + "type": "object", + "properties": { + "Or": { + "$ref": "#/definitions/lowerConditions" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["Or", "Next"] + }, + "topNot": { + "type": "object", + "properties": { + "Not": { + "$ref": "#/definitions/lowerCondition" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["Not", "Next"] + }, + "topStringEqualsPath": { + "type": "object", + "properties": { + "StringEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringEqualsPath", "Variable", "Next"] + }, + "topStringLessThanPath": { + "type": "object", + "properties": { + "StringLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanPath", "Variable", "Next"] + }, + "topStringGreaterThanPath": { + "type": "object", + "properties": { + "StringGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanPath", "Variable", "Next"] + }, + "topStringLessThanEqualsPath": { + "type": "object", + "properties": { + "StringLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanEqualsPath", "Variable", "Next"] + }, + "topStringGreaterThanEqualsPath": { + "type": "object", + "properties": { + "StringGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanEqualsPath", "Variable", "Next"] + }, + "topNumericEqualsPath": { + "type": "object", + "properties": { + "NumericEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericEqualsPath", "Variable", "Next"] + }, + "topNumericLessThanPath": { + "type": "object", + "properties": { + "NumericLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanPath", "Variable", "Next"] + }, + "topNumericGreaterThanPath": { + "type": "object", + "properties": { + "NumericGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanPath", "Variable", "Next"] + }, + "topNumericLessThanEqualsPath": { + "type": "object", + "properties": { + "NumericLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanEqualsPath", "Variable", "Next"] + }, + "topNumericGreaterThanEqualsPath": { + "type": "object", + "properties": { + "NumericGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanEqualsPath", "Variable", "Next"] + }, + "topBooleanEqualsPath": { + "type": "object", + "properties": { + "BooleanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["BooleanEqualsPath", "Variable", "Next"] + }, + "topTimestampEqualsPath": { + "type": "object", + "properties": { + "TimestampEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampEqualsPath", "Variable", "Next"] + }, + "topTimestampLessThanPath": { + "type": "object", + "properties": { + "TimestampLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanPath", "Variable", "Next"] + }, + "topTimestampGreaterThanPath": { + "type": "object", + "properties": { + "TimestampGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanPath", "Variable", "Next"] + }, + "topTimestampLessThanEqualsPath": { + "type": "object", + "properties": { + "TimestampLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanEqualsPath", "Variable", "Next"] + }, + "topTimestampGreaterThanEqualsPath": { + "type": "object", + "properties": { + "TimestampGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanEqualsPath", "Variable", "Next"] + }, + "topIsNull": { + "type": "object", + "properties": { + "IsNull": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsNull", "Variable", "Next"] + }, + "topIsPresent": { + "type": "object", + "properties": { + "IsPresent": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsPresent", "Variable", "Next"] + }, + "topIsNumeric": { + "type": "object", + "properties": { + "IsNumeric": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsNumeric", "Variable", "Next"] + }, + "topIsString": { + "type": "object", + "properties": { + "IsString": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsString", "Variable", "Next"] + }, + "topIsBoolean": { + "type": "object", + "properties": { + "IsBoolean": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsBoolean", "Variable", "Next"] + }, + "topIsTimestamp": { + "type": "object", + "properties": { + "IsTimestamp": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsTimestamp", "Variable", "Next"] + }, + "topStringMatches": { + "type": "object", + "properties": { + "StringMatches": { + "type": "string" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Next": { + "$ref": "#/definitions/next" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringMatches", "Variable", "Next"] + }, + "lowerConditions": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/lowerCondition" + } + }, + "lowerCondition": { + "oneOf": [ + { + "$ref": "#/definitions/nestedStringEquals" + }, + { + "$ref": "#/definitions/nestedStringLessThan" + }, + { + "$ref": "#/definitions/nestedStringGreaterThan" + }, + { + "$ref": "#/definitions/nestedStringLessThanEquals" + }, + { + "$ref": "#/definitions/nestedStringGreaterThanEquals" + }, + { + "$ref": "#/definitions/nestedNumericEquals" + }, + { + "$ref": "#/definitions/nestedNumericLessThan" + }, + { + "$ref": "#/definitions/nestedNumericGreaterThan" + }, + { + "$ref": "#/definitions/nestedNumericLessThanEquals" + }, + { + "$ref": "#/definitions/nestedNumericGreaterThanEquals" + }, + { + "$ref": "#/definitions/nestedBooleanEquals" + }, + { + "$ref": "#/definitions/nestedTimestampEquals" + }, + { + "$ref": "#/definitions/nestedTimestampLessThan" + }, + { + "$ref": "#/definitions/nestedTimestampGreaterThan" + }, + { + "$ref": "#/definitions/nestedTimestampLessThanEquals" + }, + { + "$ref": "#/definitions/nestedTimestampGreaterThanEquals" + }, + { + "$ref": "#/definitions/nestedAnd" + }, + { + "$ref": "#/definitions/nestedOr" + }, + { + "$ref": "#/definitions/nestedNot" + }, + { + "$ref": "#/definitions/nestedStringEqualsPath" + }, + { + "$ref": "#/definitions/nestedStringLessThanPath" + }, + { + "$ref": "#/definitions/nestedStringGreaterThanPath" + }, + { + "$ref": "#/definitions/nestedStringLessThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedStringGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedNumericEqualsPath" + }, + { + "$ref": "#/definitions/nestedNumericLessThanPath" + }, + { + "$ref": "#/definitions/nestedNumericGreaterThanPath" + }, + { + "$ref": "#/definitions/nestedNumericLessThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedNumericGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedBooleanEqualsPath" + }, + { + "$ref": "#/definitions/nestedTimestampEqualsPath" + }, + { + "$ref": "#/definitions/nestedTimestampLessThanPath" + }, + { + "$ref": "#/definitions/nestedTimestampGreaterThanPath" + }, + { + "$ref": "#/definitions/nestedTimestampLessThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedTimestampGreaterThanEqualsPath" + }, + { + "$ref": "#/definitions/nestedIsNull" + }, + { + "$ref": "#/definitions/nestedIsPresent" + }, + { + "$ref": "#/definitions/nestedIsNumeric" + }, + { + "$ref": "#/definitions/nestedIsString" + }, + { + "$ref": "#/definitions/nestedIsBoolean" + }, + { + "$ref": "#/definitions/nestedIsTimestamp" + }, + { + "$ref": "#/definitions/nestedStringMatches" + } + ] + }, + "nestedStringEquals": { + "type": "object", + "properties": { + "StringEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringEquals", "Variable"] + }, + "nestedStringLessThan": { + "type": "object", + "properties": { + "StringLessThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThan", "Variable"] + }, + "nestedStringGreaterThan": { + "type": "object", + "properties": { + "StringGreaterThan": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThan", "Variable"] + }, + "nestedStringLessThanEquals": { + "type": "object", + "properties": { + "StringLessThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanEquals", "Variable"] + }, + "nestedStringGreaterThanEquals": { + "type": "object", + "properties": { + "StringGreaterThanEquals": { + "type": "string" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanEquals", "Variable"] + }, + "nestedNumericEquals": { + "type": "object", + "properties": { + "NumericEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericEquals", "Variable"] + }, + "nestedNumericLessThan": { + "type": "object", + "properties": { + "NumericLessThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThan", "Variable"] + }, + "nestedNumericGreaterThan": { + "type": "object", + "properties": { + "NumericGreaterThan": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThan", "Variable"] + }, + "nestedNumericLessThanEquals": { + "type": "object", + "properties": { + "NumericLessThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanEquals", "Variable"] + }, + "nestedNumericGreaterThanEquals": { + "type": "object", + "properties": { + "NumericGreaterThanEquals": { + "type": "number" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanEquals", "Variable"] + }, + "nestedBooleanEquals": { + "type": "object", + "properties": { + "BooleanEquals": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["BooleanEquals", "Variable"] + }, + "nestedTimestampEquals": { + "type": "object", + "properties": { + "TimestampEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampEquals", "Variable"] + }, + "nestedTimestampLessThan": { + "type": "object", + "properties": { + "TimestampLessThan": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThan", "Variable"] + }, + "nestedTimestampGreaterThan": { + "type": "object", + "properties": { + "TimestampGreaterThan": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThan", "Variable"] + }, + "nestedTimestampLessThanEquals": { + "type": "object", + "properties": { + "TimestampLessThanEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanEquals", "Variable"] + }, + "nestedTimestampGreaterThanEquals": { + "type": "object", + "properties": { + "TimestampGreaterThanEquals": { + "$ref": "common.json#/definitions/timestamp" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanEquals", "Variable"] + }, + "nestedAnd": { + "type": "object", + "properties": { + "And": { + "$ref": "#/definitions/lowerConditions" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["And"] + }, + "nestedOr": { + "type": "object", + "properties": { + "Or": { + "$ref": "#/definitions/lowerConditions" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["Or"] + }, + "nestedNot": { + "type": "object", + "properties": { + "Not": { + "$ref": "#/definitions/lowerCondition" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["Not"] + }, - - - "nestedStringEqualsPath": { - "type": "object", - "properties": { - "StringEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringEqualsPath", - "Variable" - ] - }, - "nestedStringLessThanPath": { - "type": "object", - "properties": { - "StringLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanPath", - "Variable" - ] - }, - "nestedStringGreaterThanPath": { - "type": "object", - "properties": { - "StringGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanPath", - "Variable" - ] - }, - "nestedStringLessThanEqualsPath": { - "type": "object", - "properties": { - "StringLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringLessThanEqualsPath", - "Variable" - ] - }, - "nestedStringGreaterThanEqualsPath": { - "type": "object", - "properties": { - "StringGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringGreaterThanEqualsPath", - "Variable" - ] - }, - "nestedNumericEqualsPath": { - "type": "object", - "properties": { - "NumericEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericEqualsPath", - "Variable" - ] - }, - "nestedNumericLessThanPath": { - "type": "object", - "properties": { - "NumericLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanPath", - "Variable" - ] - }, - "nestedNumericGreaterThanPath": { - "type": "object", - "properties": { - "NumericGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanPath", - "Variable" - ] - }, - "nestedNumericLessThanEqualsPath": { - "type": "object", - "properties": { - "NumericLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericLessThanEqualsPath", - "Variable" - ] - }, - "nestedNumericGreaterThanEqualsPath": { - "type": "object", - "properties": { - "NumericGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "#/definitions/variable" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "NumericGreaterThanEqualsPath", - "Variable" - ] - }, - "nestedBooleanEqualsPath": { - "type": "object", - "properties": { - "BooleanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "BooleanEqualsPath", - "Variable" - ] - }, - "nestedTimestampEqualsPath": { - "type": "object", - "properties": { - "TimestampEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampEqualsPath", - "Variable" - ] - }, - "nestedTimestampLessThanPath": { - "type": "object", - "properties": { - "TimestampLessThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanPath", - "Variable" - ] - }, - "nestedTimestampGreaterThanPath": { - "type": "object", - "properties": { - "TimestampGreaterThanPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanPath", - "Variable" - ] - }, - "nestedTimestampLessThanEqualsPath": { - "type": "object", - "properties": { - "TimestampLessThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampLessThanEqualsPath", - "Variable" - ] - }, - "nestedTimestampGreaterThanEqualsPath": { - "type": "object", - "properties": { - "TimestampGreaterThanEqualsPath": { - "$ref": "common.json#/definitions/path" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "TimestampGreaterThanEqualsPath", - "Variable" - ] - }, - "nestedIsNull": { - "type": "object", - "properties": { - "IsNull": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsNull", - "Variable" - ] - }, - "nestedIsPresent": { - "type": "object", - "properties": { - "IsPresent": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsPresent", - "Variable" - ] - }, - "nestedIsNumeric": { - "type": "object", - "properties": { - "IsNumeric": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsNumeric", - "Variable" - ] - }, - "nestedIsString": { - "type": "object", - "properties": { - "IsString": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsString", - "Variable" - ] - }, - "nestedIsBoolean": { - "type": "object", - "properties": { - "IsBoolean": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsBoolean", - "Variable" - ] - }, - "nestedIsTimestamp": { - "type": "object", - "properties": { - "IsTimestamp": { - "type": "boolean" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "IsTimestamp", - "Variable" - ] - }, - "nestedStringMatches": { - "type": "object", - "properties": { - "StringMatches": { - "type": "string" - }, - "Variable": { - "$ref": "common.json#/definitions/referencePath" - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - } - }, - "required": [ - "StringMatches", - "Variable" - ] + "nestedStringEqualsPath": { + "type": "object", + "properties": { + "StringEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringEqualsPath", "Variable"] + }, + "nestedStringLessThanPath": { + "type": "object", + "properties": { + "StringLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanPath", "Variable"] + }, + "nestedStringGreaterThanPath": { + "type": "object", + "properties": { + "StringGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanPath", "Variable"] + }, + "nestedStringLessThanEqualsPath": { + "type": "object", + "properties": { + "StringLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringLessThanEqualsPath", "Variable"] + }, + "nestedStringGreaterThanEqualsPath": { + "type": "object", + "properties": { + "StringGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["StringGreaterThanEqualsPath", "Variable"] + }, + "nestedNumericEqualsPath": { + "type": "object", + "properties": { + "NumericEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericEqualsPath", "Variable"] + }, + "nestedNumericLessThanPath": { + "type": "object", + "properties": { + "NumericLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanPath", "Variable"] + }, + "nestedNumericGreaterThanPath": { + "type": "object", + "properties": { + "NumericGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanPath", "Variable"] + }, + "nestedNumericLessThanEqualsPath": { + "type": "object", + "properties": { + "NumericLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericLessThanEqualsPath", "Variable"] + }, + "nestedNumericGreaterThanEqualsPath": { + "type": "object", + "properties": { + "NumericGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "#/definitions/variable" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["NumericGreaterThanEqualsPath", "Variable"] + }, + "nestedBooleanEqualsPath": { + "type": "object", + "properties": { + "BooleanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["BooleanEqualsPath", "Variable"] + }, + "nestedTimestampEqualsPath": { + "type": "object", + "properties": { + "TimestampEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampEqualsPath", "Variable"] + }, + "nestedTimestampLessThanPath": { + "type": "object", + "properties": { + "TimestampLessThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanPath", "Variable"] + }, + "nestedTimestampGreaterThanPath": { + "type": "object", + "properties": { + "TimestampGreaterThanPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanPath", "Variable"] + }, + "nestedTimestampLessThanEqualsPath": { + "type": "object", + "properties": { + "TimestampLessThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampLessThanEqualsPath", "Variable"] + }, + "nestedTimestampGreaterThanEqualsPath": { + "type": "object", + "properties": { + "TimestampGreaterThanEqualsPath": { + "$ref": "common.json#/definitions/path" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["TimestampGreaterThanEqualsPath", "Variable"] + }, + "nestedIsNull": { + "type": "object", + "properties": { + "IsNull": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsNull", "Variable"] + }, + "nestedIsPresent": { + "type": "object", + "properties": { + "IsPresent": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsPresent", "Variable"] + }, + "nestedIsNumeric": { + "type": "object", + "properties": { + "IsNumeric": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsNumeric", "Variable"] + }, + "nestedIsString": { + "type": "object", + "properties": { + "IsString": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsString", "Variable"] + }, + "nestedIsBoolean": { + "type": "object", + "properties": { + "IsBoolean": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsBoolean", "Variable"] + }, + "nestedIsTimestamp": { + "type": "object", + "properties": { + "IsTimestamp": { + "type": "boolean" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + } + }, + "required": ["IsTimestamp", "Variable"] + }, + "nestedStringMatches": { + "type": "object", + "properties": { + "StringMatches": { + "type": "string" + }, + "Variable": { + "$ref": "common.json#/definitions/referencePath" + }, + "Comment": { + "$ref": "common.json#/definitions/comment" } + }, + "required": ["StringMatches", "Variable"] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/common.json b/src/json-schema/partial/common.json index 9b2fe67ff..3716b26cb 100755 --- a/src/json-schema/partial/common.json +++ b/src/json-schema/partial/common.json @@ -1,294 +1,254 @@ { - "definitions": { - "basics": { - "type": "object", - "properties": { - "Type": { - "type": "string", - "description": "The state's type.", - "minLength": 1, - "enum": [ - "Pass", - "Succeed", - "Fail", - "Task", - "Choice", - "Wait", - "Parallel", - "Map" - ] - }, - "QueryLanguage": { - "$ref": "#/definitions/queryLanguage" - }, - "Comment": { - "$ref": "#/definitions/comment" - } + "definitions": { + "basics": { + "type": "object", + "properties": { + "Type": { + "type": "string", + "description": "The state's type.", + "minLength": 1, + "enum": ["Pass", "Succeed", "Fail", "Task", "Choice", "Wait", "Parallel", "Map"] + }, + "QueryLanguage": { + "$ref": "#/definitions/queryLanguage" + }, + "Comment": { + "$ref": "#/definitions/comment" + } + }, + "required": ["Type"] + }, + "inputOutputResult": { + "properties": { + "InputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" }, - "required": [ - "Type" - ] - }, - "inputOutputResult": { - "properties": { - "InputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ResultPath": { - "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary.", - "oneOf": [ - { - "$ref": "#/definitions/referencePath" - }, - { - "type": "null" - } - ] - }, - "OutputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } + { + "type": "null" } + ] }, - "inputOutput": { - "properties": { - "InputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "OutputPath": { - "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } + "ResultPath": { + "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary.", + "oneOf": [ + { + "$ref": "#/definitions/referencePath" + }, + { + "type": "null" } + ] }, - "queryLanguage": { - "type": "string", - "description": "ASL mode configuration. Specify either JSONata or JSONPath.", - "minLength": 1, - "enum": [ - "JSONata", - "JSONPath" - ] - }, - "comment": { - "type": "string", - "description": "A human-readable comment or description.", - "minLength": 1 - }, - "endOrTransition": { - "oneOf": [ - { - "required": [ - "Next" - ] - }, - { - "required": [ - "End" - ] - } - ], - "properties": { - "Next": { - "type": "string", - "description": "The name of the next state that is run when the current state finishes.", - "minLength": 1 - }, - "End": { - "type": "boolean", - "description": "Designates this state as a terminal state (ends the execution) if set to true. There can be any number of terminal states per state machine." - } + "OutputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" } - }, - "referencePath": { - "type": "string", - "minLength": 1 - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "errors": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" + ] + } + } + }, + "inputOutput": { + "properties": { + "InputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's task for processing. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" } + ] }, - "seconds": { + "OutputPath": { + "description": "A path that selects a portion of the state's input to be passed to the state's output. If omitted, it has the value $ which designates the entire input.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + } + }, + "queryLanguage": { + "type": "string", + "description": "ASL mode configuration. Specify either JSONata or JSONPath.", + "minLength": 1, + "enum": ["JSONata", "JSONPath"] + }, + "comment": { + "type": "string", + "description": "A human-readable comment or description.", + "minLength": 1 + }, + "endOrTransition": { + "oneOf": [ + { + "required": ["Next"] + }, + { + "required": ["End"] + } + ], + "properties": { + "Next": { + "type": "string", + "description": "The name of the next state that is run when the current state finishes.", + "minLength": 1 + }, + "End": { + "type": "boolean", + "description": "Designates this state as a terminal state (ends the execution) if set to true. There can be any number of terminal states per state machine." + } + } + }, + "referencePath": { + "type": "string", + "minLength": 1 + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "errors": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "seconds": { + "type": "integer", + "minimum": 0, + "maximum": 99999999 + }, + "path": { + "type": "string", + "pattern": "\\$.*" + }, + "jsonata": { + "type": "string", + "pattern": "^{%(.*)%}$" + }, + "parameters": { + "type": ["number", "string", "boolean", "object", "array", "null"] + }, + "resultSelector": { + "type": "object" + }, + "retry": { + "type": "array", + "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors.", + "items": { + "type": "object", + "properties": { + "ErrorEquals": { + "$ref": "#/definitions/errors", + "description": "A non-empty array of Error Names. The retry policy for this Retrier is implemented if the reported error matches one of the Error Names." + }, + "IntervalSeconds": { + "$ref": "#/definitions/seconds", + "description": "A positive integer representing the number of seconds before the first retry attempt. (Default: 1, Maximum: 99999999)" + }, + "MaxAttempts": { "type": "integer", + "description": "A non-negative integer representing the maximum number of retry attempts. (Default: 3, Maximum: 99999999)", "minimum": 0, "maximum": 99999999 - }, - "path": { + }, + "BackoffRate": { + "type": "number", + "description": "A number (>= 1) which is the multiplier that increases the retry interval on each attempt. (Default: 2.0)", + "minimum": 1.0 + }, + "Comment": { + "$ref": "#/definitions/comment" + }, + "MaxDelaySeconds": { + "type": "integer", + "description": "A positive integer representing the maximum number of seconds to wait before a retry attempt. If not specified, the limit is the maximum duration a state machine can run. (Maximum: 31622400)", + "minimum": 1, + "maximum": 31622400 + }, + "JitterStrategy": { "type": "string", - "pattern": "\\$.*" - }, - "jsonata": { + "description": "The Jitter Strategy to apply to the retry interval.", + "minLength": 1, + "enum": ["FULL", "NONE"] + } + }, + "required": ["ErrorEquals"] + } + }, + "catch": { + "type": "array", + "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined.", + "items": { + "type": "object", + "properties": { + "ErrorEquals": { + "$ref": "#/definitions/errors", + "description": "A non-empty array of Error Names. The state machine transitions to this Catcher's fallback state if the reported error matches one of the Error Names." + }, + "Next": { "type": "string", - "pattern": "^{%(.*)%}$" - }, - "parameters": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ] - }, - "resultSelector": { - "type": "object" - }, - "retry": { - "type": "array", - "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors.", - "items": { - "type": "object", - "properties": { - "ErrorEquals": { - "$ref": "#/definitions/errors", - "description": "A non-empty array of Error Names. The retry policy for this Retrier is implemented if the reported error matches one of the Error Names." - }, - "IntervalSeconds": { - "$ref": "#/definitions/seconds", - "description": "A positive integer representing the number of seconds before the first retry attempt. (Default: 1, Maximum: 99999999)" - }, - "MaxAttempts": { - "type": "integer", - "description": "A non-negative integer representing the maximum number of retry attempts. (Default: 3, Maximum: 99999999)", - "minimum": 0, - "maximum": 99999999 - }, - "BackoffRate": { - "type": "number", - "description": "A number (>= 1) which is the multiplier that increases the retry interval on each attempt. (Default: 2.0)", - "minimum": 1.0 - }, - "Comment": { - "$ref": "#/definitions/comment" - }, - "MaxDelaySeconds": { - "type": "integer", - "description": "A positive integer representing the maximum number of seconds to wait before a retry attempt. If not specified, the limit is the maximum duration a state machine can run. (Maximum: 31622400)", - "minimum": 1, - "maximum": 31622400 - }, - "JitterStrategy": { - "type": "string", - "description": "The Jitter Strategy to apply to the retry interval.", - "minLength": 1, - "enum": [ - "FULL", - "NONE" - ] - } - }, - "required": [ - "ErrorEquals" - ] - } - }, - "catch": { - "type": "array", - "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined.", - "items": { - "type": "object", - "properties": { - "ErrorEquals": { - "$ref": "#/definitions/errors", - "description": "A non-empty array of Error Names. The state machine transitions to this Catcher's fallback state if the reported error matches one of the Error Names." - }, - "Next": { - "type": "string", - "description": "The state to transition to on Error Name match.", - "minLength": 1 - }, - "ResultPath": { - "oneOf": [ - { - "$ref": "#/definitions/referencePath", - "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary." - }, - { - "type": "null" - } - ] - }, - "Output": { - "$ref": "#/definitions/output" - }, - "Comment": { - "$ref": "#/definitions/comment" - }, - "Assign": { - "$ref": "#/definitions/assign" - } - }, - "required": [ - "ErrorEquals", - "Next" - ] - } - }, - "arguments": { + "description": "The state to transition to on Error Name match.", + "minLength": 1 + }, + "ResultPath": { "oneOf": [ - { - "type": "object", - "errorMessage": "Incorrect type. Expected one of object, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An object or JSONata expression to define the Argument of this task state." - }, - "output": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "A value to define the Output configuration of this task state." - }, - "assign": { - "type": "object", - "description": "An object to define the variables to be assigned." + { + "$ref": "#/definitions/referencePath", + "description": "A path that specifies where to place the Result, relative to the raw input. If the raw input has a field at the location addressed by the ResultPath value then in the output that field is discarded and overwritten by the state's result. Otherwise, a new field is created in the state output, with intervening fields constructed as necessary." + }, + { + "type": "null" + } + ] + }, + "Output": { + "$ref": "#/definitions/output" + }, + "Comment": { + "$ref": "#/definitions/comment" + }, + "Assign": { + "$ref": "#/definitions/assign" + } + }, + "required": ["ErrorEquals", "Next"] + } + }, + "arguments": { + "oneOf": [ + { + "type": "object", + "errorMessage": "Incorrect type. Expected one of object, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" } + ], + "description": "An object or JSONata expression to define the Argument of this task state." + }, + "output": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "A value to define the Output configuration of this task state." + }, + "assign": { + "type": "object", + "description": "An object to define the variables to be assigned." } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/fail_state.json b/src/json-schema/partial/fail_state.json index 5271a69ad..41345fc1e 100755 --- a/src/json-schema/partial/fail_state.json +++ b/src/json-schema/partial/fail_state.json @@ -1,44 +1,42 @@ { - "definitions": { - "failState": { - "description": "A Fail state stops the execution of the state machine and marks it as a failure.", - "allOf": [ - { - "$ref": "common.json#/definitions/basics" - }, - { - "properties": { - "Type": { - "enum": [ - "Fail" - ] - }, - "Comment": { - "$ref": "common.json#/definitions/comment" - }, - "Error": { - "type": "string", - "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes.", - "minLength": 1 - }, - "Cause": { - "type": "string", - "description": "Provides a custom failure string that can be used for operational or diagnostic purposes.", - "minLength": 1 - }, - "ErrorPath": { - "type": "string", - "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", - "minLength": 1 - }, - "CausePath": { - "type": "string", - "description": "Provides a custom failure string that can be used for operational or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", - "minLength": 1 - } - } - } - ] + "definitions": { + "failState": { + "description": "A Fail state stops the execution of the state machine and marks it as a failure.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "properties": { + "Type": { + "enum": ["Fail"] + }, + "Comment": { + "$ref": "common.json#/definitions/comment" + }, + "Error": { + "type": "string", + "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes.", + "minLength": 1 + }, + "Cause": { + "type": "string", + "description": "Provides a custom failure string that can be used for operational or diagnostic purposes.", + "minLength": 1 + }, + "ErrorPath": { + "type": "string", + "description": "Provides an error name that can be used for error handling (Retry/Catch), operational, or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", + "minLength": 1 + }, + "CausePath": { + "type": "string", + "description": "Provides a custom failure string that can be used for operational or diagnostic purposes. Specified with JsonPath syntax or with Intrinsic Functions. The resulting value must be a string.", + "minLength": 1 + } + } } + ] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/map_state.json b/src/json-schema/partial/map_state.json index 6e5c8e51d..a15ab120a 100755 --- a/src/json-schema/partial/map_state.json +++ b/src/json-schema/partial/map_state.json @@ -1,392 +1,352 @@ { - "definitions": { - "mapState": { - "description": "The Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input.", - "allOf": [ + "definitions": { + "mapState": { + "description": "The Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutputResult" + }, + { + "$ref": "common.json#/definitions/endOrTransition" + }, + { + "properties": { + "Type": { + "enum": ["Map"] + }, + "Parameters": { + "$ref": "common.json#/definitions/parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "$ref": "common.json#/definitions/resultSelector", + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ItemsPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "Reference path identifying where in the effective input the array field is found." + }, + "Iterator": { + "type": "object", + "description": "A state machine which will process each element of the array.", + "properties": { + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", + "minLength": 1 + }, + "States": { + "$ref": "states.json#/definitions/states" + } + }, + "required": ["StartAt", "States"] + }, + "ItemReader": { + "type": "object", + "description": "Specifies the location of the dataset from which the Map state reads its input data.", + "properties": { + "ReaderConfig": { + "type": "object", + "description": "A JSON object that specifies where to read the items instead of from the effective input.", + "properties": { + "InputType": { + "type": "string", + "description": "A string that specifies the type of Amazon S3 data source.", + "minLength": 1, + "enum": ["CSV", "JSON", "MANIFEST"] + }, + "CSVHeaders": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "CSVHeaderLocation": { + "type": "string", + "description": "A string that specifies the location of the CSV column header.", + "minLength": 1, + "enum": ["FIRST_ROW", "GIVEN"] + }, + "MaxItems": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "An integer or JSONata expression that limits the number of data items passed to the Map state.", + "minimum": 0 + }, + "MaxItemsPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that limits the number of data items passed to the Map state." + } + } + }, + "Resource": { + "type": "string", + "description": "The Amazon S3 API action Step Functions must invoke depending on the specified dataset.", + "examples": ["arn:aws:states:::s3:getObject", "arn:aws:states:::s3:listObjectsV2"] + }, + "Arguments": { + "$ref": "common.json#/definitions/arguments", + "description": "A JSON object or JSONata expression that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", + "minLength": 1 + }, + "Key": { + "type": "string", + "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", + "minLength": 1 + } + } + }, + "Parameters": { + "type": "object", + "description": "A JSON object that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", + "minLength": 1 + }, + "Key": { + "type": "string", + "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", + "minLength": 1 + }, + "Bucket.$": { + "type": "string", + "description": "", + "minLength": 1 + }, + "Prefix.$": { + "type": "string", + "description": "", + "minLength": 1 + } + } + } + } + }, + "ItemSelector": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "A JSON object or value that overrides each single element of the item array." + }, + "ItemBatcher": { + "type": "object", + "description": "A JSON object that specifies how to batch the items for the ItemProcessor.", + "properties": { + "BatchInput": { + "type": ["number", "string", "boolean", "object", "array", "null"], + "description": "Specifies a fixed JSON input to include in each batch passed to each child workflow execution." + }, + "MaxItemsPerBatch": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "An integer or JSONata expression that limits the maximum number of items of each sub-array.", + "minimum": 1 + }, + "MaxItemsPerBatchPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that limits the maximum number of items of each sub-array." + }, + "MaxInputBytesPerBatch": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "An integer or JSONata expression that limits the maximum size in bytes of each sub-array.", + "minimum": 1 + }, + "MaxInputBytesPerBatchPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that limits the maximum size in bytes of each sub-array." + } + } + }, + "ResultWriter": { + "type": "object", + "description": "A JSON object that specifies where to write the results instead of to the Map state's result.", + "properties": { + "Resource": { + "type": "string", + "description": "A string that specifies the Amazon S3 API action Step Functions must invoke depending on the specified dataset.", + "examples": ["arn:aws:states:::s3:putObject"] + }, + "Arguments": { + "$ref": "common.json#/definitions/arguments", + "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name to export the results to.", + "minLength": 1 + }, + "Prefix": { + "type": "string", + "description": "A string that specifies the Amazon S3 object prefix to export the results to.", + "minLength": 1 + } + } + }, + "Parameters": { + "type": "object", + "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", + "properties": { + "Bucket": { + "type": "string", + "description": "A string that specifies the Amazon S3 bucket name to export the results to.", + "minLength": 1 + }, + "Prefix": { + "type": "string", + "description": "A string that specifies the Amazon S3 object prefix to export the results to.", + "minLength": 1 + } + } + } + } + }, + "ItemProcessor": { + "type": "object", + "description": "A JSON object that defines a state machine which will process each item or batch of items of the array.", + "properties": { + "ProcessorConfig": { + "type": "object", + "description": "A JSON object that specifies the Map state processing mode and definition.", + "properties": { + "Mode": { + "type": "string", + "description": "The Map state processing mode.", + "minLength": 1, + "enum": ["DISTRIBUTED", "INLINE"] + }, + "ExecutionType": { + "type": "string", + "description": "The execution type for the Map workflow.", + "minLength": 1, + "enum": ["EXPRESS", "STANDARD"] + } + } + }, + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", + "minLength": 1 + }, + "States": { + "$ref": "states.json#/definitions/states" + } + }, + "required": ["StartAt", "States"] + }, + "Label": { + "type": "string", + "description": "A string that uniquely identifies a Map state.", + "minLength": 1 + }, + "ToleratedFailurePercentage": { + "oneOf": [ { - "$ref": "common.json#/definitions/basics" + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "$ref": "common.json#/definitions/inputOutputResult" + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "An integer or JSONata expression that provides an upper bound on the percentage of items that may fail.", + "minimum": 0, + "maximum": 100 + }, + "ToleratedFailurePercentagePath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that provides an upper bound on the percentage of items that may fail." + }, + "ToleratedFailureCount": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "$ref": "common.json#/definitions/endOrTransition" + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "An integer or JSONata expression that provides an upper bound on how many items may fail.", + "minimum": 0 + }, + "ToleratedFailureCountPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that provides an upper bound on how many items may fail." + }, + "MaxConcurrency": { + "oneOf": [ + { + "type": "integer", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "properties": { - "Type": { - "enum": [ - "Map" - ] - }, - "Parameters": { - "$ref": "common.json#/definitions/parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "$ref": "common.json#/definitions/resultSelector", - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ItemsPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "Reference path identifying where in the effective input the array field is found." - }, - "Iterator": { - "type": "object", - "description": "A state machine which will process each element of the array.", - "properties": { - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", - "minLength": 1 - }, - "States": { - "$ref": "states.json#/definitions/states" - } - }, - "required": [ - "StartAt", - "States" - ] - }, - "ItemReader": { - "type": "object", - "description": "Specifies the location of the dataset from which the Map state reads its input data.", - "properties": { - "ReaderConfig": { - "type": "object", - "description": "A JSON object that specifies where to read the items instead of from the effective input.", - "properties": { - "InputType": { - "type": "string", - "description": "A string that specifies the type of Amazon S3 data source.", - "minLength": 1, - "enum": [ - "CSV", - "JSON", - "MANIFEST" - ] - }, - "CSVHeaders": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - }, - "CSVHeaderLocation": { - "type": "string", - "description": "A string that specifies the location of the CSV column header.", - "minLength": 1, - "enum": [ - "FIRST_ROW", - "GIVEN" - ] - }, - "MaxItems": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An integer or JSONata expression that limits the number of data items passed to the Map state.", - "minimum": 0 - }, - "MaxItemsPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that limits the number of data items passed to the Map state." - } - } - }, - "Resource": { - "type": "string", - "description": "The Amazon S3 API action Step Functions must invoke depending on the specified dataset.", - "examples": [ - "arn:aws:states:::s3:getObject", - "arn:aws:states:::s3:listObjectsV2" - ] - }, - "Arguments": { - "$ref": "common.json#/definitions/arguments", - "description": "A JSON object or JSONata expression that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", - "minLength": 1 - }, - "Key": { - "type": "string", - "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", - "minLength": 1 - } - } - }, - "Parameters": { - "type": "object", - "description": "A JSON object that specifies the Amazon S3 bucket name and object key or prefix in which the dataset is stored.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name in which the dataset is stored.", - "minLength": 1 - }, - "Key": { - "type": "string", - "description": "A string that specifies Amazon S3 object key in which the dataset is stored.", - "minLength": 1 - }, - "Bucket.$": { - "type": "string", - "description": "", - "minLength": 1 - }, - "Prefix.$": { - "type": "string", - "description": "", - "minLength": 1 - } - } - } - } - }, - "ItemSelector": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "A JSON object or value that overrides each single element of the item array." - }, - "ItemBatcher": { - "type": "object", - "description": "A JSON object that specifies how to batch the items for the ItemProcessor.", - "properties": { - "BatchInput": { - "type": [ - "number", - "string", - "boolean", - "object", - "array", - "null" - ], - "description": "Specifies a fixed JSON input to include in each batch passed to each child workflow execution." - }, - "MaxItemsPerBatch": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An integer or JSONata expression that limits the maximum number of items of each sub-array.", - "minimum": 1 - }, - "MaxItemsPerBatchPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that limits the maximum number of items of each sub-array." - }, - "MaxInputBytesPerBatch": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An integer or JSONata expression that limits the maximum size in bytes of each sub-array.", - "minimum": 1 - }, - "MaxInputBytesPerBatchPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that limits the maximum size in bytes of each sub-array." - } - } - }, - "ResultWriter": { - "type": "object", - "description": "A JSON object that specifies where to write the results instead of to the Map state's result.", - "properties": { - "Resource": { - "type": "string", - "description": "A string that specifies the Amazon S3 API action Step Functions must invoke depending on the specified dataset.", - "examples": [ - "arn:aws:states:::s3:putObject" - ] - }, - "Arguments": { - "$ref": "common.json#/definitions/arguments", - "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name to export the results to.", - "minLength": 1 - }, - "Prefix": { - "type": "string", - "description": "A string that specifies the Amazon S3 object prefix to export the results to.", - "minLength": 1 - } - } - }, - "Parameters": { - "type": "object", - "description": "A JSON object that specifies the Amazon S3 resource to export the results to.", - "properties": { - "Bucket": { - "type": "string", - "description": "A string that specifies the Amazon S3 bucket name to export the results to.", - "minLength": 1 - }, - "Prefix": { - "type": "string", - "description": "A string that specifies the Amazon S3 object prefix to export the results to.", - "minLength": 1 - } - } - } - } - }, - "ItemProcessor": { - "type": "object", - "description": "A JSON object that defines a state machine which will process each item or batch of items of the array.", - "properties": { - "ProcessorConfig": { - "type": "object", - "description": "A JSON object that specifies the Map state processing mode and definition.", - "properties": { - "Mode": { - "type": "string", - "description": "The Map state processing mode.", - "minLength": 1, - "enum": [ - "DISTRIBUTED", - "INLINE" - ] - }, - "ExecutionType": { - "type": "string", - "description": "The execution type for the Map workflow.", - "minLength": 1, - "enum": [ - "EXPRESS", - "STANDARD" - ] - } - } - }, - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects.", - "minLength": 1 - }, - "States": { - "$ref": "states.json#/definitions/states" - } - }, - "required": [ - "StartAt", - "States" - ] - }, - "Label": { - "type": "string", - "description": "A string that uniquely identifies a Map state.", - "minLength": 1 - }, - "ToleratedFailurePercentage": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An integer or JSONata expression that provides an upper bound on the percentage of items that may fail.", - "minimum": 0, - "maximum": 100 - }, - "ToleratedFailurePercentagePath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that provides an upper bound on the percentage of items that may fail." - }, - "ToleratedFailureCount": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An integer or JSONata expression that provides an upper bound on how many items may fail.", - "minimum": 0 - }, - "ToleratedFailureCountPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that provides an upper bound on how many items may fail." - }, - "MaxConcurrency": { - "oneOf": [ - { - "type": "integer", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "Provides an upper bound on how many invocations of the Iterator may run in parallel.\n\nThe default value is 0, which places no limit on parallelism and iterations are invoked as concurrently as possible.", - "minimum": 0 - }, - "MaxConcurrencyPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A reference path to an integer that provides an upper bound on how many invocations of the Iterator may run in parallel.", - "minimum": 0 - }, - "Retry": { - "$ref": "common.json#/definitions/retry", - "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." - }, - "Catch": { - "$ref": "common.json#/definitions/catch", - "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." - }, - "Items": { - "oneOf": [ - { - "type": "array", - "errorMessage": "Incorrect type. Expected one of array, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An array or JSONata expression identifying where in the state input the array field is found." - }, - "Output": { - "$ref": "common.json#/definitions/output" - } - } + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "Provides an upper bound on how many invocations of the Iterator may run in parallel.\n\nThe default value is 0, which places no limit on parallelism and iterations are invoked as concurrently as possible.", + "minimum": 0 + }, + "MaxConcurrencyPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A reference path to an integer that provides an upper bound on how many invocations of the Iterator may run in parallel.", + "minimum": 0 + }, + "Retry": { + "$ref": "common.json#/definitions/retry", + "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." + }, + "Catch": { + "$ref": "common.json#/definitions/catch", + "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." + }, + "Items": { + "oneOf": [ + { + "type": "array", + "errorMessage": "Incorrect type. Expected one of array, JSONata expression." + }, + { + "$ref": "common.json#/definitions/jsonata" } - ] + ], + "description": "An array or JSONata expression identifying where in the state input the array field is found." + }, + "Output": { + "$ref": "common.json#/definitions/output" + } + } } + ] } + } } diff --git a/src/json-schema/partial/parallel_state.json b/src/json-schema/partial/parallel_state.json index 715cc6b61..0002c72d2 100755 --- a/src/json-schema/partial/parallel_state.json +++ b/src/json-schema/partial/parallel_state.json @@ -1,73 +1,66 @@ { - "definitions": { - "parallelState": { - "description": "The Parallel state can be used to create parallel branches of execution in your state machine.", - "allOf": [ - { - "$ref": "common.json#/definitions/basics" + "definitions": { + "parallelState": { + "description": "The Parallel state can be used to create parallel branches of execution in your state machine.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutputResult" + }, + { + "$ref": "common.json#/definitions/endOrTransition" + }, + { + "properties": { + "Type": { + "enum": ["Parallel"] + }, + "Parameters": { + "$ref": "common.json#/definitions/parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "$ref": "common.json#/definitions/resultSelector", + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "Branches": { + "type": "array", + "description": "An array of objects that specifies state machines to execute in parallel.", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "StartAt": { + "type": "string", + "description": "A string that must exactly match (is case sensitive) the name of one of the state objects." + }, + "States": { + "$ref": "states.json#/definitions/states" + } }, - { - "$ref": "common.json#/definitions/inputOutputResult" - }, - { - "$ref": "common.json#/definitions/endOrTransition" - }, - { - "properties": { - "Type": { - "enum": [ - "Parallel" - ] - }, - "Parameters": { - "$ref": "common.json#/definitions/parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "$ref": "common.json#/definitions/resultSelector", - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "Branches": { - "type": "array", - "description": "An array of objects that specifies state machines to execute in parallel.", - "minItems": 1, - "items": { - "type": "object", - "properties": { - "StartAt": { - "type": "string", - "description": "A string that must exactly match (is case sensitive) the name of one of the state objects." - }, - "States": { - "$ref": "states.json#/definitions/states" - } - }, - "required": [ - "StartAt", - "States" - ] - } - }, - "Retry": { - "$ref": "common.json#/definitions/retry", - "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." - }, - "Catch": { - "$ref": "common.json#/definitions/catch", - "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." - }, - "Arguments": { - "$ref": "common.json#/definitions/arguments" - }, - "Output": { - "$ref": "common.json#/definitions/output" - } - }, - "required": [ - "Branches" - ] - } - ] + "required": ["StartAt", "States"] + } + }, + "Retry": { + "$ref": "common.json#/definitions/retry", + "description": "Contains an array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." + }, + "Catch": { + "$ref": "common.json#/definitions/catch", + "description": "Contains an array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." + }, + "Arguments": { + "$ref": "common.json#/definitions/arguments" + }, + "Output": { + "$ref": "common.json#/definitions/output" + } + }, + "required": ["Branches"] } + ] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/pass_state.json b/src/json-schema/partial/pass_state.json index 48f0d0729..9004b8410 100755 --- a/src/json-schema/partial/pass_state.json +++ b/src/json-schema/partial/pass_state.json @@ -1,34 +1,32 @@ { - "definitions": { - "passState": { - "description": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.", - "allOf": [ - { - "$ref": "common.json#/definitions/basics" - }, - { - "$ref": "common.json#/definitions/inputOutputResult" - }, - { - "$ref": "common.json#/definitions/endOrTransition" - }, - { - "properties": { - "Type": { - "enum": [ - "Pass" - ] - }, - "Parameters": { - "$ref": "common.json#/definitions/parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "Output": { - "$ref": "common.json#/definitions/output" - } - } - } - ] + "definitions": { + "passState": { + "description": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutputResult" + }, + { + "$ref": "common.json#/definitions/endOrTransition" + }, + { + "properties": { + "Type": { + "enum": ["Pass"] + }, + "Parameters": { + "$ref": "common.json#/definitions/parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "Output": { + "$ref": "common.json#/definitions/output" + } + } } + ] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/states.json b/src/json-schema/partial/states.json index 2e8add0ac..5574879ff 100755 --- a/src/json-schema/partial/states.json +++ b/src/json-schema/partial/states.json @@ -1,36 +1,36 @@ { - "definitions": { - "states": { - "type": "object", - "description": "An object containing a comma-delimited set of states.", - "additionalProperties": { - "oneOf": [ - { - "$ref": "pass_state.json#/definitions/passState" - }, - { - "$ref": "succeed_state.json#/definitions/succeedState" - }, - { - "$ref": "fail_state.json#/definitions/failState" - }, - { - "$ref": "task_state.json#/definitions/taskState" - }, - { - "$ref": "choice_state.json#/definitions/choiceState" - }, - { - "$ref": "wait_state.json#/definitions/waitState" - }, - { - "$ref": "parallel_state.json#/definitions/parallelState" - }, - { - "$ref": "map_state.json#/definitions/mapState" - } - ] - } - } + "definitions": { + "states": { + "type": "object", + "description": "An object containing a comma-delimited set of states.", + "additionalProperties": { + "oneOf": [ + { + "$ref": "pass_state.json#/definitions/passState" + }, + { + "$ref": "succeed_state.json#/definitions/succeedState" + }, + { + "$ref": "fail_state.json#/definitions/failState" + }, + { + "$ref": "task_state.json#/definitions/taskState" + }, + { + "$ref": "choice_state.json#/definitions/choiceState" + }, + { + "$ref": "wait_state.json#/definitions/waitState" + }, + { + "$ref": "parallel_state.json#/definitions/parallelState" + }, + { + "$ref": "map_state.json#/definitions/mapState" + } + ] + } } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/succeed_state.json b/src/json-schema/partial/succeed_state.json index 27b35dac4..f81f71fec 100755 --- a/src/json-schema/partial/succeed_state.json +++ b/src/json-schema/partial/succeed_state.json @@ -1,27 +1,25 @@ { - "definitions": { - "succeedState": { - "description": "A Succeed state stops an execution successfully. The Succeed state is a useful target for Choice state branches that don't do anything but stop the execution.", - "allOf": [ - { - "$ref": "common.json#/definitions/basics" - }, - { - "$ref": "common.json#/definitions/inputOutput" - }, - { - "properties": { - "Type": { - "enum": [ - "Succeed" - ] - }, - "Output": { - "$ref": "common.json#/definitions/output" - } - } - } - ] + "definitions": { + "succeedState": { + "description": "A Succeed state stops an execution successfully. The Succeed state is a useful target for Choice state branches that don't do anything but stop the execution.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutput" + }, + { + "properties": { + "Type": { + "enum": ["Succeed"] + }, + "Output": { + "$ref": "common.json#/definitions/output" + } + } } + ] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/task_state.json b/src/json-schema/partial/task_state.json index 7f89e6514..8fcaec2e1 100755 --- a/src/json-schema/partial/task_state.json +++ b/src/json-schema/partial/task_state.json @@ -1,140 +1,136 @@ { - "definitions": { - "taskState": { - "description": "A Task state represents a single unit of work performed by a state machine.\nAll work in your state machine is done by tasks. A task performs work identified by the state’s Resource field, which is often an AWS Lambda function or other Step Functions service integrations.", - "allOf": [ + "definitions": { + "taskState": { + "description": "A Task state represents a single unit of work performed by a state machine.\nAll work in your state machine is done by tasks. A task performs work identified by the state’s Resource field, which is often an AWS Lambda function or other Step Functions service integrations.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutputResult" + }, + { + "$ref": "common.json#/definitions/endOrTransition" + }, + { + "properties": { + "Type": { + "enum": ["Task"] + }, + "Resource": { + "type": "string", + "description": "A URI, especially an ARN that uniquely identifies the specific task to execute.", + "examples": [ + "arn:aws:states:::batch:submitJob", + "arn:aws:states:::batch:submitJob.sync", + "arn:aws:states:::dynamodb:deleteItem", + "arn:aws:states:::dynamodb:getItem", + "arn:aws:states:::dynamodb:putItem", + "arn:aws:states:::dynamodb:updateItem", + "arn:aws:states:::ecs:runTask", + "arn:aws:states:::ecs:runTask.sync", + "arn:aws:states:::ecs:runTask.waitForTaskToken", + "arn:aws:states:::elasticmapreduce:addStep", + "arn:aws:states:::elasticmapreduce:addStep.sync", + "arn:aws:states:::elasticmapreduce:cancelStep", + "arn:aws:states:::elasticmapreduce:createCluster", + "arn:aws:states:::elasticmapreduce:createCluster.sync", + "arn:aws:states:::elasticmapreduce:modifyInstanceFleetByName", + "arn:aws:states:::elasticmapreduce:modifyInstanceGroupByName", + "arn:aws:states:::elasticmapreduce:setClusterTerminationProtection", + "arn:aws:states:::elasticmapreduce:terminateCluster", + "arn:aws:states:::elasticmapreduce:terminateCluster.sync", + "arn:aws:states:::events:putEvents", + "arn:aws:states:::events:putEvents.waitForTaskToken", + "arn:aws:states:::glue:startJobRun", + "arn:aws:states:::glue:startJobRun.sync", + "arn:aws:states:::lambda:invoke", + "arn:aws:states:::lambda:invoke.waitForTaskToken", + "arn:aws:states:::mediaconvert:createJob", + "arn:aws:states:::mediaconvert:createJob.sync", + "arn:aws:states:::sagemaker:createEndpoint", + "arn:aws:states:::sagemaker:createEndpointConfig", + "arn:aws:states:::sagemaker:createHyperParameterTuningJob", + "arn:aws:states:::sagemaker:createHyperParameterTuningJob.sync", + "arn:aws:states:::sagemaker:createLabelingJob", + "arn:aws:states:::sagemaker:createLabelingJob.sync", + "arn:aws:states:::sagemaker:createModel", + "arn:aws:states:::sagemaker:createTrainingJob", + "arn:aws:states:::sagemaker:createTrainingJob.sync", + "arn:aws:states:::sagemaker:createTransformJob", + "arn:aws:states:::sagemaker:createTransformJob.sync", + "arn:aws:states:::sagemaker:updateEndpoint", + "arn:aws:states:::sns:publish", + "arn:aws:states:::sns:publish.waitForTaskToken", + "arn:aws:states:::sqs:sendMessage", + "arn:aws:states:::sqs:sendMessage.waitForTaskToken", + "arn:aws:states:::states:startExecution", + "arn:aws:states:::states:startExecution.sync", + "arn:aws:states:::states:startExecution.waitForTaskToken" + ] + }, + "Parameters": { + "$ref": "common.json#/definitions/parameters", + "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "ResultSelector": { + "$ref": "common.json#/definitions/resultSelector", + "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." + }, + "TimeoutSeconds": { + "oneOf": [ { - "$ref": "common.json#/definitions/basics" + "$ref": "common.json#/definitions/seconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "$ref": "common.json#/definitions/inputOutputResult" - }, + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error name. Must be a positive, non-zero integer, or a jsonata expression. If not provided, the default value is 99999999. The count begins after the task has been started, for example, when ActivityStarted or LambdaFunctionStarted are logged in the Execution event history." + }, + "TimeoutSecondsPath": { + "$ref": "common.json#/definitions/path", + "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." + }, + "HeartbeatSeconds": { + "oneOf": [ { - "$ref": "common.json#/definitions/endOrTransition" + "$ref": "common.json#/definitions/seconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "properties": { - "Type": { - "enum": [ - "Task" - ] - }, - "Resource": { - "type": "string", - "description": "A URI, especially an ARN that uniquely identifies the specific task to execute.", - "examples": [ - "arn:aws:states:::batch:submitJob", - "arn:aws:states:::batch:submitJob.sync", - "arn:aws:states:::dynamodb:deleteItem", - "arn:aws:states:::dynamodb:getItem", - "arn:aws:states:::dynamodb:putItem", - "arn:aws:states:::dynamodb:updateItem", - "arn:aws:states:::ecs:runTask", - "arn:aws:states:::ecs:runTask.sync", - "arn:aws:states:::ecs:runTask.waitForTaskToken", - "arn:aws:states:::elasticmapreduce:addStep", - "arn:aws:states:::elasticmapreduce:addStep.sync", - "arn:aws:states:::elasticmapreduce:cancelStep", - "arn:aws:states:::elasticmapreduce:createCluster", - "arn:aws:states:::elasticmapreduce:createCluster.sync", - "arn:aws:states:::elasticmapreduce:modifyInstanceFleetByName", - "arn:aws:states:::elasticmapreduce:modifyInstanceGroupByName", - "arn:aws:states:::elasticmapreduce:setClusterTerminationProtection", - "arn:aws:states:::elasticmapreduce:terminateCluster", - "arn:aws:states:::elasticmapreduce:terminateCluster.sync", - "arn:aws:states:::events:putEvents", - "arn:aws:states:::events:putEvents.waitForTaskToken", - "arn:aws:states:::glue:startJobRun", - "arn:aws:states:::glue:startJobRun.sync", - "arn:aws:states:::lambda:invoke", - "arn:aws:states:::lambda:invoke.waitForTaskToken", - "arn:aws:states:::mediaconvert:createJob", - "arn:aws:states:::mediaconvert:createJob.sync", - "arn:aws:states:::sagemaker:createEndpoint", - "arn:aws:states:::sagemaker:createEndpointConfig", - "arn:aws:states:::sagemaker:createHyperParameterTuningJob", - "arn:aws:states:::sagemaker:createHyperParameterTuningJob.sync", - "arn:aws:states:::sagemaker:createLabelingJob", - "arn:aws:states:::sagemaker:createLabelingJob.sync", - "arn:aws:states:::sagemaker:createModel", - "arn:aws:states:::sagemaker:createTrainingJob", - "arn:aws:states:::sagemaker:createTrainingJob.sync", - "arn:aws:states:::sagemaker:createTransformJob", - "arn:aws:states:::sagemaker:createTransformJob.sync", - "arn:aws:states:::sagemaker:updateEndpoint", - "arn:aws:states:::sns:publish", - "arn:aws:states:::sns:publish.waitForTaskToken", - "arn:aws:states:::sqs:sendMessage", - "arn:aws:states:::sqs:sendMessage.waitForTaskToken", - "arn:aws:states:::states:startExecution", - "arn:aws:states:::states:startExecution.sync", - "arn:aws:states:::states:startExecution.waitForTaskToken" - ] - }, - "Parameters": { - "$ref": "common.json#/definitions/parameters", - "description": "Used to pass information to the API actions of connected resources. The Parameters can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "ResultSelector": { - "$ref": "common.json#/definitions/resultSelector", - "description": "Used to transform the result. The ResultSelector can use a mix of static JSON, JsonPath and intrinsic functions." - }, - "TimeoutSeconds": { - "oneOf": [ - { - "$ref": "common.json#/definitions/seconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error name. Must be a positive, non-zero integer, or a jsonata expression. If not provided, the default value is 99999999. The count begins after the task has been started, for example, when ActivityStarted or LambdaFunctionStarted are logged in the Execution event history." - }, - "TimeoutSecondsPath": { - "$ref": "common.json#/definitions/path", - "description": "If the task runs longer than the specified seconds, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." - }, - "HeartbeatSeconds": { - "oneOf": [ - { - "$ref": "common.json#/definitions/seconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error name. Must be a positive, non-zero integer less than the number of seconds specified in the TimeoutSeconds field, or a jsonata expression. If not provided, the default value is 99999999. For Activities, the count begins when GetActivityTask receives a token and ActivityStarted is logged in the Execution event history." - }, - "HeartbeatSecondsPath": { - "$ref": "common.json#/definitions/path", - "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." - }, - "Retry": { - "$ref": "common.json#/definitions/retry", - "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." - }, - "Catch": { - "$ref": "common.json#/definitions/catch", - "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." - }, - "Arguments": { - "$ref": "common.json#/definitions/arguments" - }, - "Output": { - "$ref": "common.json#/definitions/output" - }, - "Assign": { - "$ref": "common.json#/definitions/assign", - "description": "An object to define the variables to be assigned." - } - }, - "required": [ - "Resource" - ] + "$ref": "common.json#/definitions/jsonata" } - ] + ], + "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error name. Must be a positive, non-zero integer less than the number of seconds specified in the TimeoutSeconds field, or a jsonata expression. If not provided, the default value is 99999999. For Activities, the count begins when GetActivityTask receives a token and ActivityStarted is logged in the Execution event history." + }, + "HeartbeatSecondsPath": { + "$ref": "common.json#/definitions/path", + "description": "If more time than the specified seconds elapses between heartbeats from the task, this state fails with a States.Timeout error. Specified using JsonPath syntax, to select the value from the state's input data." + }, + "Retry": { + "$ref": "common.json#/definitions/retry", + "description": "An array of objects, called Retriers, that define a retry policy if the state encounters runtime errors." + }, + "Catch": { + "$ref": "common.json#/definitions/catch", + "description": "An array of objects, called Catchers, that define a fallback state. This state is executed if the state encounters runtime errors and its retry policy is exhausted or isn't defined." + }, + "Arguments": { + "$ref": "common.json#/definitions/arguments" + }, + "Output": { + "$ref": "common.json#/definitions/output" + }, + "Assign": { + "$ref": "common.json#/definitions/assign", + "description": "An object to define the variables to be assigned." + } + }, + "required": ["Resource"] } + ] } -} \ No newline at end of file + } +} diff --git a/src/json-schema/partial/wait_state.json b/src/json-schema/partial/wait_state.json index 730d4ee63..f3f1514c0 100755 --- a/src/json-schema/partial/wait_state.json +++ b/src/json-schema/partial/wait_state.json @@ -1,88 +1,74 @@ { - "definitions": { - "waitState": { - "description": "A Wait state delays the state machine from continuing for a specified time. You can choose either a relative time, specified in seconds from when the state begins, or an absolute end time, specified as a timestamp.", - "allOf": [ + "definitions": { + "waitState": { + "description": "A Wait state delays the state machine from continuing for a specified time. You can choose either a relative time, specified in seconds from when the state begins, or an absolute end time, specified as a timestamp.", + "allOf": [ + { + "$ref": "common.json#/definitions/basics" + }, + { + "$ref": "common.json#/definitions/inputOutput" + }, + { + "$ref": "common.json#/definitions/endOrTransition" + }, + { + "properties": { + "Type": { + "enum": ["Wait"] + }, + "Seconds": { + "oneOf": [ { - "$ref": "common.json#/definitions/basics" + "$ref": "common.json#/definitions/seconds", + "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." }, { - "$ref": "common.json#/definitions/inputOutput" - }, + "$ref": "common.json#/definitions/jsonata" + } + ], + "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field." + }, + "Timestamp": { + "oneOf": [ { - "$ref": "common.json#/definitions/endOrTransition" + "$ref": "common.json#/definitions/timestamp", + "errorMessage": "Incorrect type. Expected one of timestamp, JSONata expression." }, { - "properties": { - "Type": { - "enum": [ - "Wait" - ] - }, - "Seconds": { - "oneOf": [ - { - "$ref": "common.json#/definitions/seconds", - "errorMessage": "Incorrect type. Expected one of integer, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field." - }, - "Timestamp": { - "oneOf": [ - { - "$ref": "common.json#/definitions/timestamp", - "errorMessage": "Incorrect type. Expected one of timestamp, JSONata expression." - }, - { - "$ref": "common.json#/definitions/jsonata" - } - ], - "description": "An absolute time to wait until beginning the state specified in the \"Next\" field.\n\nTimestamps must conform to the RFC3339 profile of ISO 8601, with the further restrictions that an uppercase T must separate the date and time portions, and an uppercase Z must denote that a numeric time zone offset is not present, for example, 2016-08-18T17:33:00Z." - }, - "SecondsPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field, specified using a path from the state's input data." - }, - "TimestampPath": { - "$ref": "common.json#/definitions/referencePath", - "description": "An absolute time to wait until beginning the state specified in the \"Next\" field, specified using a path from the state's input data." - }, - "Output": { - "$ref": "common.json#/definitions/output" - } - }, - "oneOf": [ - { - "required": [ - "Type", - "Seconds" - ] - }, - { - "required": [ - "Type", - "Timestamp" - ] - }, - { - "required": [ - "Type", - "SecondsPath" - ] - }, - { - "required": [ - "Type", - "TimestampPath" - ] - } - ] + "$ref": "common.json#/definitions/jsonata" } - ] + ], + "description": "An absolute time to wait until beginning the state specified in the \"Next\" field.\n\nTimestamps must conform to the RFC3339 profile of ISO 8601, with the further restrictions that an uppercase T must separate the date and time portions, and an uppercase Z must denote that a numeric time zone offset is not present, for example, 2016-08-18T17:33:00Z." + }, + "SecondsPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "A time, in seconds, to wait before beginning the state specified in the \"Next\" field, specified using a path from the state's input data." + }, + "TimestampPath": { + "$ref": "common.json#/definitions/referencePath", + "description": "An absolute time to wait until beginning the state specified in the \"Next\" field, specified using a path from the state's input data." + }, + "Output": { + "$ref": "common.json#/definitions/output" + } + }, + "oneOf": [ + { + "required": ["Type", "Seconds"] + }, + { + "required": ["Type", "Timestamp"] + }, + { + "required": ["Type", "SecondsPath"] + }, + { + "required": ["Type", "TimestampPath"] + } + ] } + ] } -} \ No newline at end of file + } +} diff --git a/src/service.ts b/src/service.ts index aec7d503a..13948ea73 100644 --- a/src/service.ts +++ b/src/service.ts @@ -4,92 +4,90 @@ */ import { - Diagnostic, - DiagnosticSeverity, - getLanguageService as getLanguageServiceVscode, - JSONSchema, - LanguageService, - LanguageServiceParams -} from 'vscode-json-languageservice'; + Diagnostic, + DiagnosticSeverity, + getLanguageService as getLanguageServiceVscode, + JSONSchema, + LanguageService, + LanguageServiceParams, +} from 'vscode-json-languageservice' -import aslSchema from './json-schema/bundled.json'; +import aslSchema from './json-schema/bundled.json' -import { - ASLOptions, - ASTTree, - isObjectNode -} from './utils/astUtilityFunctions' +import { ASLOptions, ASTTree, isObjectNode } from './utils/astUtilityFunctions' import completeAsl from './completion/completeAsl' -import { LANGUAGE_IDS } from './constants/constants'; +import { LANGUAGE_IDS } from './constants/constants' import validateStates, { RootType } from './validation/validateStates' import { getLanguageService as getAslYamlLanguageService } from './yaml/aslYamlLanguageService' export * from 'vscode-json-languageservice' -interface ASLLanguageServiceParams extends LanguageServiceParams { aslOptions?: ASLOptions } +interface ASLLanguageServiceParams extends LanguageServiceParams { + aslOptions?: ASLOptions +} export const ASL_SCHEMA = aslSchema as JSONSchema export const doCompleteAsl = completeAsl -export const getLanguageService = function( params: ASLLanguageServiceParams): LanguageService { - const builtInParams = {} - - const languageService = getLanguageServiceVscode({ ...params, ...builtInParams }) - const doValidation = languageService.doValidation.bind(languageService) as typeof languageService.doValidation - const doComplete = languageService.doComplete.bind(languageService) as typeof languageService.doComplete - - languageService.configure({ - validate: true, - allowComments: false, - schemas: [ - { - uri: LANGUAGE_IDS.JSON, - fileMatch: ['*'], - schema: aslSchema as JSONSchema - } - ] - }) - - languageService.doValidation = async function(document, jsonDocument, documentSettings) { - // vscode-json-languageservice will always set severity as warning for JSONSchema validation - // there is no option to configure this behavior so severity needs to be overwritten as error - const diagnostics = (await doValidation(document, jsonDocument, documentSettings)).map(diagnostic => { - // Non JSON Schema validation will have source: 'asl' - if (diagnostic.source !== LANGUAGE_IDS.JSON) { - return { ...diagnostic, severity: DiagnosticSeverity.Error } - } - - return diagnostic - }) as Diagnostic[] - - const rootNode = (jsonDocument as ASTTree).root - - if (rootNode && isObjectNode(rootNode)) { - const aslDiagnostics = validateStates(rootNode, document, RootType.Root, params.aslOptions) - - return diagnostics.concat(aslDiagnostics) - } - - return diagnostics +export const getLanguageService = function (params: ASLLanguageServiceParams): LanguageService { + const builtInParams = {} + + const languageService = getLanguageServiceVscode({ ...params, ...builtInParams }) + const doValidation = languageService.doValidation.bind(languageService) as typeof languageService.doValidation + const doComplete = languageService.doComplete.bind(languageService) as typeof languageService.doComplete + + languageService.configure({ + validate: true, + allowComments: false, + schemas: [ + { + uri: LANGUAGE_IDS.JSON, + fileMatch: ['*'], + schema: aslSchema as JSONSchema, + }, + ], + }) + + languageService.doValidation = async function (document, jsonDocument, documentSettings) { + // vscode-json-languageservice will always set severity as warning for JSONSchema validation + // there is no option to configure this behavior so severity needs to be overwritten as error + const diagnostics = (await doValidation(document, jsonDocument, documentSettings)).map((diagnostic) => { + // Non JSON Schema validation will have source: 'asl' + if (diagnostic.source !== LANGUAGE_IDS.JSON) { + return { ...diagnostic, severity: DiagnosticSeverity.Error } + } + + return diagnostic + }) as Diagnostic[] + + const rootNode = (jsonDocument as ASTTree).root + + if (rootNode && isObjectNode(rootNode)) { + const aslDiagnostics = validateStates(rootNode, document, RootType.Root, params.aslOptions) + + return diagnostics.concat(aslDiagnostics) } - languageService.doComplete = async function(document, position, doc) { - const jsonCompletions = await doComplete(document, position, doc); + return diagnostics + } - return completeAsl(document, position, doc, jsonCompletions, params.aslOptions); - } + languageService.doComplete = async function (document, position, doc) { + const jsonCompletions = await doComplete(document, position, doc) + + return completeAsl(document, position, doc, jsonCompletions, params.aslOptions) + } - return languageService + return languageService } -export const getYamlLanguageService = function( params: ASLLanguageServiceParams): LanguageService { - const aslLanguageService: LanguageService = getLanguageService({ - ...params, - aslOptions: { - ignoreColonOffset: true, - }, - }) +export const getYamlLanguageService = function (params: ASLLanguageServiceParams): LanguageService { + const aslLanguageService: LanguageService = getLanguageService({ + ...params, + aslOptions: { + ignoreColonOffset: true, + }, + }) - return getAslYamlLanguageService(params, ASL_SCHEMA, aslLanguageService); + return getAslYamlLanguageService(params, ASL_SCHEMA, aslLanguageService) } diff --git a/src/snippets/error_handling.json b/src/snippets/error_handling.json index 0e2ad8f03..b3956200d 100644 --- a/src/snippets/error_handling.json +++ b/src/snippets/error_handling.json @@ -1,41 +1,41 @@ [ - { - "name": "Retry", - "body": [ - "\"Retry\": [", - "\t{", - "\t\t\"ErrorEquals\": [", - "\t\t\t\"ErrorA\",", - "\t\t\t\"ErrorB\"", - "\t\t],", - "\t\t\"IntervalSeconds\": 1,", - "\t\t\"BackoffRate\": 2,", - "\t\t\"MaxAttempts\": 2,", - "\t\t\"MaxDelaySeconds\": 10,", - "\t\t\"JitterStrategy\": \"FULL\"", - "\t},", - "\t{", - "\t\t\"ErrorEquals\": [", - "\t\t\t\"ErrorC\"", - "\t\t],", - "\t\t\"IntervalSeconds\": 5", - "\t}", - "]" - ], - "description": "Code snippet for a Retry field.\n\nUse a Retry field to retry a task state after an error occurs." - }, - { - "name": "Catch", - "body": [ - "\"Catch\": [", - "\t{", - "\t\t\"ErrorEquals\": [", - "\t\t\t\"${2:States.ALL}\"", - "\t\t],", - "\t\t\"Next\": \"${1:NextState}\"", - "\t}", - "]" - ], - "description": "Code snippet for a Catch field.\n\nUse a Catch field to catch errors and revert to a fallback state." - } -] \ No newline at end of file + { + "name": "Retry", + "body": [ + "\"Retry\": [", + "\t{", + "\t\t\"ErrorEquals\": [", + "\t\t\t\"ErrorA\",", + "\t\t\t\"ErrorB\"", + "\t\t],", + "\t\t\"IntervalSeconds\": 1,", + "\t\t\"BackoffRate\": 2,", + "\t\t\"MaxAttempts\": 2,", + "\t\t\"MaxDelaySeconds\": 10,", + "\t\t\"JitterStrategy\": \"FULL\"", + "\t},", + "\t{", + "\t\t\"ErrorEquals\": [", + "\t\t\t\"ErrorC\"", + "\t\t],", + "\t\t\"IntervalSeconds\": 5", + "\t}", + "]" + ], + "description": "Code snippet for a Retry field.\n\nUse a Retry field to retry a task state after an error occurs." + }, + { + "name": "Catch", + "body": [ + "\"Catch\": [", + "\t{", + "\t\t\"ErrorEquals\": [", + "\t\t\t\"${2:States.ALL}\"", + "\t\t],", + "\t\t\"Next\": \"${1:NextState}\"", + "\t}", + "]" + ], + "description": "Code snippet for a Catch field.\n\nUse a Catch field to catch errors and revert to a fallback state." + } +] diff --git a/src/snippets/states.json b/src/snippets/states.json index 6088a4549..77e151a17 100644 --- a/src/snippets/states.json +++ b/src/snippets/states.json @@ -1,243 +1,243 @@ [ - { - "name": "Pass State", - "body": [ - "\"${1:PassState}\": {", - "\t\"Type\": \"Pass\",", - "\t\"Result\": {", - "\t\t\"data1\": 0.5,", - "\t\t\"data2\": 1.5", - "\t},", - "\t\"ResultPath\": \"$.result\",", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Pass state.\n\nA Pass state passes its input to its output, without performing work." - }, - { - "name": "Lambda Task State", - "body": [ - "\"${1:Invoke Lambda function}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::lambda:invoke\",", - "\t\"Parameters\": {", - "\t\t\"FunctionName\": \"${3:arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME}\",", - "\t\t\"Payload\": {", - "\t\t\t\"Input.$\": \"$\"", - "\t\t}", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Lambda Task state.\n\nCalls the AWS Lambda Invoke API to invoke a function." - }, - { - "name": "EventBridge Task State", - "body": [ - "\"${1:Send an EventBridge custom event}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::events:putEvents\",", - "\t\"Parameters\": {", - "\t\t\"Entries\": [", - "\t\t\t{", - "\t\t\t\t\"Detail\": {", - "\t\t\t\t\t\"Message\": \"${4:Hello from Step Functions!}\"", - "\t\t\t\t},", - "\t\t\t\t\"DetailType\": \"${5:MyDetailType}\",", - "\t\t\t\t\"EventBusName\": \"${6:MyEventBusName}\",", - "\t\t\t\t\"Source\": \"${7:MySource}\"", - "\t\t\t}", - "\t\t]", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for an EventBridge Task state.\n\nCalls the Amazon EventBridge PutEvents API to send a custom event to an event bus." - }, - { - "name": "MediaConvert Task State", - "body": [ - "\"${1:Create a MediaConvert Transcoding Job}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::mediaconvert:createJob\",", - "\t\"Parameters\": {", - "\t\t\"Role\": \"${3:arn:aws:iam::ACCOUNT_ID:role/MyServiceRole}\",", - "\t\t\"Settings\": {", - "\t\t\t\"Inputs\": [],", - "\t\t\t\"OutputGroups\": []", - "\t\t}", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for an MediaConvert Create Job Task state.\n\nCalls the AWS MediaConvert CreateJob API to create a Transcoding Job." - }, - { - "name": "SNS Task State", - "body": [ - "\"${1:Send message to SNS}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::sns:publish\",", - "\t\"Parameters\": {", - "\t\t\"TopicArn\": \"${3:arn:aws:sns:REGION:ACCOUNT_ID:myTopic}\",", - "\t\t\"Message\": {", - "\t\t\t\"Input\": \"${4:Hello from Step Functions!}\"", - "\t\t}", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for an SNS Publish Task state.\n\nCalls the Amazon SNS Publish API to send a message to a destination." - }, - { - "name": "Batch Task State", - "body": [ - "\"${1:Manage Batch task}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::batch:submitJob.sync\",", - "\t\"Parameters\": {", - "\t\t\"JobDefinition\": \"${3:arn:aws:batch:REGION:ACCOUNT_ID:job-definition/testJobDefinition}\",", - "\t\t\"JobName\": \"${4:myJobName}\",", - "\t\t\"JobQueue\": \"${5:arn:aws:batch:REGION:ACCOUNT_ID:job-queue/testQueue}\"", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Batch job Task state.\n\nCalls the AWS Batch SubmitJob API and resumes the execution once the job is complete." - }, - { - "name": "ECS Task State", - "body": [ - "\"${1:Manage ECS task}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::ecs:runTask.sync\",", - "\t\"Parameters\": {", - "\t\t\"LaunchType\": \"FARGATE\",", - "\t\t\"Cluster\": \"${3:arn:aws:ecs:REGION:ACCOUNT_ID:cluster/MyECSCluster}\",", - "\t\t\"TaskDefinition\": \"${4:arn:aws:ecs:REGION:ACCOUNT_ID:task-definition/MyTaskDefinition:1}\"", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for an ECS RunTask Task state.\n\nCalls the Amazon ECS RunTask API and resumes the execution once the ECS task is complete." - }, - { - "name": "SQS Task State", - "body": [ - "\"${1:Send message to SQS}\": {", - "\t\"Type\": \"Task\",", - "\t\"Resource\": \"arn:aws:states:::sqs:sendMessage\",", - "\t\"Parameters\": {", - "\t\t\"QueueUrl\": \"${3:https://sqs.REGION.amazonaws.com/ACCOUNT_ID/myQueue}\",", - "\t\t\"MessageBody\": {", - "\t\t\t\"Input\": \"${4:Hello from Step Functions!}\"", - "\t\t}", - "\t},", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for an SQS Publish Task state.\n\nCalls the Amazon SQS SendMessage API to send a message to a queue." - }, - { - "name": "Choice State", - "body": [ - "\"${1:ChoiceState}\": {", - "\t\"Type\": \"Choice\",", - "\t\"Choices\": [", - "\t\t{", - "\t\t\t\"Variable\": \"$.${2:variable}\",", - "\t\t\t\"BooleanEquals\": true,", - "\t\t\t\"Next\": \"TrueState\"", - "\t\t},", - "\t\t{", - "\t\t\t\"Variable\": \"$.${2:variable}\",", - "\t\t\t\"BooleanEquals\": false,", - "\t\t\t\"Next\": \"FalseState\"", - "\t\t}", - "\t],", - "\t\"Default\": \"${3:DefaultState}\"", - "}" - ], - "description": "Code snippet for a Choice state.\n\nA Choice state adds branching logic to a state machine." - }, - { - "name": "Wait State", - "body": [ - "\"${1:WaitState}\": {", - "\t\"Type\": \"Wait\",", - "\t\"Seconds\": 10,", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Wait state.\n\nA Wait state delays the state machine from continuing for a specified time." - }, - { - "name": "Succeed State", - "body": ["\"${1:SuccessState}\": {", "\t\"Type\": \"Succeed\"", "}"], - "description": "Code snippet for a Succeed state.\n\nA Succeed state stops an execution successfully." - }, - { - "name": "Fail State", - "body": [ - "\"${1:FailState}\": {", - "\t\"Type\": \"Fail\",", - "\t\"Cause\": \"${2:Invalid response.}\",", - "\t\"Error\": \"${3:ErrorA}\"", - "}" - ], - "description": "Code snippet for a Fail state.\n\nA Fail state stops the execution of the state machine and marks it as a failure." - }, - { - "name": "Parallel State", - "body": [ - "\"${1:ParallelState}\": {", - "\t\"Type\": \"Parallel\",", - "\t\"Branches\": [", - "\t\t{", - "\t\t\t\"StartAt\": \"State1\",", - "\t\t\t\"States\": {", - "\t\t\t\t\"State1\": {", - "\t\t\t\t\t\"Type\": \"Pass\",", - "\t\t\t\t\t\"End\": true", - "\t\t\t\t}", - "\t\t\t}", - "\t\t},", - "\t\t{", - "\t\t\t\"StartAt\": \"State2\",", - "\t\t\t\"States\": {", - "\t\t\t\t\"State2\": {", - "\t\t\t\t\t\"Type\": \"Pass\",", - "\t\t\t\t\t\"End\": true", - "\t\t\t\t}", - "\t\t\t}", - "\t\t}", - "\t],", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Parallel state.\n\nA Parallel state can be used to create parallel branches of execution in your state machine." - }, - { - "name": "Map State", - "body": [ - "\"${1:MapState}\": {", - "\t\"Type\": \"Map\",", - "\t\"ItemsPath\": \"$.array\",", - "\t\"MaxConcurrency\": 0,", - "\t\"Iterator\": {", - "\t\t\"StartAt\": \"Pass\",", - "\t\t\"States\": {", - "\t\t\t\"Pass\": {", - "\t\t\t\t\"Type\": \"Pass\",", - "\t\t\t\t\"Result\": \"Done!\",", - "\t\t\t\t\"End\": true", - "\t\t\t}", - "\t\t}", - "\t},", - "\t\"ResultPath\": \"$.output\",", - "\t\"Next\": \"${2:NextState}\"", - "}" - ], - "description": "Code snippet for a Map state.\n\nThe Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input." - } + { + "name": "Pass State", + "body": [ + "\"${1:PassState}\": {", + "\t\"Type\": \"Pass\",", + "\t\"Result\": {", + "\t\t\"data1\": 0.5,", + "\t\t\"data2\": 1.5", + "\t},", + "\t\"ResultPath\": \"$.result\",", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Pass state.\n\nA Pass state passes its input to its output, without performing work." + }, + { + "name": "Lambda Task State", + "body": [ + "\"${1:Invoke Lambda function}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::lambda:invoke\",", + "\t\"Parameters\": {", + "\t\t\"FunctionName\": \"${3:arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME}\",", + "\t\t\"Payload\": {", + "\t\t\t\"Input.$\": \"$\"", + "\t\t}", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Lambda Task state.\n\nCalls the AWS Lambda Invoke API to invoke a function." + }, + { + "name": "EventBridge Task State", + "body": [ + "\"${1:Send an EventBridge custom event}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::events:putEvents\",", + "\t\"Parameters\": {", + "\t\t\"Entries\": [", + "\t\t\t{", + "\t\t\t\t\"Detail\": {", + "\t\t\t\t\t\"Message\": \"${4:Hello from Step Functions!}\"", + "\t\t\t\t},", + "\t\t\t\t\"DetailType\": \"${5:MyDetailType}\",", + "\t\t\t\t\"EventBusName\": \"${6:MyEventBusName}\",", + "\t\t\t\t\"Source\": \"${7:MySource}\"", + "\t\t\t}", + "\t\t]", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for an EventBridge Task state.\n\nCalls the Amazon EventBridge PutEvents API to send a custom event to an event bus." + }, + { + "name": "MediaConvert Task State", + "body": [ + "\"${1:Create a MediaConvert Transcoding Job}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::mediaconvert:createJob\",", + "\t\"Parameters\": {", + "\t\t\"Role\": \"${3:arn:aws:iam::ACCOUNT_ID:role/MyServiceRole}\",", + "\t\t\"Settings\": {", + "\t\t\t\"Inputs\": [],", + "\t\t\t\"OutputGroups\": []", + "\t\t}", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for an MediaConvert Create Job Task state.\n\nCalls the AWS MediaConvert CreateJob API to create a Transcoding Job." + }, + { + "name": "SNS Task State", + "body": [ + "\"${1:Send message to SNS}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::sns:publish\",", + "\t\"Parameters\": {", + "\t\t\"TopicArn\": \"${3:arn:aws:sns:REGION:ACCOUNT_ID:myTopic}\",", + "\t\t\"Message\": {", + "\t\t\t\"Input\": \"${4:Hello from Step Functions!}\"", + "\t\t}", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for an SNS Publish Task state.\n\nCalls the Amazon SNS Publish API to send a message to a destination." + }, + { + "name": "Batch Task State", + "body": [ + "\"${1:Manage Batch task}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::batch:submitJob.sync\",", + "\t\"Parameters\": {", + "\t\t\"JobDefinition\": \"${3:arn:aws:batch:REGION:ACCOUNT_ID:job-definition/testJobDefinition}\",", + "\t\t\"JobName\": \"${4:myJobName}\",", + "\t\t\"JobQueue\": \"${5:arn:aws:batch:REGION:ACCOUNT_ID:job-queue/testQueue}\"", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Batch job Task state.\n\nCalls the AWS Batch SubmitJob API and resumes the execution once the job is complete." + }, + { + "name": "ECS Task State", + "body": [ + "\"${1:Manage ECS task}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::ecs:runTask.sync\",", + "\t\"Parameters\": {", + "\t\t\"LaunchType\": \"FARGATE\",", + "\t\t\"Cluster\": \"${3:arn:aws:ecs:REGION:ACCOUNT_ID:cluster/MyECSCluster}\",", + "\t\t\"TaskDefinition\": \"${4:arn:aws:ecs:REGION:ACCOUNT_ID:task-definition/MyTaskDefinition:1}\"", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for an ECS RunTask Task state.\n\nCalls the Amazon ECS RunTask API and resumes the execution once the ECS task is complete." + }, + { + "name": "SQS Task State", + "body": [ + "\"${1:Send message to SQS}\": {", + "\t\"Type\": \"Task\",", + "\t\"Resource\": \"arn:aws:states:::sqs:sendMessage\",", + "\t\"Parameters\": {", + "\t\t\"QueueUrl\": \"${3:https://sqs.REGION.amazonaws.com/ACCOUNT_ID/myQueue}\",", + "\t\t\"MessageBody\": {", + "\t\t\t\"Input\": \"${4:Hello from Step Functions!}\"", + "\t\t}", + "\t},", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for an SQS Publish Task state.\n\nCalls the Amazon SQS SendMessage API to send a message to a queue." + }, + { + "name": "Choice State", + "body": [ + "\"${1:ChoiceState}\": {", + "\t\"Type\": \"Choice\",", + "\t\"Choices\": [", + "\t\t{", + "\t\t\t\"Variable\": \"$.${2:variable}\",", + "\t\t\t\"BooleanEquals\": true,", + "\t\t\t\"Next\": \"TrueState\"", + "\t\t},", + "\t\t{", + "\t\t\t\"Variable\": \"$.${2:variable}\",", + "\t\t\t\"BooleanEquals\": false,", + "\t\t\t\"Next\": \"FalseState\"", + "\t\t}", + "\t],", + "\t\"Default\": \"${3:DefaultState}\"", + "}" + ], + "description": "Code snippet for a Choice state.\n\nA Choice state adds branching logic to a state machine." + }, + { + "name": "Wait State", + "body": [ + "\"${1:WaitState}\": {", + "\t\"Type\": \"Wait\",", + "\t\"Seconds\": 10,", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Wait state.\n\nA Wait state delays the state machine from continuing for a specified time." + }, + { + "name": "Succeed State", + "body": ["\"${1:SuccessState}\": {", "\t\"Type\": \"Succeed\"", "}"], + "description": "Code snippet for a Succeed state.\n\nA Succeed state stops an execution successfully." + }, + { + "name": "Fail State", + "body": [ + "\"${1:FailState}\": {", + "\t\"Type\": \"Fail\",", + "\t\"Cause\": \"${2:Invalid response.}\",", + "\t\"Error\": \"${3:ErrorA}\"", + "}" + ], + "description": "Code snippet for a Fail state.\n\nA Fail state stops the execution of the state machine and marks it as a failure." + }, + { + "name": "Parallel State", + "body": [ + "\"${1:ParallelState}\": {", + "\t\"Type\": \"Parallel\",", + "\t\"Branches\": [", + "\t\t{", + "\t\t\t\"StartAt\": \"State1\",", + "\t\t\t\"States\": {", + "\t\t\t\t\"State1\": {", + "\t\t\t\t\t\"Type\": \"Pass\",", + "\t\t\t\t\t\"End\": true", + "\t\t\t\t}", + "\t\t\t}", + "\t\t},", + "\t\t{", + "\t\t\t\"StartAt\": \"State2\",", + "\t\t\t\"States\": {", + "\t\t\t\t\"State2\": {", + "\t\t\t\t\t\"Type\": \"Pass\",", + "\t\t\t\t\t\"End\": true", + "\t\t\t\t}", + "\t\t\t}", + "\t\t}", + "\t],", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Parallel state.\n\nA Parallel state can be used to create parallel branches of execution in your state machine." + }, + { + "name": "Map State", + "body": [ + "\"${1:MapState}\": {", + "\t\"Type\": \"Map\",", + "\t\"ItemsPath\": \"$.array\",", + "\t\"MaxConcurrency\": 0,", + "\t\"Iterator\": {", + "\t\t\"StartAt\": \"Pass\",", + "\t\t\"States\": {", + "\t\t\t\"Pass\": {", + "\t\t\t\t\"Type\": \"Pass\",", + "\t\t\t\t\"Result\": \"Done!\",", + "\t\t\t\t\"End\": true", + "\t\t\t}", + "\t\t}", + "\t},", + "\t\"ResultPath\": \"$.output\",", + "\t\"Next\": \"${2:NextState}\"", + "}" + ], + "description": "Code snippet for a Map state.\n\nThe Map state can be used to run a set of steps for each element of an input array. While the Parallel state executes multiple branches of steps using the same input, a Map state will execute the same steps for multiple entries of an array in the state input." + } ] diff --git a/src/tests/aslUtilityFunctions.test.ts b/src/tests/aslUtilityFunctions.test.ts index b2a6962c5..2910e7631 100644 --- a/src/tests/aslUtilityFunctions.test.ts +++ b/src/tests/aslUtilityFunctions.test.ts @@ -6,7 +6,14 @@ import assert from 'assert' import { ASTNode } from 'vscode-json-languageservice' import { getLanguageService, PropertyASTNode, TextDocument } from '../service' -import { ASTTree, findClosestAncestorStateNode ,findNodeAtLocation, getListOfStateNamesFromStateNode, insideStateNode, isChildOfStates } from '../utils/astUtilityFunctions' +import { + ASTTree, + findClosestAncestorStateNode, + findNodeAtLocation, + getListOfStateNamesFromStateNode, + insideStateNode, + isChildOfStates, +} from '../utils/astUtilityFunctions' const document = ` { @@ -59,124 +66,113 @@ const documentInvalid = ` "Invalid: ` -function toDocument(text: string): { textDoc: TextDocument, jsonDoc: ASTTree } { - const textDoc = TextDocument.create('foo://bar/file.asl', 'json', 0, text); +function toDocument(text: string): { textDoc: TextDocument; jsonDoc: ASTTree } { + const textDoc = TextDocument.create('foo://bar/file.asl', 'json', 0, text) - const ls = getLanguageService({}); - // tslint:disable-next-line: no-inferred-empty-object-type - const jsonDoc = ls.parseJSONDocument(textDoc) as ASTTree; + const ls = getLanguageService({}) + // tslint:disable-next-line: no-inferred-empty-object-type + const jsonDoc = ls.parseJSONDocument(textDoc) as ASTTree - return { textDoc, jsonDoc }; + return { textDoc, jsonDoc } } -suite('Utility functions for extracting data from AST Tree', () => { - test('getListOfStateNamesFromStateNode - retrieves list of states from state node', async () => { - const { jsonDoc } = toDocument(document) - const stateNode = jsonDoc.root!.children![1] as PropertyASTNode - const stateNames = getListOfStateNamesFromStateNode(stateNode) +describe('Utility functions for extracting data from AST Tree', () => { + test('getListOfStateNamesFromStateNode - retrieves list of states from state node', async () => { + const { jsonDoc } = toDocument(document) + const stateNode = jsonDoc.root!.children![1] as PropertyASTNode + const stateNames = getListOfStateNamesFromStateNode(stateNode) - const expectedStateNames = [ - 'FirstState', - 'ChoiceState', - 'FirstMatchState', - 'SecondMatchState', - 'DefaultState', - 'NextState', - 'MapState1' - ] + const expectedStateNames = [ + 'FirstState', + 'ChoiceState', + 'FirstMatchState', + 'SecondMatchState', + 'DefaultState', + 'NextState', + 'MapState1', + ] - assert.strictEqual(stateNames?.length, expectedStateNames.length) - assert.deepEqual(stateNames, expectedStateNames) - }) + assert.strictEqual(stateNames?.length, expectedStateNames.length) + assert.deepEqual(stateNames, expectedStateNames) + }) - test('getListOfStateNamesFromStateNode - throws an error when property named "States" is not provided', async () => { - const { jsonDoc } = toDocument(document) - const stateNode = jsonDoc.root!.children![0] as PropertyASTNode + test('getListOfStateNamesFromStateNode - throws an error when property named "States" is not provided', async () => { + const { jsonDoc } = toDocument(document) + const stateNode = jsonDoc.root!.children![0] as PropertyASTNode - assert.throws( - () => getListOfStateNamesFromStateNode(stateNode), - { message: 'Not a state name property node' } - ) - }) + assert.throws(() => getListOfStateNamesFromStateNode(stateNode), { message: 'Not a state name property node' }) + }) - test('getListOfStateNamesFromStateNode - retrieves only valid states', () => { - const { jsonDoc } = toDocument(documentInvalid) - const stateNode = jsonDoc.root!.children![0] as PropertyASTNode - const stateNames = getListOfStateNamesFromStateNode(stateNode) + test('getListOfStateNamesFromStateNode - retrieves only valid states', () => { + const { jsonDoc } = toDocument(documentInvalid) + const stateNode = jsonDoc.root!.children![0] as PropertyASTNode + const stateNames = getListOfStateNamesFromStateNode(stateNode) - const expectedStateNames = [ - 'FirstState', - 'SecondState' - ] + const expectedStateNames = ['FirstState', 'SecondState'] - assert.strictEqual(stateNames?.length, expectedStateNames.length) - assert.deepEqual(stateNames, expectedStateNames) - }) + assert.strictEqual(stateNames?.length, expectedStateNames.length) + assert.deepEqual(stateNames, expectedStateNames) + }) - test('findNodeAtLocation - finds a correct node at a given location', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('MapState2') + 1 + test('findNodeAtLocation - finds a correct node at a given location', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('MapState2') + 1 - const node = findNodeAtLocation(jsonDoc.root!, location) + const node = findNodeAtLocation(jsonDoc.root!, location) - assert.ok(!!node) + assert.ok(!!node) - const nodeText = document.slice(node!.offset, node!.offset + node!.length) + const nodeText = document.slice(node!.offset, node!.offset + node!.length) - assert.strictEqual(nodeText, '"MapState2"') - }) + assert.strictEqual(nodeText, '"MapState2"') + }) - test('findClosestAncestorStateNode - finds the closest ancestor property node called "States"', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('State4') + 1 + test('findClosestAncestorStateNode - finds the closest ancestor property node called "States"', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('State4') + 1 - const node = findNodeAtLocation(jsonDoc.root!, location) - const statesNode = findClosestAncestorStateNode(node!) + const node = findNodeAtLocation(jsonDoc.root!, location) + const statesNode = findClosestAncestorStateNode(node!) - assert(!!statesNode) - const nodeText = statesNode!.keyNode.value + assert(!!statesNode) + const nodeText = statesNode!.keyNode.value - assert.strictEqual(nodeText, 'States') + assert.strictEqual(nodeText, 'States') - const stateNames = getListOfStateNamesFromStateNode(statesNode!) + const stateNames = getListOfStateNamesFromStateNode(statesNode!) - assert.deepEqual(stateNames, [ - 'State1', - 'State2', - 'State3', - 'State4' - ]); - }); + assert.deepEqual(stateNames, ['State1', 'State2', 'State3', 'State4']) + }) - test('isChildOfStates - should return True if the location is a child node of a "States" node', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('MapState1') - 2 + test('isChildOfStates - should return True if the location is a child node of a "States" node', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('MapState1') - 2 - const node = findNodeAtLocation(jsonDoc.root!, location) - assert.strictEqual(isChildOfStates(node as ASTNode), true) - }) + const node = findNodeAtLocation(jsonDoc.root!, location) + assert.strictEqual(isChildOfStates(node as ASTNode), true) + }) - test('isChildOfStates - should return False if the location is not a child node of a "States" node', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('SecondMatchState') + test('isChildOfStates - should return False if the location is not a child node of a "States" node', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('SecondMatchState') - const node = findNodeAtLocation(jsonDoc.root!, location) - assert.strictEqual(isChildOfStates(node as ASTNode), false) - }) + const node = findNodeAtLocation(jsonDoc.root!, location) + assert.strictEqual(isChildOfStates(node as ASTNode), false) + }) - test('insideStateNode - should return True if the location is inside a State node', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('SecondMatchState') + 1 + test('insideStateNode - should return True if the location is inside a State node', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('SecondMatchState') + 1 - const node = findNodeAtLocation(jsonDoc.root!, location) - assert.strictEqual(insideStateNode(node as ASTNode), true) - }) - - test('insideStateNode - should return True if the location is a child node of a "States" node', () => { - const { jsonDoc } = toDocument(document) - const location = document.indexOf('MapState1') - 2 - - const node = findNodeAtLocation(jsonDoc.root!, location) - assert.strictEqual(insideStateNode(node as ASTNode), false) - }) + const node = findNodeAtLocation(jsonDoc.root!, location) + assert.strictEqual(insideStateNode(node as ASTNode), true) + }) + + test('insideStateNode - should return True if the location is a child node of a "States" node', () => { + const { jsonDoc } = toDocument(document) + const location = document.indexOf('MapState1') - 2 + + const node = findNodeAtLocation(jsonDoc.root!, location) + assert.strictEqual(insideStateNode(node as ASTNode), false) + }) }) diff --git a/src/tests/completion.test.ts b/src/tests/completion.test.ts index d7718d343..79f38451f 100644 --- a/src/tests/completion.test.ts +++ b/src/tests/completion.test.ts @@ -6,258 +6,81 @@ // tslint:disable:no-floating-promises import * as assert from 'assert' -import { - CompletionItemKind} from 'vscode-json-languageservice' +import { CompletionItemKind } from 'vscode-json-languageservice' import { errorHandlingSnippets, stateSnippets } from '../completion/completeSnippets' import { getLanguageService, Position, Range } from '../service' import { asTextEdit, toDocument } from './utils/testUtilities' -const document1 = ` -{ - "StartAt":, - "States": { - "FirstState": {}, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next":, - }, - "ChoiceStateX": { - "Type": "Choice", - "Choices": [ - { - "Next": "" - }, - { - "Next": "FirstState" - }, - { - "Next": "NextState" - } - ], - "Default": "" - }, - } - } -` - -const document2 = ` -{ - "StartAt": , - "States": { - "FirstState": {}, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next": , - }, - "ChoiceStateX": { - "Type": "Choice", - "Choices": [ - { - "Next": "" - }, - { - "Next": "FirstState" - }, - { - "Next": "NextState" - } - ], - "Default": - }, - } - } -` - -const document3 = ` -{ - "StartAt": ", - "States": { - "FirstState": {}, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next": ", - }, - "ChoiceStateX": {} - } - } -` - -const document4 = ` -{ - "StartAt": "", - "States": { - "FirstState": {}, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next": "", - }, - "ChoiceStateX": {} - } - } -` -const document5 = ` -{ - "StartAt": "First", - "States": { - "FirstState": {}, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next": "First", - }, - "ChoiceStateX": {} - } -} -` - -const document6 = ` -{ - "StartAt": "First", - "States": { - "FirstState": { - "Type": "Task" - }, - "ChoiceState": {}, - "FirstMatchState": {}, - "SecondMatchState": {}, - "DefaultState": {}, - "NextState": { - "Next": "First", - }, - "Success State": {} - } -} -` - -const documentNested = ` -{ - "StartAt": "First", - "States": { - "FirstState": {}, - "MapState": { - "Iterator": { - "StartAt":, - "States": { - "Nested1": {}, - "Nested2": {}, - "Nested3": {}, - "Nested4": { - "Next":, - }, - } - }, - }, - } -} -` -const completionsEdgeCase1 = `{ - "Comment": "An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2.", - "StartAt": "Map", - "States": { - "Map": { - "Type": "Map", - "ItemsPath": "$.array", - "ResultPath": "\"\"\"$$$$$.array$$$", - "MaxConcurrency": 2, - "Next": "Final State", - "Iterator": { - "StartAt": "Pass", - "States": { - "Pass": { - "Type": "Pass", - "Result": "Done!", - "End": true - } - } - } - }, - " - "Net 2": { - "Type": "Fail", - "Next": "Final State" - }, - "Final State": { - "Type": "Pass", - "Next": "Net 2" - } - } -}` - -const completionsEdgeCase2 = `{ - "StartAt": "MyState", - "States": { - " - } -}` - -const itemLabels = ['FirstState', 'ChoiceState', 'FirstMatchState', 'SecondMatchState', 'DefaultState', 'NextState', 'ChoiceStateX'] -const nestedItemLabels = ['Nested1', 'Nested2', 'Nested3', 'Nested4'] +import { + document1, + document2, + document3, + document4, + document5, + document6, + documentNested, + completionsEdgeCase1, + completionsEdgeCase2, + itemLabels, + nestedItemLabels, +} from './json-strings/completionStrings' interface TestCompletionOptions { - labels: string[], - json: string, - position: [number, number], - start: [number, number], - end: [number, number], + labels: string[] + json: string + position: [number, number] + start: [number, number] + end: [number, number] labelToInsertText(label: string): string } interface TestScenario { - json: string, - position: [number, number], - start: [number, number], - end: [number, number], + json: string + position: [number, number] + start: [number, number] + end: [number, number] } async function getCompletions(json: string, position: [number, number]) { - const { textDoc, jsonDoc } = toDocument(json) - const pos = Position.create(...position) - const ls = getLanguageService({}) + const { textDoc, jsonDoc } = toDocument(json) + const pos = Position.create(...position) + const ls = getLanguageService({}) - return await ls.doComplete(textDoc, pos, jsonDoc) + return await ls.doComplete(textDoc, pos, jsonDoc) } async function testCompletions(options: TestCompletionOptions) { - const { labels, json, position, start, end, labelToInsertText } = options + const { labels, json, position, start, end, labelToInsertText } = options - const res = await getCompletions(json, position) + const res = await getCompletions(json, position) - assert.strictEqual(res?.items.length, labels.length) + assert.strictEqual(res?.items.length, labels.length) - // space before quoted item - const itemInsertTexts = labels.map(labelToInsertText) + // space before quoted item + const itemInsertTexts = labels.map(labelToInsertText) - assert.deepEqual(res?.items.map(item => item.label), labels) - assert.deepEqual(res?.items.map(item => item.textEdit?.newText), itemInsertTexts) + assert.deepEqual( + res?.items.map((item) => item.label), + labels, + ) + assert.deepEqual( + res?.items.map((item) => item.textEdit?.newText), + itemInsertTexts, + ) - const leftPos = Position.create(...start) - const rightPos = Position.create(...end) - - res?.items.forEach(item => { - assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) - }) + const leftPos = Position.create(...start) + const rightPos = Position.create(...end) + res?.items.forEach((item) => { + assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) + }) } function getArrayIntersection(arrayOne: string[] | undefined, arrayTwo: string[] | undefined): string[] { - if ((arrayOne === undefined) || (arrayTwo === undefined)) { + if (arrayOne === undefined || arrayTwo === undefined) { return [] } - const arrayIntersection = arrayOne.filter(x => arrayTwo.includes(x)) + const arrayIntersection = arrayOne.filter((x) => arrayTwo.includes(x)) return arrayIntersection } @@ -272,249 +95,244 @@ async function getSuggestedSnippets(options: TestScenario) { const res = await ls.doComplete(textDoc, pos, jsonDoc) - const suggestedSnippetLabels = res?.items.filter(item => item.kind === CompletionItemKind.Snippet).map(item => item.label) + const suggestedSnippetLabels = res?.items + .filter((item) => item.kind === CompletionItemKind.Snippet) + .map((item) => item.label) return suggestedSnippetLabels } -suite('ASL context-aware completion', () => { - suite('StartAt', () => { - test('Cursor immedietely after colon', async () => { - await testCompletions({ - labels: itemLabels, - json: document1, - position: [2, 14], - start: [2, 14], - end: [2, 15], - labelToInsertText: label => ` "${label}",` - }) +describe('ASL context-aware completion', () => { + describe('StartAt', () => { + test('Cursor immedietely after colon', async () => { + await testCompletions({ + labels: itemLabels, + json: document1, + position: [2, 14], + start: [2, 14], + end: [2, 15], + labelToInsertText: (label) => ` "${label}",`, }) + }) - test('Cursor not immedietely after colon but no quotes', async () => { - await testCompletions({ - labels: itemLabels, - json: document2, - position: [2, 16], - start: [2, 14], - end: [2, 16], - labelToInsertText: label => ` "${label}",` - }) + test('Cursor not immedietely after colon but no quotes', async () => { + await testCompletions({ + labels: itemLabels, + json: document2, + position: [2, 16], + start: [2, 14], + end: [2, 16], + labelToInsertText: (label) => ` "${label}",`, }) + }) - test('Left quotation mark present', async () => { - await testCompletions({ - labels: itemLabels, - json: document3, - position: [2, 16], - start: [2, 16], - end: [2, 17], - labelToInsertText: label => `${label}"` - }) + test('Left quotation mark present', async () => { + await testCompletions({ + labels: itemLabels, + json: document3, + position: [2, 16], + start: [2, 16], + end: [2, 17], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Both quotation marks present and cursor between them', async () => { - await testCompletions({ - labels: itemLabels, - json: document4, - position: [2, 16], - start: [2, 16], - end: [2, 17], - labelToInsertText: label => `${label}"` - }) + test('Both quotation marks present and cursor between them', async () => { + await testCompletions({ + labels: itemLabels, + json: document4, + position: [2, 16], + start: [2, 16], + end: [2, 17], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Suggests completions when text present and cursor is on it', async () => { - await testCompletions({ - labels: itemLabels, - json: document5, - position: [2, 17], - start: [2, 14], - end: [2, 20], - labelToInsertText: label => `${label}"` - }) + test('Suggests completions when text present and cursor is on it', async () => { + await testCompletions({ + labels: itemLabels, + json: document5, + position: [2, 17], + start: [2, 14], + end: [2, 20], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Suggests nested completions when StartAt is nested within Map state', async () => { - await testCompletions({ - labels: nestedItemLabels, - json: documentNested, - position: [7, 20], - start: [7, 20], - end: [7, 21], - labelToInsertText: label => ` "${label}",` - }) + test('Suggests nested completions when StartAt is nested within Map state', async () => { + await testCompletions({ + labels: nestedItemLabels, + json: documentNested, + position: [7, 20], + start: [7, 20], + end: [7, 21], + labelToInsertText: (label) => ` "${label}",`, }) }) - - suite('Next', () => { - test('Cursor immedietely after colon', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: itemLabels.filter(label => label !== 'NextState'), - json: document1, - position: [10, 15], - start: [10, 15], - end: [10, 16], - labelToInsertText: label => ` "${label}",` - }) + }) + + describe('Next', () => { + test('Cursor immedietely after colon', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: itemLabels.filter((label) => label !== 'NextState'), + json: document1, + position: [10, 15], + start: [10, 15], + end: [10, 16], + labelToInsertText: (label) => ` "${label}",`, }) + }) - test('Cursor not immedietely after colon but no quotes', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: itemLabels.filter(label => label !== 'NextState'), - json: document2, - position: [10, 17], - start: [10, 15], - end: [10, 17], - labelToInsertText: label => ` "${label}",` - }) + test('Cursor not immedietely after colon but no quotes', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: itemLabels.filter((label) => label !== 'NextState'), + json: document2, + position: [10, 17], + start: [10, 15], + end: [10, 17], + labelToInsertText: (label) => ` "${label}",`, }) + }) - test('Left quotation mark present', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: itemLabels.filter(label => label !== 'NextState'), - json: document3, - position: [10, 17], - start: [10, 17], - end: [10, 18], - labelToInsertText: label => `${label}"` - }) + test('Left quotation mark present', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: itemLabels.filter((label) => label !== 'NextState'), + json: document3, + position: [10, 17], + start: [10, 17], + end: [10, 18], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Both quotation marks present and cursor between them', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: itemLabels.filter(label => label !== 'NextState'), - json: document4, - position: [10, 17], - start: [10, 17], - end: [10, 18], - labelToInsertText: label => `${label}"` - }) + test('Both quotation marks present and cursor between them', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: itemLabels.filter((label) => label !== 'NextState'), + json: document4, + position: [10, 17], + start: [10, 17], + end: [10, 18], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Suggests completions when text present and cursor is on it', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: itemLabels.filter(label => label !== 'NextState'), - json: document5, - position: [10, 18], - start: [10, 17], - end: [10, 23], - labelToInsertText: label => `${label}"` - }) + test('Suggests completions when text present and cursor is on it', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: itemLabels.filter((label) => label !== 'NextState'), + json: document5, + position: [10, 18], + start: [10, 17], + end: [10, 23], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Suggests nested completions when Next is nested within Map state', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: nestedItemLabels.filter(label => label !== 'Nested4'), - json: documentNested, - position: [13, 21], - start: [13, 21], - end: [13, 22], - labelToInsertText: label => ` "${label}",` - }) + test('Suggests nested completions when Next is nested within Map state', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: nestedItemLabels.filter((label) => label !== 'Nested4'), + json: documentNested, + position: [13, 21], + start: [13, 21], + end: [13, 22], + labelToInsertText: (label) => ` "${label}",`, }) + }) - test('Suggests completions for the Next property within Choice state', async () => { - await testCompletions({ - labels: itemLabels.filter(label => label !== 'ChoiceStateX'), - json: document1, - position: [16, 21], - start: [16, 21], - end: [16, 22], - labelToInsertText: label => `${label}"` - }) + test('Suggests completions for the Next property within Choice state', async () => { + await testCompletions({ + labels: itemLabels.filter((label) => label !== 'ChoiceStateX'), + json: document1, + position: [16, 21], + start: [16, 21], + end: [16, 22], + labelToInsertText: (label) => `${label}"`, }) }) - - suite('Default', () => { - test('Suggests completion items for Default property of the Choice state when cursor positioned after first quote', async () => { - await testCompletions({ - labels: itemLabels.filter(label => label !== 'ChoiceStateX'), - json: document1, - position: [25, 20], - start: [25, 20], - end: [25, 21], - labelToInsertText: label => `${label}"` - }) + }) + + describe('Default', () => { + test('Suggests completion items for Default property of the Choice state when cursor positioned after first quote', async () => { + await testCompletions({ + labels: itemLabels.filter((label) => label !== 'ChoiceStateX'), + json: document1, + position: [25, 20], + start: [25, 20], + end: [25, 21], + labelToInsertText: (label) => `${label}"`, }) + }) - test('Suggests completion items for Default property of the Choice state when cursor immeditely after colon', async () => { - await testCompletions({ - labels: itemLabels.filter(label => label !== 'ChoiceStateX'), - json: document2, - position: [25, 18], - start: [25, 18], - end: [25, 18], - labelToInsertText: label => ` "${label}",` - }) + test('Suggests completion items for Default property of the Choice state when cursor immeditely after colon', async () => { + await testCompletions({ + labels: itemLabels.filter((label) => label !== 'ChoiceStateX'), + json: document2, + position: [25, 18], + start: [25, 18], + end: [25, 18], + labelToInsertText: (label) => ` "${label}",`, }) }) + }) + + describe('Snippets', () => { + test('Suggests state snippets when cursor positioned within `States` block but outside a state definition', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + json: document1, + position: [5, 3], + start: [5, 3], + end: [5, 3], + }) - suite('Snippets', () => { - - test('Suggests state snippets when cursor positioned within `States` block but outside a state definition', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - json: document1, - position: [5, 3], - start: [5, 3], - end: [5, 3] - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) - assert.deepEqual(suggestedSnippets, expectedSnippets) + test('Does not suggest state snippets when cursor is inside a state definition', async () => { + const notExpectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + json: document1, + position: [7, 28], + start: [7, 28], + end: [7, 28], }) + assert.deepEqual(getArrayIntersection(suggestedSnippets, notExpectedSnippets), []) + }) - test('Does not suggest state snippets when cursor is inside a state definition', async () => { - const notExpectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - json: document1, - position: [7, 28], - start: [7, 28], - end: [7, 28] - }) - assert.deepEqual(getArrayIntersection(suggestedSnippets, notExpectedSnippets), []) + test('Suggests error handling snippets when cursor is positioned within a State that supports error handling', async () => { + const expectedSnippets = errorHandlingSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + json: document6, + position: [5, 25], + start: [5, 25], + end: [5, 25], }) - test('Suggests error handling snippets when cursor is positioned within a State that supports error handling', async () => { - const expectedSnippets = errorHandlingSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - json: document6, - position: [5, 25], - start: [5, 25], - end: [5, 25] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) - test('Does not suggest error handling snippets when cursor is positioned within a State that does not support error handling', async () => { - const notExpectedSnippets = errorHandlingSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - json: document6, - position: [14, 27], - start: [14, 27], - end: [14, 27] - }) - assert.deepEqual(getArrayIntersection(suggestedSnippets, notExpectedSnippets), []) + test('Does not suggest error handling snippets when cursor is positioned within a State that does not support error handling', async () => { + const notExpectedSnippets = errorHandlingSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + json: document6, + position: [14, 27], + start: [14, 27], + end: [14, 27], }) + assert.deepEqual(getArrayIntersection(suggestedSnippets, notExpectedSnippets), []) }) + }) - suite('Edge Cases', () => { - test('Requested completion in state name position does not throw error', async () => { - await assert.doesNotReject( - getCompletions(completionsEdgeCase1, [22, 7]), - TypeError - ) - - await assert.doesNotReject( - getCompletions(completionsEdgeCase2, [4, 7]), - TypeError - ) - }) + describe('Edge Cases', () => { + test('Requested completion in state name position does not throw error', async () => { + await assert.doesNotReject(getCompletions(completionsEdgeCase1, [22, 7]), TypeError) + + await assert.doesNotReject(getCompletions(completionsEdgeCase2, [4, 7]), TypeError) }) + }) }) diff --git a/src/tests/json-strings/completionStrings.ts b/src/tests/json-strings/completionStrings.ts new file mode 100644 index 000000000..360027f1f --- /dev/null +++ b/src/tests/json-strings/completionStrings.ts @@ -0,0 +1,207 @@ +/*! + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT + */ + +export const document1 = ` +{ + "StartAt":, + "States": { + "FirstState": {}, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next":, + }, + "ChoiceStateX": { + "Type": "Choice", + "Choices": [ + { + "Next": "" + }, + { + "Next": "FirstState" + }, + { + "Next": "NextState" + } + ], + "Default": "" + }, + } + } +` + +export const document2 = ` +{ + "StartAt": , + "States": { + "FirstState": {}, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next": , + }, + "ChoiceStateX": { + "Type": "Choice", + "Choices": [ + { + "Next": "" + }, + { + "Next": "FirstState" + }, + { + "Next": "NextState" + } + ], + "Default": + }, + } + } +` + +export const document3 = ` +{ + "StartAt": ", + "States": { + "FirstState": {}, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next": ", + }, + "ChoiceStateX": {} + } + } +` + +export const document4 = ` +{ + "StartAt": "", + "States": { + "FirstState": {}, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next": "", + }, + "ChoiceStateX": {} + } + } +` +export const document5 = ` +{ + "StartAt": "First", + "States": { + "FirstState": {}, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next": "First", + }, + "ChoiceStateX": {} + } +} +` + +export const document6 = ` +{ + "StartAt": "First", + "States": { + "FirstState": { + "Type": "Task" + }, + "ChoiceState": {}, + "FirstMatchState": {}, + "SecondMatchState": {}, + "DefaultState": {}, + "NextState": { + "Next": "First", + }, + "Success State": {} + } +} +` + +export const documentNested = ` +{ + "StartAt": "First", + "States": { + "FirstState": {}, + "MapState": { + "Iterator": { + "StartAt":, + "States": { + "Nested1": {}, + "Nested2": {}, + "Nested3": {}, + "Nested4": { + "Next":, + }, + } + }, + }, + } +} +` +export const completionsEdgeCase1 = `{ + "Comment": "An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2.", + "StartAt": "Map", + "States": { + "Map": { + "Type": "Map", + "ItemsPath": "$.array", + "ResultPath": """"$$$$$.array$$$", + "MaxConcurrency": 2, + "Next": "Final State", + "Iterator": { + "StartAt": "Pass", + "States": { + "Pass": { + "Type": "Pass", + "Result": "Done!", + "End": true + } + } + } + }, + " + "Net 2": { + "Type": "Fail", + "Next": "Final State" + }, + "Final State": { + "Type": "Pass", + "Next": "Net 2" + } + } +}` + +export const completionsEdgeCase2 = `{ + "StartAt": "MyState", + "States": { + " + } +}` + +export const itemLabels = [ + 'FirstState', + 'ChoiceState', + 'FirstMatchState', + 'SecondMatchState', + 'DefaultState', + 'NextState', + 'ChoiceStateX', +] +export const nestedItemLabels = ['Nested1', 'Nested2', 'Nested3', 'Nested4'] diff --git a/src/tests/jsonSchemaAsl.test.ts b/src/tests/jsonSchemaAsl.test.ts index 3f0324154..cdeb0635e 100644 --- a/src/tests/jsonSchemaAsl.test.ts +++ b/src/tests/jsonSchemaAsl.test.ts @@ -3,27 +3,27 @@ * SPDX-License-Identifier: MIT */ -import * as assert from 'assert'; -import { getLanguageService, JSONDocument, TextDocument,} from '../service' +import * as assert from 'assert' +import { getLanguageService, JSONDocument, TextDocument } from '../service' -function toDocument(text: string): { textDoc: TextDocument, jsonDoc: JSONDocument } { - const textDoc = TextDocument.create('foo://bar/file.asl', 'json', 0, text); +function toDocument(text: string): { textDoc: TextDocument; jsonDoc: JSONDocument } { + const textDoc = TextDocument.create('foo://bar/file.asl', 'json', 0, text) - const ls = getLanguageService({}); - // tslint:disable-next-line: no-inferred-empty-object-type - const jsonDoc = ls.parseJSONDocument(textDoc) as JSONDocument; + const ls = getLanguageService({}) + // tslint:disable-next-line: no-inferred-empty-object-type + const jsonDoc = ls.parseJSONDocument(textDoc) as JSONDocument - return { textDoc, jsonDoc }; + return { textDoc, jsonDoc } } -suite('JSON Schema Validation for ASL', () => { - test('JSON Schema Validation works', async () => { - const { textDoc, jsonDoc } = toDocument('{}'); +describe('JSON Schema Validation for ASL', () => { + test('JSON Schema Validation works', async () => { + const { textDoc, jsonDoc } = toDocument('{}') - const ls = getLanguageService({}); - const res = await ls.doValidation(textDoc, jsonDoc); - assert.strictEqual(res.length, 2); - assert.ok(res.some(item => item.message === 'Missing property "States".')) - assert.ok(res.some(item => item.message === 'Missing property "StartAt".')) - }) -}); + const ls = getLanguageService({}) + const res = await ls.doValidation(textDoc, jsonDoc) + assert.strictEqual(res.length, 2) + assert.ok(res.some((item) => item.message === 'Missing property "States".')) + assert.ok(res.some((item) => item.message === 'Missing property "StartAt".')) + }) +}) diff --git a/src/tests/utils/testUtilities.ts b/src/tests/utils/testUtilities.ts index f1aee3b8c..0d4adbd08 100644 --- a/src/tests/utils/testUtilities.ts +++ b/src/tests/utils/testUtilities.ts @@ -3,24 +3,28 @@ * SPDX-License-Identifier: MIT */ -import { InsertReplaceEdit, TextEdit } from 'vscode-languageserver-types'; -import { FILE_EXTENSIONS, LANGUAGE_IDS } from '../../constants/constants'; +import { InsertReplaceEdit, TextEdit } from 'vscode-languageserver-types' +import { FILE_EXTENSIONS, LANGUAGE_IDS } from '../../constants/constants' import { getLanguageService, JSONDocument, TextDocument } from '../../service' -export function toDocument(text: string, isYaml?: boolean): { textDoc: TextDocument, jsonDoc: JSONDocument } { - const textDoc = TextDocument.create(`foo://bar/file.${isYaml ? FILE_EXTENSIONS.YAML : FILE_EXTENSIONS.JSON}`, isYaml ? LANGUAGE_IDS.YAML : LANGUAGE_IDS.JSON, 0, text); +export function toDocument(text: string, isYaml?: boolean): { textDoc: TextDocument; jsonDoc: JSONDocument } { + const textDoc = TextDocument.create( + `foo://bar/file.${isYaml ? FILE_EXTENSIONS.YAML : FILE_EXTENSIONS.JSON}`, + isYaml ? LANGUAGE_IDS.YAML : LANGUAGE_IDS.JSON, + 0, + text, + ) - const ls = getLanguageService({}); - // tslint:disable-next-line: no-inferred-empty-object-type - const jsonDoc = ls.parseJSONDocument(textDoc) as JSONDocument; + const ls = getLanguageService({}) + const jsonDoc = ls.parseJSONDocument(textDoc) as JSONDocument - return { textDoc, jsonDoc }; + return { textDoc, jsonDoc } } export function asTextEdit(item: TextEdit | InsertReplaceEdit | undefined): TextEdit | undefined { - if (TextEdit.is(item)) { - return item; - } + if (TextEdit.is(item)) { + return item + } - return undefined; + return undefined } diff --git a/src/tests/validation.test.ts b/src/tests/validation.test.ts index 83d47b385..2d7a35786 100644 --- a/src/tests/validation.test.ts +++ b/src/tests/validation.test.ts @@ -3,87 +3,87 @@ * SPDX-License-Identifier: MIT */ -import * as assert from 'assert'; +import * as assert from 'assert' import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver' import { MESSAGES } from '../constants/diagnosticStrings' import { getLanguageService, Position, Range } from '../service' import { - documentChoiceDefaultBeforeChoice, - documentChoiceInvalidDefault, - documentChoiceInvalidNext, - documentChoiceNextBeforeChoice, - documentChoiceNoDefault, - documentChoiceValidDefault, - documentChoiceValidNext, - documentChoiceWaitJSONata, - documentChoiceWithAssign, - documentDistributedMapInvalidNextInNestedState, - documentFailCauseAndCausePathInvalid, - documentFailCausePathJsonPathInvalid, - documentFailErrorAndCausePathValid, - documentFailErrorAndCauseValid, - documentFailErrorAndErrorPathInvalid, - documentFailErrorAndNoCauseValid, - documentFailErrorPathAndCausePathContextValid, - documentFailErrorPathAndCausePathIntrinsicInvalid, - documentFailErrorPathAndCausePathIntrinsicNestedValid, - documentFailErrorPathAndCausePathIntrinsicValid, - documentFailErrorPathAndCausePathJsonPathInvalid, - documentFailErrorPathAndCausePathValid, - documentFailErrorPathAndCauseValid, - documentFailErrorPathAndNoCauseValid, - documentFailErrorPathJsonPathInvalid, - documentFailNoErrorAndCausePathValid, - documentFailNoErrorAndCauseValid, - documentFailNoErrorAndNoCauseValid, - documentInvalidFailWithAssign, - documentInvalidNext, - documentInvalidNextNested, - documentInvalidParametersIntrinsicFunction, - documentInvalidParametersJsonPath, - documentInvalidPropertiesCatch, - documentInvalidPropertiesChoices, - documentInvalidPropertiesRoot, - documentInvalidPropertiesRootNested, - documentInvalidPropertiesState, - documentInvalidResultSelectorIntrinsicFunction, - documentInvalidResultSelectorJsonPath, - documentInvalidSuccessWithAssign, - documentMapCatchTemplate, - documentMapCatchTemplateInvalidNext, - documentMapInvalidItemProcessorConfig, - documentMapJSONata, - documentMapProcessorConfig, - documentMapWithAssign, - documentNestedNoTerminalState, - documentNestedUnreachableState, - documentNoTerminalState, - documentParallelCatchTemplate, - documentParallelCatchTemplateInvalidNext, - documentParallelPassSuccessJSONata, - documentParallelWithAssign, - documentPassWithAssign, - documentStartAtInvalid, - documentStartAtNestedInvalid, - documentStartAtValid, - documentSucceedFailTerminalState, - documentTaskCatchTemplate, - documentTaskCatchTemplateInvalidNext, - documentTaskInvalidArn, - documentTaskJSONata, - documentTaskJSONataInvalid, - documentTaskRetryInvalid, - documentTaskRetryValid, - documentTaskValidVariableSubstitution, - documentTaskWithAssign, - documentUnreachableState, - documentValidAslImprovements, - documentValidNext, - documentValidParametersIntrinsicFunction, - documentValidParametersJsonPath, - documentValidResultSelectorIntrinsicFunction, - documentValidResultSelectorJsonPath + documentChoiceDefaultBeforeChoice, + documentChoiceInvalidDefault, + documentChoiceInvalidNext, + documentChoiceNextBeforeChoice, + documentChoiceNoDefault, + documentChoiceValidDefault, + documentChoiceValidNext, + documentChoiceWaitJSONata, + documentChoiceWithAssign, + documentDistributedMapInvalidNextInNestedState, + documentFailCauseAndCausePathInvalid, + documentFailCausePathJsonPathInvalid, + documentFailErrorAndCausePathValid, + documentFailErrorAndCauseValid, + documentFailErrorAndErrorPathInvalid, + documentFailErrorAndNoCauseValid, + documentFailErrorPathAndCausePathContextValid, + documentFailErrorPathAndCausePathIntrinsicInvalid, + documentFailErrorPathAndCausePathIntrinsicNestedValid, + documentFailErrorPathAndCausePathIntrinsicValid, + documentFailErrorPathAndCausePathJsonPathInvalid, + documentFailErrorPathAndCausePathValid, + documentFailErrorPathAndCauseValid, + documentFailErrorPathAndNoCauseValid, + documentFailErrorPathJsonPathInvalid, + documentFailNoErrorAndCausePathValid, + documentFailNoErrorAndCauseValid, + documentFailNoErrorAndNoCauseValid, + documentInvalidFailWithAssign, + documentInvalidNext, + documentInvalidNextNested, + documentInvalidParametersIntrinsicFunction, + documentInvalidParametersJsonPath, + documentInvalidPropertiesCatch, + documentInvalidPropertiesChoices, + documentInvalidPropertiesRoot, + documentInvalidPropertiesRootNested, + documentInvalidPropertiesState, + documentInvalidResultSelectorIntrinsicFunction, + documentInvalidResultSelectorJsonPath, + documentInvalidSuccessWithAssign, + documentMapCatchTemplate, + documentMapCatchTemplateInvalidNext, + documentMapInvalidItemProcessorConfig, + documentMapJSONata, + documentMapProcessorConfig, + documentMapWithAssign, + documentNestedNoTerminalState, + documentNestedUnreachableState, + documentNoTerminalState, + documentParallelCatchTemplate, + documentParallelCatchTemplateInvalidNext, + documentParallelPassSuccessJSONata, + documentParallelWithAssign, + documentPassWithAssign, + documentStartAtInvalid, + documentStartAtNestedInvalid, + documentStartAtValid, + documentSucceedFailTerminalState, + documentTaskCatchTemplate, + documentTaskCatchTemplateInvalidNext, + documentTaskInvalidArn, + documentTaskJSONata, + documentTaskJSONataInvalid, + documentTaskRetryInvalid, + documentTaskRetryValid, + documentTaskValidVariableSubstitution, + documentTaskWithAssign, + documentUnreachableState, + documentValidAslImprovements, + documentValidNext, + documentValidParametersIntrinsicFunction, + documentValidParametersJsonPath, + documentValidResultSelectorIntrinsicFunction, + documentValidResultSelectorJsonPath, } from './json-strings/validationStrings' import { toDocument } from './utils/testUtilities' @@ -91,1126 +91,1134 @@ import { toDocument } from './utils/testUtilities' const JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG = 'Matches multiple schemas when only one must validate.' export interface TestValidationOptions { - json: string, - diagnostics: { - message: string, - start: [number, number], - end: [number, number], - code?: string | number | undefined - }[], - filterMessages?: string[] + json: string + diagnostics: { + message: string + start: [number, number] + end: [number, number] + code?: string | number | undefined + }[] + filterMessages?: string[] } async function getValidations(json: string) { - const { textDoc, jsonDoc } = toDocument(json); - const ls = getLanguageService({}); + const { textDoc, jsonDoc } = toDocument(json) + const ls = getLanguageService({}) - return await ls.doValidation(textDoc, jsonDoc) + return await ls.doValidation(textDoc, jsonDoc) } async function testValidations(options: TestValidationOptions) { - const { json, diagnostics, filterMessages } = options + const { json, diagnostics, filterMessages } = options - let res = await getValidations(json) + let res = await getValidations(json) - res = res.filter(diagnostic => { - if (filterMessages && filterMessages.find(message => message === diagnostic.message)) { - return false - } + res = res.filter((diagnostic) => { + if (filterMessages && filterMessages.find((message) => message === diagnostic.message)) { + return false + } - return true - }) + return true + }) + + assert.strictEqual(res.length, diagnostics.length) - assert.strictEqual(res.length, diagnostics.length) + res.forEach((item, index) => { + const leftPos = Position.create(...diagnostics[index].start) + const rightPos = Position.create(...diagnostics[index].end) - res.forEach((item, index) => { - const leftPos = Position.create(...diagnostics[index].start) - const rightPos = Position.create(...diagnostics[index].end) + const diagnostic = Diagnostic.create( + Range.create(leftPos, rightPos), + diagnostics[index].message, + DiagnosticSeverity.Error, + diagnostics[index].code, + ) - const diagnostic = Diagnostic.create( - Range.create(leftPos, rightPos), - diagnostics[index].message, - DiagnosticSeverity.Error, - diagnostics[index].code - ) + assert.deepStrictEqual(diagnostic, item) + }) +} - assert.deepStrictEqual(diagnostic, item) +describe('ASL context-aware validation', () => { + describe('Invalid JSON Input', () => { + test("Empty string doesn't throw errors", async () => { + await getValidations('') }) -} + test("[] string doesn't throw type errors", async () => { + await assert.doesNotReject(getValidations('[]'), TypeError) + }) + }) + + describe('Default of Choice state', () => { + test('Shows diagnostic for invalid state name', async () => { + await testValidations({ + json: documentChoiceInvalidDefault, + diagnostics: [ + { + message: MESSAGES.INVALID_DEFAULT, + start: [17, 21], + end: [17, 41], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [24, 6], + end: [24, 20], + }, + ], + }) + }) -suite('ASL context-aware validation', () => { - suite('Invalid JSON Input', () => { - test("Empty string doesn't throw errors", async () => { - await getValidations('') - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentChoiceValidDefault, + diagnostics: [], + }) + }) - test("[] string doesn't throw type errors", async () => { - await assert.doesNotReject( - getValidations('[]'), - TypeError - ) - }) + test("Doesn't show Diagnostic when default property is absent", async () => { + await testValidations({ + json: documentChoiceNoDefault, + diagnostics: [], + }) }) - suite('Default of Choice state', () => { - test('Shows diagnostic for invalid state name', async () => { - await testValidations({ - json: documentChoiceInvalidDefault, - diagnostics: [ - { - message: MESSAGES.INVALID_DEFAULT, - start: [17, 21], - end: [17, 41] - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [24, 6], - end: [24, 20] - }, - ], - }) + test("Doesn't show Diagnostic for valid state name when default state is declared before Choice state", async () => { + await testValidations({ + json: documentChoiceDefaultBeforeChoice, + diagnostics: [], + }) + }) + }) + + describe('StartAt', () => { + test("Shows Diagnostic for state name that doesn't exist", async () => { + await testValidations({ + json: documentStartAtInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_START_AT, + start: [1, 13], + end: [1, 20], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentStartAtValid, + diagnostics: [], + }) + }) - test('Doesn\'t show Diagnostic for valid state name', async () => { - await testValidations({ - json: documentChoiceValidDefault, - diagnostics: [] - }) - }) + test("Shows Diagnostic for state name that doesn't exist in nested StartAt property", async () => { + await testValidations({ + json: documentStartAtNestedInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_START_AT, + start: [8, 21], + end: [8, 26], + }, + { + message: MESSAGES.INVALID_START_AT, + start: [31, 23], + end: [31, 29], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) + }) + + describe('Map State', () => { + test("Doesn't show diagnostics for valid processor config", async () => { + await testValidations({ + json: documentMapProcessorConfig, + diagnostics: [], + }) + }) - test('Doesn\'t show Diagnostic when default property is absent', async () => { - await testValidations({ - json: documentChoiceNoDefault, - diagnostics: [] - }) - }) + test('Shows diagnostics on ItemProcessor that does not have required states', async () => { + await testValidations({ + json: documentMapInvalidItemProcessorConfig, + diagnostics: [ + { + message: 'Missing property "StartAt".', + start: [10, 10], + end: [10, 25], + }, + { + message: 'Missing property "States".', + start: [10, 10], + end: [10, 25], + }, + ], + }) + }) + }) + + describe('Next', () => { + test("Shows Diagnostic for state name that doesn't exist", async () => { + await testValidations({ + json: documentInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [5, 14], + end: [5, 20], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - test('Doesn\'t show Diagnostic for valid state name when default state is declared before Choice state', async () => { - await testValidations({ - json: documentChoiceDefaultBeforeChoice, - diagnostics: [] - }) - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentValidNext, + diagnostics: [], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) }) - suite('StartAt', () => { - test('Shows Diagnostic for state name that doesn\'t exist', async () => { - await testValidations({ - json: documentStartAtInvalid, - diagnostics: [{ - message: MESSAGES.INVALID_START_AT, - start: [1, 13], - end: [1, 20] - }], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test("Shows Diagnostic for state name that doesn't exist in nested Next property", async () => { + await testValidations({ + json: documentInvalidNextNested, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [12, 22], + end: [12, 35], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [43, 20], + end: [43, 33], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - test('Doesn\'t show Diagnostic for valid state name', async () => { - await testValidations({ - json: documentStartAtValid, - diagnostics: [] - }) - }) + test('Validates next property of the Choice state', async () => { + await testValidations({ + json: documentChoiceInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [20, 26], + end: [20, 30], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - test('Shows Diagnostic for state name that doesn\'t exist in nested StartAt property', async () => { - await testValidations({ - json: documentStartAtNestedInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_START_AT, - start: [8, 21], - end: [8, 26] - }, - { - message: MESSAGES.INVALID_START_AT, - start: [31, 23], - end: [31, 29] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test("Doesn't show Diagnostic for valid state name when Next state is declared before Choice state", async () => { + await testValidations({ + json: documentChoiceNextBeforeChoice, + diagnostics: [], + }) + }) + }) + + describe('Unreachable State', () => { + test('Shows diagnostic for an unreachable state', async () => { + await testValidations({ + json: documentUnreachableState, + diagnostics: [ + { + message: MESSAGES.UNREACHABLE_STATE, + start: [3, 4], + end: [3, 13], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [15, 4], + end: [15, 16], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [19, 4], + end: [19, 17], + }, + ], + filterMessages: [MESSAGES.NO_TERMINAL_STATE, MESSAGES.INVALID_START_AT], + }) }) - suite('Map State', () => { + test('Shows diagnostic for an unreachable state in nested list of states', async () => { + await testValidations({ + json: documentNestedUnreachableState, + diagnostics: [ + { + message: MESSAGES.UNREACHABLE_STATE, + start: [14, 12], + end: [14, 20], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [45, 10], + end: [45, 18], + }, + ], + filterMessages: [MESSAGES.NO_TERMINAL_STATE], + }) + }) + }) + + describe('Terminal State', () => { + test('Shows diagnostic for lack of terminal state', async () => { + await testValidations({ + json: documentNoTerminalState, + diagnostics: [ + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [2, 2], + end: [2, 10], + }, + ], + }) + }) - test('Doesn\'t show diagnostics for valid processor config', async () => { - await testValidations({ - json: documentMapProcessorConfig, - diagnostics: [] - }) - }) + test('Shows diagnostic for lack of terminal state in nested list of states', async () => { + await testValidations({ + json: documentNestedNoTerminalState, + diagnostics: [ + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [22, 10], + end: [22, 18], + }, + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [40, 8], + end: [40, 16], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostics on ItemProcessor that does not have required states', async () => { - await testValidations({ - json: documentMapInvalidItemProcessorConfig, - diagnostics: [{ - message: 'Missing property "StartAt".', - start: [10, 10], - end: [10, 25] - }, - { - message: 'Missing property "States".', - start: [10, 10], - end: [10, 25] - },] - }) - }) + test('Accepts "Succeed" and "Fail" state as terminal states', async () => { + await testValidations({ + json: documentSucceedFailTerminalState, + diagnostics: [], + }) + }) + test('No terminal state error when state referenced from next property of Choice state within Parallel state', async () => { + await testValidations({ + json: documentChoiceValidNext, + diagnostics: [], + }) + }) + }) + + describe('Catch property of "Parallel" and "Task" state', () => { + test('Does not show diagnostic on valid next property within Catch block of Task state', async () => { + await testValidations({ + json: documentTaskCatchTemplate, + diagnostics: [], + }) }) - suite('Next', () => { - test('Shows Diagnostic for state name that doesn\'t exist', async () => { - await testValidations({ - json: documentInvalidNext, - diagnostics: [{ - message: MESSAGES.INVALID_NEXT, - start: [5, 14], - end: [5, 20] - }], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test('Does not show diagnostic on valid next property within Catch block of Parallel state', async () => { + await testValidations({ + json: documentParallelCatchTemplate, + diagnostics: [], + }) + }) - test('Doesn\'t show Diagnostic for valid state name', async () => { - await testValidations({ - json: documentValidNext, - diagnostics: [], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test('Does not show diagnostic on valid next property within Catch block of Map state', async () => { + await testValidations({ + json: documentMapCatchTemplate, + diagnostics: [], + }) + }) - test('Shows Diagnostic for state name that doesn\'t exist in nested Next property', async () => { - await testValidations({ - json: documentInvalidNextNested, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [12, 22], - end: [12, 35] - }, - { - message: MESSAGES.INVALID_NEXT, - start: [43, 20], - end: [43, 33] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Task state', async () => { + await testValidations({ + json: documentTaskCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [18, 26], + end: [18, 40], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [24, 26], + end: [24, 44], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Validates next property of the Choice state', async () => { - await testValidations({ - json: documentChoiceInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [20, 26], - end: [20, 30] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE] - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Parallel', async () => { + await testValidations({ + json: documentParallelCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [11, 18], + end: [11, 28], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Doesn\'t show Diagnostic for valid state name when Next state is declared before Choice state', async () => { - await testValidations({ - json: documentChoiceNextBeforeChoice, - diagnostics: [] - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Map', async () => { + await testValidations({ + json: documentMapCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [25, 26], + end: [25, 35], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [37, 26], + end: [37, 36], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) }) - suite('Unreachable State', () => { - test('Shows diagnostic for an unreachable state', async () => { - await testValidations({ - json: documentUnreachableState, - diagnostics: [ - { - message: MESSAGES.UNREACHABLE_STATE, - start: [3, 4], - end: [3, 13] - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [15, 4], - end: [15, 16] - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [19, 4], - end: [19, 17] - }, - ], - filterMessages: [MESSAGES.NO_TERMINAL_STATE, MESSAGES.INVALID_START_AT] - }) - }) + test('Shows diagnostics on invalid next property of a nested state withing DistributedMap', async () => { + await testValidations({ + json: documentDistributedMapInvalidNextInNestedState, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [16, 30], + end: [16, 53], + }, + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [12, 14], + end: [12, 22], + }, + ], + }) + }) + }) + + describe('Additional properties that are not valid', () => { + test('Shows diagnostics for additional invalid properties of a given state', async () => { + await testValidations({ + json: documentInvalidPropertiesState, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [7, 10], + end: [7, 29], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [8, 10], + end: [8, 29], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostic for an unreachable state in nested list of states', async () => { - await testValidations({ - json: documentNestedUnreachableState, - diagnostics: [ - { - message: MESSAGES.UNREACHABLE_STATE, - start: [14, 12], - end: [14, 20] - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [45, 10], - end: [45, 18] - } - ], - filterMessages: [MESSAGES.NO_TERMINAL_STATE] - }) - }) + test('Shows diagnostics for additional invalid properties within Catch block', async () => { + await testValidations({ + json: documentInvalidPropertiesCatch, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [12, 20], + end: [12, 32], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [19, 20], + end: [19, 32], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [20, 20], + end: [20, 34], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) }) - suite('Terminal State', () => { - test('Shows diagnostic for lack of terminal state', async () => { - await testValidations({ - json: documentNoTerminalState, - diagnostics: [{ - message: MESSAGES.NO_TERMINAL_STATE, - start: [2, 2], - end: [2, 10] - }] - }) - }) + test('Shows diagnostics for additional invalid properties within Choice state', async () => { + await testValidations({ + json: documentInvalidPropertiesChoices, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [17, 22], + end: [17, 40], + }, + { + message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, + start: [15, 22], + end: [15, 36], + }, + { + message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, + start: [16, 22], + end: [16, 48], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [23, 18], + end: [23, 37], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [29, 30], + end: [29, 48], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [30, 30], + end: [30, 36], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [38, 34], + end: [38, 53], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [39, 34], + end: [39, 40], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [50, 24], + end: [50, 30], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG], + }) + }) - test('Shows diagnostic for lack of terminal state in nested list of states', async () => { - await testValidations({ - json: documentNestedNoTerminalState, - diagnostics: [ - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [22, 10], - end: [22, 18] - }, - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [40, 8], - end: [40, 16] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) - }) + test('Shows diagnostics for additional invalid properties within root of state machine', async () => { + await testValidations({ + json: documentInvalidPropertiesRoot, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [5, 2], + end: [5, 20], + }, + ], + }) + }) - test('Accepts "Succeed" and "Fail" state as terminal states', async () => { - await testValidations({ - json: documentSucceedFailTerminalState, - diagnostics: [] - }) - }) + test('Shows diagnostics for additional invalid properties within root of nested state machine', async () => { + await testValidations({ + json: documentInvalidPropertiesRootNested, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [10, 14], + end: [10, 27], + }, + ], + }) + }) + }) + + describe('Test validation of Resource arn for Task State', () => { + test('Does not show diagnostic on invalid arn', async () => { + await testValidations({ + json: documentTaskInvalidArn, + diagnostics: [], + }) + }) - test('No terminal state error when state referenced from next property of Choice state within Parallel state', async () => { - await testValidations({ - json: documentChoiceValidNext, - diagnostics: [] - }) - }) + test('Does not show diagnostic on valid variable substitution', async () => { + await testValidations({ + json: documentTaskValidVariableSubstitution, + diagnostics: [], + }) + }) + }) + + describe('Test validation of Properties field', () => { + test('Does not show diagnostics for valid JSON paths', async () => { + await testValidations({ + json: documentValidParametersJsonPath, + diagnostics: [], + }) }) - suite('Catch property of "Parallel" and "Task" state', async () => { - test('Does not show diagnostic on valid next property within Catch block of Task state', async () => { - await testValidations({ - json: documentTaskCatchTemplate, - diagnostics: [] - }) - }) + test('Does not show diagnostics for valid Intrinsic Functions', async () => { + await testValidations({ + json: documentValidParametersIntrinsicFunction, + diagnostics: [], + }) + }) - test('Does not show diagnostic on valid next property within Catch block of Parallel state', async () => { - await testValidations({ - json: documentParallelCatchTemplate, - diagnostics: [] - }) - }) + test('Shows diagnostics for invalid JSON paths', async () => { + await testValidations({ + json: documentInvalidParametersJsonPath, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 29], + end: [10, 31], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 40], + end: [13, 42], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 40], + end: [14, 44], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [17, 29], + end: [17, 38], + }, + ], + }) + }) - test('Does not show diagnostic on valid next property within Catch block of Map state', async () => { - await testValidations({ - json: documentMapCatchTemplate, - diagnostics: [] - }) - }) + test('Shows diagnostics for invalid Intrinsic Functions', async () => { + await testValidations({ + json: documentInvalidParametersIntrinsicFunction, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 22], + end: [10, 76], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [11, 22], + end: [11, 45], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 22], + end: [12, 54], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 22], + end: [13, 32], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 22], + end: [14, 39], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [15, 22], + end: [15, 42], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [16, 22], + end: [16, 47], + }, + ], + }) + }) + }) + + describe('ASL Improvements', () => { + test('Does not show diagnostics for valid document containing ASL Improvements', async () => { + await testValidations({ + json: documentValidAslImprovements, + diagnostics: [], + }) + }) - test('Shows diagnostics on invalid next property within Catch block of Task state', async () => { - await testValidations({ - json: documentTaskCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [18, 26], - end: [18, 40] - }, - { - message: MESSAGES.INVALID_NEXT, - start: [24, 26], - end: [24, 44] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) + describe('Test validation of ResultSelector field', () => { + test('Does not show diagnostics for valid JSON paths', async () => { + await testValidations({ + json: documentValidResultSelectorJsonPath, + diagnostics: [], }) + }) - test('Shows diagnostics on invalid next property within Catch block of Parallel', async () => { - await testValidations({ - json: documentParallelCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [11, 18], - end: [11, 28] - } - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) + test('Does not show diagnostics for valid Intrinsic Functions', async () => { + await testValidations({ + json: documentValidResultSelectorIntrinsicFunction, + diagnostics: [], }) - - test('Shows diagnostics on invalid next property within Catch block of Map', async () => { - await testValidations({ - json: documentMapCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [25, 26], - end: [25, 35] - }, - { - message: MESSAGES.INVALID_NEXT, - start: [37, 26], - end: [37, 36], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) + }) + + test('Shows diagnostics for invalid JSON paths', async () => { + await testValidations({ + json: documentInvalidResultSelectorJsonPath, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 29], + end: [10, 31], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 40], + end: [13, 42], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 40], + end: [14, 44], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [17, 29], + end: [17, 38], + }, + ], }) - - test('Shows diagnostics on invalid next property of a nested state withing DistributedMap', async () => { - await testValidations({ - json: documentDistributedMapInvalidNextInNestedState, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [16, 30], - end: [16, 53], - }, - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [12, 14], - end: [12, 22], - }, - ], - }) + }) + + test('Shows diagnostics for invalid Intrinsic Functions', async () => { + await testValidations({ + json: documentInvalidResultSelectorIntrinsicFunction, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 22], + end: [10, 76], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [11, 22], + end: [11, 45], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 22], + end: [12, 54], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 22], + end: [13, 32], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 22], + end: [14, 39], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [15, 22], + end: [15, 42], + }, + ], }) + }) }) + }) + + describe('Fail state', () => { + describe('Valid Error, ErrorPath, Cause & CausePath combinations', () => { + test('Fail state with Error and Cause valid', async () => { + await testValidations({ + json: documentFailErrorAndCauseValid, + diagnostics: [], + }) + }) - suite('Additional properties that are not valid', async () => { - test('Shows diagnostics for additional invalid properties of a given state', async () => { - await testValidations({ - json: documentInvalidPropertiesState, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [7, 10], - end: [7, 29] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [8, 10], - end: [8, 29] - } - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) + test('Fail state with Error and no Cause valid', async () => { + await testValidations({ + json: documentFailErrorAndNoCauseValid, + diagnostics: [], }) + }) - test('Shows diagnostics for additional invalid properties within Catch block', async () => { - await testValidations({ - json: documentInvalidPropertiesCatch, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [12, 20], - end: [12, 32] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [19, 20], - end: [19, 32] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [20, 20], - end: [20, 34] - } - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE] - }) + test('Fail state with no Error and Cause valid', async () => { + await testValidations({ + json: documentFailNoErrorAndCauseValid, + diagnostics: [], }) + }) - test('Shows diagnostics for additional invalid properties within Choice state', async () => { - await testValidations({ - json: documentInvalidPropertiesChoices, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [17, 22], - end: [17, 40] - }, - { - message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, - start: [15, 22], - end: [15, 36] - }, - { - message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, - start: [16, 22], - end: [16, 48] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [23, 18], - end: [23, 37] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [29, 30], - end: [29, 48] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [30, 30], - end: [30, 36] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [38, 34], - end: [38, 53] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [39, 34], - end: [39, 40] - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [50, 24], - end: [50, 30] - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG] - - }) + test('Fail state with neither Error nor Cause valid', async () => { + await testValidations({ + json: documentFailNoErrorAndNoCauseValid, + diagnostics: [], + }) + }) + test('Fail state with ErrorPath and CausePath valid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathValid, + diagnostics: [], }) + }) - test('Shows diagnostics for additional invalid properties within root of state machine', async () => { - await testValidations({ - json: documentInvalidPropertiesRoot, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [5, 2], - end: [5, 20] - } - ] - }) + test('Fail state with ErrorPath and Cause valid', async () => { + await testValidations({ + json: documentFailErrorPathAndCauseValid, + diagnostics: [], }) + }) - test('Shows diagnostics for additional invalid properties within root of nested state machine', async () => { - await testValidations({ - json: documentInvalidPropertiesRootNested, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [10, 14], - end: [10, 27] - } - ] - }) + test('Fail state with Error and CausePath valid', async () => { + await testValidations({ + json: documentFailErrorAndCausePathValid, + diagnostics: [], }) - }) + }) - suite('Test validation of Resource arn for Task State', async () => { - test('Does not show diagnostic on invalid arn', async () => { - await testValidations({ - json: documentTaskInvalidArn, - diagnostics: [] - }) + test('Fail state with ErrorPath and no Cause valid', async () => { + await testValidations({ + json: documentFailErrorPathAndNoCauseValid, + diagnostics: [], }) + }) - test('Does not show diagnostic on valid variable substitution', async () => { - await testValidations({ - json: documentTaskValidVariableSubstitution, - diagnostics: [] - }) + test('Fail state with no Error and CausePath valid', async () => { + await testValidations({ + json: documentFailNoErrorAndCausePathValid, + diagnostics: [], }) + }) }) - suite('Test validation of Properties field', async () => { - test('Does not show diagnostics for valid JSON paths', async () => { - await testValidations({ - json: documentValidParametersJsonPath, - diagnostics: [] - }) + describe('JsonPath, Context Object and Intrinsic Functions', () => { + test('Fail state ErrorPath and CausePath Context object valid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathContextValid, + diagnostics: [], }) + }) - test('Does not show diagnostics for valid Intrinsic Functions', async () => { - await testValidations({ - json: documentValidParametersIntrinsicFunction, - diagnostics: [] - }) + test('Fail state ErrorPath and CausePath Intrinsic functions valid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathIntrinsicValid, + diagnostics: [], }) + }) - test('Shows diagnostics for invalid JSON paths', async () => { - await testValidations({ - json: documentInvalidParametersJsonPath, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 29], - end: [10, 31] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 40], - end: [13, 42] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 40], - end: [14, 44] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [17, 29], - end: [17, 38] - }, - ] - }) + test('Fail state ErrorPath and CausePath Intrinsic functions valid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathIntrinsicNestedValid, + diagnostics: [], }) - - test('Shows diagnostics for invalid Intrinsic Functions', async () => { - await testValidations({ - json: documentInvalidParametersIntrinsicFunction, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 22], - end: [10, 76] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [11, 22], - end: [11, 45] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 22], - end: [12, 54] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 22], - end: [13, 32] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 22], - end: [14, 39] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [15, 22], - end: [15, 42] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [16, 22], - end: [16, 47] - }, - ] - }) + }) + + test('Fail state ErrorPath and CausePath Intrinsic functions invalid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathIntrinsicInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [6, 10], + end: [6, 65], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [7, 10], + end: [7, 57], + }, + ], + }) + }) + + test('Fail state ErrorPath and CausePath JSONPath invalid', async () => { + await testValidations({ + json: documentFailErrorPathAndCausePathJsonPathInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [6, 10], + end: [6, 30], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [7, 10], + end: [7, 30], + }, + ], + }) + }) + + test('Fail state ErrorPath JSONPath invalid', async () => { + await testValidations({ + json: documentFailErrorPathJsonPathInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [6, 10], + end: [6, 30], + }, + ], }) + }) + + test('Fail state CausePath JSONPath invalid', async () => { + await testValidations({ + json: documentFailCausePathJsonPathInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, + start: [7, 10], + end: [7, 30], + }, + ], + }) + }) }) - suite('ASL Improvements', async () => { - test('Does not show diagnostics for valid document containing ASL Improvements', async () => { - await testValidations({ - json: documentValidAslImprovements, - diagnostics: [] - }) + describe('Invalid Error, ErrorPath, Cause & CausePath combinations', () => { + test('Fail state Error and ErrorPath combination invalid', async () => { + await testValidations({ + json: documentFailErrorAndErrorPathInvalid, + diagnostics: [ + { + message: 'You cannot set both Error and ErrorPath at the same time.', + start: [7, 10], + end: [7, 32], + }, + ], }) - - suite('Test validation of ResultSelector field', async () => { - test('Does not show diagnostics for valid JSON paths', async () => { - await testValidations({ - json: documentValidResultSelectorJsonPath, - diagnostics: [] - }) - }) - - test('Does not show diagnostics for valid Intrinsic Functions', async () => { - await testValidations({ - json: documentValidResultSelectorIntrinsicFunction, - diagnostics: [] - }) - }) - - test('Shows diagnostics for invalid JSON paths', async () => { - await testValidations({ - json: documentInvalidResultSelectorJsonPath, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 29], - end: [10, 31] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 40], - end: [13, 42] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 40], - end: [14, 44] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [17, 29], - end: [17, 38] - }, - ] - }) - }) - - test('Shows diagnostics for invalid Intrinsic Functions', async () => { - await testValidations({ - json: documentInvalidResultSelectorIntrinsicFunction, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 22], - end: [10, 76] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [11, 22], - end: [11, 45] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 22], - end: [12, 54] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 22], - end: [13, 32] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 22], - end: [14, 39] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [15, 22], - end: [15, 42] - }, - ] - }) - }) + }) + + test('Fail state Cause and CausePath combination invalid', async () => { + await testValidations({ + json: documentFailCauseAndCausePathInvalid, + diagnostics: [ + { + message: 'You cannot set both Cause and CausePath at the same time.', + start: [7, 10], + end: [7, 32], + }, + ], }) - }); - - suite('Fail state', async () => { - suite('Valid Error, ErrorPath, Cause & CausePath combinations', async () => { - test('Fail state with Error and Cause valid', async () => { - await testValidations({ - json: documentFailErrorAndCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with Error and no Cause valid', async () => { - await testValidations({ - json: documentFailErrorAndNoCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with no Error and Cause valid', async () => { - await testValidations({ - json: documentFailNoErrorAndCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with neither Error nor Cause valid', async () => { - await testValidations({ - json: documentFailNoErrorAndNoCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with ErrorPath and CausePath valid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathValid, - diagnostics: [] - }) - }) - - test('Fail state with ErrorPath and Cause valid', async () => { - await testValidations({ - json: documentFailErrorPathAndCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with Error and CausePath valid', async () => { - await testValidations({ - json: documentFailErrorAndCausePathValid, - diagnostics: [] - }) - }) - - test('Fail state with ErrorPath and no Cause valid', async () => { - await testValidations({ - json: documentFailErrorPathAndNoCauseValid, - diagnostics: [] - }) - }) - - test('Fail state with no Error and CausePath valid', async () => { - await testValidations({ - json: documentFailNoErrorAndCausePathValid, - diagnostics: [] - }) - }) - }); - - suite('JsonPath, Context Object and Intrinsic Functions', async () => { - test('Fail state ErrorPath and CausePath Context object valid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathContextValid, - diagnostics: [] - }) - }) - - test('Fail state ErrorPath and CausePath Intrinsic functions valid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathIntrinsicValid, - diagnostics: [] - }) - }) - - test('Fail state ErrorPath and CausePath Intrinsic functions valid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathIntrinsicNestedValid, - diagnostics: [] - }) - }) - - test('Fail state ErrorPath and CausePath Intrinsic functions invalid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathIntrinsicInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [6, 10], - end: [6, 65] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [7, 10], - end: [7, 57] - }, - ] - }) - }) - - test('Fail state ErrorPath and CausePath JSONPath invalid', async () => { - await testValidations({ - json: documentFailErrorPathAndCausePathJsonPathInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [6, 10], - end: [6, 30] - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [7, 10], - end: [7, 30] - }, - ] - }) - }) - - test('Fail state ErrorPath JSONPath invalid', async () => { - await testValidations({ - json: documentFailErrorPathJsonPathInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [6, 10], - end: [6, 30] - } - ] - }) - }) - - test('Fail state CausePath JSONPath invalid', async () => { - await testValidations({ - json: documentFailCausePathJsonPathInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, - start: [7, 10], - end: [7, 30] - } - ] - }) - }) - - }); - - suite('Invalid Error, ErrorPath, Cause & CausePath combinations', async () => { - test('Fail state Error and ErrorPath combination invalid', async () => { - await testValidations({ - json: documentFailErrorAndErrorPathInvalid, - diagnostics: [ - { - message: 'You cannot set both Error and ErrorPath at the same time.', - start: [7, 10], - end: [7, 32] - } - ] - }) - }) - - test('Fail state Cause and CausePath combination invalid', async () => { - await testValidations({ - json: documentFailCauseAndCausePathInvalid, - diagnostics: [ - { - message: 'You cannot set both Cause and CausePath at the same time.', - start: [7, 10], - end: [7, 32] - } - ] - }) - }) - }); - }); - - suite('Retry', async () => { - suite('Task retry', async () => { - test('Task retry valid', async () => { - await testValidations({ - json: documentTaskRetryValid, - diagnostics: [] - }) - }) - - test('Task retry invalid', async () => { - await testValidations({ - json: documentTaskRetryInvalid, - diagnostics: [ - { - message: 'Value is below the minimum of 0.', - start: [10, 29], - end: [10, 31] - }, - { - message: 'Incorrect type. Expected "integer".', - start: [14, 33], - end: [14, 36] - }, - { - message: 'Value is below the minimum of 1.', - start: [18, 29], - end: [18, 31] - }, - { - message: 'Incorrect type. Expected "integer".', - start: [22, 29], - end: [22, 33] - }, - { - message: 'Value is below the minimum of 1.', - start: [26, 33], - end: [26, 34] - }, - { - message: 'Incorrect type. Expected "integer".', - start: [30, 33], - end: [30, 36] - }, - { - message: 'Value is above the maximum of 31622400.', - start: [34, 33], - end: [34, 41] - }, - { - message: 'Value is not accepted. Valid values: "FULL", "NONE".', - start: [38, 32], - end: [38, 41], - code: 1 - }, - { - message: 'Value is below the minimum of 1.', - start: [45, 33], - end: [45, 35] - }, - { - message: 'Value is not accepted. Valid values: "FULL", "NONE".', - start: [46, 32], - end: [46, 38], - code: 1 - }, - ] - }) - }) - }); - }); - - suite('Test validation with JSONata fields', async () => { - test('does not show diagnostic error on valid states', async () => { - const validJSONataStates = [ - documentTaskJSONata, - documentMapJSONata, - documentParallelPassSuccessJSONata, - documentChoiceWaitJSONata, - ] - - validJSONataStates.forEach(async (definition) => { - await testValidations({ - json: definition, - diagnostics: [] - }) - }) + }) + }) + }) + + describe('Retry', () => { + describe('Task retry', () => { + test('Task retry valid', async () => { + await testValidations({ + json: documentTaskRetryValid, + diagnostics: [], }) - - test('does show diagnostic error on invalid Task state', async () => { - await testValidations({ - json: documentTaskJSONataInvalid, - diagnostics: [{ - message: 'Value is not accepted. Valid values: \"JSONata\", \"JSONPath\".', - start: [5, 23], - end: [5, 33], - code: 1 - }, { - message: 'Incorrect type. Expected one of integer, JSONata expression.', - start: [11, 24], - end: [11, 29] - }, - { - message: 'Incorrect type. Expected one of integer, JSONata expression.', - start: [12, 26], - end: [12, 30], - }, - { - message: 'Incorrect type. Expected one of object, JSONata expression.', - start: [9, 19], - end: [9, 22] - }, - ] - }) + }) + + test('Task retry invalid', async () => { + await testValidations({ + json: documentTaskRetryInvalid, + diagnostics: [ + { + message: 'Value is below the minimum of 0.', + start: [10, 29], + end: [10, 31], + }, + { + message: 'Incorrect type. Expected "integer".', + start: [14, 33], + end: [14, 36], + }, + { + message: 'Value is below the minimum of 1.', + start: [18, 29], + end: [18, 31], + }, + { + message: 'Incorrect type. Expected "integer".', + start: [22, 29], + end: [22, 33], + }, + { + message: 'Value is below the minimum of 1.', + start: [26, 33], + end: [26, 34], + }, + { + message: 'Incorrect type. Expected "integer".', + start: [30, 33], + end: [30, 36], + }, + { + message: 'Value is above the maximum of 31622400.', + start: [34, 33], + end: [34, 41], + }, + { + message: 'Value is not accepted. Valid values: "FULL", "NONE".', + start: [38, 32], + end: [38, 41], + code: 1, + }, + { + message: 'Value is below the minimum of 1.', + start: [45, 33], + end: [45, 35], + }, + { + message: 'Value is not accepted. Valid values: "FULL", "NONE".', + start: [46, 32], + end: [46, 38], + code: 1, + }, + ], }) - }); - - suite('Assign property', async () => { - test('Should be valid for all state types', async () => { - const testCases = [ - documentTaskWithAssign, - documentMapWithAssign, - documentChoiceWithAssign, - documentParallelWithAssign, - documentPassWithAssign - ] - for (const jsonForTestCase of testCases) { - await testValidations({ - json: jsonForTestCase, - diagnostics: [] - }) - } + }) + }) + }) + + describe('Test validation with JSONata fields', () => { + test('does not show diagnostic error on valid states', async () => { + const validJSONataStates = [ + documentTaskJSONata, + documentMapJSONata, + documentParallelPassSuccessJSONata, + documentChoiceWaitJSONata, + ] + + validJSONataStates.forEach(async (definition) => { + await testValidations({ + json: definition, + diagnostics: [], }) + }) + }) - test('Should be valid in choice state when it is added at top level', async () => { - /* tslint:disable:no-unsafe-any */ - const asl = JSON.parse(documentChoiceWithAssign) - asl.States.Choice.Assign = {} - await testValidations({ - json: JSON.stringify(asl, undefined, 2), - diagnostics: [] - }) + test('does show diagnostic error on invalid Task state', async () => { + await testValidations({ + json: documentTaskJSONataInvalid, + diagnostics: [ + { + message: 'Value is not accepted. Valid values: "JSONata", "JSONPath".', + start: [5, 23], + end: [5, 33], + code: 1, + }, + { + message: 'Incorrect type. Expected one of integer, JSONata expression.', + start: [11, 24], + end: [11, 29], + }, + { + message: 'Incorrect type. Expected one of integer, JSONata expression.', + start: [12, 26], + end: [12, 30], + }, + { + message: 'Incorrect type. Expected one of object, JSONata expression.', + start: [9, 19], + end: [9, 22], + }, + ], + }) + }) + }) + + describe('Assign property', () => { + test('Should be valid for all state types', async () => { + const testCases = [ + documentTaskWithAssign, + documentMapWithAssign, + documentChoiceWithAssign, + documentParallelWithAssign, + documentPassWithAssign, + ] + for (const jsonForTestCase of testCases) { + await testValidations({ + json: jsonForTestCase, + diagnostics: [], }) + } + }) - test('Should be invalid when used in Success or Fail', async () => { - await testValidations({ - json: documentInvalidSuccessWithAssign, - diagnostics: [{ - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [6, 10], - end: [6, 18] - }] - }) - await testValidations({ - json: documentInvalidFailWithAssign, - diagnostics: [{ - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [6, 10], - end: [6, 18] - }] - }) - }) + test('Should be valid in choice state when it is added at top level', async () => { + /* tslint:disable:no-unsafe-any */ + const asl = JSON.parse(documentChoiceWithAssign) + asl.States.Choice.Assign = {} + await testValidations({ + json: JSON.stringify(asl, undefined, 2), + diagnostics: [], + }) + }) - test('Should be valid if value is undefined', async () => { - /* tslint:disable:no-unsafe-any */ - const asl = JSON.parse(documentTaskWithAssign) - asl.States.HelloWorld.Assign = undefined - await testValidations({ - json: JSON.stringify(asl, undefined, 2), - diagnostics: [] - }) - }) + test('Should be invalid when used in Success or Fail', async () => { + await testValidations({ + json: documentInvalidSuccessWithAssign, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [6, 10], + end: [6, 18], + }, + ], + }) + await testValidations({ + json: documentInvalidFailWithAssign, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [6, 10], + end: [6, 18], + }, + ], + }) + }) - test('Should be invalid for all non-object types', async () => { - const errorMessage = 'Incorrect type. Expected \"object\".' - /* tslint:disable:no-null-keyword */ - const assignCases = [null, 'NO', 1234, true] - for (const assignCase of assignCases) { - /* tslint:disable:no-unsafe-any */ - const asl = JSON.parse(documentTaskWithAssign) - asl.States.HelloWorld.Assign = assignCase - await testValidations({ - json: JSON.stringify(asl, undefined, 2), - diagnostics: [{ - message: errorMessage, - start: [7, 16], - end: [7, 20] - }] - }) - } - - /* tslint:disable:no-unsafe-any */ - const aslWithArrayForAssign = JSON.parse(documentTaskWithAssign) - aslWithArrayForAssign.States.HelloWorld.Assign = [''] - await testValidations({ - json: JSON.stringify(aslWithArrayForAssign, undefined, 2), - diagnostics: [{ - message: errorMessage, - start: [7, 16], - end: [9, 7] - }] - }) + test('Should be valid if value is undefined', async () => { + /* tslint:disable:no-unsafe-any */ + const asl = JSON.parse(documentTaskWithAssign) + asl.States.HelloWorld.Assign = undefined + await testValidations({ + json: JSON.stringify(asl, undefined, 2), + diagnostics: [], + }) + }) + + test('Should be invalid for all non-object types', async () => { + const errorMessage = 'Incorrect type. Expected "object".' + /* tslint:disable:no-null-keyword */ + const assignCases = [null, 'NO', 1234, true] + for (const assignCase of assignCases) { + /* tslint:disable:no-unsafe-any */ + const asl = JSON.parse(documentTaskWithAssign) + asl.States.HelloWorld.Assign = assignCase + await testValidations({ + json: JSON.stringify(asl, undefined, 2), + diagnostics: [ + { + message: errorMessage, + start: [7, 16], + end: [7, 20], + }, + ], }) - }); + } + + /* tslint:disable:no-unsafe-any */ + const aslWithArrayForAssign = JSON.parse(documentTaskWithAssign) + aslWithArrayForAssign.States.HelloWorld.Assign = [''] + await testValidations({ + json: JSON.stringify(aslWithArrayForAssign, undefined, 2), + diagnostics: [ + { + message: errorMessage, + start: [7, 16], + end: [9, 7], + }, + ], + }) + }) + }) }) diff --git a/src/tests/yaml-strings/completionStrings.ts b/src/tests/yaml-strings/completionStrings.ts new file mode 100644 index 000000000..29c7ec1c0 --- /dev/null +++ b/src/tests/yaml-strings/completionStrings.ts @@ -0,0 +1,322 @@ +/*! + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: MIT + */ + +export const emptyDocument = '' + +export const documentWithPartialTopLevel = ` +St +` + +export const documentWithStates = ` + +StartAt: + +States: +\u0020\u0020 +` + +export const document1 = ` + StartAt: + States: + FirstState: + ChoiceState: + FirstMatchState: + SecondMatchState: + DefaultState: + NextState: + Next: "" + ChoiceStateX: + Type: Choice + Choices: + - Next: "" + - Next: FirstState + - Next: NextState + Default: "" +` +export const document2 = ` + StartAt: + States: + FirstState: + ChoiceState: + FirstMatchState: + SecondMatchState: + DefaultState: + NextState: + Next: "" + ChoiceStateX: + Type: Choice, + Choices: + - Next: "" + - Next: FirstState + - Next: NextState + Default: "" +` + +export const document3 = ` + StartAt: "" + States: + FirstState: + ChoiceState: + FirstMatchState: + SecondMatchState: + DefaultState: + NextState: + Next: "" + ChoiceStateX: +` +export const document4 = ` + StartAt: First + States: + FirstState: + ChoiceState: + FirstMatchState: + SecondMatchState: + DefaultState: + NextState: + Next: First + ChoiceStateX: +` + +export const documentNested = ` + StartAt: First + States: + FirstState: + MapState: + Iterator: + StartAt: "" + States: + Nested1: + Nested2: + Nested3: + Nested4: + Next: "" +` +export const completionsEdgeCase1 = ` + Comment: An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2. + StartAt: Map + States: + Map: + Type: Map + ItemsPath: $.array + ResultPath: \\\$$$$$.array$$$ + MaxConcurrency: 2 + Next: Final State + Iterator: + StartAt: Pass + States: + Pass: + Type: Pass + Result: Done! + End: true + "Net 2": + Type: Fail + Next: Final State + Final State: + Type: Pass + Next: "Net 2" +` + +export const completionsEdgeCase2 = ` + StartAt: MyState + States: + +` + +export const snippetsCompletionCase1 = ` +StartAt: Hello +States: +\u0020\u0020 + Hello: + Type: Pass + Result: Hello + Next: World + + World: + Type: Pass + Result: World + End: true +` + +export const snippetsCompletionCase2 = ` +StartAt: Hello +States: + Hello: + Type: Pass + Result: Hello + Next: World + World: + Type: Pass + Result: World + End: true +` + +export const snippetsCompletionCase3 = ` +StartAt: Hello +States: + Hello: + Type: Pass + Result: Hello + Next: World +\u0020\u0020 + + World: + Type: Pass + Result: World + End: true +` + +export const snippetsCompletionCase4 = ` +StartAt: Hello +States: + Hello: + Type: Pass + Result: Hello + Next: World + + World: + Type: Pass + Result: World + End: true +\u0020\u0020\u0020\u0020 +` + +export const snippetsCompletionCase5 = ` +StartAt: Hello +States: + Hello: + Type: Pass + Result: Hello + Next: World + + World: + Type: Pass + Result: World + End: true + + +\u0020\u0020 +` + +export const snippetsCompletionWithinMap = ` +StartAt: Map +States: + Map: + Type: Map + Next: Final State + Iterator: + StartAt: Pass + States: + Pass: + Type: Pass + Result: Done! + End: true +\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020 + Final State: + Type: Pass + End: true +` + +export const snippetsCompletionWithinParallel = ` +StartAt: Parallel +States: + Parallel: + Type: Parallel + Next: Final State + Branches: + - StartAt: Wait 20s + States: + Wait 20s: + Type: Wait + Seconds: 20 + End: true +\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020 + Final State: + Type: Pass + End: true +` + +export const catchRetrySnippetsCompletionWithinMap = ` +StartAt: Map +States: + Map: + Type: Map + Next: Final State +\u0020\u0020\u0020\u0020 + Iterator: + StartAt: Pass + States: + Pass: + Type: Pass + Result: Done! + End: true + Final State: + Type: Pass + End: true +` + +export const catchRetrySnippetsCompletionWithinParallel = ` +StartAt: Parallel +States: + Parallel: +\u0020\u0020\u0020\u0020 + Type: Parallel + Next: Final State + Branches: + - StartAt: Wait 20s + States: + Wait 20s: + Type: Wait + Seconds: 20 + End: true + Final State: + Type: Pass + End: true +\u0020\u0020\u0020\u0020 +\u0020\u0020 +` + +export const catchRetrySnippetsCompletionWithinTask = ` +StartAt: FirstState +States: + FirstState: + Type: Task + +\u0020\u0020\u0020\u0020 + + Resource: 'arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME' + End: true +` + +export const topLevelLabels = ['Version', 'Comment', 'TimeoutSeconds', 'StartAt', 'States', 'QueryLanguage'] +export const stateSnippetLabels = [ + 'Pass State', + 'Lambda Task State', + 'EventBridge Task State', + 'MediaConvert Task State', + 'SNS Task State', + 'Batch Task State', + 'ECS Task State', + 'SQS Task State', + 'Choice State', + 'Wait State', + 'Succeed State', + 'Fail State', + 'Parallel State', + 'Map State', +] + +export const stateNameLabels = [ + 'FirstState', + 'ChoiceState', + 'FirstMatchState', + 'SecondMatchState', + 'DefaultState', + 'NextState', + 'ChoiceStateX', +] +export const nestedItemLabels = ['Nested1', 'Nested2', 'Nested3', 'Nested4'] + +export const passSnippetYaml = + '${1:PassState}:\n\tType: Pass\n\tResult:\n\t\tdata1: 0.5\n\t\tdata2: 1.5\n\tResultPath: $.result\n\tNext: ${2:NextState}\n' diff --git a/src/tests/yasl-strings/validationStrings.ts b/src/tests/yaml-strings/validationStrings.ts similarity index 100% rename from src/tests/yasl-strings/validationStrings.ts rename to src/tests/yaml-strings/validationStrings.ts diff --git a/src/tests/yamlCompletion.test.ts b/src/tests/yamlCompletion.test.ts index 63517a385..a52e941d4 100644 --- a/src/tests/yamlCompletion.test.ts +++ b/src/tests/yamlCompletion.test.ts @@ -8,774 +8,468 @@ import { CompletionItemKind, InsertTextFormat } from 'vscode-json-languageservic import { stateSnippets } from '../completion/completeSnippets' import { getYamlLanguageService, Position, Range } from '../service' import { asTextEdit, toDocument } from './utils/testUtilities' - -const emptyDocument = '' - -const documentWithPartialTopLevel = ` -St -` - -const documentWithStates = ` - -StartAt: - -States: -\u0020\u0020 -` - -const document1 = ` - StartAt: - States: - FirstState: - ChoiceState: - FirstMatchState: - SecondMatchState: - DefaultState: - NextState: - Next: "" - ChoiceStateX: - Type: Choice - Choices: - - Next: "" - - Next: FirstState - - Next: NextState - Default: "" -` -const document2 = ` - StartAt: - States: - FirstState: - ChoiceState: - FirstMatchState: - SecondMatchState: - DefaultState: - NextState: - Next: "" - ChoiceStateX: - Type: Choice, - Choices: - - Next: "" - - Next: FirstState - - Next: NextState - Default: "" -` - -const document3 = ` - StartAt: "" - States: - FirstState: - ChoiceState: - FirstMatchState: - SecondMatchState: - DefaultState: - NextState: - Next: "" - ChoiceStateX: -` -const document4 = ` - StartAt: First - States: - FirstState: - ChoiceState: - FirstMatchState: - SecondMatchState: - DefaultState: - NextState: - Next: First - ChoiceStateX: -` - -const documentNested = ` - StartAt: First - States: - FirstState: - MapState: - Iterator: - StartAt: "" - States: - Nested1: - Nested2: - Nested3: - Nested4: - Next: "" -` -const completionsEdgeCase1 = ` - Comment: An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2. - StartAt: Map - States: - Map: - Type: Map - ItemsPath: $.array - ResultPath: \\\$$$$$.array$$$ - MaxConcurrency: 2 - Next: Final State - Iterator: - StartAt: Pass - States: - Pass: - Type: Pass - Result: Done! - End: true - "Net 2": - Type: Fail - Next: Final State - Final State: - Type: Pass - Next: "Net 2" -` - -const completionsEdgeCase2 = ` - StartAt: MyState - States: - -` - -const snippetsCompletionCase1 = ` -StartAt: Hello -States: -\u0020\u0020 - Hello: - Type: Pass - Result: Hello - Next: World - - World: - Type: Pass - Result: World - End: true -` - -const snippetsCompletionCase2 = ` -StartAt: Hello -States: - Hello: - Type: Pass - Result: Hello - Next: World - World: - Type: Pass - Result: World - End: true -` - -const snippetsCompletionCase3 = ` -StartAt: Hello -States: - Hello: - Type: Pass - Result: Hello - Next: World -\u0020\u0020 - - World: - Type: Pass - Result: World - End: true -` - -const snippetsCompletionCase4 = ` -StartAt: Hello -States: - Hello: - Type: Pass - Result: Hello - Next: World - - World: - Type: Pass - Result: World - End: true -\u0020\u0020\u0020\u0020 -` - -const snippetsCompletionCase5 = ` -StartAt: Hello -States: - Hello: - Type: Pass - Result: Hello - Next: World - - World: - Type: Pass - Result: World - End: true - - -\u0020\u0020 -` - -const snippetsCompletionWithinMap = ` -StartAt: Map -States: - Map: - Type: Map - Next: Final State - Iterator: - StartAt: Pass - States: - Pass: - Type: Pass - Result: Done! - End: true -\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020 - Final State: - Type: Pass - End: true -` - -const snippetsCompletionWithinParallel = ` -StartAt: Parallel -States: - Parallel: - Type: Parallel - Next: Final State - Branches: - - StartAt: Wait 20s - States: - Wait 20s: - Type: Wait - Seconds: 20 - End: true -\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020 - Final State: - Type: Pass - End: true -` - -const catchRetrySnippetsCompletionWithinMap = ` -StartAt: Map -States: - Map: - Type: Map - Next: Final State -\u0020\u0020\u0020\u0020 - Iterator: - StartAt: Pass - States: - Pass: - Type: Pass - Result: Done! - End: true - Final State: - Type: Pass - End: true -` - -const catchRetrySnippetsCompletionWithinParallel = ` -StartAt: Parallel -States: - Parallel: -\u0020\u0020\u0020\u0020 - Type: Parallel - Next: Final State - Branches: - - StartAt: Wait 20s - States: - Wait 20s: - Type: Wait - Seconds: 20 - End: true - Final State: - Type: Pass - End: true -\u0020\u0020\u0020\u0020 -\u0020\u0020 -` - -const catchRetrySnippetsCompletionWithinTask = ` -StartAt: FirstState -States: - FirstState: - Type: Task - -\u0020\u0020\u0020\u0020 - - Resource: 'arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME' - End: true -` - -const topLevelLabels = [ - 'Version', - 'Comment', - 'TimeoutSeconds', - 'StartAt', - 'States', - 'QueryLanguage' -] -const stateSnippetLabels = [ - 'Pass State', - 'Lambda Task State', - 'EventBridge Task State', - 'MediaConvert Task State', - 'SNS Task State', - 'Batch Task State', - 'ECS Task State', - 'SQS Task State', - 'Choice State', - 'Wait State', - 'Succeed State', - 'Fail State', - 'Parallel State', - 'Map State' -] - -const stateNameLabels = [ - 'FirstState', - 'ChoiceState', - 'FirstMatchState', - 'SecondMatchState', - 'DefaultState', - 'NextState', - 'ChoiceStateX', -] -const nestedItemLabels = ['Nested1', 'Nested2', 'Nested3', 'Nested4'] - -// tslint:disable-next-line: no-invalid-template-strings -const passSnippetYaml = '${1:PassState}:\n\tType: Pass\n\tResult:\n\t\tdata1: 0.5\n\t\tdata2: 1.5\n\tResultPath: $.result\n\tNext: ${2:NextState}\n' +import { + document1, + document2, + document3, + document4, + documentNested, + completionsEdgeCase1, + completionsEdgeCase2, + nestedItemLabels, + topLevelLabels, + emptyDocument, + documentWithPartialTopLevel, + documentWithStates, + stateNameLabels, + stateSnippetLabels, + snippetsCompletionCase1, + snippetsCompletionCase2, + snippetsCompletionCase3, + snippetsCompletionCase4, + snippetsCompletionCase5, + snippetsCompletionWithinMap, + snippetsCompletionWithinParallel, + passSnippetYaml, + catchRetrySnippetsCompletionWithinMap, + catchRetrySnippetsCompletionWithinParallel, + catchRetrySnippetsCompletionWithinTask, +} from './yaml-strings/completionStrings' interface TestCompletionOptions { - labels: string[] - yaml: string - position: [number, number] - start: [number, number] - end: [number, number] - labelToInsertText(label: string): string + labels: string[] + yaml: string + position: [number, number] + start: [number, number] + end: [number, number] + labelToInsertText(label: string): string } interface TestPropertyCompletionOptions { - labels: string[] - yaml: string - position: [number, number] + labels: string[] + yaml: string + position: [number, number] } async function getCompletions(yaml: string, position: [number, number]) { - const { textDoc, jsonDoc } = toDocument(yaml, true) - const pos = Position.create(...position) - const ls = getYamlLanguageService({}) + const { textDoc, jsonDoc } = toDocument(yaml, true) + const pos = Position.create(...position) + const ls = getYamlLanguageService({}) - return await ls.doComplete(textDoc, pos, jsonDoc) + return await ls.doComplete(textDoc, pos, jsonDoc) } async function testCompletions(options: TestCompletionOptions) { - const { labels, yaml, position, start, end, labelToInsertText } = options + const { labels, yaml, position, start, end, labelToInsertText } = options - const res = await getCompletions(yaml, position) + const res = await getCompletions(yaml, position) - assert.strictEqual(res?.items.length, labels.length) + assert.strictEqual(res?.items.length, labels.length) - // space before quoted item - const itemInsertTexts = labels.map(labelToInsertText) + // space before quoted item + const itemInsertTexts = labels.map(labelToInsertText) - assert.deepEqual( - res?.items.map(item => item.label), - labels - ) - assert.deepEqual( - res?.items.map(item => item.textEdit?.newText), - itemInsertTexts - ) + assert.deepEqual( + res?.items.map((item) => item.label), + labels, + ) + assert.deepEqual( + res?.items.map((item) => item.textEdit?.newText), + itemInsertTexts, + ) - const leftPos = Position.create(...start) - const rightPos = Position.create(...end) + const leftPos = Position.create(...start) + const rightPos = Position.create(...end) - res?.items.forEach(item => { - assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) - }) + res?.items.forEach((item) => { + assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) + }) } // Validate completions that include a full property (key-val pair) async function testPropertyCompletions(options: TestPropertyCompletionOptions) { - const { labels, yaml, position } = options - - const res = await getCompletions(yaml, position) - - assert.strictEqual(res?.items.length, labels.length) - - const itemLabels = res?.items.map(item => item.label) - assert.deepEqual( - itemLabels, - labels - ) - - // Test property keys match labels. - const itemInsertTextKeys = res?.items.map(item => item.insertText?.split(':')[0]) - assert.deepEqual( - itemInsertTextKeys, - labels - ) - - // Test textEdit newText matches the insertText - const itemInsertTexts = res?.items.map(item => item.insertText) - const itemTextEditNewTexts = res?.items.map(item => item.textEdit?.newText) - assert.deepEqual( - itemInsertTexts, - itemTextEditNewTexts - ) - - // Test range is from position to end of line. - const leftPos = Position.create(position[0], 0) - const rightPos = Position.create(position[0], yaml.length) - res?.items.forEach(item => { - assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) - }) + const { labels, yaml, position } = options + + const res = await getCompletions(yaml, position) + + assert.strictEqual(res?.items.length, labels.length) + + const itemLabels = res?.items.map((item) => item.label) + assert.deepEqual(itemLabels, labels) + + // Test property keys match labels. + const itemInsertTextKeys = res?.items.map((item) => item.insertText?.split(':')[0]) + assert.deepEqual(itemInsertTextKeys, labels) + + // Test textEdit newText matches the insertText + const itemInsertTexts = res?.items.map((item) => item.insertText) + const itemTextEditNewTexts = res?.items.map((item) => item.textEdit?.newText) + assert.deepEqual(itemInsertTexts, itemTextEditNewTexts) + + // Test range is from position to end of line. + const leftPos = Position.create(position[0], 0) + const rightPos = Position.create(position[0], yaml.length) + res?.items.forEach((item) => { + assert.deepEqual(asTextEdit(item.textEdit)?.range, Range.create(leftPos, rightPos)) + }) } interface TestScenario { - yaml: string, - position: [number, number], - start: [number, number], - end: [number, number], + yaml: string + position: [number, number] + start: [number, number] + end: [number, number] } export async function getSuggestedSnippets(options: TestScenario) { - const { yaml, position } = options - const { textDoc, jsonDoc } = toDocument(yaml) - const pos = Position.create(...position) - const ls = getYamlLanguageService({}) - const res = await ls.doComplete(textDoc, pos, jsonDoc) - const suggestedSnippetLabels = res?.items.filter(item => item.kind === CompletionItemKind.Snippet).map(item => item.label) - - return suggestedSnippetLabels + const { yaml, position } = options + const { textDoc, jsonDoc } = toDocument(yaml) + const pos = Position.create(...position) + const ls = getYamlLanguageService({}) + const res = await ls.doComplete(textDoc, pos, jsonDoc) + const suggestedSnippetLabels = res?.items + .filter((item) => item.kind === CompletionItemKind.Snippet) + .map((item) => item.label) + + return suggestedSnippetLabels } -suite('ASL YAML context-aware completion', () => { - suite('Top Level Properties', () => { - test('Empty document', async () => { - await testPropertyCompletions({ - labels: topLevelLabels, - yaml: emptyDocument, - position: [0, 0], - }) - }) +describe('ASL YAML context-aware completion', () => { + describe('Top Level Properties', () => { + test('Empty document', async () => { + await testPropertyCompletions({ + labels: topLevelLabels, + yaml: emptyDocument, + position: [0, 0], + }) + }) - test('Partially defined property, cursor in front of first letter', async () => { - await testPropertyCompletions({ - labels: topLevelLabels, - yaml: documentWithPartialTopLevel, - position: [1, 0], - }) - }) + test('Partially defined property, cursor in front of first letter', async () => { + await testPropertyCompletions({ + labels: topLevelLabels, + yaml: documentWithPartialTopLevel, + position: [1, 0], + }) + }) - test('Partially defined property, cursor in middle', async () => { - await testPropertyCompletions({ - labels: topLevelLabels, - yaml: documentWithPartialTopLevel, - position: [1, 1] - }) - }) + test('Partially defined property, cursor in middle', async () => { + await testPropertyCompletions({ + labels: topLevelLabels, + yaml: documentWithPartialTopLevel, + position: [1, 1], + }) + }) - test('Partially defined property, cursor after final letter', async () => { - await testPropertyCompletions({ - labels: topLevelLabels, - yaml: documentWithPartialTopLevel, - position: [1, 2] - }) - }) + test('Partially defined property, cursor after final letter', async () => { + await testPropertyCompletions({ + labels: topLevelLabels, + yaml: documentWithPartialTopLevel, + position: [1, 2], + }) + }) - test('States snippets', async () => { - const labels = stateSnippetLabels - const yaml = documentWithStates + test('States snippets', async () => { + const labels = stateSnippetLabels + const yaml = documentWithStates - const res = await getCompletions(yaml, [5, 2]) + const res = await getCompletions(yaml, [5, 2]) - assert.strictEqual(res?.items.length, labels.length) + assert.strictEqual(res?.items.length, labels.length) - const itemLabels = res?.items.map(item => item.label) - assert.deepEqual( - itemLabels, - labels - ) + const itemLabels = res?.items.map((item) => item.label) + assert.deepEqual(itemLabels, labels) - res?.items.forEach(item => { - assert.strictEqual(item.kind, CompletionItemKind.Snippet) - assert.strictEqual(item.insertTextFormat, InsertTextFormat.Snippet) - assert.ok(item.insertText) - assert.ok(item.documentation) - }) - }) + res?.items.forEach((item) => { + assert.strictEqual(item.kind, CompletionItemKind.Snippet) + assert.strictEqual(item.insertTextFormat, InsertTextFormat.Snippet) + assert.ok(item.insertText) + assert.ok(item.documentation) + }) + }) + }) + + describe('StartAt', () => { + test('Both quotation marks present and cursor between them', async () => { + await testCompletions({ + labels: stateNameLabels, + yaml: document3, + position: [1, 12], + start: [1, 10], + end: [1, 13], + labelToInsertText: (label) => ` ${label}`, + }) }) - suite('StartAt', () => { - test('Both quotation marks present and cursor between them', async () => { - await testCompletions({ - labels: stateNameLabels, - yaml: document3, - position: [1, 12], - start: [1, 10], - end: [1, 13], - labelToInsertText: label => ` ${label}`, - }) - }) + test('Suggests completions when text present and cursor is on it', async () => { + await testCompletions({ + labels: stateNameLabels, + yaml: document4, + position: [1, 13], + start: [1, 10], + end: [1, 16], + labelToInsertText: (label) => ` ${label}`, + }) + }) + + test('Suggests nested completions when StartAt is nested within Map state', async () => { + await testCompletions({ + labels: nestedItemLabels, + yaml: documentNested, + position: [6, 18], + start: [6, 16], + end: [6, 19], + labelToInsertText: (label) => ` ${label}`, + }) + }) + }) + + describe('Next', () => { + test('Cursor after colon but no quotes', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: stateNameLabels.filter((label) => label !== 'NextState'), + yaml: document2, + position: [9, 12], + start: [9, 11], + end: [9, 14], + labelToInsertText: (label) => ` ${label}`, + }) + }) + + test('Both quotation marks present and cursor between them', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: stateNameLabels.filter((label) => label !== 'NextState'), + yaml: document3, + position: [9, 13], + start: [9, 11], + end: [9, 14], + labelToInsertText: (label) => ` ${label}`, + }) + }) - test('Suggests completions when text present and cursor is on it', async () => { - await testCompletions({ - labels: stateNameLabels, - yaml: document4, - position: [1, 13], - start: [1, 10], - end: [1, 16], - labelToInsertText: label => ` ${label}`, - }) + test('Suggests completions when text present and cursor is on it', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: stateNameLabels.filter((label) => label !== 'NextState'), + yaml: document4, + position: [9, 18], + start: [9, 11], + end: [9, 17], + labelToInsertText: (label) => ` ${label}`, + }) + }) + + test('Suggests nested completions when Next is nested within Map state', async () => { + await testCompletions({ + // remove last label as it is the name of the current state + labels: nestedItemLabels.filter((label) => label !== 'Nested4'), + yaml: documentNested, + position: [12, 21], + start: [12, 17], + end: [12, 20], + labelToInsertText: (label) => ` ${label}`, + }) + }) + + test('Suggests completions for the Next property within Choice state', async () => { + await testCompletions({ + labels: stateNameLabels.filter((label) => label !== 'ChoiceStateX'), + yaml: document1, + position: [13, 17], + start: [13, 15], + end: [13, 18], + labelToInsertText: (label) => ` ${label}`, + }) + }) + }) + + describe('Default', () => { + test('Suggests completion items for Default property of the Choice state when cursor positioned after first quote', async () => { + await testCompletions({ + labels: stateNameLabels.filter((label) => label !== 'ChoiceStateX'), + yaml: document1, + position: [16, 16], + start: [16, 14], + end: [16, 17], + labelToInsertText: (label) => ` ${label}`, + }) + }) + + test('Suggests completion items for Default property of the Choice state when cursor is a space after colon', async () => { + await testCompletions({ + labels: stateNameLabels.filter((label) => label !== 'ChoiceStateX'), + yaml: document2, + position: [16, 15], + start: [16, 14], + end: [16, 17], + labelToInsertText: (label) => ` ${label}`, + }) + }) + }) + + describe('Edge Cases', () => { + test('Requested completion in state name position does not throw error', async () => { + await assert.doesNotReject(getCompletions(completionsEdgeCase1, [17, 4]), TypeError) + + await assert.doesNotReject(getCompletions(completionsEdgeCase2, [3, 5]), TypeError) + }) + }) + + describe('Snippets', () => { + describe('State snippets', () => { + test('Shows state snippets when cursor placed on first line after States prop with greater indendation', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionCase1, + position: [3, 2], + start: [3, 2], + end: [3, 2], }) - test('Suggests nested completions when StartAt is nested within Map state', async () => { - await testCompletions({ - labels: nestedItemLabels, - yaml: documentNested, - position: [6, 18], - start: [6, 16], - end: [6, 19], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Does not show state snippets when cursor placed on first line after States prop with same indentation indendation', async () => { + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionCase2, + position: [3, 0], + start: [3, 0], + end: [3, 0], }) - }) - suite('Next', () => { - test('Cursor after colon but no quotes', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: stateNameLabels.filter(label => label !== 'NextState'), - yaml: document2, - position: [9, 12], - start: [9, 11], - end: [9, 14], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, []) + }) + + test('Shows state snippets when cursor placed on line after state declaration with the indentation same as the previous state name', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionCase3, + position: [7, 2], + start: [7, 2], + end: [7, 2], }) - test('Both quotation marks present and cursor between them', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: stateNameLabels.filter(label => label !== 'NextState'), - yaml: document3, - position: [9, 13], - start: [9, 11], - end: [9, 14], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Does not show state snippets when cursor placed on line after state declaration with the indentation same as the nested state property name ', async () => { + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionCase4, + position: [7, 4], + start: [7, 4], + end: [7, 4], }) - test('Suggests completions when text present and cursor is on it', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: stateNameLabels.filter(label => label !== 'NextState'), - yaml: document4, - position: [9, 18], - start: [9, 11], - end: [9, 17], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, []) + }) + + test('Shows state snippets when cursor placed 2 lines below last declared state machine with same indentation level as its name', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionCase5, + position: [14, 2], + start: [14, 2], + end: [14, 2], }) - test('Suggests nested completions when Next is nested within Map state', async () => { - await testCompletions({ - // remove last label as it is the name of the current state - labels: nestedItemLabels.filter(label => label !== 'Nested4'), - yaml: documentNested, - position: [12, 21], - start: [12, 17], - end: [12, 20], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Shows state snippets when cursor placed within States object of Map state', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionWithinMap, + position: [13, 8], + start: [13, 8], + end: [13, 8], }) - test('Suggests completions for the Next property within Choice state', async () => { - await testCompletions({ - labels: stateNameLabels.filter(label => label !== 'ChoiceStateX'), - yaml: document1, - position: [13, 17], - start: [13, 15], - end: [13, 18], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Shows state snippets when cursor placed within States object of Parallel state', async () => { + const expectedSnippets = stateSnippets.map((item) => item.label) + const suggestedSnippets = await getSuggestedSnippets({ + yaml: snippetsCompletionWithinParallel, + position: [13, 8], + start: [13, 8], + end: [13, 8], }) + + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Shows the snippets in correct YAML format', async () => { + const { textDoc, jsonDoc } = toDocument(snippetsCompletionCase1, true) + const pos = Position.create(3, 2) + const ls = getYamlLanguageService({}) + const res = await ls.doComplete(textDoc, pos, jsonDoc) + + assert.ok(res?.items.find((item) => item.insertText === passSnippetYaml)) + }) }) - suite('Default', () => { - test('Suggests completion items for Default property of the Choice state when cursor positioned after first quote', async () => { - await testCompletions({ - labels: stateNameLabels.filter(label => label !== 'ChoiceStateX'), - yaml: document1, - position: [16, 16], - start: [16, 14], - end: [16, 17], - labelToInsertText: label => ` ${label}`, - }) + describe('Catch/Retry snippets', () => { + test('Shows error snippets when cursor placed within map state', async () => { + const expectedSnippets = ['Retry', 'Catch'] + const suggestedSnippets = await getSuggestedSnippets({ + yaml: catchRetrySnippetsCompletionWithinMap, + position: [6, 4], + start: [6, 4], + end: [6, 4], }) - test('Suggests completion items for Default property of the Choice state when cursor is a space after colon', async () => { - await testCompletions({ - labels: stateNameLabels.filter(label => label !== 'ChoiceStateX'), - yaml: document2, - position: [16, 15], - start: [16, 14], - end: [16, 17], - labelToInsertText: label => ` ${label}`, - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + + test('Shows error snippets when cursor placed within parallel state', async () => { + const expectedSnippets = ['Retry', 'Catch'] + const suggestedSnippets = await getSuggestedSnippets({ + yaml: catchRetrySnippetsCompletionWithinParallel, + position: [4, 4], + start: [4, 4], + end: [4, 4], }) - }) - suite('Edge Cases', () => { - test('Requested completion in state name position does not throw error', async () => { - await assert.doesNotReject(getCompletions(completionsEdgeCase1, [17, 4]), TypeError) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) - await assert.doesNotReject(getCompletions(completionsEdgeCase2, [3, 5]), TypeError) + test('Shows error snippets when cursor placed within task state', async () => { + const expectedSnippets = ['Retry', 'Catch'] + const suggestedSnippets = await getSuggestedSnippets({ + yaml: catchRetrySnippetsCompletionWithinTask, + position: [6, 4], + start: [6, 4], + end: [6, 4], }) - }) - suite('Snippets', () => { - suite('State snippets', () => { - test('Shows state snippets when cursor placed on first line after States prop with greater indendation', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionCase1, - position: [3, 2], - start: [3, 2], - end: [3, 2] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Does not show state snippets when cursor placed on first line after States prop with same indentation indendation', async () => { - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionCase2, - position: [3, 0], - start: [3, 0], - end: [3, 0] - }) - - assert.deepEqual(suggestedSnippets, []) - }) - - test('Shows state snippets when cursor placed on line after state declaration with the indentation same as the previous state name', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionCase3, - position: [7, 2], - start: [7, 2], - end: [7, 2] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Does not show state snippets when cursor placed on line after state declaration with the indentation same as the nested state property name ', async () => { - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionCase4, - position: [7, 4], - start: [7, 4], - end: [7, 4] - }) - - assert.deepEqual(suggestedSnippets, []) - }) - - test('Shows state snippets when cursor placed 2 lines below last declared state machine with same indentation level as its name', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionCase5, - position: [14, 2], - start: [14, 2], - end: [14, 2] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Shows state snippets when cursor placed within States object of Map state', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionWithinMap, - position: [13, 8], - start: [13, 8], - end: [13, 8] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Shows state snippets when cursor placed within States object of Parallel state', async () => { - const expectedSnippets = stateSnippets.map(item => item.label) - const suggestedSnippets = await getSuggestedSnippets({ - yaml: snippetsCompletionWithinParallel, - position: [13, 8], - start: [13, 8], - end: [13, 8] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Shows the snippets in correct YAML format', async () => { - const { textDoc, jsonDoc } = toDocument(snippetsCompletionCase1, true) - const pos = Position.create(3, 2) - const ls = getYamlLanguageService({}) - const res = await ls.doComplete(textDoc, pos, jsonDoc) - - assert.ok(res?.items.find(item => item.insertText === passSnippetYaml)) - }) + assert.deepEqual(suggestedSnippets, expectedSnippets) + }) + test('Does not show error snippets outside of allowed states', async () => { + const notExpectedSnippets = ['Retry', 'Catch'] + const suggestedSnippetsOtherState = await getSuggestedSnippets({ + yaml: catchRetrySnippetsCompletionWithinParallel, + position: [17, 4], + start: [17, 4], + end: [17, 4], }) - suite('Catch/Retry snippets', () => { - test('Shows error snippets when cursor placed within map state', async () => { - const expectedSnippets = ['Retry', 'Catch'] - const suggestedSnippets = await getSuggestedSnippets({ - yaml: catchRetrySnippetsCompletionWithinMap, - position: [6, 4], - start: [6, 4], - end: [6, 4] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Shows error snippets when cursor placed within parallel state', async () => { - const expectedSnippets = ['Retry', 'Catch'] - const suggestedSnippets = await getSuggestedSnippets({ - yaml: catchRetrySnippetsCompletionWithinParallel, - position: [4, 4], - start: [4, 4], - end: [4, 4] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Shows error snippets when cursor placed within task state', async () => { - const expectedSnippets = ['Retry', 'Catch'] - const suggestedSnippets = await getSuggestedSnippets({ - yaml: catchRetrySnippetsCompletionWithinTask, - position: [6, 4], - start: [6, 4], - end: [6, 4] - }) - - assert.deepEqual(suggestedSnippets, expectedSnippets) - }) - - test('Does not show error snippets outside of allowed states', async () => { - const notExpectedSnippets = ['Retry', 'Catch'] - const suggestedSnippetsOtherState = await getSuggestedSnippets({ - yaml: catchRetrySnippetsCompletionWithinParallel, - position: [17, 4], - start: [17, 4], - end: [17, 4] - }) - - assert.equal(suggestedSnippetsOtherState?.filter(snippet => notExpectedSnippets.includes(snippet)).length, 0) - - const suggestedSnippetsStatePropLevel = await getSuggestedSnippets({ - yaml: catchRetrySnippetsCompletionWithinParallel, - position: [18, 4], - start: [18, 4], - end: [18, 4] - }) - - assert.equal(suggestedSnippetsStatePropLevel?.filter(snippet => notExpectedSnippets.includes(snippet)).length, 0) - }) + assert.equal(suggestedSnippetsOtherState?.filter((snippet) => notExpectedSnippets.includes(snippet)).length, 0) + + const suggestedSnippetsStatePropLevel = await getSuggestedSnippets({ + yaml: catchRetrySnippetsCompletionWithinParallel, + position: [18, 4], + start: [18, 4], + end: [18, 4], }) + + assert.equal( + suggestedSnippetsStatePropLevel?.filter((snippet) => notExpectedSnippets.includes(snippet)).length, + 0, + ) + }) }) + }) }) diff --git a/src/tests/yamlFormat.test.ts b/src/tests/yamlFormat.test.ts index 80b32b0d1..3c0f0fd89 100644 --- a/src/tests/yamlFormat.test.ts +++ b/src/tests/yamlFormat.test.ts @@ -9,35 +9,47 @@ import { getYamlLanguageService, Position, Range } from '../service' import { toDocument } from './utils/testUtilities' async function getFormat(yaml: string, range: Range, formattingOptions: FormattingOptions): Promise { - const { textDoc } = toDocument(yaml, true) - const ls = getYamlLanguageService({}) + const { textDoc } = toDocument(yaml, true) + const ls = getYamlLanguageService({}) - return ls.format(textDoc, range, formattingOptions); + return ls.format(textDoc, range, formattingOptions) } -suite('ASL YAML format', () => { - test('Format does not remove comments', async () => { - const yaml = ` +describe('ASL YAML format', () => { + test('Format does not remove comments', async () => { + const yaml = ` # this is my comment hello: world # this is another comment ` - const formattedTextEdits = await getFormat(yaml, Range.create(Position.create(0, 0), Position.create(yaml.length, yaml.length)), { - tabSize: 4, - insertSpaces: true - }) + const formattedTextEdits = await getFormat( + yaml, + Range.create(Position.create(0, 0), Position.create(yaml.length, yaml.length)), + { + tabSize: 4, + insertSpaces: true, + }, + ) - assert.equal(formattedTextEdits[0].newText, '# this is my comment\nhello: world # this is another comment\n', 'Expected comments to not be removed') - }) + assert.equal( + formattedTextEdits[0].newText, + '# this is my comment\nhello: world # this is another comment\n', + 'Expected comments to not be removed', + ) + }) - test('Format removes unnecessary spaces', async () => { - const yaml = ` + test('Format removes unnecessary spaces', async () => { + const yaml = ` hello: world ` - const formattedTextEdits = await getFormat(yaml, Range.create(Position.create(0, 0), Position.create(yaml.length, yaml.length)), { - tabSize: 4, - insertSpaces: true - }) + const formattedTextEdits = await getFormat( + yaml, + Range.create(Position.create(0, 0), Position.create(yaml.length, yaml.length)), + { + tabSize: 4, + insertSpaces: true, + }, + ) - assert.equal(formattedTextEdits[0].newText, 'hello: world\n', 'Expected unnecessary spaces to be removed') - }) + assert.equal(formattedTextEdits[0].newText, 'hello: world\n', 'Expected unnecessary spaces to be removed') + }) }) diff --git a/src/tests/yamlValidation.test.ts b/src/tests/yamlValidation.test.ts index 9110d0f02..a09c81a6c 100644 --- a/src/tests/yamlValidation.test.ts +++ b/src/tests/yamlValidation.test.ts @@ -8,792 +8,792 @@ import { MESSAGES, YAML_PARSER_MESSAGES } from '../constants/diagnosticStrings' import { Diagnostic, DiagnosticSeverity, getYamlLanguageService, Position, Range } from '../service' import { - documentChoiceDefaultBeforeChoice, - documentChoiceInvalidDefault, - documentChoiceInvalidNext, - documentChoiceNoDefault, - documentChoiceValidDefault, - documentChoiceValidNext, - documentDuplicateKey, - documentInvalidNext, - documentInvalidNextNested, - documentInvalidParametersIntrinsicFunction, - documentInvalidParametersJsonPath, - documentInvalidPropertiesCatch, - documentInvalidPropertiesChoices, - documentInvalidPropertiesRoot, - documentInvalidPropertiesRootNested, - documentInvalidPropertiesState, - documentInvalidResultSelectorIntrinsicFunction, - documentInvalidResultSelectorJsonPath, - documentMapCatchTemplate, - documentMapCatchTemplateInvalidNext, - documentNestedNoTerminalState, - documentNestedUnreachableState, - documentNoTerminalState, - documentParallelCatchTemplate, - documentParallelCatchTemplateInvalidNext, - documentParametersArray, - documentParametersBoolean, - documentParametersNull, - documentParametersNumber, - documentParametersString, - documentStartAtInvalid, - documentStartAtNestedInvalid, - documentStartAtValid, - documentSucceedFailTerminalState, - documentTaskCatchTemplate, - documentTaskCatchTemplateInvalidNext, - documentTaskInvalidArn, - documentTaskValidVariableSubstitution, - documentUnreachableState, - documentValidAslImprovements, - documentValidNext, - documentValidParametersIntrinsicFunction, - documentValidParametersJsonPath, - documentValidResultSelectorIntrinsicFunction, - documentValidResultSelectorJsonPath, -} from './yasl-strings/validationStrings' + documentChoiceDefaultBeforeChoice, + documentChoiceInvalidDefault, + documentChoiceInvalidNext, + documentChoiceNoDefault, + documentChoiceValidDefault, + documentChoiceValidNext, + documentDuplicateKey, + documentInvalidNext, + documentInvalidNextNested, + documentInvalidParametersIntrinsicFunction, + documentInvalidParametersJsonPath, + documentInvalidPropertiesCatch, + documentInvalidPropertiesChoices, + documentInvalidPropertiesRoot, + documentInvalidPropertiesRootNested, + documentInvalidPropertiesState, + documentInvalidResultSelectorIntrinsicFunction, + documentInvalidResultSelectorJsonPath, + documentMapCatchTemplate, + documentMapCatchTemplateInvalidNext, + documentNestedNoTerminalState, + documentNestedUnreachableState, + documentNoTerminalState, + documentParallelCatchTemplate, + documentParallelCatchTemplateInvalidNext, + documentParametersArray, + documentParametersBoolean, + documentParametersNull, + documentParametersNumber, + documentParametersString, + documentStartAtInvalid, + documentStartAtNestedInvalid, + documentStartAtValid, + documentSucceedFailTerminalState, + documentTaskCatchTemplate, + documentTaskCatchTemplateInvalidNext, + documentTaskInvalidArn, + documentTaskValidVariableSubstitution, + documentUnreachableState, + documentValidAslImprovements, + documentValidNext, + documentValidParametersIntrinsicFunction, + documentValidParametersJsonPath, + documentValidResultSelectorIntrinsicFunction, + documentValidResultSelectorJsonPath, +} from './yaml-strings/validationStrings' import { toDocument } from './utils/testUtilities' const JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG = 'Matches multiple schemas when only one must validate.' export interface TestValidationOptions { - json: string - diagnostics: { - message: string - start: [number, number] - end: [number, number] - }[] - filterMessages?: string[] + json: string + diagnostics: { + message: string + start: [number, number] + end: [number, number] + }[] + filterMessages?: string[] } async function getValidations(json: string) { - const { textDoc, jsonDoc } = toDocument(json, true) - const ls = getYamlLanguageService({}) + const { textDoc, jsonDoc } = toDocument(json, true) + const ls = getYamlLanguageService({}) - return await ls.doValidation(textDoc, jsonDoc) + return await ls.doValidation(textDoc, jsonDoc) } async function testValidations(options: TestValidationOptions) { - const { json, diagnostics, filterMessages } = options + const { json, diagnostics, filterMessages } = options - let res = await getValidations(json) - res = res.filter(diagnostic => { - if (filterMessages && filterMessages.find(message => message === diagnostic.message)) { - return false - } + let res = await getValidations(json) + res = res.filter((diagnostic) => { + if (filterMessages && filterMessages.find((message) => message === diagnostic.message)) { + return false + } - return true - }) + return true + }) - assert.strictEqual(res.length, diagnostics.length) + assert.strictEqual(res.length, diagnostics.length) - res.forEach((item, index) => { - const leftPos = Position.create(...diagnostics[index].start) - const rightPos = Position.create(...diagnostics[index].end) + res.forEach((item, index) => { + const leftPos = Position.create(...diagnostics[index].start) + const rightPos = Position.create(...diagnostics[index].end) - const diagnostic = Diagnostic.create( - Range.create(leftPos, rightPos), - diagnostics[index].message, - DiagnosticSeverity.Error - ) + const diagnostic = Diagnostic.create( + Range.create(leftPos, rightPos), + diagnostics[index].message, + DiagnosticSeverity.Error, + ) - assert.deepStrictEqual(diagnostic, item) - }) + assert.deepStrictEqual(diagnostic, item) + }) } -suite('ASL YAML context-aware validation', () => { - suite('Invalid YAML Input', () => { - test("Empty string doesn't throw errors", async () => { - await assert.doesNotReject(getValidations('')) - }) - - test("[] string doesn't throw type errors", async () => { - await assert.doesNotReject(getValidations('[]'), TypeError) - }) - - test('Shows diagnostic for duplicate key', async () => { - const message = YAML_PARSER_MESSAGES.DUPLICATE_KEY - - await testValidations({ - json: documentDuplicateKey, - diagnostics: [ - { - message, - start: [3, 2], - end: [3, 9], - }, - { - message, - start: [1, 2], - end: [1, 9], - }, - { - message, - start: [12, 4], - end: [12, 9], - }, - { - message, - start: [9, 4], - end: [9, 9], - }, - ], - }) - }) +describe('ASL YAML context-aware validation', () => { + describe('Invalid YAML Input', () => { + test("Empty string doesn't throw errors", async () => { + await assert.doesNotReject(getValidations('')) }) - suite('Default of Choice state', () => { - test('Shows diagnostic for invalid state name', async () => { - await testValidations({ - json: documentChoiceInvalidDefault, - diagnostics: [ - { - message: MESSAGES.INVALID_DEFAULT, - start: [13, 15], - end: [13, 33], - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [18, 4], - end: [18, 16], - }, - ], - }) - }) - - test("Doesn't show Diagnostic for valid state name", async () => { - await testValidations({ - json: documentChoiceValidDefault, - diagnostics: [], - }) - }) - - test("Doesn't show Diagnostic when default property is absent", async () => { - await testValidations({ - json: documentChoiceNoDefault, - diagnostics: [], - }) - }) - - test("Doesn't show Diagnostic for valid state name when default state is declared before Choice state", async () => { - await testValidations({ - json: documentChoiceDefaultBeforeChoice, - diagnostics: [], - }) - }) + test("[] string doesn't throw type errors", async () => { + await assert.doesNotReject(getValidations('[]'), TypeError) }) - suite('StartAt', () => { - test("Shows Diagnostic for state name that doesn't exist", async () => { - await testValidations({ - json: documentStartAtInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_START_AT, - start: [1, 11], - end: [1, 16], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) - - test("Doesn't show Diagnostic for valid state name", async () => { - await testValidations({ - json: documentStartAtValid, - diagnostics: [], - }) - }) - - test("Shows Diagnostic for state name that doesn't exist in nested StartAt property", async () => { - await testValidations({ - json: documentStartAtNestedInvalid, - diagnostics: [ - { - message: MESSAGES.INVALID_START_AT, - start: [7, 19], - end: [7, 22], - }, - { - message: MESSAGES.INVALID_START_AT, - start: [21, 19], - end: [21, 23], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) + test('Shows diagnostic for duplicate key', async () => { + const message = YAML_PARSER_MESSAGES.DUPLICATE_KEY + + await testValidations({ + json: documentDuplicateKey, + diagnostics: [ + { + message, + start: [3, 2], + end: [3, 9], + }, + { + message, + start: [1, 2], + end: [1, 9], + }, + { + message, + start: [12, 4], + end: [12, 9], + }, + { + message, + start: [9, 4], + end: [9, 9], + }, + ], + }) + }) + }) + + describe('Default of Choice state', () => { + test('Shows diagnostic for invalid state name', async () => { + await testValidations({ + json: documentChoiceInvalidDefault, + diagnostics: [ + { + message: MESSAGES.INVALID_DEFAULT, + start: [13, 15], + end: [13, 33], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [18, 4], + end: [18, 16], + }, + ], + }) }) - suite('Next', () => { - test("Shows Diagnostic for state name that doesn't exist", async () => { - await testValidations({ - json: documentInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [5, 12], - end: [5, 16], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) - - test("Doesn't show Diagnostic for valid state name", async () => { - await testValidations({ - json: documentValidNext, - diagnostics: [], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) - - test("Shows Diagnostic for state name that doesn't exist in nested Next property", async () => { - await testValidations({ - json: documentInvalidNextNested, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [11, 20], - end: [11, 31], - }, - { - message: MESSAGES.INVALID_NEXT, - start: [31, 18], - end: [31, 29], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) - - test('Validates next property of the Choice state', async () => { - await testValidations({ - json: documentChoiceInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [17, 24], - end: [17, 26], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], - }) - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentChoiceValidDefault, + diagnostics: [], + }) }) - suite('Unreachable State', () => { - test('Shows diagnostic for an unreachable state', async () => { - await testValidations({ - json: documentUnreachableState, - diagnostics: [ - { - message: MESSAGES.UNREACHABLE_STATE, - start: [3, 4], - end: [3, 11], - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [12, 4], - end: [12, 14], - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [15, 4], - end: [15, 15], - }, - ], - filterMessages: [MESSAGES.NO_TERMINAL_STATE, MESSAGES.INVALID_START_AT], - }) - }) + test("Doesn't show Diagnostic when default property is absent", async () => { + await testValidations({ + json: documentChoiceNoDefault, + diagnostics: [], + }) + }) - test('Shows diagnostic for an unreachable state in nested list of states', async () => { - await testValidations({ - json: documentNestedUnreachableState, - diagnostics: [ - { - message: MESSAGES.UNREACHABLE_STATE, - start: [12, 12], - end: [12, 18], - }, - { - message: MESSAGES.UNREACHABLE_STATE, - start: [32, 10], - end: [32, 16], - }, - ], - filterMessages: [MESSAGES.NO_TERMINAL_STATE], - }) - }) + test("Doesn't show Diagnostic for valid state name when default state is declared before Choice state", async () => { + await testValidations({ + json: documentChoiceDefaultBeforeChoice, + diagnostics: [], + }) + }) + }) + + describe('StartAt', () => { + test("Shows Diagnostic for state name that doesn't exist", async () => { + await testValidations({ + json: documentStartAtInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_START_AT, + start: [1, 11], + end: [1, 16], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) }) - suite('Terminal State', () => { - test('Shows diagnostic for lack of terminal state', async () => { - await testValidations({ - json: documentNoTerminalState, - diagnostics: [ - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [2, 2], - end: [2, 8], - }, - ], - }) - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentStartAtValid, + diagnostics: [], + }) + }) - test('Shows diagnostic for lack of terminal state in nested list of states', async () => { - await testValidations({ - json: documentNestedNoTerminalState, - diagnostics: [ - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [16, 10], - end: [16, 16], - }, - { - message: MESSAGES.NO_TERMINAL_STATE, - start: [28, 8], - end: [28, 14], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test("Shows Diagnostic for state name that doesn't exist in nested StartAt property", async () => { + await testValidations({ + json: documentStartAtNestedInvalid, + diagnostics: [ + { + message: MESSAGES.INVALID_START_AT, + start: [7, 19], + end: [7, 22], + }, + { + message: MESSAGES.INVALID_START_AT, + start: [21, 19], + end: [21, 23], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) + }) + + describe('Next', () => { + test("Shows Diagnostic for state name that doesn't exist", async () => { + await testValidations({ + json: documentInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [5, 12], + end: [5, 16], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - test('Accepts "Succeed" and "Fail" state as terminal states', async () => { - await testValidations({ - json: documentSucceedFailTerminalState, - diagnostics: [], - }) - }) + test("Doesn't show Diagnostic for valid state name", async () => { + await testValidations({ + json: documentValidNext, + diagnostics: [], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) - test('No terminal state error when state referenced from next property of Choice state within Parallel state', async () => { - await testValidations({ - json: documentChoiceValidNext, - diagnostics: [], - }) - }) + test("Shows Diagnostic for state name that doesn't exist in nested Next property", async () => { + await testValidations({ + json: documentInvalidNextNested, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [11, 20], + end: [11, 31], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [31, 18], + end: [31, 29], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) }) - suite('Catch property of "Parallel" and "Task" state', async () => { - test('Does not show diagnostic on valid next property within Catch block of Task state', async () => { - await testValidations({ - json: documentTaskCatchTemplate, - diagnostics: [], - }) - }) + test('Validates next property of the Choice state', async () => { + await testValidations({ + json: documentChoiceInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [17, 24], + end: [17, 26], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, MESSAGES.NO_TERMINAL_STATE], + }) + }) + }) + + describe('Unreachable State', () => { + test('Shows diagnostic for an unreachable state', async () => { + await testValidations({ + json: documentUnreachableState, + diagnostics: [ + { + message: MESSAGES.UNREACHABLE_STATE, + start: [3, 4], + end: [3, 11], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [12, 4], + end: [12, 14], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [15, 4], + end: [15, 15], + }, + ], + filterMessages: [MESSAGES.NO_TERMINAL_STATE, MESSAGES.INVALID_START_AT], + }) + }) - test('Does not show diagnostic on valid next property within Catch block of Parallel state', async () => { - await testValidations({ - json: documentParallelCatchTemplate, - diagnostics: [], - }) - }) + test('Shows diagnostic for an unreachable state in nested list of states', async () => { + await testValidations({ + json: documentNestedUnreachableState, + diagnostics: [ + { + message: MESSAGES.UNREACHABLE_STATE, + start: [12, 12], + end: [12, 18], + }, + { + message: MESSAGES.UNREACHABLE_STATE, + start: [32, 10], + end: [32, 16], + }, + ], + filterMessages: [MESSAGES.NO_TERMINAL_STATE], + }) + }) + }) + + describe('Terminal State', () => { + test('Shows diagnostic for lack of terminal state', async () => { + await testValidations({ + json: documentNoTerminalState, + diagnostics: [ + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [2, 2], + end: [2, 8], + }, + ], + }) + }) - test('Does not show diagnostic on valid next property within Catch block of Map state', async () => { - await testValidations({ - json: documentMapCatchTemplate, - diagnostics: [], - }) - }) + test('Shows diagnostic for lack of terminal state in nested list of states', async () => { + await testValidations({ + json: documentNestedNoTerminalState, + diagnostics: [ + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [16, 10], + end: [16, 16], + }, + { + message: MESSAGES.NO_TERMINAL_STATE, + start: [28, 8], + end: [28, 14], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostics on invalid next property within Catch block of Task state', async () => { - await testValidations({ - json: documentTaskCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [13, 18], - end: [13, 30], - }, - { - message: MESSAGES.INVALID_NEXT, - start: [16, 18], - end: [16, 34], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test('Accepts "Succeed" and "Fail" state as terminal states', async () => { + await testValidations({ + json: documentSucceedFailTerminalState, + diagnostics: [], + }) + }) - test('Shows diagnostics on invalid next property within Catch block of Parallel', async () => { - await testValidations({ - json: documentParallelCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [9, 16], - end: [9, 24], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test('No terminal state error when state referenced from next property of Choice state within Parallel state', async () => { + await testValidations({ + json: documentChoiceValidNext, + diagnostics: [], + }) + }) + }) + + describe('Catch property of "Parallel" and "Task" state', () => { + test('Does not show diagnostic on valid next property within Catch block of Task state', async () => { + await testValidations({ + json: documentTaskCatchTemplate, + diagnostics: [], + }) + }) - test('Shows diagnostics on invalid next property within Catch block of Map', async () => { - await testValidations({ - json: documentMapCatchTemplateInvalidNext, - diagnostics: [ - { - message: MESSAGES.INVALID_NEXT, - start: [19, 16], - end: [19, 23], - }, - { - message: MESSAGES.INVALID_NEXT, - start: [25, 16], - end: [25, 24], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test('Does not show diagnostic on valid next property within Catch block of Parallel state', async () => { + await testValidations({ + json: documentParallelCatchTemplate, + diagnostics: [], + }) }) - suite('Additional properties that are not valid', async () => { - test('Shows diagnostics for additional invalid properties of a given state', async () => { - await testValidations({ - json: documentInvalidPropertiesState, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [7, 6], - end: [7, 23], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [8, 6], - end: [8, 23], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test('Does not show diagnostic on valid next property within Catch block of Map state', async () => { + await testValidations({ + json: documentMapCatchTemplate, + diagnostics: [], + }) + }) - test('Shows diagnostics for additional invalid properties within Catch block', async () => { - await testValidations({ - json: documentInvalidPropertiesCatch, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [10, 8], - end: [10, 18], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [14, 8], - end: [14, 18], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [15, 8], - end: [15, 20], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE], - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Task state', async () => { + await testValidations({ + json: documentTaskCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [13, 18], + end: [13, 30], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [16, 18], + end: [16, 34], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostics for additional invalid properties within Choice state', async () => { - await testValidations({ - json: documentInvalidPropertiesChoices, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [15, 8], - end: [15, 24], - }, - { - message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, - start: [13, 8], - end: [13, 20], - }, - { - message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, - start: [14, 8], - end: [14, 32], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [21, 10], - end: [21, 27], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [22, 10], - end: [22, 14], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [26, 10], - end: [26, 26], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [27, 10], - end: [27, 14], - }, - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [32, 8], - end: [32, 12], - }, - ], - filterMessages: [MESSAGES.UNREACHABLE_STATE, JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG], - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Parallel', async () => { + await testValidations({ + json: documentParallelCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [9, 16], + end: [9, 24], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostics for additional invalid properties within root of state machine', async () => { - await testValidations({ - json: documentInvalidPropertiesRoot, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [5, 2], - end: [5, 18], - }, - ], - }) - }) + test('Shows diagnostics on invalid next property within Catch block of Map', async () => { + await testValidations({ + json: documentMapCatchTemplateInvalidNext, + diagnostics: [ + { + message: MESSAGES.INVALID_NEXT, + start: [19, 16], + end: [19, 23], + }, + { + message: MESSAGES.INVALID_NEXT, + start: [25, 16], + end: [25, 24], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) + }) + + describe('Additional properties that are not valid', () => { + test('Shows diagnostics for additional invalid properties of a given state', async () => { + await testValidations({ + json: documentInvalidPropertiesState, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [7, 6], + end: [7, 23], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [8, 6], + end: [8, 23], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) + }) - test('Shows diagnostics for additional invalid properties within root of nested state machine', async () => { - await testValidations({ - json: documentInvalidPropertiesRootNested, - diagnostics: [ - { - message: MESSAGES.INVALID_PROPERTY_NAME, - start: [10, 8], - end: [10, 19], - }, - ], - }) - }) + test('Shows diagnostics for additional invalid properties within Catch block', async () => { + await testValidations({ + json: documentInvalidPropertiesCatch, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [10, 8], + end: [10, 18], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [14, 8], + end: [14, 18], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [15, 8], + end: [15, 20], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE], + }) }) - suite('Test validation of Resource arn for Task State', async () => { - test('Does not show diagnostic on invalid arn', async () => { - await testValidations({ - json: documentTaskInvalidArn, - diagnostics: [], - }) - }) + test('Shows diagnostics for additional invalid properties within Choice state', async () => { + await testValidations({ + json: documentInvalidPropertiesChoices, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [15, 8], + end: [15, 24], + }, + { + message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, + start: [13, 8], + end: [13, 20], + }, + { + message: MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES, + start: [14, 8], + end: [14, 32], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [21, 10], + end: [21, 27], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [22, 10], + end: [22, 14], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [26, 10], + end: [26, 26], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [27, 10], + end: [27, 14], + }, + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [32, 8], + end: [32, 12], + }, + ], + filterMessages: [MESSAGES.UNREACHABLE_STATE, JSON_SCHEMA_MULTIPLE_SCHEMAS_MSG], + }) + }) - test('Does not show diagnostic on valid variable substitution', async () => { - await testValidations({ - json: documentTaskValidVariableSubstitution, - diagnostics: [], - }) - }) + test('Shows diagnostics for additional invalid properties within root of state machine', async () => { + await testValidations({ + json: documentInvalidPropertiesRoot, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [5, 2], + end: [5, 18], + }, + ], + }) }) - suite('Test validation of Properties field', async () => { - test('Does not show diagnostics for valid JSON paths', async () => { - await testValidations({ - json: documentValidParametersJsonPath, - diagnostics: [], - }) - }) + test('Shows diagnostics for additional invalid properties within root of nested state machine', async () => { + await testValidations({ + json: documentInvalidPropertiesRootNested, + diagnostics: [ + { + message: MESSAGES.INVALID_PROPERTY_NAME, + start: [10, 8], + end: [10, 19], + }, + ], + }) + }) + }) + + describe('Test validation of Resource arn for Task State', () => { + test('Does not show diagnostic on invalid arn', async () => { + await testValidations({ + json: documentTaskInvalidArn, + diagnostics: [], + }) + }) - test('Does not show diagnostics for valid Intrinsic Functions', async () => { - await testValidations({ - json: documentValidParametersIntrinsicFunction, - diagnostics: [], - }) - }) + test('Does not show diagnostic on valid variable substitution', async () => { + await testValidations({ + json: documentTaskValidVariableSubstitution, + diagnostics: [], + }) + }) + }) + + describe('Test validation of Properties field', () => { + test('Does not show diagnostics for valid JSON paths', async () => { + await testValidations({ + json: documentValidParametersJsonPath, + diagnostics: [], + }) + }) - test('Does not show diagnostics for Parameters array', async () => { - await testValidations({ - json: documentParametersArray, - diagnostics: [], - }) - }) + test('Does not show diagnostics for valid Intrinsic Functions', async () => { + await testValidations({ + json: documentValidParametersIntrinsicFunction, + diagnostics: [], + }) + }) - test('Does not show diagnostics for Parameters boolean', async () => { - await testValidations({ - json: documentParametersBoolean, - diagnostics: [], - }) - }) + test('Does not show diagnostics for Parameters array', async () => { + await testValidations({ + json: documentParametersArray, + diagnostics: [], + }) + }) - test('Does not show diagnostics for Parameters null', async () => { - await testValidations({ - json: documentParametersNull, - diagnostics: [], - }) - }) + test('Does not show diagnostics for Parameters boolean', async () => { + await testValidations({ + json: documentParametersBoolean, + diagnostics: [], + }) + }) - test('Does not show diagnostics for Parameters number', async () => { - await testValidations({ - json: documentParametersNumber, - diagnostics: [], - }) - }) + test('Does not show diagnostics for Parameters null', async () => { + await testValidations({ + json: documentParametersNull, + diagnostics: [], + }) + }) - test('Does not show diagnostics for Parameters string', async () => { - await testValidations({ - json: documentParametersString, - diagnostics: [], - }) - }) + test('Does not show diagnostics for Parameters number', async () => { + await testValidations({ + json: documentParametersNumber, + diagnostics: [], + }) + }) - test('Shows diagnostics for invalid JSON paths', async () => { - await testValidations({ - json: documentInvalidParametersJsonPath, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [9, 18], - end: [9, 18], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 28], - end: [12, 30], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 28], - end: [13, 32], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 21], - end: [14, 28], - }, - ], - }) - }) + test('Does not show diagnostics for Parameters string', async () => { + await testValidations({ + json: documentParametersString, + diagnostics: [], + }) + }) - test('Shows diagnostics for invalid Intrinsic Functions', async () => { - await testValidations({ - json: documentInvalidParametersIntrinsicFunction, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [9, 20], - end: [9, 72], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 20], - end: [10, 43], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [11, 20], - end: [11, 52], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 20], - end: [12, 30], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 20], - end: [13, 37], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 20], - end: [14, 38], - }, - ], - }) - }) + test('Shows diagnostics for invalid JSON paths', async () => { + await testValidations({ + json: documentInvalidParametersJsonPath, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [9, 18], + end: [9, 18], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 28], + end: [12, 30], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 28], + end: [13, 32], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 21], + end: [14, 28], + }, + ], + }) }) - suite('ASL Improvements', async () => { - test('Does not show diagnostics for valid document containing ASL Improvements', async () => { - await testValidations({ - json: documentValidAslImprovements, - diagnostics: [], - }) - }) + test('Shows diagnostics for invalid Intrinsic Functions', async () => { + await testValidations({ + json: documentInvalidParametersIntrinsicFunction, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [9, 20], + end: [9, 72], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 20], + end: [10, 43], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [11, 20], + end: [11, 52], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 20], + end: [12, 30], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 20], + end: [13, 37], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 20], + end: [14, 38], + }, + ], + }) + }) + }) + + describe('ASL Improvements', () => { + test('Does not show diagnostics for valid document containing ASL Improvements', async () => { + await testValidations({ + json: documentValidAslImprovements, + diagnostics: [], + }) + }) - suite('Test validation of ResultSelector field', async () => { - test('Does not show diagnostics for valid JSON paths', async () => { - await testValidations({ - json: documentValidResultSelectorJsonPath, - diagnostics: [], - }) - }) - - test('Does not show diagnostics for valid Intrinsic Functions', async () => { - await testValidations({ - json: documentValidResultSelectorIntrinsicFunction, - diagnostics: [], - }) - }) - - test('Shows diagnostics for invalid JSON paths', async () => { - await testValidations({ - json: documentInvalidResultSelectorJsonPath, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [9, 18], - end: [9, 18], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 28], - end: [12, 30], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 28], - end: [13, 32], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 21], - end: [14, 28], - }, - ], - }) - }) - - test('Shows diagnostics for invalid Intrinsic Functions', async () => { - await testValidations({ - json: documentInvalidResultSelectorIntrinsicFunction, - diagnostics: [ - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [9, 20], - end: [9, 72], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [10, 20], - end: [10, 43], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [11, 20], - end: [11, 52], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [12, 20], - end: [12, 30], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [13, 20], - end: [13, 37], - }, - { - message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, - start: [14, 20], - end: [14, 39], - }, - ], - }) - }) - }) + describe('Test validation of ResultSelector field', () => { + test('Does not show diagnostics for valid JSON paths', async () => { + await testValidations({ + json: documentValidResultSelectorJsonPath, + diagnostics: [], + }) + }) + + test('Does not show diagnostics for valid Intrinsic Functions', async () => { + await testValidations({ + json: documentValidResultSelectorIntrinsicFunction, + diagnostics: [], + }) + }) + + test('Shows diagnostics for invalid JSON paths', async () => { + await testValidations({ + json: documentInvalidResultSelectorJsonPath, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [9, 18], + end: [9, 18], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 28], + end: [12, 30], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 28], + end: [13, 32], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 21], + end: [14, 28], + }, + ], + }) + }) + + test('Shows diagnostics for invalid Intrinsic Functions', async () => { + await testValidations({ + json: documentInvalidResultSelectorIntrinsicFunction, + diagnostics: [ + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [9, 20], + end: [9, 72], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [10, 20], + end: [10, 43], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [11, 20], + end: [11, 52], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [12, 20], + end: [12, 30], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [13, 20], + end: [13, 37], + }, + { + message: MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, + start: [14, 20], + end: [14, 39], + }, + ], + }) + }) }) + }) }) diff --git a/src/utils/astUtilityFunctions.ts b/src/utils/astUtilityFunctions.ts index 6f51e62dc..366c6d937 100644 --- a/src/utils/astUtilityFunctions.ts +++ b/src/utils/astUtilityFunctions.ts @@ -3,121 +3,129 @@ * SPDX-License-Identifier: MIT */ -import { ArrayASTNode, ASTNode, JSONDocument, LanguageServiceParams, ObjectASTNode, PropertyASTNode, StringASTNode } from 'vscode-json-languageservice' +import { + ArrayASTNode, + ASTNode, + JSONDocument, + LanguageServiceParams, + ObjectASTNode, + PropertyASTNode, + StringASTNode, +} from 'vscode-json-languageservice' import { Position } from 'vscode-languageserver-types' export interface ASTTree extends JSONDocument { - root: ASTNode + root: ASTNode } export interface ASLOptions { - ignoreColonOffset?: boolean - shouldShowStateSnippets?: boolean - shouldShowErrorSnippets?: { - retry: boolean - catch: boolean - } + ignoreColonOffset?: boolean + shouldShowStateSnippets?: boolean + shouldShowErrorSnippets?: { + retry: boolean + catch: boolean + } } export interface CompleteStateNameOptions { - shouldAddLeftQuote?: boolean, - shouldAddRightQuote?: boolean, - shouldAddLeadingSpace?: boolean, - shoudlAddTrailingComma?: boolean + shouldAddLeftQuote?: boolean + shouldAddRightQuote?: boolean + shouldAddLeadingSpace?: boolean + shoudlAddTrailingComma?: boolean } export interface ProcessYamlDocForCompletionOutput { - modifiedDocText: string, - tempPositionForCompletions: Position, - startPositionForInsertion: Position, - endPositionForInsertion: Position, - shouldPrependSpace: boolean + modifiedDocText: string + tempPositionForCompletions: Position + startPositionForInsertion: Position + endPositionForInsertion: Position + shouldPrependSpace: boolean } export function isStringNode(node: ASTNode): node is StringASTNode { - return node.type === 'string' + return node.type === 'string' } export function isPropertyNode(node: ASTNode): node is PropertyASTNode { - return node.type === 'property' + return node.type === 'property' } export function isObjectNode(node: ASTNode): node is ObjectASTNode { - return node.type === 'object' + return node.type === 'object' } export function isArrayNode(node: ASTNode): node is ArrayASTNode { - return node.type === 'array' + return node.type === 'array' } export function findPropChildByName(rootNode: ObjectASTNode, name: string): PropertyASTNode | undefined { - return rootNode.properties.find(propNode => propNode.keyNode.value === name) + return rootNode.properties.find((propNode) => propNode.keyNode.value === name) } function isLocationInNodeRange(node: ASTNode, loc: number) { - return loc >= node.offset && loc <= node.offset + node.length + return loc >= node.offset && loc <= node.offset + node.length } export function isChildOfStates(node: ASTNode): boolean { - return ( - !!node.parent - && isPropertyNode(node.parent) - && node.parent.keyNode.value === 'States' - ) + return !!node.parent && isPropertyNode(node.parent) && node.parent.keyNode.value === 'States' } export function insideStateNode(node: ASTNode): boolean { - const greatGrandParentNode = node.parent?.parent?.parent + const greatGrandParentNode = node.parent?.parent?.parent - return ( - !!greatGrandParentNode - && isPropertyNode(greatGrandParentNode) - && greatGrandParentNode.keyNode?.value === 'States' - ) + return ( + !!greatGrandParentNode && isPropertyNode(greatGrandParentNode) && greatGrandParentNode.keyNode?.value === 'States' + ) } /** Finds the relevant node at a given location in respective json string */ export function findNodeAtLocation(rootNode: ASTNode, loc: number): ASTNode | undefined { + if (isLocationInNodeRange(rootNode, loc)) { + const { children } = rootNode - if (isLocationInNodeRange(rootNode, loc)) { - const { children } = rootNode - - if (children?.length) { - const nodeInRange = children.find(node => isLocationInNodeRange(node, loc)) + if (children?.length) { + const nodeInRange = children.find((node) => isLocationInNodeRange(node, loc)) - if (nodeInRange) { - return findNodeAtLocation(nodeInRange, loc) - } - } - - return rootNode + if (nodeInRange) { + return findNodeAtLocation(nodeInRange, loc) + } } + + return rootNode + } } /** Finds the closest ancestor property node named "States" */ export function findClosestAncestorStateNode(node: ASTNode): PropertyASTNode | undefined { - if (isPropertyNode(node) && (node as PropertyASTNode).keyNode.value === 'States') { - return node - } else if (!node.parent) { - return undefined - } + if (isPropertyNode(node) && (node as PropertyASTNode).keyNode.value === 'States') { + return node + } else if (!node.parent) { + return undefined + } - return findClosestAncestorStateNode(node.parent!) + return findClosestAncestorStateNode(node.parent!) } /** Extracts the list of state names from given property node named "States" */ export function getListOfStateNamesFromStateNode(node: PropertyASTNode, ignoreColonOffset = false): string[] { - const nodeName = node.keyNode.value + const nodeName = node.keyNode.value - if (nodeName === 'States') { - // The first object node will contain property nodes containing state names - const objNode = node.children.find(isObjectNode) + if (nodeName === 'States') { + // The first object node will contain property nodes containing state names + const objNode = node.children.find(isObjectNode) - return objNode?.children + return ( + objNode?.children // Filter out property nodes that do not have colonOffset. They are invalid. - .filter(childNode => isPropertyNode(childNode) && childNode.colonOffset && (ignoreColonOffset || (!ignoreColonOffset && childNode.colonOffset >= 0))) - .map(propNode => (propNode as PropertyASTNode).keyNode.value) ?? [] - } else { - throw new Error('Not a state name property node') - } + .filter( + (childNode) => + isPropertyNode(childNode) && + childNode.colonOffset && + (ignoreColonOffset || (!ignoreColonOffset && childNode.colonOffset >= 0)), + ) + .map((propNode) => (propNode as PropertyASTNode).keyNode.value) ?? [] + ) + } else { + throw new Error('Not a state name property node') + } } diff --git a/src/validation/utils/getDiagnosticsForNode.ts b/src/validation/utils/getDiagnosticsForNode.ts index 5b22b7872..bbd9a93ae 100644 --- a/src/validation/utils/getDiagnosticsForNode.ts +++ b/src/validation/utils/getDiagnosticsForNode.ts @@ -4,18 +4,15 @@ */ import { - ArrayASTNode, - ASTNode, - Diagnostic, - ObjectASTNode, - PropertyASTNode, - TextDocument, -} from 'vscode-json-languageservice'; + ArrayASTNode, + ASTNode, + Diagnostic, + ObjectASTNode, + PropertyASTNode, + TextDocument, +} from 'vscode-json-languageservice' -import { - isArrayNode, - isObjectNode, -} from '../../utils/astUtilityFunctions' +import { isArrayNode, isObjectNode } from '../../utils/astUtilityFunctions' import getPropertyNodeDiagnostic from './getPropertyNodeDiagnostic' @@ -24,133 +21,123 @@ import schema from '../validationSchema' const referenceTypes = schema.ReferenceTypes -interface SchemaObject { [property: string]: SchemaObject | boolean | string } +interface SchemaObject { + [property: string]: SchemaObject | boolean | string +} function isObject(obj: any): obj is object { - return obj === Object(obj); + return obj === Object(obj) } -function getDiagnosticsForArrayOfSchema( - rootNode: ArrayASTNode, - document: TextDocument, - arraySchema: string, -) { - const newSchemaPart = referenceTypes[arraySchema] as SchemaObject - let diagnostics: Diagnostic[] = [] - - if (isObject(newSchemaPart)) { - rootNode.items.forEach(itemNode => { - if (isObjectNode(itemNode)) { - diagnostics = diagnostics.concat( - getDiagnosticsForNode(itemNode, document, newSchemaPart) - ) - } - }) - } +function getDiagnosticsForArrayOfSchema(rootNode: ArrayASTNode, document: TextDocument, arraySchema: string) { + const newSchemaPart = referenceTypes[arraySchema] as SchemaObject + let diagnostics: Diagnostic[] = [] + + if (isObject(newSchemaPart)) { + rootNode.items.forEach((itemNode) => { + if (isObjectNode(itemNode)) { + diagnostics = diagnostics.concat(getDiagnosticsForNode(itemNode, document, newSchemaPart)) + } + }) + } - return diagnostics + return diagnostics } function getDiagnosticsForOneOfSchema( - rootNode: ObjectASTNode, - document: TextDocument, - schemaPart: SchemaObject, - oneOfSchema: string, + rootNode: ObjectASTNode, + document: TextDocument, + schemaPart: SchemaObject, + oneOfSchema: string, ) { - const mutuallyExclusiveProperties: unknown = referenceTypes[oneOfSchema] - const mutuallyExclusivePropertiesPresent: { propNode: PropertyASTNode, schemaValue: unknown }[] = [] - let diagnostics: Diagnostic[] = [] - - rootNode.properties.forEach(prop => { - if (!isObject(mutuallyExclusiveProperties)) { - return - } - - const propName = prop.keyNode.value - const propertySchema = mutuallyExclusiveProperties[propName] - - // If the property is one of mutually exclusive properties - if (propertySchema) { - mutuallyExclusivePropertiesPresent.push({ propNode: prop, schemaValue: propertySchema}) - // If the property is neither in the set nor in the schema props - } else if (!schemaPart[propName]) { - diagnostics.push( - getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME) - ) - } - }) + const mutuallyExclusiveProperties: unknown = referenceTypes[oneOfSchema] + const mutuallyExclusivePropertiesPresent: { propNode: PropertyASTNode; schemaValue: unknown }[] = [] + let diagnostics: Diagnostic[] = [] + + rootNode.properties.forEach((prop) => { + if (!isObject(mutuallyExclusiveProperties)) { + return + } + + const propName = prop.keyNode.value + const propertySchema = mutuallyExclusiveProperties[propName] - // if there is more than one item mark them all as invalid - if (mutuallyExclusivePropertiesPresent.length > 1) { - mutuallyExclusivePropertiesPresent.forEach(oneOfProp => { - diagnostics.push( - getPropertyNodeDiagnostic(oneOfProp.propNode, document, MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES) - ) - }) + // If the property is one of mutually exclusive properties + if (propertySchema) { + mutuallyExclusivePropertiesPresent.push({ propNode: prop, schemaValue: propertySchema }) + // If the property is neither in the set nor in the schema props + } else if (!schemaPart[propName]) { + diagnostics.push(getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME)) + } + }) + + // if there is more than one item mark them all as invalid + if (mutuallyExclusivePropertiesPresent.length > 1) { + mutuallyExclusivePropertiesPresent.forEach((oneOfProp) => { + diagnostics.push( + getPropertyNodeDiagnostic(oneOfProp.propNode, document, MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES), + ) + }) // if there is only one item and it is an object // recursively continue on with validation - } else if (mutuallyExclusivePropertiesPresent.length) { - const { schemaValue, propNode } = mutuallyExclusivePropertiesPresent[0] - const { valueNode } = propNode - if (valueNode && isObject(schemaValue)) { - diagnostics = diagnostics.concat( - getDiagnosticsForNode(valueNode, document, schemaValue as SchemaObject) - ) - } + } else if (mutuallyExclusivePropertiesPresent.length) { + const { schemaValue, propNode } = mutuallyExclusivePropertiesPresent[0] + const { valueNode } = propNode + if (valueNode && isObject(schemaValue)) { + diagnostics = diagnostics.concat(getDiagnosticsForNode(valueNode, document, schemaValue as SchemaObject)) } + } - return diagnostics + return diagnostics } -function getDiagnosticsForRegularProperties( - rootNode: ObjectASTNode, - document: TextDocument, - schemaPart: SchemaObject, -) { - const diagnostics: Diagnostic[] = [] +function getDiagnosticsForRegularProperties(rootNode: ObjectASTNode, document: TextDocument, schemaPart: SchemaObject) { + const diagnostics: Diagnostic[] = [] - if (schemaPart.properties) { - schemaPart = schemaPart.properties as SchemaObject - } + if (schemaPart.properties) { + schemaPart = schemaPart.properties as SchemaObject + } - rootNode.properties.forEach(prop => { - const propName = prop.keyNode.value - const propertySchema: unknown = schemaPart[propName] - - if (!propertySchema) { - diagnostics.push( - getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME) - ) - } else if (prop.valueNode && isObject(propertySchema)) { - // evaluate nested schema - diagnostics.push(...getDiagnosticsForNode(prop.valueNode, document, propertySchema as SchemaObject)) - } - }) + rootNode.properties.forEach((prop) => { + const propName = prop.keyNode.value + const propertySchema: unknown = schemaPart[propName] - return diagnostics -} + if (!propertySchema) { + diagnostics.push(getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME)) + } else if (prop.valueNode && isObject(propertySchema)) { + // evaluate nested schema + diagnostics.push(...getDiagnosticsForNode(prop.valueNode, document, propertySchema as SchemaObject)) + } + }) -export default function getDiagnosticsForNode(rootNode: ASTNode, document: TextDocument, schemaPart: SchemaObject): Diagnostic[] { - const arrayOfType = schemaPart['Fn:ArrayOf'] - const oneOfType = schemaPart['Fn:OneOf'] - const valueOfType = schemaPart['Fn:ValueOf'] + return diagnostics +} - // Fn:ArrayOf - // if it contains Fn:ArrayOf property all the other values will be ignored - if (typeof arrayOfType === 'string' && isArrayNode(rootNode)) { - return getDiagnosticsForArrayOfSchema(rootNode, document, arrayOfType) +export default function getDiagnosticsForNode( + rootNode: ASTNode, + document: TextDocument, + schemaPart: SchemaObject, +): Diagnostic[] { + const arrayOfType = schemaPart['Fn:ArrayOf'] + const oneOfType = schemaPart['Fn:OneOf'] + const valueOfType = schemaPart['Fn:ValueOf'] + + // Fn:ArrayOf + // if it contains Fn:ArrayOf property all the other values will be ignored + if (typeof arrayOfType === 'string' && isArrayNode(rootNode)) { + return getDiagnosticsForArrayOfSchema(rootNode, document, arrayOfType) // Fn:OneOf - } else if (typeof oneOfType === 'string' && isObjectNode(rootNode)) { - return getDiagnosticsForOneOfSchema(rootNode, document, schemaPart, oneOfType) + } else if (typeof oneOfType === 'string' && isObjectNode(rootNode)) { + return getDiagnosticsForOneOfSchema(rootNode, document, schemaPart, oneOfType) // Fn:ValueOf - } else if (typeof valueOfType === 'string' && isObjectNode(rootNode)) { - const newSchemaPart = referenceTypes[valueOfType] as SchemaObject + } else if (typeof valueOfType === 'string' && isObjectNode(rootNode)) { + const newSchemaPart = referenceTypes[valueOfType] as SchemaObject - return getDiagnosticsForNode(rootNode, document, newSchemaPart) + return getDiagnosticsForNode(rootNode, document, newSchemaPart) // Regular properties - } else if (isObjectNode(rootNode)) { - return getDiagnosticsForRegularProperties(rootNode, document, schemaPart) - } + } else if (isObjectNode(rootNode)) { + return getDiagnosticsForRegularProperties(rootNode, document, schemaPart) + } - return [] + return [] } diff --git a/src/validation/utils/getPropertyNodeDiagnostic.ts b/src/validation/utils/getPropertyNodeDiagnostic.ts index 85bf77779..34cab5d22 100644 --- a/src/validation/utils/getPropertyNodeDiagnostic.ts +++ b/src/validation/utils/getPropertyNodeDiagnostic.ts @@ -3,17 +3,15 @@ * SPDX-License-Identifier: MIT */ -import { - Diagnostic, - DiagnosticSeverity, - PropertyASTNode, - Range, - TextDocument, -} from 'vscode-json-languageservice' +import { Diagnostic, DiagnosticSeverity, PropertyASTNode, Range, TextDocument } from 'vscode-json-languageservice' -export default function getPropertyNodeDiagnostic(propNode: PropertyASTNode, document: TextDocument, message: string): Diagnostic { - const { length, offset } = propNode.keyNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) +export default function getPropertyNodeDiagnostic( + propNode: PropertyASTNode, + document: TextDocument, + message: string, +): Diagnostic { + const { length, offset } = propNode.keyNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) - return Diagnostic.create(range, message, DiagnosticSeverity.Error) + return Diagnostic.create(range, message, DiagnosticSeverity.Error) } diff --git a/src/validation/validateProperties.ts b/src/validation/validateProperties.ts index a5efbe51d..11c5be63d 100644 --- a/src/validation/validateProperties.ts +++ b/src/validation/validateProperties.ts @@ -3,42 +3,34 @@ * SPDX-License-Identifier: MIT */ -import { - Diagnostic, - ObjectASTNode, - TextDocument, -} from 'vscode-json-languageservice'; +import { Diagnostic, ObjectASTNode, TextDocument } from 'vscode-json-languageservice' -import { - findPropChildByName, -} from '../utils/astUtilityFunctions' +import { findPropChildByName } from '../utils/astUtilityFunctions' import getDiagnosticsForNode from './utils/getDiagnosticsForNode' import schema from './validationSchema' -export default function(oneStateValueNode: ObjectASTNode, document: TextDocument): Diagnostic[] { - // Get the type of state - const stateType = findPropChildByName(oneStateValueNode, 'Type')?.valueNode?.value - const diagnostics: Diagnostic[] = [] +export default function (oneStateValueNode: ObjectASTNode, document: TextDocument): Diagnostic[] { + // Get the type of state + const stateType = findPropChildByName(oneStateValueNode, 'Type')?.valueNode?.value + const diagnostics: Diagnostic[] = [] - if (typeof stateType === 'string') { - // tslint:disable-next-line no-unsafe-any - const hasCommonProperties = !!schema.StateTypes[stateType]?.hasCommonProperties - // tslint:disable-next-line no-unsafe-any - const stateProperties = schema.StateTypes[stateType]?.Properties + if (typeof stateType === 'string') { + // tslint:disable-next-line no-unsafe-any + const hasCommonProperties = !!schema.StateTypes[stateType]?.hasCommonProperties + // tslint:disable-next-line no-unsafe-any + const stateProperties = schema.StateTypes[stateType]?.Properties - if (!stateProperties) { - return [] - } + if (!stateProperties) { + return [] + } - const allowedProperties = hasCommonProperties - ? { ...schema.Common, ...stateProperties } - : { ...stateProperties } + const allowedProperties = hasCommonProperties ? { ...schema.Common, ...stateProperties } : { ...stateProperties } - // tslint:disable-next-line no-unsafe-any - diagnostics.push(...getDiagnosticsForNode(oneStateValueNode, document, allowedProperties)) - } + // tslint:disable-next-line no-unsafe-any + diagnostics.push(...getDiagnosticsForNode(oneStateValueNode, document, allowedProperties)) + } - return diagnostics + return diagnostics } diff --git a/src/validation/validateStates.ts b/src/validation/validateStates.ts index c1c00d29b..453b3576d 100755 --- a/src/validation/validateStates.ts +++ b/src/validation/validateStates.ts @@ -6,20 +6,20 @@ /* tslint:disable:cyclomatic-complexity */ import { - Diagnostic, - DiagnosticSeverity, - ObjectASTNode, - PropertyASTNode, - Range, - TextDocument, + Diagnostic, + DiagnosticSeverity, + ObjectASTNode, + PropertyASTNode, + Range, + TextDocument, } from 'vscode-json-languageservice' import { - ASLOptions, - findPropChildByName, - getListOfStateNamesFromStateNode, - isArrayNode, - isObjectNode, + ASLOptions, + findPropChildByName, + getListOfStateNamesFromStateNode, + isArrayNode, + isObjectNode, } from '../utils/astUtilityFunctions' import { MESSAGES } from '../constants/diagnosticStrings' @@ -27,42 +27,44 @@ import getPropertyNodeDiagnostic from './utils/getPropertyNodeDiagnostic' import validateProperties from './validateProperties' import schema from './validationSchema' -const INTRINSIC_FUNC_REGEX = /^States\.(?:(JsonToString|Format|StringToJson|Array|ArrayContains|ArrayGetItem|ArrayLength|ArrayPartition|ArrayRange|ArrayUnique|Base64Decode|Base64Encode|Hash|JsonMerge|MathAdd|MathRandom|StringSplit)\(.+\)|(UUID)\(\))$/s +const INTRINSIC_FUNC_REGEX = + /^States\.(?:(JsonToString|Format|StringToJson|Array|ArrayContains|ArrayGetItem|ArrayLength|ArrayPartition|ArrayRange|ArrayUnique|Base64Decode|Base64Encode|Hash|JsonMerge|MathAdd|MathRandom|StringSplit)\(.+\)|(UUID)\(\))$/s // update src/constants/diagnosticStrings INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY when you change this regex. -const INTRINSIC_FUNC_REGEX_STRING_RETURN = /^States\.(?:(JsonToString|Format|ArrayGetItem|Base64Decode|Base64Encode|Hash)\(.+\)|(UUID)\(\))$/s +const INTRINSIC_FUNC_REGEX_STRING_RETURN = + /^States\.(?:(JsonToString|Format|ArrayGetItem|Base64Decode|Base64Encode|Hash)\(.+\)|(UUID)\(\))$/s export const enum RootType { - Root = 0, - Map = 1, - Parallel = 2 + Root = 0, + Map = 1, + Parallel = 2, } function stateNameExistsInPropNode( - nextPropNode: PropertyASTNode, - stateNames: string[], - document: TextDocument, - message: string + nextPropNode: PropertyASTNode, + stateNames: string[], + document: TextDocument, + message: string, ): Diagnostic | void { - const stateNameExists = (stateNames as unknown[]).includes(nextPropNode?.valueNode?.value) + const stateNameExists = (stateNames as unknown[]).includes(nextPropNode?.valueNode?.value) - if (nextPropNode && nextPropNode.valueNode && !stateNameExists) { - const { length, offset } = nextPropNode.valueNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + if (nextPropNode && nextPropNode.valueNode && !stateNameExists) { + const { length, offset } = nextPropNode.valueNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) - return Diagnostic.create(range, message, DiagnosticSeverity.Error) - } + return Diagnostic.create(range, message, DiagnosticSeverity.Error) + } } interface ValidateCatchResult { - diagnostics: Diagnostic[], - reachedStates: { [ix: string]: boolean } + diagnostics: Diagnostic[] + reachedStates: { [ix: string]: boolean } } function isIntrinsicFunction(text: string): boolean { - const intrinsicText = text.trimRight() + const intrinsicText = text.trimRight() - return INTRINSIC_FUNC_REGEX.test(intrinsicText) + return INTRINSIC_FUNC_REGEX.test(intrinsicText) } /** @@ -72,13 +74,13 @@ function isIntrinsicFunction(text: string): boolean { * @returns True if text is an Intrinsic Function that returns a string. */ function isIntrinsicFunctionWithStringReturn(text: string): boolean { - const intrinsicText = text.trimEnd() + const intrinsicText = text.trimEnd() - return INTRINSIC_FUNC_REGEX_STRING_RETURN.test(intrinsicText) + return INTRINSIC_FUNC_REGEX_STRING_RETURN.test(intrinsicText) } function isJsonPath(text: string) { - return text.startsWith('$') + return text.startsWith('$') } /** @@ -89,18 +91,20 @@ function isJsonPath(text: string) { * @returns A diagnostics array of any validation issues. */ function validatePathField(pathField: PropertyASTNode, document: TextDocument): Diagnostic[] { - const diagnostics: Diagnostic[] = [] - const valueNode = pathField.valueNode - const propValue = valueNode && valueNode.value + const diagnostics: Diagnostic[] = [] + const valueNode = pathField.valueNode + const propValue = valueNode && valueNode.value - if (typeof propValue !== 'string' || !(isJsonPath(propValue) || isIntrinsicFunctionWithStringReturn(propValue))) { - const { length, offset } = pathField - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + if (typeof propValue !== 'string' || !(isJsonPath(propValue) || isIntrinsicFunctionWithStringReturn(propValue))) { + const { length, offset } = pathField + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) - diagnostics.push(Diagnostic.create(range, MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, DiagnosticSeverity.Error)) - } + diagnostics.push( + Diagnostic.create(range, MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC_STRING_ONLY, DiagnosticSeverity.Error), + ) + } - return diagnostics + return diagnostics } /** @@ -118,279 +122,304 @@ function validatePathField(pathField: PropertyASTNode, document: TextDocument): * @param document The document to evaluate * @returns A diagnostics array of any validation issues. */ -function validateExclusivePathTypeField(stateNode: ObjectASTNode, - propertyName: string, - document: TextDocument): Diagnostic[] { - let diagnostics: Diagnostic[] = [] - - const pathFieldName = `${propertyName}Path` - const pathNode = findPropChildByName(stateNode, pathFieldName) - - if (pathNode) { - const validatePathFieldDiagnostics = validatePathField(pathNode, document) - diagnostics = diagnostics.concat(validatePathFieldDiagnostics) - - // Myfield and MyfieldPath are mutually exclusive - if (findPropChildByName(stateNode, propertyName)) { - const { length, offset } = pathNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) - const errorMessage = `You cannot set both ${propertyName} and ${pathFieldName} at the same time.` - diagnostics.push(Diagnostic.create(range, errorMessage, DiagnosticSeverity.Error)) - } +function validateExclusivePathTypeField( + stateNode: ObjectASTNode, + propertyName: string, + document: TextDocument, +): Diagnostic[] { + let diagnostics: Diagnostic[] = [] + + const pathFieldName = `${propertyName}Path` + const pathNode = findPropChildByName(stateNode, pathFieldName) + + if (pathNode) { + const validatePathFieldDiagnostics = validatePathField(pathNode, document) + diagnostics = diagnostics.concat(validatePathFieldDiagnostics) + + // Myfield and MyfieldPath are mutually exclusive + if (findPropChildByName(stateNode, propertyName)) { + const { length, offset } = pathNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + const errorMessage = `You cannot set both ${propertyName} and ${pathFieldName} at the same time.` + diagnostics.push(Diagnostic.create(range, errorMessage, DiagnosticSeverity.Error)) } + } - return diagnostics + return diagnostics } function validateParameters(parametersPropNode: PropertyASTNode, document: TextDocument): Diagnostic[] { - let diagnostics: Diagnostic[] = [] - const valueNode = parametersPropNode.valueNode + let diagnostics: Diagnostic[] = [] + const valueNode = parametersPropNode.valueNode - if (valueNode && isObjectNode(valueNode)) { - valueNode.properties.forEach(prop => { - if (prop.valueNode && prop.keyNode.value.endsWith('.$')) { - const propValue = prop.valueNode.value + if (valueNode && isObjectNode(valueNode)) { + valueNode.properties.forEach((prop) => { + if (prop.valueNode && prop.keyNode.value.endsWith('.$')) { + const propValue = prop.valueNode.value - if (typeof propValue !== 'string' || !(isJsonPath(propValue) || isIntrinsicFunction(propValue))) { - const { length, offset } = prop.valueNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + if (typeof propValue !== 'string' || !(isJsonPath(propValue) || isIntrinsicFunction(propValue))) { + const { length, offset } = prop.valueNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) - diagnostics.push(Diagnostic.create(range, MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, DiagnosticSeverity.Error)) - } - } else if (prop.valueNode && isObjectNode(prop.valueNode)) { - diagnostics = diagnostics.concat(validateParameters(prop, document)) - } - }); - } + diagnostics.push(Diagnostic.create(range, MESSAGES.INVALID_JSON_PATH_OR_INTRINSIC, DiagnosticSeverity.Error)) + } + } else if (prop.valueNode && isObjectNode(prop.valueNode)) { + diagnostics = diagnostics.concat(validateParameters(prop, document)) + } + }) + } - return diagnostics + return diagnostics } // Validates next property within array of objects -function validateArrayNext(arrayPropName: string, oneStateValueNode: ObjectASTNode, stateNames: string[], document: TextDocument): ValidateCatchResult { - const arrayPropNode = findPropChildByName(oneStateValueNode, arrayPropName) - const diagnostics: Diagnostic[] = [] - const reachedStates: { [ix: string]: boolean } = {} - - if (arrayPropNode?.valueNode && isArrayNode(arrayPropNode.valueNode)) { - arrayPropNode.valueNode.items.forEach(item => { - if (isObjectNode(item)) { - const nextProp = findPropChildByName(item, 'Next') - - if (nextProp) { - const nextPropValue = nextProp.valueNode?.value - const diagnostic = stateNameExistsInPropNode(nextProp, stateNames, document, MESSAGES.INVALID_NEXT) - - if (diagnostic) { - diagnostics.push(diagnostic) - } else if (typeof nextPropValue === 'string') { - reachedStates[nextPropValue] = true - } - } - } - }) - } +function validateArrayNext( + arrayPropName: string, + oneStateValueNode: ObjectASTNode, + stateNames: string[], + document: TextDocument, +): ValidateCatchResult { + const arrayPropNode = findPropChildByName(oneStateValueNode, arrayPropName) + const diagnostics: Diagnostic[] = [] + const reachedStates: { [ix: string]: boolean } = {} + + if (arrayPropNode?.valueNode && isArrayNode(arrayPropNode.valueNode)) { + arrayPropNode.valueNode.items.forEach((item) => { + if (isObjectNode(item)) { + const nextProp = findPropChildByName(item, 'Next') + + if (nextProp) { + const nextPropValue = nextProp.valueNode?.value + const diagnostic = stateNameExistsInPropNode(nextProp, stateNames, document, MESSAGES.INVALID_NEXT) + + if (diagnostic) { + diagnostics.push(diagnostic) + } else if (typeof nextPropValue === 'string') { + reachedStates[nextPropValue] = true + } + } + } + }) + } - return { diagnostics, reachedStates } + return { diagnostics, reachedStates } } -export default function validateStates(rootNode: ObjectASTNode, document: TextDocument, rootType: RootType, options?: ASLOptions): Diagnostic[] { - const statesNode = findPropChildByName(rootNode, 'States') - const startAtNode = findPropChildByName(rootNode, 'StartAt') +export default function validateStates( + rootNode: ObjectASTNode, + document: TextDocument, + rootType: RootType, + options?: ASLOptions, +): Diagnostic[] { + const statesNode = findPropChildByName(rootNode, 'States') + const startAtNode = findPropChildByName(rootNode, 'StartAt') + + // Different schemas for root and root of nested state machine + let rootSchema: object = schema.Root + if (rootType === RootType.Map) { + rootSchema = schema.NestedMapRoot + } else if (rootType === RootType.Parallel) { + rootSchema = schema.NestedParallelRoot + } + let diagnostics: Diagnostic[] = [] + + // Check root property names against the schema + rootNode.properties.forEach((prop) => { + const key = prop.keyNode.value + + if (!rootSchema[key]) { + diagnostics.push(getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME)) + } + }) + + if (statesNode) { + const stateNames = getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset) + const statesValueNode = statesNode.valueNode + + if (startAtNode) { + const stateNameExists = (stateNames as unknown[]).includes(startAtNode.valueNode?.value) - // Different schemas for root and root of nested state machine - let rootSchema: object = schema.Root - if (rootType === RootType.Map) { - rootSchema = schema.NestedMapRoot - } else if (rootType === RootType.Parallel) { - rootSchema = schema.NestedParallelRoot + if (startAtNode.valueNode && !stateNameExists) { + const { length, offset } = startAtNode.valueNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + + diagnostics.push(Diagnostic.create(range, MESSAGES.INVALID_START_AT, DiagnosticSeverity.Error)) + } } - let diagnostics: Diagnostic[] = [] - // Check root property names against the schema - rootNode.properties.forEach(prop => { - const key = prop.keyNode.value + if (statesValueNode && isObjectNode(statesValueNode)) { + // keep track of reached states and unreached states to avoid multiple loops + let reachedStates: { [ix: string]: boolean } = {} + let hasTerminalState = false - if (!rootSchema[key]) { - diagnostics.push( - getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME) - ) - } - }) + const startAtValue = startAtNode?.valueNode?.value - if (statesNode) { - const stateNames = getListOfStateNamesFromStateNode(statesNode, options?.ignoreColonOffset) - const statesValueNode = statesNode.valueNode + // mark state referred to in StartAt as reached + if (typeof startAtValue === 'string') { + reachedStates[startAtValue] = true + } - if (startAtNode) { - const stateNameExists = (stateNames as unknown[]).includes(startAtNode.valueNode?.value) + statesValueNode.properties.forEach((prop) => { + const oneStateValueNode = prop.valueNode - if (startAtNode.valueNode && !stateNameExists) { - const { length, offset } = startAtNode.valueNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + if (oneStateValueNode && isObjectNode(oneStateValueNode)) { + diagnostics = diagnostics.concat(validateProperties(oneStateValueNode, document)) - diagnostics.push(Diagnostic.create(range, MESSAGES.INVALID_START_AT, DiagnosticSeverity.Error)) - } - } + const nextPropNode = findPropChildByName(oneStateValueNode, 'Next') + const endPropNode = findPropChildByName(oneStateValueNode, 'End') + + const stateType = oneStateValueNode.properties.find((oneStateProp) => oneStateProp.keyNode.value === 'Type') + ?.valueNode?.value + + const nextNodeValue = nextPropNode?.valueNode?.value + const stateName = prop.keyNode.value + + if (endPropNode && endPropNode.valueNode?.value === true) { + hasTerminalState = true + } - if (statesValueNode && isObjectNode(statesValueNode)) { - // keep track of reached states and unreached states to avoid multiple loops - let reachedStates: { [ix: string]: boolean } = {} - let hasTerminalState = false + // mark the value of Next property as reached state + if (typeof nextNodeValue === 'string') { + reachedStates[nextNodeValue] = true + } - const startAtValue = startAtNode?.valueNode?.value + // Validate Parameters for given state types + if (['Pass', 'Task', 'Parallel', 'Map'].includes(stateType as string)) { + const parametersPropNode = findPropChildByName(oneStateValueNode, 'Parameters') - // mark state referred to in StartAt as reached - if (typeof startAtValue === 'string') { - reachedStates[startAtValue] = true + if (parametersPropNode) { + const validateParametersDiagnostics = validateParameters(parametersPropNode, document) + diagnostics = diagnostics.concat(validateParametersDiagnostics) } + } - statesValueNode.properties.forEach(prop => { - const oneStateValueNode = prop.valueNode - - if (oneStateValueNode && isObjectNode(oneStateValueNode)) { - diagnostics = diagnostics.concat(validateProperties(oneStateValueNode, document)) + // Validate Catch for given state types + if (['Task', 'Parallel', 'Map'].includes(stateType as string)) { + const validateCatchResult = validateArrayNext('Catch', oneStateValueNode, stateNames, document) + const resultSelectorPropNode = findPropChildByName(oneStateValueNode, 'ResultSelector') - const nextPropNode = findPropChildByName(oneStateValueNode, 'Next') - const endPropNode = findPropChildByName(oneStateValueNode, 'End') + diagnostics = diagnostics.concat(validateCatchResult.diagnostics) + reachedStates = { ...reachedStates, ...validateCatchResult.reachedStates } - const stateType = oneStateValueNode.properties - .find(oneStateProp => oneStateProp.keyNode.value === 'Type')?.valueNode?.value + if (resultSelectorPropNode) { + const resultSelectorDiagnostics = validateParameters(resultSelectorPropNode, document) + diagnostics = diagnostics.concat(resultSelectorDiagnostics) + } + } + + switch (stateType) { + // if the type of the state is "Map" recursively run validateStates for its value node + case 'Map': { + const iteratorPropNode = + findPropChildByName(oneStateValueNode, 'Iterator') || + findPropChildByName(oneStateValueNode, 'ItemProcessor') + + if (iteratorPropNode && iteratorPropNode.valueNode && isObjectNode(iteratorPropNode.valueNode)) { + // append the result of recursive validation to the list of diagnostics + diagnostics = [ + ...diagnostics, + ...validateStates(iteratorPropNode.valueNode, document, RootType.Map, options), + ] + } + + break + } - const nextNodeValue = nextPropNode?.valueNode?.value - const stateName = prop.keyNode.value + // it the type of state is "Parallel" recursively run validateStates for each child of value node (an array) + case 'Parallel': { + const branchesPropNode = findPropChildByName(oneStateValueNode, 'Branches') - if (endPropNode && endPropNode.valueNode?.value === true) { - hasTerminalState = true - } - - // mark the value of Next property as reached state - if (typeof nextNodeValue === 'string') { - reachedStates[nextNodeValue] = true - } - - // Validate Parameters for given state types - if (['Pass', 'Task', 'Parallel', 'Map'].includes(stateType as string)) { - const parametersPropNode = findPropChildByName(oneStateValueNode, 'Parameters') - - if (parametersPropNode) { - const validateParametersDiagnostics = validateParameters(parametersPropNode, document) - diagnostics = diagnostics.concat(validateParametersDiagnostics) - } - } - - // Validate Catch for given state types - if (['Task', 'Parallel', 'Map'].includes(stateType as string)) { - const validateCatchResult = validateArrayNext('Catch', oneStateValueNode, stateNames, document) - const resultSelectorPropNode = findPropChildByName(oneStateValueNode, 'ResultSelector') - - diagnostics = diagnostics.concat(validateCatchResult.diagnostics) - reachedStates = { ...reachedStates, ...validateCatchResult.reachedStates } - - if (resultSelectorPropNode) { - const resultSelectorDiagnostics = validateParameters(resultSelectorPropNode, document) - diagnostics = diagnostics.concat(resultSelectorDiagnostics) - } - } - - switch (stateType) { - // if the type of the state is "Map" recursively run validateStates for its value node - case 'Map': { - const iteratorPropNode = findPropChildByName(oneStateValueNode, 'Iterator') || findPropChildByName(oneStateValueNode, 'ItemProcessor') - - if (iteratorPropNode && iteratorPropNode.valueNode && isObjectNode(iteratorPropNode.valueNode)) { - // append the result of recursive validation to the list of diagnostics - diagnostics = [...diagnostics, ...validateStates(iteratorPropNode.valueNode, document, RootType.Map, options)] - } - - break - } - - // it the type of state is "Parallel" recursively run validateStates for each child of value node (an array) - case 'Parallel': { - const branchesPropNode = findPropChildByName(oneStateValueNode, 'Branches') - - if (branchesPropNode && branchesPropNode.valueNode && isArrayNode(branchesPropNode.valueNode)) { - branchesPropNode.valueNode.children.forEach(branchItem => { - if (isObjectNode(branchItem)) { - // append the result of recursive validation to the list of diagnostics - diagnostics = [...diagnostics, ...validateStates(branchItem, document, RootType.Parallel, options)] - } - }) - } - - break - } - - case 'Choice': { - const defaultNode = findPropChildByName(oneStateValueNode, 'Default') - - if (defaultNode) { - const name = defaultNode?.valueNode?.value - const defaultStateDiagnostic = stateNameExistsInPropNode(defaultNode, stateNames, document, MESSAGES.INVALID_DEFAULT) - - if (defaultStateDiagnostic) { - diagnostics.push(defaultStateDiagnostic) - } else if (typeof name === 'string') { - reachedStates[name] = true - } - } - - const validateChoiceResult = validateArrayNext('Choices', oneStateValueNode, stateNames, document) - diagnostics = diagnostics.concat(validateChoiceResult.diagnostics) - reachedStates = { ...reachedStates, ...validateChoiceResult.reachedStates } - - break - } - - case 'Succeed': - case 'Fail': { - hasTerminalState = true - - const validateErrorFieldDiagnostics = validateExclusivePathTypeField(oneStateValueNode, 'Error', document) - diagnostics = diagnostics.concat(validateErrorFieldDiagnostics) - - const validateCauseFieldDiagnostics = validateExclusivePathTypeField(oneStateValueNode, 'Cause', document) - diagnostics = diagnostics.concat(validateCauseFieldDiagnostics) - - break - } - } - - if (nextPropNode) { - const nextStateDiagnostic = stateNameExistsInPropNode(nextPropNode, stateNames, document, MESSAGES.INVALID_NEXT) - - if (nextStateDiagnostic) { - diagnostics.push(nextStateDiagnostic) - } - } + if (branchesPropNode && branchesPropNode.valueNode && isArrayNode(branchesPropNode.valueNode)) { + branchesPropNode.valueNode.children.forEach((branchItem) => { + if (isObjectNode(branchItem)) { + // append the result of recursive validation to the list of diagnostics + diagnostics = [...diagnostics, ...validateStates(branchItem, document, RootType.Parallel, options)] + } + }) + } + + break + } + + case 'Choice': { + const defaultNode = findPropChildByName(oneStateValueNode, 'Default') + + if (defaultNode) { + const name = defaultNode?.valueNode?.value + const defaultStateDiagnostic = stateNameExistsInPropNode( + defaultNode, + stateNames, + document, + MESSAGES.INVALID_DEFAULT, + ) + + if (defaultStateDiagnostic) { + diagnostics.push(defaultStateDiagnostic) + } else if (typeof name === 'string') { + reachedStates[name] = true } - }) + } - // if it doesn't have a terminal state emit diagnostic - // selecting the range of "States" property key node - if (!hasTerminalState) { - const { length, offset } = statesNode.keyNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + const validateChoiceResult = validateArrayNext('Choices', oneStateValueNode, stateNames, document) + diagnostics = diagnostics.concat(validateChoiceResult.diagnostics) + reachedStates = { ...reachedStates, ...validateChoiceResult.reachedStates } - diagnostics.push(Diagnostic.create(range, MESSAGES.NO_TERMINAL_STATE, DiagnosticSeverity.Error)) + break } - // Create diagnostics for states that weren't referenced by a State, Choice Rule, or Catcher's "Next" field - statesValueNode.properties - .filter(statePropNode => { - const stateName = statePropNode.keyNode.value + case 'Succeed': + case 'Fail': { + hasTerminalState = true - return !reachedStates[stateName] - }) - .forEach(unreachableStatePropNode => { - const { length, offset } = unreachableStatePropNode.keyNode - const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + const validateErrorFieldDiagnostics = validateExclusivePathTypeField(oneStateValueNode, 'Error', document) + diagnostics = diagnostics.concat(validateErrorFieldDiagnostics) - diagnostics.push(Diagnostic.create(range, MESSAGES.UNREACHABLE_STATE, DiagnosticSeverity.Error)) - }) + const validateCauseFieldDiagnostics = validateExclusivePathTypeField(oneStateValueNode, 'Cause', document) + diagnostics = diagnostics.concat(validateCauseFieldDiagnostics) + + break + } + } + + if (nextPropNode) { + const nextStateDiagnostic = stateNameExistsInPropNode( + nextPropNode, + stateNames, + document, + MESSAGES.INVALID_NEXT, + ) + + if (nextStateDiagnostic) { + diagnostics.push(nextStateDiagnostic) + } + } } + }) + + // if it doesn't have a terminal state emit diagnostic + // selecting the range of "States" property key node + if (!hasTerminalState) { + const { length, offset } = statesNode.keyNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + + diagnostics.push(Diagnostic.create(range, MESSAGES.NO_TERMINAL_STATE, DiagnosticSeverity.Error)) + } + + // Create diagnostics for states that weren't referenced by a State, Choice Rule, or Catcher's "Next" field + statesValueNode.properties + .filter((statePropNode) => { + const stateName = statePropNode.keyNode.value + + return !reachedStates[stateName] + }) + .forEach((unreachableStatePropNode) => { + const { length, offset } = unreachableStatePropNode.keyNode + const range = Range.create(document.positionAt(offset), document.positionAt(offset + length)) + + diagnostics.push(Diagnostic.create(range, MESSAGES.UNREACHABLE_STATE, DiagnosticSeverity.Error)) + }) } + } - return diagnostics + return diagnostics } diff --git a/src/validation/validationSchema.ts b/src/validation/validationSchema.ts index c11e5860f..045f07cd6 100644 --- a/src/validation/validationSchema.ts +++ b/src/validation/validationSchema.ts @@ -4,252 +4,252 @@ */ export default { - Common: { - Next: true, - End: true, + Common: { + Next: true, + End: true, + Comment: true, + InputPath: true, + OutputPath: true, + QueryLanguage: true, + Type: true, + }, + StateTypes: { + Pass: { + Properties: { + Assign: true, + Result: true, + ResultPath: true, + Parameters: true, + Output: true, + }, + hasCommonProperties: true, + }, + Task: { + Properties: { + Assign: true, + Resource: true, + Parameters: true, + Credentials: true, + ResultSelector: true, + ResultPath: true, + TimeoutSeconds: true, + TimeoutSecondsPath: true, + HeartbeatSeconds: true, + HeartbeatSecondsPath: true, + Retry: { + 'Fn:ArrayOf': 'Retrier', + }, + Catch: { + 'Fn:ArrayOf': 'Catcher', + }, + Arguments: true, + Output: true, + }, + hasCommonProperties: true, + }, + Choice: { + Properties: { Comment: true, InputPath: true, OutputPath: true, QueryLanguage: true, - Type: true - }, - StateTypes: { - Pass: { - Properties: { - Assign: true, - Result: true, - ResultPath: true, - Parameters: true, - Output: true, - }, - hasCommonProperties: true - }, - Task: { - Properties: { - Assign: true, - Resource: true, - Parameters: true, - Credentials: true, - ResultSelector: true, - ResultPath: true, - TimeoutSeconds: true, - TimeoutSecondsPath: true, - HeartbeatSeconds: true, - HeartbeatSecondsPath: true, - Retry: { - 'Fn:ArrayOf': 'Retrier' - }, - Catch: { - 'Fn:ArrayOf': 'Catcher' - }, - Arguments: true, - Output: true - }, - hasCommonProperties: true - }, - Choice: { - Properties: { - Comment: true, - InputPath: true, - OutputPath: true, - QueryLanguage: true, - Type: true, - Choices: { - 'Fn:ArrayOf': 'ChoiceRule' - }, - Output: true, - Assign: true, - Default: true, - } - }, - Wait: { - Properties: { - Assign: true, - Seconds: true, - Timestamp: true, - SecondsPath: true, - TimestampPath: true, - Output: true, - }, - hasCommonProperties: true + Type: true, + Choices: { + 'Fn:ArrayOf': 'ChoiceRule', }, - Succeed: { - Properties: { - QueryLanguage: true, - Type: true, - Comment: true, - InputPath: true, - OutputPath: true, - Output: true, - } - }, - Fail: { - Properties: { - Error: true, - ErrorPath: true, - Cause: true, - CausePath: true, - Comment: true, - QueryLanguage: true, - Type: true - } - }, - Parallel: { - Properties: { - QueryLanguage: true, - Assign: true, - Branches: true, - ResultPath: true, - Parameters: true, - ResultSelector: true, - Arguments: true, - Output: true, - Retry: { - 'Fn:ArrayOf': 'Retrier' - }, - Catch: { - 'Fn:ArrayOf': 'Catcher' - } - }, - hasCommonProperties: true - }, - Map: { - Properties: { - QueryLanguage: true, - Assign: true, - Iterator: true, - ItemsPath: true, - Items: true, - MaxConcurrency: true, - MaxConcurrencyPath: true, - ResultPath: true, - Output: true, - Parameters: true, - ResultSelector: true, - ItemReader: true, - ItemSelector: true, - ItemBatcher: true, - ResultWriter: true, - ItemProcessor: true, - ToleratedFailurePercentage: true, - ToleratedFailurePercentagePath: true, - ToleratedFailureCount: true, - ToleratedFailureCountPath: true, - Label: true, - Retry: { - 'Fn:ArrayOf': 'Retrier' - }, - Catch: { - 'Fn:ArrayOf': 'Catcher' - } - }, - hasCommonProperties: true - } + Output: true, + Assign: true, + Default: true, + }, }, - ReferenceTypes: { - ComparisonOperators: { - And: { - 'Fn:ArrayOf': 'NestedChoiceRule' - }, - Not: { - 'Fn:ValueOf': 'NestedChoiceRule' - }, - Or: { - 'Fn:ArrayOf': 'NestedChoiceRule' - }, - BooleanEquals: true, - NumericEquals: true, - NumericGreaterThan: true, - NumericGreaterThanEquals: true, - NumericLessThan: true, - NumericLessThanEquals: true, - StringEquals: true, - StringGreaterThan: true, - StringGreaterThanEquals: true, - StringLessThan: true, - StringLessThanEquals: true, - TimestampEquals: true, - TimestampGreaterThan: true, - TimestampGreaterThanEquals: true, - TimestampLessThan: true, - TimestampLessThanEquals: true, - BooleanEqualsPath: true, - NumericEqualsPath: true, - NumericGreaterThanPath: true, - NumericGreaterThanEqualsPath: true, - NumericLessThanPath: true, - NumericLessThanEqualsPath: true, - StringEqualsPath: true, - StringGreaterThanPath: true, - StringGreaterThanEqualsPath: true, - StringLessThanPath: true, - StringLessThanEqualsPath: true, - TimestampEqualsPath: true, - TimestampGreaterThanPath: true, - TimestampGreaterThanEqualsPath: true, - TimestampLessThanPath: true, - TimestampLessThanEqualsPath: true, - StringMatches: true, - IsNull: true, - IsPresent: true, - IsNumeric: true, - IsString: true, - IsBoolean: true, - IsTimestamp: true - }, - ChoiceRule: { - 'Fn:OneOf': 'ComparisonOperators', - Assign: true, - Variable: true, - Condition: true, - Output: true, - Next: true, - Comment: true - }, - NestedChoiceRule: { - 'Fn:OneOf': 'ComparisonOperators', - Assign: true, - Variable: true, - Comment: true - }, - Catcher: { - ErrorEquals: true, - ResultPath: true, - Output: true, - Next: true, - Comment: true, - Assign: true, - }, - Retrier: { - ErrorEquals: true, - IntervalSeconds: true, - MaxAttempts: true, - BackoffRate: true, - Comment: true, - MaxDelaySeconds: true, - JitterStrategy: true - } + Wait: { + Properties: { + Assign: true, + Seconds: true, + Timestamp: true, + SecondsPath: true, + TimestampPath: true, + Output: true, + }, + hasCommonProperties: true, }, - Root: { - Comment: true, - StartAt: true, - TimeoutSeconds: true, - Version: true, + Succeed: { + Properties: { QueryLanguage: true, - States: true + Type: true, + Comment: true, + InputPath: true, + OutputPath: true, + Output: true, + }, }, - // State machines nested within Map and Parallel states - NestedParallelRoot: { + Fail: { + Properties: { + Error: true, + ErrorPath: true, + Cause: true, + CausePath: true, Comment: true, - StartAt: true, QueryLanguage: true, - States: true + Type: true, + }, }, - NestedMapRoot: { - Comment: true, - StartAt: true, + Parallel: { + Properties: { + QueryLanguage: true, + Assign: true, + Branches: true, + ResultPath: true, + Parameters: true, + ResultSelector: true, + Arguments: true, + Output: true, + Retry: { + 'Fn:ArrayOf': 'Retrier', + }, + Catch: { + 'Fn:ArrayOf': 'Catcher', + }, + }, + hasCommonProperties: true, + }, + Map: { + Properties: { QueryLanguage: true, - States: true, - ProcessorConfig: true - } + Assign: true, + Iterator: true, + ItemsPath: true, + Items: true, + MaxConcurrency: true, + MaxConcurrencyPath: true, + ResultPath: true, + Output: true, + Parameters: true, + ResultSelector: true, + ItemReader: true, + ItemSelector: true, + ItemBatcher: true, + ResultWriter: true, + ItemProcessor: true, + ToleratedFailurePercentage: true, + ToleratedFailurePercentagePath: true, + ToleratedFailureCount: true, + ToleratedFailureCountPath: true, + Label: true, + Retry: { + 'Fn:ArrayOf': 'Retrier', + }, + Catch: { + 'Fn:ArrayOf': 'Catcher', + }, + }, + hasCommonProperties: true, + }, + }, + ReferenceTypes: { + ComparisonOperators: { + And: { + 'Fn:ArrayOf': 'NestedChoiceRule', + }, + Not: { + 'Fn:ValueOf': 'NestedChoiceRule', + }, + Or: { + 'Fn:ArrayOf': 'NestedChoiceRule', + }, + BooleanEquals: true, + NumericEquals: true, + NumericGreaterThan: true, + NumericGreaterThanEquals: true, + NumericLessThan: true, + NumericLessThanEquals: true, + StringEquals: true, + StringGreaterThan: true, + StringGreaterThanEquals: true, + StringLessThan: true, + StringLessThanEquals: true, + TimestampEquals: true, + TimestampGreaterThan: true, + TimestampGreaterThanEquals: true, + TimestampLessThan: true, + TimestampLessThanEquals: true, + BooleanEqualsPath: true, + NumericEqualsPath: true, + NumericGreaterThanPath: true, + NumericGreaterThanEqualsPath: true, + NumericLessThanPath: true, + NumericLessThanEqualsPath: true, + StringEqualsPath: true, + StringGreaterThanPath: true, + StringGreaterThanEqualsPath: true, + StringLessThanPath: true, + StringLessThanEqualsPath: true, + TimestampEqualsPath: true, + TimestampGreaterThanPath: true, + TimestampGreaterThanEqualsPath: true, + TimestampLessThanPath: true, + TimestampLessThanEqualsPath: true, + StringMatches: true, + IsNull: true, + IsPresent: true, + IsNumeric: true, + IsString: true, + IsBoolean: true, + IsTimestamp: true, + }, + ChoiceRule: { + 'Fn:OneOf': 'ComparisonOperators', + Assign: true, + Variable: true, + Condition: true, + Output: true, + Next: true, + Comment: true, + }, + NestedChoiceRule: { + 'Fn:OneOf': 'ComparisonOperators', + Assign: true, + Variable: true, + Comment: true, + }, + Catcher: { + ErrorEquals: true, + ResultPath: true, + Output: true, + Next: true, + Comment: true, + Assign: true, + }, + Retrier: { + ErrorEquals: true, + IntervalSeconds: true, + MaxAttempts: true, + BackoffRate: true, + Comment: true, + MaxDelaySeconds: true, + JitterStrategy: true, + }, + }, + Root: { + Comment: true, + StartAt: true, + TimeoutSeconds: true, + Version: true, + QueryLanguage: true, + States: true, + }, + // State machines nested within Map and Parallel states + NestedParallelRoot: { + Comment: true, + StartAt: true, + QueryLanguage: true, + States: true, + }, + NestedMapRoot: { + Comment: true, + StartAt: true, + QueryLanguage: true, + States: true, + ProcessorConfig: true, + }, } diff --git a/src/yaml/aslYamlLanguageService.ts b/src/yaml/aslYamlLanguageService.ts index d63698ee3..6af1a8c01 100644 --- a/src/yaml/aslYamlLanguageService.ts +++ b/src/yaml/aslYamlLanguageService.ts @@ -4,28 +4,28 @@ */ import { - CompletionItemKind, - Diagnostic, - getLanguageService as getLanguageServiceVscode, - JSONSchema, - LanguageService, - LanguageServiceParams, + CompletionItemKind, + Diagnostic, + getLanguageService as getLanguageServiceVscode, + JSONSchema, + LanguageService, + LanguageServiceParams, } from 'vscode-json-languageservice' import { TextDocument } from 'vscode-languageserver-textdocument' import { - CompletionItem, - CompletionList, - DocumentSymbol, - FormattingOptions, - Hover, - Position, - Range, - SymbolInformation, - TextEdit + CompletionItem, + CompletionList, + DocumentSymbol, + FormattingOptions, + Hover, + Position, + Range, + SymbolInformation, + TextEdit, } from 'vscode-languageserver-types' import { - parse as parseYAML, - YAMLDocument, + parse as parseYAML, + YAMLDocument, } from 'yaml-language-server/out/server/src/languageservice/parser/yamlParser07' import { YAMLCompletion } from 'yaml-language-server/out/server/src/languageservice/services/yamlCompletion' import { YAMLFormatter } from 'yaml-language-server/out/server/src/languageservice/services/yamlFormatter' @@ -42,237 +42,240 @@ const CATCH_INSERT = 'Catch:\n\t- ' const RETRY_INSERT = 'Retry:\n\t- ' function convertYAMLDiagnostic(yamlDiagnostic: YAMLDocDiagnostic, textDocument: TextDocument): Diagnostic { - const startLoc = yamlDiagnostic.location.start - let endLoc = yamlDiagnostic.location.end - let severity = yamlDiagnostic.severity - - // Duplicate positioning returns incorrect end position and needs to be ovewritten - if (yamlDiagnostic.message === YAML_PARSER_MESSAGES.DUPLICATE_KEY) { - const text = textDocument.getText() - // Update severity to error - severity = 1 - - for (let loc = yamlDiagnostic.location.start; loc < text.length; loc++) { - // Colon and whitespace character signal the end of the key. - if (text.slice(loc, loc + 2).match(/:\s/)) { - endLoc = loc - } else if (text[loc] === '\n') { - break - } - } + const startLoc = yamlDiagnostic.location.start + let endLoc = yamlDiagnostic.location.end + let severity = yamlDiagnostic.severity + + // Duplicate positioning returns incorrect end position and needs to be ovewritten + if (yamlDiagnostic.message === YAML_PARSER_MESSAGES.DUPLICATE_KEY) { + const text = textDocument.getText() + // Update severity to error + severity = 1 + + for (let loc = yamlDiagnostic.location.start; loc < text.length; loc++) { + // Colon and whitespace character signal the end of the key. + if (text.slice(loc, loc + 2).match(/:\s/)) { + endLoc = loc + } else if (text[loc] === '\n') { + break + } } + } - const startPos = textDocument.positionAt(startLoc) - const endPos = textDocument.positionAt(endLoc) + const startPos = textDocument.positionAt(startLoc) + const endPos = textDocument.positionAt(endLoc) - return { - range: Range.create(startPos, endPos), - message: yamlDiagnostic.message, - severity - } + return { + range: Range.create(startPos, endPos), + message: yamlDiagnostic.message, + severity, + } } -export const getLanguageService = function(params: LanguageServiceParams, schema: JSONSchema, aslLanguageService: LanguageService): LanguageService { - const builtInParams = {} - - const languageService = getLanguageServiceVscode({ - ...params, - ...builtInParams, +export const getLanguageService = function ( + params: LanguageServiceParams, + schema: JSONSchema, + aslLanguageService: LanguageService, +): LanguageService { + const builtInParams = {} + + const languageService = getLanguageServiceVscode({ + ...params, + ...builtInParams, + }) + + const requestServiceMock = async function (uri: string): Promise { + return new Promise((c) => { + c(JSON.stringify(schema)) }) - - const requestServiceMock = async function(uri: string): Promise { - return new Promise(c => { - c(JSON.stringify(schema)) - }) + } + const schemaService = new YAMLSchemaService(requestServiceMock, params.workspaceContext) + // initialize schema + schemaService.registerExternalSchema(LANGUAGE_IDS.YAML, ['*'], schema) + schemaService.getOrAddSchemaHandle(LANGUAGE_IDS.YAML, schema) + + const completer = new YAMLCompletion(schemaService) + const formatter = new YAMLFormatter() + + languageService.doValidation = async function (textDocument: TextDocument) { + const yamlDocument: YAMLDocument = parseYAML(textDocument.getText()) + const validationResult: Diagnostic[] = [] + + for (const currentYAMLDoc of yamlDocument.documents) { + const validation = await aslLanguageService.doValidation(textDocument, currentYAMLDoc) + validationResult.push( + ...currentYAMLDoc.errors.concat(currentYAMLDoc.warnings).map((err) => convertYAMLDiagnostic(err, textDocument)), + ) + validationResult.push(...validation) } - const schemaService = new YAMLSchemaService(requestServiceMock, params.workspaceContext) - // initialize schema - schemaService.registerExternalSchema(LANGUAGE_IDS.YAML, ['*'], schema) - schemaService.getOrAddSchemaHandle(LANGUAGE_IDS.YAML, schema) - - const completer = new YAMLCompletion(schemaService) - const formatter = new YAMLFormatter() - - languageService.doValidation = async function( - textDocument: TextDocument - ) { - const yamlDocument: YAMLDocument = parseYAML(textDocument.getText()) - const validationResult: Diagnostic[] = [] - - for (const currentYAMLDoc of yamlDocument.documents) { - const validation = await aslLanguageService.doValidation(textDocument, currentYAMLDoc) - validationResult.push( - ...currentYAMLDoc.errors - .concat(currentYAMLDoc.warnings) - .map(err => convertYAMLDiagnostic(err, textDocument)) - ) - validationResult.push(...validation) - } - return validationResult - } + return validationResult + } - languageService.doComplete = async function( - document: TextDocument, - position: Position - ): Promise { - const { - modifiedDocText, - tempPositionForCompletions, - startPositionForInsertion, - endPositionForInsertion, - shouldPrependSpace - } = processYamlDocForCompletion(document, position) + languageService.doComplete = async function (document: TextDocument, position: Position): Promise { + const { + modifiedDocText, + tempPositionForCompletions, + startPositionForInsertion, + endPositionForInsertion, + shouldPrependSpace, + } = processYamlDocForCompletion(document, position) - const processedDocument = TextDocument.create(document.uri, document.languageId, document.version, modifiedDocText) + const processedDocument = TextDocument.create(document.uri, document.languageId, document.version, modifiedDocText) - const offsetIntoOriginalDocument = document.offsetAt(position) - const offsetIntoProcessedDocument = processedDocument.offsetAt(tempPositionForCompletions) + const offsetIntoOriginalDocument = document.offsetAt(position) + const offsetIntoProcessedDocument = processedDocument.offsetAt(tempPositionForCompletions) - const processedYamlDoc: YAMLDocument = parseYAML(modifiedDocText) - const currentDoc = matchOffsetToDocument(offsetIntoProcessedDocument, processedYamlDoc) + const processedYamlDoc: YAMLDocument = parseYAML(modifiedDocText) + const currentDoc = matchOffsetToDocument(offsetIntoProcessedDocument, processedYamlDoc) - if (!currentDoc) { - return { items: [], isIncomplete: false } - } + if (!currentDoc) { + return { items: [], isIncomplete: false } + } - const positionForDoComplete = {...tempPositionForCompletions} // Copy position to new object since doComplete modifies the position - const yamlCompletions = await completer.doComplete(processedDocument, positionForDoComplete, false) - // yaml-language-server does not output correct completions for retry/catch - // we need to overwrite the text - function updateCompletionText(item: CompletionItem, text: string) { - item.insertText = text + const positionForDoComplete = { ...tempPositionForCompletions } // Copy position to new object since doComplete modifies the position + const yamlCompletions = await completer.doComplete(processedDocument, positionForDoComplete, false) + // yaml-language-server does not output correct completions for retry/catch + // we need to overwrite the text + function updateCompletionText(item: CompletionItem, text: string) { + item.insertText = text - if (item.textEdit) { - item.textEdit.newText = text - } - } + if (item.textEdit) { + item.textEdit.newText = text + } + } - yamlCompletions.items.forEach(item => { - if (item.label === 'Catch') { - updateCompletionText(item, CATCH_INSERT) - } else if (item.label === 'Retry') { - updateCompletionText(item, RETRY_INSERT) - } - }) + yamlCompletions.items.forEach((item) => { + if (item.label === 'Catch') { + updateCompletionText(item, CATCH_INSERT) + } else if (item.label === 'Retry') { + updateCompletionText(item, RETRY_INSERT) + } + }) - const { isDirectChildOfStates, isWithinCatchRetryState, hasCatchPropSibling, hasRetryPropSibling } = getOffsetData(document, offsetIntoOriginalDocument) + const { isDirectChildOfStates, isWithinCatchRetryState, hasCatchPropSibling, hasRetryPropSibling } = getOffsetData( + document, + offsetIntoOriginalDocument, + ) + + const aslOptions: ASLOptions = { + ignoreColonOffset: true, + shouldShowStateSnippets: isDirectChildOfStates, + shouldShowErrorSnippets: { + retry: isWithinCatchRetryState && !hasRetryPropSibling, + catch: isWithinCatchRetryState && !hasCatchPropSibling, + }, + } - const aslOptions: ASLOptions = { - ignoreColonOffset: true, - shouldShowStateSnippets: isDirectChildOfStates, - shouldShowErrorSnippets: { - retry: isWithinCatchRetryState && !hasRetryPropSibling, - catch: isWithinCatchRetryState && !hasCatchPropSibling + const aslCompletions: CompletionList = doCompleteAsl( + processedDocument, + tempPositionForCompletions, + currentDoc, + yamlCompletions, + aslOptions, + ) + + const modifiedAslCompletionItems: CompletionItem[] = aslCompletions.items.map((completionItem) => { + const completionItemCopy = { ...completionItem } // Copy completion to new object to avoid overwriting any snippets + + if ( + completionItemCopy.insertText && + completionItemCopy.kind === CompletionItemKind.Snippet && + document.languageId === LANGUAGE_IDS.YAML + ) { + completionItemCopy.insertText = convertJsonSnippetToYaml(completionItemCopy.insertText) + } else { + const currentTextEdit = completionItemCopy.textEdit + + if (currentTextEdit) { + if (shouldPrependSpace) { + if (currentTextEdit.newText && currentTextEdit.newText.charAt(0) !== ' ') { + currentTextEdit.newText = ' ' + currentTextEdit.newText + } + if (completionItemCopy.insertText && completionItemCopy.insertText.charAt(0) !== ' ') { + completionItemCopy.insertText = ' ' + completionItemCopy.insertText + } + } + + if (TextEdit.is(currentTextEdit)) { + currentTextEdit.range.start = startPositionForInsertion + currentTextEdit.range.end = endPositionForInsertion + // Completions that include both a key and a value should replace everything right of the cursor. + if (completionItemCopy.kind === CompletionItemKind.Property) { + currentTextEdit.range.end = { + line: endPositionForInsertion.line, + character: document.getText().length, + } } + } } + } - const aslCompletions: CompletionList = doCompleteAsl(processedDocument, tempPositionForCompletions, currentDoc, yamlCompletions, aslOptions) - - const modifiedAslCompletionItems: CompletionItem[] = aslCompletions.items.map(completionItem => { - const completionItemCopy = {...completionItem} // Copy completion to new object to avoid overwriting any snippets - - if (completionItemCopy.insertText && completionItemCopy.kind === CompletionItemKind.Snippet && document.languageId === LANGUAGE_IDS.YAML) { - completionItemCopy.insertText = convertJsonSnippetToYaml(completionItemCopy.insertText) - } else { - const currentTextEdit = completionItemCopy.textEdit - - if (currentTextEdit) { - if (shouldPrependSpace) { - if (currentTextEdit.newText && currentTextEdit.newText.charAt(0) !== ' ') { - currentTextEdit.newText = ' ' + currentTextEdit.newText - } - if (completionItemCopy.insertText && completionItemCopy.insertText.charAt(0) !== ' ') { - completionItemCopy.insertText = ' ' + completionItemCopy.insertText - } - } - - if (TextEdit.is(currentTextEdit)) { - currentTextEdit.range.start = startPositionForInsertion - currentTextEdit.range.end = endPositionForInsertion - // Completions that include both a key and a value should replace everything right of the cursor. - if (completionItemCopy.kind === CompletionItemKind.Property) { - currentTextEdit.range.end = { - line: endPositionForInsertion.line, - character: document.getText().length - } - } - } - } - } + return completionItemCopy + }) - return completionItemCopy - }) + const modifiedAslCompletions: CompletionList = { + isIncomplete: aslCompletions.isIncomplete, + items: modifiedAslCompletionItems, + } - const modifiedAslCompletions: CompletionList = { - isIncomplete: aslCompletions.isIncomplete, - items: modifiedAslCompletionItems - } + return Promise.resolve(modifiedAslCompletions) + } - return Promise.resolve(modifiedAslCompletions) + languageService.doHover = function (document: TextDocument, position: Position): Thenable { + const doc = parseYAML(document.getText()) + const offset = document.offsetAt(position) + const currentDoc = matchOffsetToDocument(offset, doc) + if (!currentDoc) { + // tslint:disable-next-line: no-null-keyword + return Promise.resolve(null) } - languageService.doHover = function( - document: TextDocument, - position: Position - ): Thenable { - const doc = parseYAML(document.getText()) - const offset = document.offsetAt(position) - const currentDoc = matchOffsetToDocument(offset, doc) - if (!currentDoc) { - // tslint:disable-next-line: no-null-keyword - return Promise.resolve(null) - } + const currentDocIndex = doc.documents.indexOf(currentDoc) + currentDoc.currentDocIndex = currentDocIndex - const currentDocIndex = doc.documents.indexOf(currentDoc) - currentDoc.currentDocIndex = currentDocIndex + return aslLanguageService.doHover(document, position, currentDoc) + } - return aslLanguageService.doHover(document, position, currentDoc) + languageService.format = function (document: TextDocument, range: Range, options: FormattingOptions): TextEdit[] { + try { + return formatter.format(document, options) + } catch (error) { + return [] } + } - languageService.format = function( - document: TextDocument, - range: Range, - options: FormattingOptions - ): TextEdit[] { - try { - return formatter.format(document, options); - } catch (error) { - return [] - } + languageService.findDocumentSymbols = function (document: TextDocument): SymbolInformation[] { + const doc = parseYAML(document.getText()) + if (!doc || doc.documents.length === 0) { + return [] } - languageService.findDocumentSymbols = function(document: TextDocument): SymbolInformation[] { - const doc = parseYAML(document.getText()) - if (!doc || doc.documents.length === 0) { - return [] - } - - let results: any[] = [] - for (const yamlDoc of doc.documents) { - if (yamlDoc.root) { - results = results.concat(aslLanguageService.findDocumentSymbols(document, yamlDoc)) - } - } - - return results + let results: any[] = [] + for (const yamlDoc of doc.documents) { + if (yamlDoc.root) { + results = results.concat(aslLanguageService.findDocumentSymbols(document, yamlDoc)) + } } - languageService.findDocumentSymbols2 = function(document: TextDocument): DocumentSymbol[] { - const doc = parseYAML(document.getText()) - if (!doc || doc.documents.length === 0) { - return [] - } + return results + } - let results: any[] = [] - for (const yamlDoc of doc.documents) { - if (yamlDoc.root) { - results = results.concat(aslLanguageService.findDocumentSymbols2(document, yamlDoc)) - } - } + languageService.findDocumentSymbols2 = function (document: TextDocument): DocumentSymbol[] { + const doc = parseYAML(document.getText()) + if (!doc || doc.documents.length === 0) { + return [] + } - return results + let results: any[] = [] + for (const yamlDoc of doc.documents) { + if (yamlDoc.root) { + results = results.concat(aslLanguageService.findDocumentSymbols2(document, yamlDoc)) + } } - return languageService + return results + } + + return languageService } diff --git a/src/yaml/yamlUtils.ts b/src/yaml/yamlUtils.ts index b6feba3cb..402097f45 100644 --- a/src/yaml/yamlUtils.ts +++ b/src/yaml/yamlUtils.ts @@ -10,7 +10,9 @@ import { ProcessYamlDocForCompletionOutput } from '../utils/astUtilityFunctions' const YAML_RESERVED_KEYWORDS = ['y', 'yes', 'n', 'no', 'true', 'false', 'on', 'off'] const RETRY_CATCH_STATES = ['Task', 'Map', 'Parallel'] const RETRY_CATCH_STATES_REGEX_STRING = `(${RETRY_CATCH_STATES.join(')|(')})` -const CATCH_RETRY_STATE_REGEX = new RegExp(`['"]{0,1}Type['"]{0,1}\\s*:\\s*['"]{0,1}(${RETRY_CATCH_STATES_REGEX_STRING})['"]{0,1}`) +const CATCH_RETRY_STATE_REGEX = new RegExp( + `['"]{0,1}Type['"]{0,1}\\s*:\\s*['"]{0,1}(${RETRY_CATCH_STATES_REGEX_STRING})['"]{0,1}`, +) const STATES_PROP_STRING = 'States:' const CATCH_PROP_STRING = 'Catch:' const RETRY_PROP_STRING = 'Retry:' @@ -30,436 +32,459 @@ const RETRY_PROP_STRING = 'Retry:' * @param {Position} position * @returns {ProcessYamlDocForCompletionOutput} */ -export function processYamlDocForCompletion(document: TextDocument, position: Position): ProcessYamlDocForCompletionOutput { - const lineOffsets = getLineOffsets(document.getText()) - const { currentLine, currentLineEnd } = getCurrentLine(document, position, lineOffsets) - - if (currentLine.indexOf(':') === -1) { - return processLineWithoutColon(document, position, currentLine, currentLineEnd) - } else { - return processLineWithColon(document, position, currentLine, currentLineEnd) - } +export function processYamlDocForCompletion( + document: TextDocument, + position: Position, +): ProcessYamlDocForCompletionOutput { + const lineOffsets = getLineOffsets(document.getText()) + const { currentLine, currentLineEnd } = getCurrentLine(document, position, lineOffsets) + + if (currentLine.indexOf(':') === -1) { + return processLineWithoutColon(document, position, currentLine, currentLineEnd) + } else { + return processLineWithColon(document, position, currentLine, currentLineEnd) + } } -function processLineWithoutColon(document: TextDocument, cursorPosition: Position, currentLine: string, currentLineEnd: number): ProcessYamlDocForCompletionOutput { - let modifiedDocText: string - let shouldPrependSpace = false +function processLineWithoutColon( + document: TextDocument, + cursorPosition: Position, + currentLine: string, + currentLineEnd: number, +): ProcessYamlDocForCompletionOutput { + let shouldPrependSpace = false - const tempPositionForCompletions: Position = { ...cursorPosition } - const startPositionForInsertion: Position = { ...cursorPosition } + const tempPositionForCompletions: Position = { ...cursorPosition } + const startPositionForInsertion: Position = { ...cursorPosition } - // Since there's no colon to separate the key and value, replace all text after the cursor. - const endPositionForInsertion: Position = { - line: cursorPosition.line, - character: currentLine.length - } + // Since there's no colon to separate the key and value, replace all text after the cursor. + const endPositionForInsertion: Position = { + line: cursorPosition.line, + character: currentLine.length, + } - const docText = document.getText() - const docTextLength = docText.length - const lineOffsets = getLineOffsets(docText) - const trimmedLine = currentLine.trim() + const docText = document.getText() + const docTextLength = docText.length + const lineOffsets = getLineOffsets(docText) + const trimmedLine = currentLine.trim() - let preText: string - let postText: string - let insertedText: string + let preText: string + let postText: string + let insertedText: string - // Current line has no non-space characters, insert a placeholder node at the end of the line - if (trimmedLine.length === 0) { - preText = docText.substring(0, currentLineEnd) - insertedText = '"":\n' - postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) + // Current line has no non-space characters, insert a placeholder node at the end of the line + if (trimmedLine.length === 0) { + preText = docText.substring(0, currentLineEnd) + insertedText = '"":\n' + postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) - tempPositionForCompletions.character += 1 + tempPositionForCompletions.character += 1 // Trimmed line starts with '-' - } else if (trimmedLine.length >= 1 && trimmedLine[0] === '-') { - // Set start of insertion range to be immediately after the hyphen. - const hyphenIndex = currentLine.indexOf('-') - startPositionForInsertion.character = hyphenIndex + 1 - shouldPrependSpace = true - - const postHyphenTextTrimmed = currentLine.substring(hyphenIndex + 1).trim() - - // No non-space characters after the hyphen, insert a placeholder node after the hyphen - if (postHyphenTextTrimmed.length === 0) { - tempPositionForCompletions.character = hyphenIndex + 3 - preText = docText.substring(0, lineOffsets[cursorPosition.line] + hyphenIndex) - insertedText = "- '':\n" - postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) - - // There are non-space character after the hyphen, but no colon. Just insert colon at end of line. - } else { - preText = docText.substring(0, currentLineEnd) - insertedText = (!currentLine.endsWith(' ') ? ' ' : '') + ':\n' - postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) - } - - // Non-empty line but missing colon, add colon to end of current line + } else if (trimmedLine.length >= 1 && trimmedLine[0] === '-') { + // Set start of insertion range to be immediately after the hyphen. + const hyphenIndex = currentLine.indexOf('-') + startPositionForInsertion.character = hyphenIndex + 1 + shouldPrependSpace = true + + const postHyphenTextTrimmed = currentLine.substring(hyphenIndex + 1).trim() + + // No non-space characters after the hyphen, insert a placeholder node after the hyphen + if (postHyphenTextTrimmed.length === 0) { + tempPositionForCompletions.character = hyphenIndex + 3 + preText = docText.substring(0, lineOffsets[cursorPosition.line] + hyphenIndex) + insertedText = "- '':\n" + postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) + + // There are non-space character after the hyphen, but no colon. Just insert colon at end of line. } else { - preText = docText.substring(0, currentLineEnd) - insertedText = ':\n' - postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) - - // Starting pos is first non-space character - startPositionForInsertion.character = currentLine.indexOf(trimmedLine) + preText = docText.substring(0, currentLineEnd) + insertedText = (!currentLine.endsWith(' ') ? ' ' : '') + ':\n' + postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) } - modifiedDocText = `${preText}${insertedText}${postText}` - - return { - modifiedDocText, - tempPositionForCompletions, - startPositionForInsertion, - endPositionForInsertion, - shouldPrependSpace - } + // Non-empty line but missing colon, add colon to end of current line + } else { + preText = docText.substring(0, currentLineEnd) + insertedText = ':\n' + postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) + + // Starting pos is first non-space character + startPositionForInsertion.character = currentLine.indexOf(trimmedLine) + } + + const modifiedDocText = `${preText}${insertedText}${postText}` + + return { + modifiedDocText, + tempPositionForCompletions, + startPositionForInsertion, + endPositionForInsertion, + shouldPrependSpace, + } } -function processLineWithColon(document: TextDocument, cursorPosition: Position, currentLine: string, currentLineEnd: number): ProcessYamlDocForCompletionOutput { - const docText = document.getText() - const docTextLength = docText.length - - let modifiedDocText: string = docText - let shouldPrependSpace = false - - const tempPositionForCompletions: Position = { ...cursorPosition } - const startPositionForInsertion: Position = { ...cursorPosition } - const endPositionForInsertion: Position = { ...cursorPosition } - - const charNum = cursorPosition.character - const lineOffsets = getLineOffsets(docText) - - let preText: string - let postText: string - let insertedText: string - - // Current line has a colon, determine if cursor position is right or left of it - const colonIndex = currentLine.indexOf(':') - - // Cursor is left of the colon. - if (charNum <= colonIndex) { - // Start position is first non-space character, ending position is left of colon. - const preColonTextTrimmed = currentLine.substring(0, colonIndex).trim() - - // Only whitespace before the colon. - if (preColonTextTrimmed.length === 0) { - // Insert placeholder quotes and place cursor inside of them. - preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex) - insertedText = "''" - postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex) - - startPositionForInsertion.character = colonIndex - endPositionForInsertion.character = colonIndex - tempPositionForCompletions.character = colonIndex + 1 - - // Only hyphen before the colon. - } else if (preColonTextTrimmed.length === 1 && preColonTextTrimmed.charAt(0) === '-') { - // Insert placeholder quotes and place cursor inside of them. - preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex) - insertedText = " ''" - postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex) - - startPositionForInsertion.character = colonIndex - endPositionForInsertion.character = colonIndex - - // Move cursor to be inside the quotes - tempPositionForCompletions.character = colonIndex + 2 - shouldPrependSpace = currentLine.charAt(Math.max(colonIndex - 1, 0)) !== ' ' - } else { - // Set start of insertion range to be where the non-whitespace characters start. - startPositionForInsertion.character = currentLine.indexOf(preColonTextTrimmed) - // Set end of insertion range to be immediately before the colon. - endPositionForInsertion.character = colonIndex - - preText = docText - insertedText = '' - postText = '' - - // If the non-whitespace characters start with a hyphen, adjust starting position to be after the hyphen - if (preColonTextTrimmed.charAt(0) === '-') { - startPositionForInsertion.character = Math.min(startPositionForInsertion.character + 2, colonIndex) - } - } +function processLineWithColon( + document: TextDocument, + cursorPosition: Position, + currentLine: string, + currentLineEnd: number, +): ProcessYamlDocForCompletionOutput { + const docText = document.getText() + const docTextLength = docText.length + + let modifiedDocText: string = docText + let shouldPrependSpace = false + + const tempPositionForCompletions: Position = { ...cursorPosition } + const startPositionForInsertion: Position = { ...cursorPosition } + const endPositionForInsertion: Position = { ...cursorPosition } + + const charNum = cursorPosition.character + const lineOffsets = getLineOffsets(docText) + + let preText: string + let postText: string + let insertedText: string + + // Current line has a colon, determine if cursor position is right or left of it + const colonIndex = currentLine.indexOf(':') + + // Cursor is left of the colon. + if (charNum <= colonIndex) { + // Start position is first non-space character, ending position is left of colon. + const preColonTextTrimmed = currentLine.substring(0, colonIndex).trim() + + // Only whitespace before the colon. + if (preColonTextTrimmed.length === 0) { + // Insert placeholder quotes and place cursor inside of them. + preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex) + insertedText = "''" + postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex) + + startPositionForInsertion.character = colonIndex + endPositionForInsertion.character = colonIndex + tempPositionForCompletions.character = colonIndex + 1 + + // Only hyphen before the colon. + } else if (preColonTextTrimmed.length === 1 && preColonTextTrimmed.charAt(0) === '-') { + // Insert placeholder quotes and place cursor inside of them. + preText = docText.substring(0, lineOffsets[cursorPosition.line] + colonIndex) + insertedText = " ''" + postText = docText.slice(lineOffsets[cursorPosition.line] + colonIndex) + + startPositionForInsertion.character = colonIndex + endPositionForInsertion.character = colonIndex + + // Move cursor to be inside the quotes + tempPositionForCompletions.character = colonIndex + 2 + shouldPrependSpace = currentLine.charAt(Math.max(colonIndex - 1, 0)) !== ' ' + } else { + // Set start of insertion range to be where the non-whitespace characters start. + startPositionForInsertion.character = currentLine.indexOf(preColonTextTrimmed) + // Set end of insertion range to be immediately before the colon. + endPositionForInsertion.character = colonIndex + + preText = docText + insertedText = '' + postText = '' + + // If the non-whitespace characters start with a hyphen, adjust starting position to be after the hyphen + if (preColonTextTrimmed.charAt(0) === '-') { + startPositionForInsertion.character = Math.min(startPositionForInsertion.character + 2, colonIndex) + } + } // Cursor is right of the colon. + } else { + // Starting position is immediately after the colon, end is end of line + startPositionForInsertion.character = colonIndex + 1 + endPositionForInsertion.character = currentLine.length + shouldPrependSpace = true + + // Remove all trailing whitespace on that line and adjust tempPositionForCompletions if needed + let numTrailingSpacesToRemove = 0 + while (currentLine.charAt(currentLine.length - numTrailingSpacesToRemove - 1) === ' ') { + numTrailingSpacesToRemove++ + } + tempPositionForCompletions.character = Math.min( + tempPositionForCompletions.character, + currentLine.length - numTrailingSpacesToRemove - 1, + ) + + // If after removing trailing spaces, the last character is the colon, add a placeholder empty string value + const postColonTextTrimmed = currentLine.substring(colonIndex + 1).trim() + const hasOnlyWhitespaceAfterColon = postColonTextTrimmed.length === 0 + + preText = docText.substring(0, currentLineEnd - numTrailingSpacesToRemove) + insertedText = (hasOnlyWhitespaceAfterColon ? ' ""' : '') + '\n' + postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) + + if (hasOnlyWhitespaceAfterColon) { + // Move cursor inside of quotes + tempPositionForCompletions.character += 2 } else { - // Starting position is immediately after the colon, end is end of line - startPositionForInsertion.character = colonIndex + 1 - endPositionForInsertion.character = currentLine.length - shouldPrependSpace = true - - // Remove all trailing whitespace on that line and adjust tempPositionForCompletions if needed - let numTrailingSpacesToRemove = 0 - while (currentLine.charAt(currentLine.length - numTrailingSpacesToRemove - 1) === ' ') { - numTrailingSpacesToRemove++ - } - tempPositionForCompletions.character = Math.min(tempPositionForCompletions.character, currentLine.length - numTrailingSpacesToRemove - 1) - - // If after removing trailing spaces, the last character is the colon, add a placeholder empty string value - const postColonTextTrimmed = currentLine.substring(colonIndex + 1).trim() - const hasOnlyWhitespaceAfterColon = postColonTextTrimmed.length === 0 - - preText = docText.substring(0, currentLineEnd - numTrailingSpacesToRemove) - insertedText = (hasOnlyWhitespaceAfterColon ? ' ""' : '') + '\n' - postText = docText.slice(lineOffsets[cursorPosition.line + 1] || docTextLength) - - if (hasOnlyWhitespaceAfterColon) { - // Move cursor inside of quotes - tempPositionForCompletions.character += 2 - } else { - // Current line has non-whitespace characters following the colon. - const indexOfPostColonCharacters = currentLine.indexOf(postColonTextTrimmed) - - // Cursor is between colon and start of post-colon characters - if (charNum < indexOfPostColonCharacters) { - // Move cursor to be at immediately before the value - tempPositionForCompletions.character = indexOfPostColonCharacters - } - } + // Current line has non-whitespace characters following the colon. + const indexOfPostColonCharacters = currentLine.indexOf(postColonTextTrimmed) + + // Cursor is between colon and start of post-colon characters + if (charNum < indexOfPostColonCharacters) { + // Move cursor to be at immediately before the value + tempPositionForCompletions.character = indexOfPostColonCharacters + } } + } - modifiedDocText = `${preText}${insertedText}${postText}` + modifiedDocText = `${preText}${insertedText}${postText}` - return { - modifiedDocText, - tempPositionForCompletions, - startPositionForInsertion, - endPositionForInsertion, - shouldPrependSpace - } + return { + modifiedDocText, + tempPositionForCompletions, + startPositionForInsertion, + endPositionForInsertion, + shouldPrependSpace, + } } // Returns an array of offsets corresponding to the line breaks in the provided text function getLineOffsets(text: string): number[] { - const lineOffsets: number[] = [] - let isLineStart = true + const lineOffsets: number[] = [] + let isLineStart = true - for (let i = 0; i < text.length; i++) { - if (isLineStart) { - lineOffsets.push(i) - isLineStart = false - } - const ch = text.charAt(i) - isLineStart = ch === '\r' || ch === '\n' - if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { - i++ - } + for (let i = 0; i < text.length; i++) { + if (isLineStart) { + lineOffsets.push(i) + isLineStart = false } - - if (isLineStart && text.length > 0) { - lineOffsets.push(text.length) + const ch = text.charAt(i) + isLineStart = ch === '\r' || ch === '\n' + if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { + i++ } + } - return lineOffsets + if (isLineStart && text.length > 0) { + lineOffsets.push(text.length) + } + + return lineOffsets } // Returns the text for the current line as well as the offset at which the line ends. -function getCurrentLine(document: TextDocument, position: Position, lineOffsets: number[]): { - currentLine: string, - currentLineEnd: number +function getCurrentLine( + document: TextDocument, + position: Position, + lineOffsets: number[], +): { + currentLine: string + currentLineEnd: number } { - const docText = document.getText() - const lineNum: number = position.line + const docText = document.getText() + const lineNum: number = position.line - const lineStart = lineOffsets[lineNum] - let lineEnd = lineOffsets[lineNum + 1] ? lineOffsets[lineNum + 1] : docText.length + const lineStart = lineOffsets[lineNum] + let lineEnd = lineOffsets[lineNum + 1] ? lineOffsets[lineNum + 1] : docText.length - if (lineEnd - 1 >= 0 && isCharEol(docText.charCodeAt(lineEnd - 1))) { - lineEnd-- - } + if (lineEnd - 1 >= 0 && isCharEol(docText.charCodeAt(lineEnd - 1))) { + lineEnd-- + } - const textLine = docText.substring(lineStart, lineEnd) + const textLine = docText.substring(lineStart, lineEnd) - return { - currentLine: textLine, - currentLineEnd: lineEnd - } + return { + currentLine: textLine, + currentLineEnd: lineEnd, + } } // Returns true iff the character code matches LF or CR function isCharEol(c: number) { - return c === 0x0A || c === 0x0D + return c === 0x0a || c === 0x0d } export function isStateNameReservedYamlKeyword(stateName: string): boolean { - return YAML_RESERVED_KEYWORDS.indexOf(stateName.toLowerCase()) !== -1 + return YAML_RESERVED_KEYWORDS.indexOf(stateName.toLowerCase()) !== -1 } export function convertJsonSnippetToYaml(snippetText: string) { - // Convert to YAML with indendation of 1 space - return dump(load(snippetText), { indent: 1 }) - // Remove quotation marks - .replace(/[']/g, '') - .split('\n') - // For each line replace left padding spaces with tabs - .map(line => { - if (line.length) { - let numOfSpaces = 0 - - // Count number of spaces that the line begins with - for (const char of line) { - if (char === ' ') { - numOfSpaces++ - } else { - break - } - } - - // Convert each space to tab character. Even though tab carracters are not valid yaml whitespace characters - // the vscode will convert them to the correct number of spaces according to user preferences. - return '\t'.repeat(numOfSpaces) + line.slice(numOfSpaces, line.length) + // Convert to YAML with indendation of 1 space + return ( + dump(load(snippetText), { indent: 1 }) + // Remove quotation marks + .replace(/[']/g, '') + .split('\n') + // For each line replace left padding spaces with tabs + .map((line) => { + if (line.length) { + let numOfSpaces = 0 + + // Count number of spaces that the line begins with + for (const char of line) { + if (char === ' ') { + numOfSpaces++ } else { - return line + break } - }) - .join('\n') + } + + // Convert each space to tab character. Even though tab carracters are not valid yaml whitespace characters + // the vscode will convert them to the correct number of spaces according to user preferences. + return '\t'.repeat(numOfSpaces) + line.slice(numOfSpaces, line.length) + } else { + return line + } + }) + .join('\n') + ) } function getNumberOfLeftSpaces(text: string) { - return text.length - text.trimLeft().length + return text.length - text.trimLeft().length } function getBackwardOffsetData(text: string, offset: number, initialNumberOfSpaces: number) { - let isDirectChildOfStates = false - let isGrandChildOfStates = false - let isWithinCatchRetryState = false; - let hasCatchPropSibling = false; - let hasRetryPropSibling = false; - let beginLineOffset = offset; - let levelsDown = 0; - - for (let i = offset; i >= 0; i--) { - if (text[i] === '\n') { - const lineText = text.slice(i + 1, beginLineOffset) - const numberOfPrecedingSpaces = getNumberOfLeftSpaces(lineText) - const trimmedLine = lineText.trim() - beginLineOffset = i - - // Ignore empty lines - if (trimmedLine.length === 0) { - continue - } - - // If number of spaces lower than that of the cursor - // it is a parent property or a sibling of parent property - if (numberOfPrecedingSpaces < initialNumberOfSpaces) { - if (trimmedLine.startsWith(STATES_PROP_STRING)) { - isDirectChildOfStates = levelsDown === 0; - isGrandChildOfStates = levelsDown === 1; - break - // If the indentation is one level lower increase the number in levelsDown variable - // and start checking if the offset is a "grandchild" of states. - } else if (levelsDown === 0) { - levelsDown++ - continue - // When the levelDown is 1 it means there is no point of searching anymore. - // We know that the offset is neither child nor grandchild of states. We have all the needed information. - } else { - break - } - - // If number of spaces is higher than that of the cursor it means it is a child - // of the property or of its siblings - } else if (numberOfPrecedingSpaces > initialNumberOfSpaces) { - continue - } else if (levelsDown > 0) { - continue - } + let isDirectChildOfStates = false + let isGrandChildOfStates = false + let isWithinCatchRetryState = false + let hasCatchPropSibling = false + let hasRetryPropSibling = false + let beginLineOffset = offset + let levelsDown = 0 + + for (let i = offset; i >= 0; i--) { + if (text[i] === '\n') { + const lineText = text.slice(i + 1, beginLineOffset) + const numberOfPrecedingSpaces = getNumberOfLeftSpaces(lineText) + const trimmedLine = lineText.trim() + beginLineOffset = i + + // Ignore empty lines + if (trimmedLine.length === 0) { + continue + } + + // If number of spaces lower than that of the cursor + // it is a parent property or a sibling of parent property + if (numberOfPrecedingSpaces < initialNumberOfSpaces) { + if (trimmedLine.startsWith(STATES_PROP_STRING)) { + isDirectChildOfStates = levelsDown === 0 + isGrandChildOfStates = levelsDown === 1 + break + // If the indentation is one level lower increase the number in levelsDown variable + // and start checking if the offset is a "grandchild" of states. + } else if (levelsDown === 0) { + levelsDown++ + continue + // When the levelDown is 1 it means there is no point of searching anymore. + // We know that the offset is neither child nor grandchild of states. We have all the needed information. + } else { + break + } - hasCatchPropSibling = trimmedLine.startsWith(CATCH_PROP_STRING) || hasCatchPropSibling - hasRetryPropSibling = trimmedLine.startsWith(RETRY_PROP_STRING) || hasRetryPropSibling + // If number of spaces is higher than that of the cursor it means it is a child + // of the property or of its siblings + } else if (numberOfPrecedingSpaces > initialNumberOfSpaces) { + continue + } else if (levelsDown > 0) { + continue + } - const isCatchRetryState = CATCH_RETRY_STATE_REGEX.test(trimmedLine) + hasCatchPropSibling = trimmedLine.startsWith(CATCH_PROP_STRING) || hasCatchPropSibling + hasRetryPropSibling = trimmedLine.startsWith(RETRY_PROP_STRING) || hasRetryPropSibling - if (isCatchRetryState) { - isWithinCatchRetryState = true - } - } - } + const isCatchRetryState = CATCH_RETRY_STATE_REGEX.test(trimmedLine) - return { - isDirectChildOfStates, - isGrandChildOfStates, - isWithinCatchRetryState, - hasCatchPropSibling, - hasRetryPropSibling + if (isCatchRetryState) { + isWithinCatchRetryState = true + } } + } + + return { + isDirectChildOfStates, + isGrandChildOfStates, + isWithinCatchRetryState, + hasCatchPropSibling, + hasRetryPropSibling, + } } function getForwardOffsetData(text: string, offset: number, initialNumberOfSpaces: number) { - let isWithinCatchRetryState = false; - let hasCatchPropSibling = false; - let hasRetryPropSibling = false; - let beginLineOffset = offset; - - // Iterate the text forwards from the offset - for (let i = offset; i <= text.length; i++) { - if (text[i] === '\n') { - const lineText = text.slice(beginLineOffset + 1, i) - const trimmedLine = lineText.trim() - const numberOfPrecedingSpaces = getNumberOfLeftSpaces(lineText) - beginLineOffset = i - - // Ignore empty lines - if (trimmedLine.length === 0) { - continue - } - - // If number of spaces lower than that of the cursor - // it is a parent property or a sibling of parent property - if (numberOfPrecedingSpaces < initialNumberOfSpaces) { - break - // If number of spaces is higher than that of the cursor it means it is a child - // of the property or of its siblings - } else if (numberOfPrecedingSpaces > initialNumberOfSpaces) { - continue - } - - hasCatchPropSibling = trimmedLine.startsWith(CATCH_PROP_STRING) || hasCatchPropSibling - hasRetryPropSibling = trimmedLine.startsWith(RETRY_PROP_STRING) || hasRetryPropSibling - - const isCatchRetryState = CATCH_RETRY_STATE_REGEX.test(trimmedLine) - - if (isCatchRetryState) { - isWithinCatchRetryState = true - } - } + let isWithinCatchRetryState = false + let hasCatchPropSibling = false + let hasRetryPropSibling = false + let beginLineOffset = offset + + // Iterate the text forwards from the offset + for (let i = offset; i <= text.length; i++) { + if (text[i] === '\n') { + const lineText = text.slice(beginLineOffset + 1, i) + const trimmedLine = lineText.trim() + const numberOfPrecedingSpaces = getNumberOfLeftSpaces(lineText) + beginLineOffset = i + + // Ignore empty lines + if (trimmedLine.length === 0) { + continue + } + + // If number of spaces lower than that of the cursor + // it is a parent property or a sibling of parent property + if (numberOfPrecedingSpaces < initialNumberOfSpaces) { + break + // If number of spaces is higher than that of the cursor it means it is a child + // of the property or of its siblings + } else if (numberOfPrecedingSpaces > initialNumberOfSpaces) { + continue + } + + hasCatchPropSibling = trimmedLine.startsWith(CATCH_PROP_STRING) || hasCatchPropSibling + hasRetryPropSibling = trimmedLine.startsWith(RETRY_PROP_STRING) || hasRetryPropSibling + + const isCatchRetryState = CATCH_RETRY_STATE_REGEX.test(trimmedLine) + + if (isCatchRetryState) { + isWithinCatchRetryState = true + } } + } - return { - isWithinCatchRetryState, - hasCatchPropSibling, - hasRetryPropSibling - } + return { + isWithinCatchRetryState, + hasCatchPropSibling, + hasRetryPropSibling, + } } export function getOffsetData(document: TextDocument, offset: number) { - const text = document.getText() - const indexOfLastNewLine = text.lastIndexOf('\n', offset - 1) - const indexOfNextNewLine = text.indexOf('\n', offset) - const cursorLine = text.substring(indexOfLastNewLine + 1, indexOfNextNewLine) - const hasCursorLineNonSpace = /\S/.test(cursorLine) - const numberOfSpacesCursorLine = getNumberOfLeftSpaces(text.substring(indexOfLastNewLine + 1, offset)) - const initialNumberOfSpaces = numberOfSpacesCursorLine - let isDirectChildOfStates = false - let isWithinCatchRetryState = false - let hasCatchPropSibling = false - let hasRetryPropSibling = false - - if (!hasCursorLineNonSpace && numberOfSpacesCursorLine > 0) { - const backwardOffsetData = getBackwardOffsetData(text, offset, initialNumberOfSpaces) - const forwardOffsetData = getForwardOffsetData(text, offset, initialNumberOfSpaces) - - isDirectChildOfStates = backwardOffsetData.isDirectChildOfStates - isWithinCatchRetryState = (backwardOffsetData.isWithinCatchRetryState || forwardOffsetData.isWithinCatchRetryState) && backwardOffsetData.isGrandChildOfStates - hasCatchPropSibling = backwardOffsetData.hasCatchPropSibling || forwardOffsetData.hasCatchPropSibling - hasRetryPropSibling = backwardOffsetData.hasRetryPropSibling || forwardOffsetData.hasRetryPropSibling - } - - return { - isDirectChildOfStates, - isWithinCatchRetryState, - hasCatchPropSibling, - hasRetryPropSibling - } + const text = document.getText() + const indexOfLastNewLine = text.lastIndexOf('\n', offset - 1) + const indexOfNextNewLine = text.indexOf('\n', offset) + const cursorLine = text.substring(indexOfLastNewLine + 1, indexOfNextNewLine) + const hasCursorLineNonSpace = /\S/.test(cursorLine) + const numberOfSpacesCursorLine = getNumberOfLeftSpaces(text.substring(indexOfLastNewLine + 1, offset)) + const initialNumberOfSpaces = numberOfSpacesCursorLine + let isDirectChildOfStates = false + let isWithinCatchRetryState = false + let hasCatchPropSibling = false + let hasRetryPropSibling = false + + if (!hasCursorLineNonSpace && numberOfSpacesCursorLine > 0) { + const backwardOffsetData = getBackwardOffsetData(text, offset, initialNumberOfSpaces) + const forwardOffsetData = getForwardOffsetData(text, offset, initialNumberOfSpaces) + + isDirectChildOfStates = backwardOffsetData.isDirectChildOfStates + isWithinCatchRetryState = + (backwardOffsetData.isWithinCatchRetryState || forwardOffsetData.isWithinCatchRetryState) && + backwardOffsetData.isGrandChildOfStates + hasCatchPropSibling = backwardOffsetData.hasCatchPropSibling || forwardOffsetData.hasCatchPropSibling + hasRetryPropSibling = backwardOffsetData.hasRetryPropSibling || forwardOffsetData.hasRetryPropSibling + } + + return { + isDirectChildOfStates, + isWithinCatchRetryState, + hasCatchPropSibling, + hasRetryPropSibling, + } }