diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..22bb7f71 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,232 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + env: { + node: true, + mocha: true, + es6: true + }, + parserOptions: { + project: ['./tsconfig.json'], + createDefaultProgram: true + }, + plugins: [ + '@typescript-eslint', + 'no-only-tests', + 'github' + ], + extends: [ + 'eslint:all', + 'plugin:@typescript-eslint/all' + ], + rules: { + '@typescript-eslint/parameter-properties': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-member-accessibility': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/init-declarations': 'off', + '@typescript-eslint/lines-between-class-members': 'off', + '@typescript-eslint/member-ordering': 'off', + '@typescript-eslint/method-signature-style': 'off', + '@typescript-eslint/naming-convention': 'off', + '@typescript-eslint/no-base-to-string': 'off', + '@typescript-eslint/no-confusing-void-expression': 'off', + '@typescript-eslint/no-dynamic-delete': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-extra-parens': 'off', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-implicit-any-catch': 'off', + '@typescript-eslint/no-invalid-this': 'off', + '@typescript-eslint/no-magic-numbers': 'off', + '@typescript-eslint/no-parameter-properties': 'off', + //had to add this rule to prevent eslint from crashing + '@typescript-eslint/no-restricted-imports': ['off', {}], + //mitigating this sometimes results in undesirably verbose code. Should investigate enabling again in the future. + '@typescript-eslint/no-unsafe-argument': 'off', + 'object-curly-spacing': 'off', + '@typescript-eslint/object-curly-spacing': [ + 'error', + 'always' + ], + '@typescript-eslint/no-shadow': 'off', + '@typescript-eslint/no-this-alias': 'off', + //possibly disable this once we have converted all throw statements to actual errors + '@typescript-eslint/no-throw-literal': 'off', + '@typescript-eslint/no-invalid-void': 'off', + '@typescript-eslint/no-invalid-void-type': 'off', + '@typescript-eslint/no-type-alias': 'off', + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off', + '@typescript-eslint/no-unnecessary-condition': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars-experimental': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + '@typescript-eslint/prefer-readonly': 'off', + '@typescript-eslint/prefer-readonly-parameter-types': 'off', + '@typescript-eslint/promise-function-async': 'off', + 'generator-star-spacing': 'off', + '@typescript-eslint/quotes': [ + 'error', + 'single', + { + 'allowTemplateLiterals': true + } + ], + '@typescript-eslint/require-array-sort-compare': 'off', + '@typescript-eslint/restrict-plus-operands': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/sort-type-constituents': 'off', + '@typescript-eslint/sort-type-union-intersection-members': 'off', + '@typescript-eslint/space-before-function-paren': 'off', + '@typescript-eslint/strict-boolean-expressions': 'off', + '@typescript-eslint/typedef': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/unified-signatures': 'off', + 'array-bracket-newline': 'off', + 'array-element-newline': 'off', + 'array-type': 'off', + 'arrow-body-style': 'off', + 'arrow-parens': 'off', + 'callback-return': 'off', + 'capitalized-comments': 'off', + 'class-methods-use-this': 'off', + 'complexity': 'off', + 'consistent-return': 'off', + 'consistent-this': 'off', + 'curly': 'error', + 'default-case': 'off', + 'dot-location': 'off', + 'dot-notation': 'off', + 'func-style': 'off', + 'function-call-argument-newline': 'off', + 'function-paren-newline': 'off', + 'getter-return': 'off', + 'github/array-foreach': 'error', + 'guard-for-in': 'off', + 'id-length': 'off', + 'no-multi-assign': ['error', { 'ignoreNonDeclaration': true }], + 'indent': 'off', + 'init-declarations': 'off', + 'line-comment-position': 'off', + 'linebreak-style': 'off', + 'lines-around-comment': 'off', + 'lines-between-class-members': 'off', + 'max-classes-per-file': 'off', + 'max-depth': 'off', + 'max-len': 'off', + 'max-lines': 'off', + 'max-lines-per-function': 'off', + 'max-params': 'off', + 'max-statements': 'off', + 'no-only-tests/no-only-tests': 'error', + 'multiline-comment-style': 'off', + 'multiline-ternary': 'off', + 'new-cap': 'off', + 'newline-per-chained-call': 'off', + 'no-await-in-loop': 'off', + 'no-case-declarations': 'off', + 'no-constant-condition': 'off', + 'no-console': 'off', + 'no-continue': 'off', + 'no-else-return': 'off', + 'no-empty': 'off', + 'no-implicit-coercion': 'off', + 'no-inline-comments': 'off', + 'no-invalid-this': 'off', + 'no-labels': 'off', + 'no-lonely-if': 'off', + 'no-negated-condition': 'off', + 'no-param-reassign': 'off', + 'no-plusplus': 'off', + 'no-process-exit': 'off', + 'no-prototype-builtins': 'off', + 'no-shadow': 'off', + 'no-sync': 'off', + 'no-template-curly-in-string': 'off', + 'no-ternary': 'off', + 'no-undefined': 'off', + 'no-underscore-dangle': 'off', + 'no-unneeded-ternary': 'off', + 'no-useless-escape': 'off', + 'no-void': 'off', + 'no-warning-comments': 'off', + 'object-property-newline': 'off', + 'object-shorthand': [ + 'error', + 'never' + ], + 'one-var': [ + 'error', + 'never' + ], + 'padded-blocks': 'off', + 'prefer-const': 'off', + 'prefer-destructuring': 'off', + 'prefer-named-capture-group': 'off', + 'prefer-template': 'off', + 'quote-props': 'off', + 'radix': 'off', + 'require-atomic-updates': 'off', + 'require-unicode-regexp': 'off', + 'sort-imports': 'off', + 'sort-keys': 'off', + 'spaced-comment': 'off', + 'vars-on-top': 'off', + 'wrap-regex': 'off' + }, + //disable some rules for certain files + overrides: [{ + //these files are getting deleted soon, so ignore the eslint warnings for now + files: ['src/brsTypes/**/*.ts'], + rules: { + '@typescript-eslint/no-invalid-this': 'off', + '@typescript-eslint/method-signature-style': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/prefer-enum-initializers': 'off' + } + }, { + files: ['scripts/**/*.ts'], + rules: { + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + 'no-inner-declarations': 'off' + } + }, { + files: ['*.spec.ts'], + rules: { + '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars-experimental': 'off', + '@typescript-eslint/dot-notation': 'off', + '@typescript-eslint/no-require-imports': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-var-requires': 'off', + 'prefer-rest-params': 'off', + 'github/array-foreach': 'off', + 'func-names': 'off', + 'func-name-matching': 'off', + 'new-cap': 'off', + 'no-shadow': 'off', + 'no-void': 'off' + } + }, { + files: ['benchmarks/**/*'], + rules: { + '@typescript-eslint/no-require-imports': 'off', + '@typescript-eslint/no-var-requires': 'off' + } + }] +}; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ff0949d..860df1bb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,13 +1,12 @@ name: build on: push: - tags: - - '*' branches: - - '*' + - master + tags: + - v* pull_request: - branches: - - '*' + jobs: ci: runs-on: ${{ matrix.os }} @@ -16,23 +15,26 @@ jobs: COVERALLS_REPO_TOKEN: "Ysqq6q68DgojDzv3gvl5Yv029HXZYwGxq" strategy: matrix: - os: [ubuntu-18.04, macos-10.15, windows-2019] + os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@master - uses: actions/setup-node@master with: - node-version: "12.12.0" + node-version: "14.19.0" - run: npm ci - run: npm run build - run: npm run lint - run: npm run test - - run: npm run publish-coverage + # disable coverage for now (because coveralls is down right now) + #- run: npm run publish-coverage - run: npm run package release: #only run this task if a tag starting with 'v' was used to trigger this (i.e. a tagged release) if: startsWith(github.ref, 'refs/tags/v') needs: ci - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest + #the ovsx publish never quits (but the upload succeeds), so kill the build if we've taken more than 10 minutes + timeout-minutes: 10 env: VSCE_TOKEN: ${{ secrets.VSCE_TOKEN }} OPEN_VSX_TOKEN: ${{ secrets.OPEN_VSX_TOKEN }} @@ -41,8 +43,8 @@ jobs: - uses: actions/checkout@master - uses: actions/setup-node@master with: - node-version: "12.12.0" - + node-version: "14.19.0" + #build package - run: npm ci - run: npm run build @@ -74,4 +76,4 @@ jobs: - name: Publish to OpenVSX registry #exclude beta release tags if: contains(github.ref, '-beta.') == false - run: npx ovsx publish -p ${{env.OPEN_VSX_TOKEN}} + run: npx ovsx publish -p ${{env.OPEN_VSX_TOKEN}} --debug diff --git a/.github/workflows/create-vsix-from-pr.yml b/.github/workflows/create-vsix-from-pr.yml new file mode 100644 index 00000000..141469c3 --- /dev/null +++ b/.github/workflows/create-vsix-from-pr.yml @@ -0,0 +1,41 @@ +on: + pull_request: + types: [labeled, unlabeled, synchronize] +jobs: + run: + runs-on: ubuntu-latest + if: contains(github.event.pull_request.labels.*.name, 'create-vsix') + steps: + # Get a bot token so the bot's name shows up on all our actions + - name: Get Token From roku-ci-token Application + uses: tibdex/github-app-token@v1.5.1 + id: generate-token + with: + app_id: ${{ secrets.BOT_APP_ID }} + private_key: ${{ secrets.BOT_PRIVATE_KEY }} + - name: Set New GitHub Token + run: echo "TOKEN=${{ steps.generate-token.outputs.token }}" >> $GITHUB_ENV + #trigger the build on vscode-brightscript-language + - name: Build vsix for branch "${{ github.head_ref}}" + uses: aurelien-baudet/workflow-dispatch@v2.1.1 + id: create-vsix + with: + workflow: create-vsix + ref: master + wait-for-completion: true + display-workflow-run-url: true + repo: rokucommunity/vscode-brightscript-language + token: ${{ env.TOKEN }} + inputs: '{ "branch": "${{ github.head_ref }}"}' + #add a comment on the PR + - name: Add comment to PR + uses: actions/github-script@v5 + with: + github-token: ${{ env.TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Hey there! I just built a new version of the vscode extension based on ${{ github.event.pull_request.head.sha }}. You can downloaded the .vsix [here](${{steps.create-vsix.outputs.workflow-url}}) and then follow [these installation instructions](https://rokucommunity.github.io/vscode-brightscript-language/prerelease-versions.html).' + }) diff --git a/.github/workflows/create-vsix.yml b/.github/workflows/create-vsix.yml index 061fb446..294ddd69 100644 --- a/.github/workflows/create-vsix.yml +++ b/.github/workflows/create-vsix.yml @@ -3,11 +3,11 @@ on: workflow_dispatch: inputs: branch: - description: 'The branch name which should be used to build the vsix' + description: "The branch name which should be used to build the vsix" required: true jobs: create-vsix: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions/setup-node@master diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..3483c9d3 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,22 @@ +name: publish-docs +on: + push: + branches: + - 'master' +jobs: + publish-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: actions/setup-node@master + with: + node-version: "14.19.0" + - run: npm install + - run: npm run build-docs + - name: Deploy + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages + FOLDER: .tmp/docs + CLEAN: true # Automatically remove deleted files from the deploy branch \ No newline at end of file diff --git a/.gitignore b/.gitignore index d0f12342..6ed8486d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ coverage *.vsix brsconfig.schema.json .history +.tmp .vsix-building diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..f5d1045c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "svelteSortOrder" : "options-scripts-styles-markup", + "svelteAllowShorthand": false, + "tabWidth": 4, + "useTabs": false, + "singleQuote": true, + "trailingComma": "none", + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "strict", + "singleAttributePerLine": false +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 16b31330..6a33081f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "type": "extensionHost", "request": "launch", "name": "Extension", - "preLaunchTask": "svelte-watch", + "preLaunchTask": "watch-webviews", "runtimeExecutable": "${execPath}", "args": [ "--extensionDevelopmentPath=${workspaceFolder}" @@ -18,6 +18,25 @@ "${workspaceFolder}/../brighterscript/dist/**/*.js" ] }, + { + "name": "Extension (PWA)", + "type": "pwa-extensionHost", + "debugWebWorkerHost": true, + "request": "launch", + "preLaunchTask": "watch-webviews", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionDevelopmentKind=web" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js", + "${workspaceFolder}/../brighterscript-formatter/dist/**/*.js", + "${workspaceFolder}/../roku-debug/dist/**/*.js", + "${workspaceFolder}/../roku-deploy/dist/**/*.js", + "${workspaceFolder}/../brighterscript/dist/**/*.js" + ] + }, { "name": "Debug Server", "type": "node", @@ -27,11 +46,12 @@ "args": [ "--server=4711" ], + "sourceMaps": true, "outFiles": [ - "${workspaceFolder}/dist/**/*.js", "${workspaceFolder}/../roku-debug/dist/**/*.js", - "${workspaceFolder}/../roku-deploy/dist/**/*.js" + "!**/node_modules/**" ], + "resolveSourceMapLocations": null, "stopOnEntry": false }, { @@ -54,14 +74,8 @@ "cwd": "${workspaceFolder}", "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "args": [ - "-r", - "ts-node/register", - "-r", - "source-map-support/register", "--timeout", - "999999", - "./src/**/*.spec.ts", - "./ui/**/*.spec.ts" + "0" ], "internalConsoleOptions": "openOnSessionStart" } diff --git a/.vscode/settings.json b/.vscode/settings.json index f69f880d..d96421dd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,8 @@ { "files.trimTrailingWhitespace": true, - "[markdown]": { - "files.trimTrailingWhitespace": false - }, + "[markdown]": { + "files.trimTrailingWhitespace": false + }, "files.exclude": { "**/.nyc_output": true, "**/.roku-deploy-staging": false, @@ -20,5 +20,32 @@ "editor.detectIndentation": false, "editor.tabSize": 4, "tslint.autoFixOnSave": true, - "typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false + "typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": false, + "html.format.unformatted": "wbr,%", + "typescript.tsdk": "node_modules\\typescript\\lib", + "svelte.plugin.svelte.compilerWarnings": { + "a11y-aria-attributes": "ignore", + "a11y-incorrect-aria-attribute-type": "ignore", + "a11y-unknown-aria-attribute": "ignore", + "a11y-hidden": "ignore", + "a11y-misplaced-role": "ignore", + "a11y-unknown-role": "ignore", + "a11y-no-abstract-role": "ignore", + "a11y-no-redundant-roles": "ignore", + "a11y-role-has-required-aria-props": "ignore", + "a11y-accesskey": "ignore", + "a11y-autofocus": "ignore", + "a11y-misplaced-scope": "ignore", + "a11y-positive-tabindex": "ignore", + "a11y-invalid-attribute": "ignore", + "a11y-missing-attribute": "ignore", + "a11y-img-redundant-alt": "ignore", + "a11y-label-has-associated-control": "ignore", + "a11y-media-has-caption": "ignore", + "a11y-distracting-elements": "ignore", + "a11y-structure": "ignore", + "a11y-mouse-events-have-key-events": "ignore", + "a11y-missing-content": "ignore", + "a11y-click-events-have-key-events": "ignore" + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 22b0cb0d..f5f25b53 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,6 +1,16 @@ { "version": "2.0.0", "tasks": [ + { + "label": "watch-all", + "type": "shell", + "command": "npm run watch-all --loglevel silent", + "presentation": { + "group": "watch", + }, + "isBackground": true, + "problemMatcher": "$tsc-watch" + }, { "label": "watch", "type": "shell", @@ -20,14 +30,11 @@ }, "isBackground": true, "problemMatcher": "$tsc-watch" - }, { - "label": "svelte-watch", + }, + { + "label": "watch-webviews", "type": "shell", - "command": "npm", - "args": [ - "run", - "svelte-watch" - ], + "command": "npm run watch-webviews", "presentation": { "group": "watch", "echo": true, @@ -36,55 +43,49 @@ "panel": "shared" }, "isBackground": true, - "problemMatcher": [{ - "pattern": { - "regexp": "^\\[!\\]" - }, - "severity": "error" - }, { - "base": "$tsc-watch", - "background": { - "activeOnStart": true, - "beginsPattern": "^\\s*\\[\\d{1,2}:\\d{1,2}:\\d{1,2}(?: AM| PM)?\\] Validating project", - "endsPattern": "waiting for changes..." + "problemMatcher": [ + { + "pattern": { + "regexp": "^\\[!\\]" + }, + "severity": "error" }, - }], - "dependsOn": ["watch"] + { + "base": "$tsc-watch", + "background": { + "activeOnStart": true, + "beginsPattern": "^build started\\.\\.\\.", + "endsPattern": "^built in \\d+" + } + } + ], + "dependsOn": [ + "watch-all" + ] }, { "label": "test", "type": "shell", - "command": "npm", - "args": [ - "run", - "test:nocover", - "--loglevel", - "silent" - ], + "command": "npm run test:nocover --silent", + "presentation": { + "focus": true, + }, "group": { "kind": "test", "isDefault": true }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "dedicated", - "showReuseMessage": true, - "clear": true - }, "problemMatcher": [] }, { "label": "clean", - "type": "npm", - "script": "clean", - "problemMatcher": [], + "type": "shell", + "command": "npm run clean", + "problemMatcher": [] }, { - "type": "npm", "label": "build", - "script": "build", + "type": "shell", + "command": "npm run build", "dependsOn": "clean", "problemMatcher": [], "group": { @@ -92,17 +93,9 @@ "isDefault": true }, "presentation": { - "echo": true, - "reveal": "always", "focus": true, - "panel": "dedicated", - "clear": true + "panel": "dedicated" } - }, - { - "type": "npm", - "script": "test", - "problemMatcher": [] } ] } diff --git a/.vscodeignore b/.vscodeignore index 6c7be325..309720b0 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -5,6 +5,9 @@ coverage/**/* scripts/** src/** +webviews/** +docs/** +.tmp/** **/*.map **/*.spec.js developer-guidelines.md diff --git a/CHANGELOG.md b/CHANGELOG.md index f61e1c61..99bd102f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,690 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 +## [2.40.4](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.40.3...v2.40.4) - 2023-05-18 +### Changed + - upgrade to [roku-debug@0.18.12](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#01812---2023-05-18). Notable changes since 0.18.11: + - Remove axios in favor of postman-request ([roku-debug#153](https://github.com/rokucommunity/roku-debug/pull/153)) + - Fix `file already exists` error and hung process ([roku-debug#152](https://github.com/rokucommunity/roku-debug/pull/152)) + + + +## [2.40.3](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.40.2...v2.40.3) - 2023-05-17 +### Changed + - upgrade to [roku-debug@0.18.11](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#01811---2023-05-17). Notable changes since 0.18.10: + - Fix crash by using postman-request ([roku-debug#151](https://github.com/rokucommunity/roku-debug/pull/151)) +### Fixed + - Use postman-request instead of request ([#485](https://github.com/rokucommunity/vscode-brightscript-language/pull/485)) + + + +## [2.40.2](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.40.1...v2.40.2) - 2023-05-17 +### Changed + - Bump http-cache-semantics from 4.1.0 to 4.1.1 ([#466](https://github.com/rokucommunity/vscode-brightscript-language/pull/466)) + - Augment roku error codes in the logs with human readable messages ([#467](https://github.com/rokucommunity/vscode-brightscript-language/pull/467)) + - upgrade to [roku-deploy@3.10.2](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#3102---2023-05-10). Notable changes since 3.10.1: + - TBD-67: roku-deploy: fix nodejs 19 bug ([roku-deploy#115](https://github.com/rokucommunity/roku-deploy/pull/115)) + - upgrade to [roku-debug@0.18.10](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#01810---2023-05-17). Notable changes since 0.18.8: + - upgrade to [brighterscript@0.65.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0650---2023-05-17). Notable changes since 0.64.3: + - npm audit fixes. upgrade to coveralls-next ([#brighterscript43756d8](https://github.com/rokucommunity/brighterscript/commit/43756d8)) + - Improve findChild and findAncestor AST methods ([brighterscript#807](https://github.com/rokucommunity/brighterscript/pull/807)) + - upgrade to [brighterscript-formatter@1.6.29](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1629---2023-05-17). Notable changes since 1.6.27: +### Fixed + - Remove `<` and `>` from bracket matching ([#483](https://github.com/rokucommunity/vscode-brightscript-language/pull/483)) + - incorrect rendezvous count for file history ([#482](https://github.com/rokucommunity/vscode-brightscript-language/pull/482)) + - fix infinite recursion possibility in Scenegraph Inspector and fix Roku Commands list of available requests ([#480](https://github.com/rokucommunity/vscode-brightscript-language/pull/480)) + + + +## [2.40.1](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.40.0...v2.40.1) - 2023-04-28 +### Changed + - upgrade to [roku-debug@0.18.8](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0188---2023-04-28). Notable changes since 0.18.6: + - Make axios a prod dependency ([roku-debug#148](https://github.com/rokucommunity/roku-debug/pull/148)) + - Add better error for failed session starts ([roku-debug#147](https://github.com/rokucommunity/roku-debug/pull/147)) + - Bump xml2js from 0.4.23 to 0.5.0 ([roku-debug#146](https://github.com/rokucommunity/roku-debug/pull/146)) + - adds device query info to debug session ([roku-debug#130](https://github.com/rokucommunity/roku-debug/pull/130)) + - upgrade to [brighterscript@0.64.3](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0643---2023-04-28). Notable changes since 0.64.2: + - Improves performance in symbol table fetching ([brighterscript#797](https://github.com/rokucommunity/brighterscript/pull/797)) + - upgrade to [brighterscript-formatter@1.6.27](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1627---2023-04-28). Notable changes since 1.6.26: +### Fixed + - bugs when using the Device View from within WSL ([#478](https://github.com/rokucommunity/vscode-brightscript-language/pull/478)) + + + +## [2.40.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.39.0...v2.40.0) - 2023-04-18 +### Added + - validation for raleTrackerTaskFileLocation setting existence. ([#472](https://github.com/rokucommunity/vscode-brightscript-language/pull/472)) +### Changed + - Run findNode calculations in webview and other improvements ([#477](https://github.com/rokucommunity/vscode-brightscript-language/pull/477)) + - upgrade to [roku-deploy@3.10.1](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#3101---2023-04-14). Notable changes since 3.10.0: + - Bump xml2js from 0.4.23 to 0.5.0 ([roku-deploy#112](https://github.com/rokucommunity/roku-deploy/pull/112)) + - Fix build status badge ([#roku-deployad2c9ec](https://github.com/rokucommunity/roku-deploy/commit/ad2c9ec)) + - upgrade to [roku-debug@0.18.6](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0186---2023-04-18). Notable changes since 0.18.4: + - Exclude sourcemaps when sideloading ([roku-debug#145](https://github.com/rokucommunity/roku-debug/pull/145)) + - upgrade to [brighterscript@0.64.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0642---2023-04-18). Notable changes since 0.62.0: + - Fix namespace-relative enum value ([brighterscript#793](https://github.com/rokucommunity/brighterscript/pull/793)) + - Bump xml2js from 0.4.23 to 0.5.0 ([brighterscript#790](https://github.com/rokucommunity/brighterscript/pull/790)) + - Fix namespace-relative items ([brighterscript#789](https://github.com/rokucommunity/brighterscript/pull/789)) + - Wrap transpiled template strings in parens ([brighterscript#788](https://github.com/rokucommunity/brighterscript/pull/788)) + - Simplify the ast range logic ([brighterscript#784](https://github.com/rokucommunity/brighterscript/pull/784)) + - upgrade to [brighterscript-formatter@1.6.26](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1626---2023-04-18) +### Fixed + - Fix crash during launch due to missing rale option ([#476](https://github.com/rokucommunity/vscode-brightscript-language/pull/476)) + - Wrap the dnsLookup for host in a try/catch ([#473](https://github.com/rokucommunity/vscode-brightscript-language/pull/473)) + + + +## [2.39.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.8...v2.39.0) - 2023-03-22 +### Added + - device view with direct node selection ([#465](https://github.com/rokucommunity/vscode-brightscript-language/pull/465)) + +### Changed + - upgrade to [roku-deploy@3.10.0](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#3100---2023-03-16). Notable changes since 3.9.3: + - Use micromatch instead of picomatch ([roku-deploy#109](https://github.com/rokucommunity/roku-deploy/pull/109)) + - upgrade to [roku-debug@0.18.4](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0184---2023-03-17). Notable changes since 0.18.3: + - upgrade to [brighterscript@0.62.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0620---2023-03-17). Notable changes since 0.61.3: + - Optional chaining assignment validation ([brighterscript#782](https://github.com/rokucommunity/brighterscript/pull/782)) + - Fix transpile bug with optional chaning ([brighterscript#781](https://github.com/rokucommunity/brighterscript/pull/781)) + - Add 'severityOverride' option ([brighterscript#725](https://github.com/rokucommunity/brighterscript/pull/725)) + - Fix crash when func has no block ([brighterscript#774](https://github.com/rokucommunity/brighterscript/pull/774)) + - Remove invalid annotation example ([#brighterscript8d3d74e](https://github.com/rokucommunity/brighterscript/commit/8d3d74e)) + - upgrade to [brighterscript-formatter@1.6.24](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1624---2023-03-17). Notable changes since 1.6.23: + - Fix indent format issue related to optional chaining array access ([brighterscript-formatter#71](https://github.com/rokucommunity/brighterscript-formatter/pull/71)) + + + +## [2.38.8](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.7...v2.38.8) - 2023-01-31 +### Changed + - Allow relative injectRaleTrackerTask ([#462](https://github.com/rokucommunity/vscode-brightscript-language/pull/462)) + - upgrade to [roku-debug@0.18.3](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0183---2023-01-31). Notable changes since 0.18.1: + - Increase the timeout for debug protocol control ([roku-debug#134](https://github.com/rokucommunity/roku-debug/pull/134)) + - Fix off-by-1 bug with threads over protocol ([roku-debug#132](https://github.com/rokucommunity/roku-debug/pull/132)) + + + +## [2.38.7](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.6...v2.38.7) - 2023-01-24 +### Changed + - upgrade to [roku-debug@0.18.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0181---2023-01-24). Notable changes since 0.18.0: + - hide prefixed variables in the debug variable panel ([roku-debug#127](https://github.com/rokucommunity/roku-debug/pull/127)) + - fix isAssignableExpression to correctly support dotted and indexed set statements ([roku-debug#128](https://github.com/rokucommunity/roku-debug/pull/128)) +### Fixed + - `continue` keyword colorization ([#459](https://github.com/rokucommunity/vscode-brightscript-language/pull/459)) + + + +## [2.38.6](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.5...v2.38.6) - 2023-01-17 +### Changed + - replaced vsmarketplace badge url to pass marketplace certification + + + +## [2.38.5](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.4...v2.38.5) - 2023-01-17 +### Changed + - nothing changed. the VSCode extension marketplace isn't showing v2.38.4 for some reason, so bump the patch version to force an update + + + +## [2.38.4](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.3...v2.38.4) - 2023-01-12 +### Changed + - upgrade to [roku-deploy@3.9.3](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#393---2023-01-12) + - upgrade to [roku-debug@0.18.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0180---2023-01-12) + - Execute command for repl expressions ([roku-debug#119](https://github.com/rokucommunity/roku-debug/pull/119)) + - Fix inifinite-spin for unloaded vars ([roku-debug#120](https://github.com/rokucommunity/roku-debug/pull/120)) + - upgrade to [brighterscript@0.61.3](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0613---2023-01-12). Notable changes since 0.61.2: + - Add diagnostic for passing more than 5 arguments to a callFunc ([brighterscript#765](https://github.com/rokucommunity/brighterscript/pull/765)) + - upgrade to [brighterscript-formatter@1.6.23](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1623---2023-01-12) +### Fixed + - rdb keypaths and focus scrolling ([#455](https://github.com/rokucommunity/vscode-brightscript-language/pull/455)) + + + +## [2.38.3](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.2...v2.38.3) - 2022-12-15 +### Changed + - upgrade to [roku-debug@0.17.3](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0173---2022-12-15). Notable changes since 0.17.1: + - Debug protocol breakpoint verification ([roku-debug#117](https://github.com/rokucommunity/roku-debug/pull/117)) + - upgrade to [brighterscript@0.61.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0612---2022-12-15) + - upgrade to [brighterscript-formatter@1.6.22](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1622---2022-12-15). Notable changes since 1.6.20: + - Fix continue for ([brighterscript-formatter#65](https://github.com/rokucommunity/brighterscript-formatter/pull/65)) +### Fixed + - Make vsix smaller by excluding unneeded files ([#454](https://github.com/rokucommunity/vscode-brightscript-language/pull/454)) + - Upgrade webview build system ([#450](https://github.com/rokucommunity/vscode-brightscript-language/pull/450)) + - upgrade roku-test-automation module and update code accordingly ([#440](https://github.com/rokucommunity/vscode-brightscript-language/pull/440)) + + + +## [2.38.2](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.1...v2.38.2) - 2022-12-08 +### Changed + - upgrade to [roku-debug@0.17.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0171---2022-12-08). Notable changes since 0.17.0: + - Fix npm audit issues. ([#roku-debuge1857c7](https://github.com/rokucommunity/roku-debug/commit/e1857c7)) + - Fix "continue" repeat bug in protocol adapter ([roku-debug#114](https://github.com/rokucommunity/roku-debug/pull/114)) + - Fix issue with truncated debugger paths ([roku-debug#113](https://github.com/rokucommunity/roku-debug/pull/113)) + - Bugfix/do not alter out file path for libraries ([roku-debug#112](https://github.com/rokucommunity/roku-debug/pull/112)) + - upgrade to [brighterscript@0.61.1](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0611---2022-12-07). Notable changes since 0.60.5: + - Ensure enums and interfaces persist in typedefs ([brighterscript#757](https://github.com/rokucommunity/brighterscript/pull/757)) + - Throttle transpiling to prevent crashes ([brighterscript#755](https://github.com/rokucommunity/brighterscript/pull/755)) + - Let users use or discard explicit types ([brighterscript#744](https://github.com/rokucommunity/brighterscript/pull/744)) + - Fix exception while validating continue statement ([brighterscript#752](https://github.com/rokucommunity/brighterscript/pull/752)) + - Add missing visitor params for DottedSetStatement ([brighterscript#748](https://github.com/rokucommunity/brighterscript/pull/748)) + - Flag incorrectly nested statements ([brighterscript#747](https://github.com/rokucommunity/brighterscript/pull/747)) + - Prevent a double `super` call in subclasses ([brighterscript#740](https://github.com/rokucommunity/brighterscript/pull/740)) + - Fixes issues with Roku doc scraper and adds missing components ([brighterscript#736](https://github.com/rokucommunity/brighterscript/pull/736)) + - upgrade to [brighterscript-formatter@1.6.20](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1620---2022-12-08) + + + +## [2.38.1](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.38.0...v2.38.1) - 2022-11-04 +### Changed + - upgrade to [brighterscript@0.60.5](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0605---2022-11-03). Notable changes since 0.60.4: + - Cache `getCallableByName` ([brighterscript#739](https://github.com/rokucommunity/brighterscript/pull/739)) + - Prevent namespaces being used as variables ([brighterscript#738](https://github.com/rokucommunity/brighterscript/pull/738)) + - Fix crash in `getDefinition` ([brighterscript#734](https://github.com/rokucommunity/brighterscript/pull/734)) +### Fixed + - significant performance issue while validating larger projects ([brighterscript#739](https://github.com/rokucommunity/brighterscript/pull/739)) + + + +## [2.38.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.37.0...v2.38.0) - 2022-11-02 +### Changed + - Added the `brightscript_warnings` command ([#446](https://github.com/rokucommunity/vscode-brightscript-language/pull/446)) + - upgrade to [roku-debug@0.17.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0170---2022-11-02). Notable changes since 0.16.1: + - Added the `brightscript_warnings` command ([roku-debug#110](https://github.com/rokucommunity/roku-debug/pull/110)) + + + +## [2.37.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.36.1...v2.37.0) - 2022-10-28 +### Added + - add `brightscript.deviceDiscovery.concealDeviceInfo` option to obscure the device-info ([#443](https://github.com/rokucommunity/vscode-brightscript-language/pull/443)) +### Changed + - upgrade to [roku-debug@0.16.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0161---2022-10-28) + - upgrade to [brighterscript@0.60.4](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0604---2022-10-28). Notable changes since 0.60.2: + - fix: allow `continue` as local var ([brighterscript#730](https://github.com/rokucommunity/brighterscript/pull/730)) + - fix: semanticToken request wait until validate finishes ([brighterscript#727](https://github.com/rokucommunity/brighterscript/pull/727)) + - fix: better parse recovery for unknown function parameter types ([brighterscript#722](https://github.com/rokucommunity/brighterscript/pull/722)) + - upgrade to [brighterscript-formatter@1.6.19](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1619---2022-10-28) +### Fixed + - allow clearing rendezvous events when a debug session is not running. ([#444](https://github.com/rokucommunity/vscode-brightscript-language/pull/444)) + - move "clear rendezvous history" button out of a menu and into the title bar of that section ([#444](https://github.com/rokucommunity/vscode-brightscript-language/pull/444)) + + + +## [2.36.1](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.36.0...v2.36.1) - 2022-10-18 +### Changed + - upgrade to [brighterscript@0.60.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0602---2022-10-18). Notable changes since 0.60.1: + - Fix if statement block var bug ([brighterscript#698](https://github.com/rokucommunity/brighterscript/pull/698)) + + + +## [2.36.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.35.2...v2.36.0) - 2022-10-18 +### Added + - all launch configuration settings are avaiable in settings under the `brightscript.debug` key ([#438](https://github.com/rokucommunity/vscode-brightscript-language/pull/438)) +### Changed + - Handle new custom event structures and names introduced in roku-debug@0.16.0 ([#433](https://github.com/rokucommunity/vscode-brightscript-language/pull/433)) + - upgrade to [roku-deploy@3.9.2](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#392---2022-10-03). Notable changes since 3.8.1: + - Replace minimatch with picomatch ([roku-deploy#101](https://github.com/rokucommunity/roku-deploy/pull/101)) + - Sync retainStagingFolder, stagingFolderPath with options. ([roku-deploy#100](https://github.com/rokucommunity/roku-deploy/pull/100)) + - Add stagingDir and retainStagingDir. ([roku-deploy#99](https://github.com/rokucommunity/roku-deploy/pull/99)) + - upgrade to [roku-debug@0.16.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0160---2022-10-17). Notable changes since 0.15.0: + - fix crash in rendezvous parser for missing files ([roku-debug#108](https://github.com/rokucommunity/roku-debug/pull/108)) + - emit device diagnostics instead of compile errors ([roku-debug#104](https://github.com/rokucommunity/roku-debug/pull/104)) + - standardize custom events, add is* helpers ([roku-debug#103](https://github.com/rokucommunity/roku-debug/pull/103)) + - better debug protocol launch handling ([roku-debug#102](https://github.com/rokucommunity/roku-debug/pull/102)) + - upgrade to [brighterscript@0.60.1](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0601---2022-10-18). Notable changes since 0.57.2: + - add goto definition for enum statements and enum members ([brighterscript#715](https://github.com/rokucommunity/brighterscript/pull/715)) + - add jsdoc eslint checking ([brighterscript#717](https://github.com/rokucommunity/brighterscript/pull/717)) + - add support for nested namespaces ([brighterscript#708](https://github.com/rokucommunity/brighterscript/pull/708)) + - add an 'isThrowStatement' utility function for plugins ([brighterscript#709](https://github.com/rokucommunity/brighterscript/pull/709)) + - add support for `pkg:/` paths in `setFile` ([brighterscript#701](https://github.com/rokucommunity/brighterscript/pull/701)) + - add syntax and transpile support for continue statement ([brighterscript#697](https://github.com/rokucommunity/brighterscript/pull/697)) + - add AST child searching functionality. ([brighterscript#695](https://github.com/rokucommunity/brighterscript/pull/695)) + - change: migrate to `stagingDir` away from `stagingFolder` ([brighterscript#706](https://github.com/rokucommunity/brighterscript/pull/706)) + - change: change `isClassFieldMethod` and `isClassMethodStatement` calls to use `isFieldMethod` and `isMethodStatement` ([brighterscript#694](https://github.com/rokucommunity/brighterscript/pull/694)) + - change: create common ancestor for Expression and Statement ([brighterscript#693](https://github.com/rokucommunity/brighterscript/pull/693)) + - change: move file validation into BscPlugin ([brighterscript#688](https://github.com/rokucommunity/brighterscript/pull/688)) + - fix token location for bs1042 ([brighterscript#719](https://github.com/rokucommunity/brighterscript/pull/719)) + - fix signature help resolution for callexpressions ([brighterscript#707](https://github.com/rokucommunity/brighterscript/pull/707)) + - fix transpilation of simple else block with leading comment ([brighterscript#712](https://github.com/rokucommunity/brighterscript/pull/712)) + - fix enum error for negative values ([brighterscript#703](https://github.com/rokucommunity/brighterscript/pull/703)) + - fix: finds and includes more deeply embedded expressions ([brighterscript#696](https://github.com/rokucommunity/brighterscript/pull/696)) + - fix xml parse bug during benchmarking ([#brighterscript0805c1f](https://github.com/rokucommunity/brighterscript/commit/0805c1f)) + - fix: scope validation performance boost ([brighterscript#656](https://github.com/rokucommunity/brighterscript/pull/656)) + - fix: error during transpile with duplicate file paths ([brighterscript#691](https://github.com/rokucommunity/brighterscript/pull/691)) + - upgrade to [brighterscript-formatter@1.6.17](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1617---2022-10-03) +### Fixed + - ignore default user settings not set by user ([#439](https://github.com/rokucommunity/vscode-brightscript-language/pull/439)) + + + +## [2.35.2](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.35.1...v2.35.2) - 2022-09-08 +### Changed + - upgrade to [brighterscript@0.57.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0572---2022-09-08). Notable changes since 0.57.0: + - Fix brightscript.configFile workspace config bug ([brighterscript#686](https://github.com/rokucommunity/brighterscript/pull/686)) + - fix(parser): consider namespace function transpiled names ([brighterscript#685](https://github.com/rokucommunity/brighterscript/pull/685)) + + + +## [2.35.1](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.35.0...v2.35.1) - 2022-09-02 +### Changed + - Document customizing editor.wordSeparators for trailing type symbols ([#436](https://github.com/rokucommunity/vscode-brightscript-language/pull/436)) + - upgrade to [roku-deploy@3.8.1](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#381---2022-09-02). Notable changes since 3.7.1: + - Bump moment from 2.29.2 to 2.29.4 ([roku-deploy#98](https://github.com/rokucommunity/roku-deploy/pull/98)) + - Remotedebug connect early ([roku-deploy#97](https://github.com/rokucommunity/roku-deploy/pull/97)) + - Better compile error handling ([roku-deploy#96](https://github.com/rokucommunity/roku-deploy/pull/96)) + - upgrade to [brighterscript@0.57.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0570---2022-09-02). Notable changes since 0.56.0: + - Allow `mod` as an aa prop, aa member identifier kinds forced to Identifier ([brighterscript#684](https://github.com/rokucommunity/brighterscript/pull/684)) + - Improve Roku docs information ([brighterscript#585](https://github.com/rokucommunity/brighterscript/pull/585)) + - Validate too deep nested files ([brighterscript#680](https://github.com/rokucommunity/brighterscript/pull/680)) + - Add class method binding docs ([brighterscript#682](https://github.com/rokucommunity/brighterscript/pull/682)) + - Fix case sensitivity issue with bs_const values ([brighterscript#677](https://github.com/rokucommunity/brighterscript/pull/677)) + - upgrade to [brighterscript-formatter@1.6.16](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1616---2022-09-02). Notable changes since 1.6.15: + - Mod case formatting ([brighterscript-formatter#62](https://github.com/rokucommunity/brighterscript-formatter/pull/62)) + - Parse all code as brighterscript to improve formatting context ([brighterscript-formatter#61](https://github.com/rokucommunity/brighterscript-formatter/pull/61)) + - Split formatter into separate processors ([brighterscript-formatter#57](https://github.com/rokucommunity/brighterscript-formatter/pull/57)) + - Break `process` into smaller functions ([brighterscript-formatter#59](https://github.com/rokucommunity/brighterscript-formatter/pull/59)) + - Rename `process` to `format` ([brighterscript-formatter#60](https://github.com/rokucommunity/brighterscript-formatter/pull/60)) + + + +## [2.35.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.34.2...v2.35.0) - 2022-08-24 +### Changed + - upgrade to [roku-debug@0.15.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0150---2022-08-23). Notable changes since 0.14.2: + - Fix stopOnEntry bug with deep links. ([roku-debug#100](https://github.com/rokucommunity/roku-debug/pull/100)) + - Add `invalid` data type support ([roku-debug#99](https://github.com/rokucommunity/roku-debug/pull/99)) + - Add support for conditional breakpoints ([roku-debug#97](https://github.com/rokucommunity/roku-debug/pull/97)) + - upgrade to [brighterscript@0.56.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0560---2022-08-23). Notable changes since 0.55.2: + - Fix compile crash for scope-less files ([brighterscript#674](https://github.com/rokucommunity/brighterscript/pull/674)) + - Fix parse error for malformed dim statement ([brighterscript#673](https://github.com/rokucommunity/brighterscript/pull/673)) + - Add validation for dimmed variables ([brighterscript#672](https://github.com/rokucommunity/brighterscript/pull/672)) + - Allow const as variable name ([brighterscript#670](https://github.com/rokucommunity/brighterscript/pull/670)) + - upgrade to [brighterscript-formatter@1.6.15](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1615---2022-08-24) +### Fixed + - improve multi-network-interface device discovery ([#427](https://github.com/rokucommunity/vscode-brightscript-language/pull/427)) + - component var coloring ([#426](https://github.com/rokucommunity/vscode-brightscript-language/pull/426)) + + + +## [2.34.2](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.34.1...v2.34.2) - 2022-08-15 +### Fixed + - converted file svg icons to paths instead of text + + + +## [2.34.1](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.34.0...v2.34.1) - 2022-08-15 +### Changed + - Add .bs and .brs file icon support ([#422](https://github.com/rokucommunity/vscode-brightscript-language/pull/422)) + - WebView restructuring ([#421](https://github.com/rokucommunity/vscode-brightscript-language/pull/421)) + - Add activation events for device panel ([#418](https://github.com/rokucommunity/vscode-brightscript-language/pull/418)) + - upgrade to [roku-debug@0.14.2](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0142---2022-08-12). Notable changes since 0.14.1: + - Support complib breakpoints on 11.5.0 ([roku-debug#96](https://github.com/rokucommunity/roku-debug/pull/96)) + - Disable thread hopping workaround >= protocol v3.1.0 ([roku-debug#95](https://github.com/rokucommunity/roku-debug/pull/95)) + - Upload zip and connect to protocol socket in parallel ([roku-debug#94](https://github.com/rokucommunity/roku-debug/pull/94)) + - upgrade to [brighterscript@0.55.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0552---2022-08-15). Notable changes since 0.53.1: + - Dedupe code completions in components ([brighterscript#664](https://github.com/rokucommunity/brighterscript/pull/664)) + - Fix scope-specific diagnostic grouping issue ([brighterscript#660](https://github.com/rokucommunity/brighterscript/pull/660)) + - Fix typescript error for ast parent setting ([brighterscript#659](https://github.com/rokucommunity/brighterscript/pull/659)) + - Fix missing constant references ([brighterscript#658](https://github.com/rokucommunity/brighterscript/pull/658)) + - Link all brs AST nodes to parent onFileValidate ([brighterscript#650](https://github.com/rokucommunity/brighterscript/pull/650)) + - Add a `toJSON` function to SymbolTable ([brighterscript#655](https://github.com/rokucommunity/brighterscript/pull/655)) + - Performance boost: better function sorting during validation ([brighterscript#651](https://github.com/rokucommunity/brighterscript/pull/651)) + - Add semantic token color for consts ([brighterscript#654](https://github.com/rokucommunity/brighterscript/pull/654)) + - Add go-to-definition support for const statements ([brighterscript#653](https://github.com/rokucommunity/brighterscript/pull/653)) + - Fix broken plugin imports with custom cwd ([brighterscript#652](https://github.com/rokucommunity/brighterscript/pull/652)) + - Fix bug in languageserver hover provider ([brighterscript#649](https://github.com/rokucommunity/brighterscript/pull/649)) + - Add hover for CONST references. ([brighterscript#648](https://github.com/rokucommunity/brighterscript/pull/648)) + - Allow plugins to contribute completions ([brighterscript#647](https://github.com/rokucommunity/brighterscript/pull/647)) + - chore: github actions use latest operating systems ([#brighterscript0b3d31a](https://github.com/rokucommunity/brighterscript/commit/0b3d31a)) + - Plugin support for hover ([brighterscript#393](https://github.com/rokucommunity/brighterscript/pull/393)) + - Export some vscode interfaces ([brighterscript#644](https://github.com/rokucommunity/brighterscript/pull/644)) + - Better plugin docs ([brighterscript#643](https://github.com/rokucommunity/brighterscript/pull/643)) + - upgrade to [brighterscript-formatter@1.6.14](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1614---2022-08-12) + + + +## [2.34.0](https://github.com/rokucommunity/vscode-brightscript-language/compare/v2.33.2...v2.34.0) - 2022-07-18 +### Added + - support showing popups from debug sessions ([#407](https://github.com/rokucommunity/vscode-brightscript-language/pull/407)) + - syntax highlighting for regex literals ([#408](https://github.com/rokucommunity/vscode-brightscript-language/pull/408)) + - syntax highlighting support for the new `const` keyword ([#412](https://github.com/rokucommunity/vscode-brightscript-language/pull/412)) +### Changed + - upgrade to [roku-debug@0.14.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0141---2022-07-16). Notable changes since 0.13.1: + - case-sensitivity in getVariables protocol request ([roku-debug#91](https://github.com/rokucommunity/roku-debug/pull/91)) + - Show error when cannot resolve hostname ([roku-debug#90](https://github.com/rokucommunity/roku-debug/pull/90)) + - upgrade to [brighterscript@0.53.1](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0531---2022-07-15). Notable changes since 0.52.2: + - support codeactions at the edges of tokens. ([brighterscript#642](https://github.com/rokucommunity/brighterscript/pull/642)) + - fix nested namespace import codeActions bug. ([brighterscript#641](https://github.com/rokucommunity/brighterscript/pull/641)) + - new Language Feature: Constants ([brighterscript#632](https://github.com/rokucommunity/brighterscript/pull/632)) + - flag invalid top level statements ([brighterscript#638](https://github.com/rokucommunity/brighterscript/pull/638)) + - flag usage of undefined variables ([brighterscript#631](https://github.com/rokucommunity/brighterscript/pull/631)) + - better project detection by language server ([brighterscript#633](https://github.com/rokucommunity/brighterscript/pull/633)) + - fix bug with class transpile in watch mode ([brighterscript#630](https://github.com/rokucommunity/brighterscript/pull/630)) + - send program-triggered validate() diagnostics to language client ([brighterscript#629](https://github.com/rokucommunity/brighterscript/pull/629)) + - emit before/after programTranspile plugin events during file transpile preview ([brighterscript#628](https://github.com/rokucommunity/brighterscript/pull/628)) + - upgrade to [brighterscript-formatter@1.6.13](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1613---2022-07-16). Notable changes since 1.6.12: + - Fix import statement formatting. ([brighterscript-formatter#55](https://github.com/rokucommunity/brighterscript-formatter/pull/55)) +### Fixed + - property and call syntax highlighting ([#414](https://github.com/rokucommunity/vscode-brightscript-language/pull/414)) + - import statement syntax highlighting. ([#413](https://github.com/rokucommunity/vscode-brightscript-language/pull/413)) + - Rdb improvements ([#410](https://github.com/rokucommunity/vscode-brightscript-language/pull/410)) + + + +## [2.33.2](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.33.1...v2.33.2) - 2022-06-13 +### Changed + - updated to [brighterscript@0.52.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0522---2022-06-13). Notable changes since v0.52.0: + - fixed transpile crash when file was changed by a plugin in beforeTranspile events ([brighterscript#627](https://github.com/rokucommunity/brighterscript/pull/627)) + - fixed bug in transpile preview custom command that wasn't returning the result ([brighterscript#626](https://github.com/rokucommunity/brighterscript/pull/626)) + - add missing range on interface statement, causing transpile crashes ([brighterscript#623](https://github.com/rokucommunity/brighterscript/pull/623)) + - transpile enum values in binary expressions ([brighterscript#622](https://github.com/rokucommunity/brighterscript/pull/622)) + - detect class circular extends ([brighterscript#619](https://github.com/rokucommunity/brighterscript/pull/619)) + - improve namespace/enum/class semantic token detection (better syntax highlighting) ([brighterscript#621](https://github.com/rokucommunity/brighterscript/pull/#621)) + + + +## [2.33.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.33.0...v2.33.1) - 2022-06-09 +### Changed + - updated to [roku-debug@0.13.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0131---2022-06-09). + - fixed dynamic breakpoints bug where component library breakpoints weren't being hit ([roku-debug#89](https://github.com/rokucommunity/roku-debug/pull/89)) + + + +## [2.33.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.32.1...v2.33.0) - 2022-06-08 +### Changed + - updated to [brighterscript@0.52.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0520---2022-06-08). Notable changes since v0.51.4: + - update LanguageServer to load projects based on bsconfig.json presence ([brighterscript#613](https://github.com/rokucommunity/brighterscript/pull/613)) + - updated to [roku-debug@0.13.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0130---2022-06-08). Notable changes since 0.12.2: + - add support for dynamic breakpoints when using Debug Protocol ([roku-debug#84](https://github.com/rokucommunity/roku-debug/pull/84)) + - fix crash when RAF files show up in stacktrace ([roku-debug#88](https://github.com/rokucommunity/roku-debug/pull/88)) + - updated to [roku-deploy@3.7.1](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#371---2022-06-08) +### Fixed + - don't show error messages when 0 Roku devices are found in the active device manager ([#406](https://github.com/rokucommunity/vscode-brightscript-language/pull/406)) + - delay the language server 1.5 seconds when running in dev mode to help with language server debugging ([#405](https://github.com/rokucommunity/vscode-brightscript-language/pull/405)) + - add missing RDP parameter ([#403](https://github.com/rokucommunity/vscode-brightscript-language/pull/403)) + + + +## [2.32.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.32.0...v2.32.1) - 2022-06-02 +### Fixed + - allow user-specified RDB port ([#401](https://github.com/rokucommunity/vscode-brightscript-language/pull/401)) + - prevent RDB-related "port already in use" error after the first debug session ([#401](https://github.com/rokucommunity/vscode-brightscript-language/pull/401)) + + + +## [2.32.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.31.1...v2.32.0) - 2022-05-31 +### Added + - new SceneGraph Inspector panel to view/manage all on-device SceneGraph nodes right in vscode. ([#386](https://github.com/rokucommunity/vscode-brightscript-language/pull/386)) + - syntax coloring for experimental `ComponentStatement` brighterscript feature ([#389](https://github.com/rokucommunity/vscode-brightscript-language/pull/389)) + - subdivisions to VSCode Extension Settings ([#390](https://github.com/rokucommunity/vscode-brightscript-language/pull/390)) + - refresh button in the devices panel ([#392](https://github.com/rokucommunity/vscode-brightscript-language/pull/392)) + - support for `enum` and `interface` lookup ([#398](https://github.com/rokucommunity/vscode-brightscript-language/pull/398)) +### Changed + - updated to [brighterscript@0.51.4](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0514---2022-05-31). Notable changes since v0.48.1: + - allow interfaces and enums as function param types ([#580](https://github.com/rokucommunity/brighterscript/pull/580)) + - Transpile files added by plugins after start of transpile cycle ([#578](https://github.com/rokucommunity/brighterscript/pull/578)) + - Fix semantic tokens for enums in if statements ([#584](https://github.com/rokucommunity/brighterscript/pull/584)) + - Fix language server cwd issue with multi-root workspaces ([#592](https://github.com/rokucommunity/brighterscript/pull/592)) + - `allowBrighterScriptInBrightScript` config option to allow brighterscript features to be included in BrightScript files, and force those files to be transpiled ([#573](https://github.com/rokucommunity/brighterscript/pull/573)) + - allow enums and interfaces as function return types ([#601](https://github.com/rokucommunity/brighterscript/pull/601)) + - allow enums and interfaces as class field types ([#602](https://github.com/rokucommunity/brighterscript/pull/602)) + - add hover for namespace functions ([#606](https://github.com/rokucommunity/brighterscript/pull/606)) + - updated to [roku-debug@0.12.2](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0122---2022-05-31). Notable changes since 0.10.5: + - fix RDB path bug on windows ([#76](https://github.com/rokucommunity/roku-debug/pull/76)) + - add `brightScriptConsolePort` option. Utilize `remotePort` in more places ([#79](https://github.com/rokucommunity/roku-debug/pull/79)) + - fix crash during rendezvous tracking ([#82](https://github.com/rokucommunity/roku-debug/pull/82)) + - fix line number and thread hopping issues ([#86](https://github.com/rokucommunity/roku-debug/pull/86)) + - updated to [roku-deploy@3.7.0](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#370---2022-05-23) +### Fixed + - Excludes the out directory from readDeclarations function ([#391](https://github.com/rokucommunity/vscode-brightscript-language/pull/391)) + - `roIntrinsicDouble` syntax highlighting color ([#395](https://github.com/rokucommunity/vscode-brightscript-language/pull/395)) + + + +## [2.31.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.31.0...v2.31.1) - 2022-04-18 +### Fixed + - Unfocus **remote control mode** statusbar item on click ([#384](https://github.com/rokucommunity/vscode-brightscript-language/pull/384)) + - Add missing **remote control mode** keybinding `Ctrl+Escape`/`Cmd+Escape` for home press ([#383](https://github.com/rokucommunity/vscode-brightscript-language/pull/383)) + - enable **remote control mode** telemetry tracking + + +## [2.31.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.30.1...v2.31.0) - 2022-04-14 +### Added + - a `BRS` custom view in the Activity Bar ([#375](https://github.com/rokucommunity/vscode-brightscript-language/pull/375)) + - new **Remote Control Mode** to handle Roku remote emulation. ([#375](https://github.com/rokucommunity/vscode-brightscript-language/pull/375)) + - history tracking of the last 30 unique values sent by the `extension.brightscript.sendRemoteText` command ([#375](https://github.com/rokucommunity/vscode-brightscript-language/pull/375)) + - Many missing ECP commands ([#375](https://github.com/rokucommunity/vscode-brightscript-language/pull/375)) + - new `extension.brightscript.showReleaseNotes` command accessible via the command pallet +### Changed + - Remove the debug-panel focus-based remote emulation functionality in favor of **Remote Control Mode** ([#375](https://github.com/rokucommunity/vscode-brightscript-language/pull/375)) + - updated to [brighterscript@0.48.1](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0481---2022-04-14) + - language support for native BrightScript optional chaining ([#546](https://github.com/rokucommunity/brighterscript/pull/546)) + - validation for all known `createObject` values and parameters. ([#435](https://github.com/rokucommunity/brighterscript/pull/435), [#568](https://github.com/rokucommunity/brighterscript/pull/568)) + - for plugin authors: + - fixed accuracy issues when parsing the manifest ([#565](https://github.com/rokucommunity/brighterscript/pull/565)) + - add missing statements and expressions to `createVisitor` ([#567](https://github.com/rokucommunity/brighterscript/pull/567)) + - updated to [roku-deploy@3.6.0](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#360---2022-04-13) + - updated to [brighterscript-formatter@1.6.12](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1612---2022-04-13) + - updated to [roku-debug@0.10.5](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0105---2022-04-13) + - removed the `CreateObject` snippet because it's too aggressive +### Fixed + - bug with `brightscript.deviceDiscovery.includeNonDeveloperDevices` setting not working + - bug with `brightscript.deviceDiscovery.enabled` not working properly ([#236](https://github.com/rokucommunity/vscode-brightscript-language/issues/236)) + - issue where the rendezvous ui commands would show up in the when they shouldn't + - Rendezvous timing issue ([#367](https://github.com/rokucommunity/vscode-brightscript-language/issues/367)) + + + +## [2.30.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.30.0...v2.30.1) - 2022-04-07 +### Changed + - updated to [roku-debug@0.10.2](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0104---2022-04-07) + - fixed stability issues when restarting an existing debug session ([#74](https://github.com/rokucommunity/roku-debug/pull/74)) + - fixed issue where the `type` and `keys` commands would time out. ([#73](https://github.com/rokucommunity/roku-debug/pull/73)) + - possible fix for [#72](https://github.com/rokucommunity/roku-debug/issues/72) ([#73](https://github.com/rokucommunity/roku-debug/pull/73)) + - updated to [brighterscript@0.47.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0472---2022-04-07) + - fixed enum transpile bug for binary expressions ([#559](https://github.com/rokucommunity/brighterscript/pull/559)) + - added missing `require` entry to `bsconfig.schema.json` ([#560](https://github.com/rokucommunity/brighterscript/pull/560)) + - don't add trailing commas in transpiled output for array and aa literals ([#556](https://github.com/rokucommunity/brighterscript/pull/556)) + - retain quote char when transpiling xml attributes ([#552](https://github.com/rokucommunity/brighterscript/pull/552)) + - add `require` flag to allow loading external node modules as part of the build process (useful for things like `ts-node/register`). ([#550](https://github.com/rokucommunity/brighterscript/pull/550), [#551](https://github.com/rokucommunity/brighterscript/pull/551)) + - updated to [brighterscript-formatter@1.6.11](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1611---2022-04-07) +### Fixed + - empty `host` and `password` fields for new launch configuration + - standardized the default value for `retainStagingFolder` and `stopOnEntry` launch options + + + +## [2.30.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.29.4...v2.30.0) - 2022-03-30 +### Added + - Add bsc problem matchers. (`$bsc`, `$bsc-watch`, `$bsc-watch-silent`) ([#376](https://github.com/rokucommunity/vscode-brightscript-language/pull/376)) + + + +## [2.29.4](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.29.3...v2.29.4) - 2022-03-25 +### Changed + - updated to [roku-debug@0.10.2](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0102---2022-03-25) + - fixed bug with protocol step command killing the app ([roku-debug#70](https://github.com/rokucommunity/roku-debug/pull/70)) + - fixed event flow on protocol debugger startup ([roku-debug#70](https://github.com/rokucommunity/roku-debug/pull/70)) + - fixed bug cleaning up packet lengths for v3 ([roku-debug#70](https://github.com/rokucommunity/roku-debug/pull/70)) + - updated to [brighterscript@0.46.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0460---2022-03-24) + - refactored try-catch statement to make the expressions and bodies easier to access via plugins. ([brighterscript#514](https://github.com/rokucommunity/brighterscript/pull/514)) +### Fixed + - sendRemoteText command no longer times out when sending large text. ([#373](https://github.com/rokucommunity/vscode-brightscript-language/pull/373)) + + + +## [2.29.3](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.29.2...v2.29.3) - 2022-03-23 +### Fixed + - reverted syntax highlighting introduced in v2.29.2. + + + +## [2.29.2](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.29.1...v2.29.2) - 2022-03-22 +### Fixed + - better function, method, and type syntax highlighting. ([#371](https://github.com/rokucommunity/vscode-brightscript-language/pull/371)) + + + +## [2.29.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.29.0...v2.29.1) - 2022-03-18 +### Changed + - updated to [roku-debug@0.10.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0101---2022-03-17) + - updated to [brighterscript@0.45.6](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0456---2022-03-17) + - updated to [brighterscript-formatter@1.6.10](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#1610---2022-03-17) + - updated to [roku-deploy@3.5.4](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#354---2022-03-17) +### Fixed + - speed issues when zipping project during launch ([roku-deploy#86](https://github.com/rokucommunity/roku-deploy/pull/86)) + + + +## [2.29.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.28.1...v2.29.0) - 2022-03-08 +### Changed + - updated to [brighterscript@0.45.4](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0454---2022-03-08) + - fixed bug calculating parse time. ([brighterscript#532](https://github.com/rokucommunity/brighterscript/pull/532)) + - updated to [roku-debug@0.10.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#0100---2022-03-08) + - added support for roku debug protocol v3.0.0 + - support for eval/execute functionality over the debug protocol(v3.0.0+) from the debug console + - Changed: running `print` statements in the debug console now runs an actual print statement. To do variable evaluation, simply type the name of the variable. + + + +## [2.28.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.28.0...v2.28.1) - 2022-02-24 +### Changed + - updated to [brighterscript@0.45.2](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0452---2022-02-24) + - fixed significant memory leak [brighterscript#527](https://github.com/rokucommunity/brighterscript/pull/527) + - updated to [brighterscript-formatter@1.6.9](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#169---2022-02-24) + - updated to [roku-deploy@3.5.3](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#353---2022-02-16) + - updated to [roku-debug@0.9.4](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#094---2022-02-24) + + + +## [2.28.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.27.2...v2.28.0) - 2022-02-11 +### Changed + - updated to [brighterscript@0.45.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0450---2022-02-11) + - `enum` language feature ([BrighterScript#484](https://github.com/rokucommunity/brighterscript/pull/484)) + - updated to [brighterscript-formatter@1.6.8](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#168---2022-02-11) + - adds enum indentation support +### Fixed + - fixed bug with indented enum syntax highlighting + - bug with namespace, interface, and enum indentation rules + + + +## [2.27.2](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.27.1...v2.27.2) - 2022-02-08 +### Added + - enum syntax highlighting ([#359](https://github.com/rokucommunity/vscode-brightscript-language/pull/359)) +### Changed + - updated to [brighterscript@0.44.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0440---2022-02-08) + - fixed bug in hover showing required params as optional and optional params as required ([brighterscript#501](https://github.com/rokucommunity/brighterscript/pull/501)) + - show plugin transpile modifications in the `getTranspiledFile` callback (used for "show preview" functionality in vscode) ([brighterscript#502](https://github.com/rokucommunity/brighterscript/pull/502)) + + + +## [2.27.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.27.0...v2.27.1) - 2022-02-01 +### Changed + - updated to [brighterscript-formatter@1.6.7](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#167---2022-02-01) +### Fixed + - formatting bug that was incorrectly removing whitespace between certain characters. ([brighterscript-formatter#49](https://github.com/rokucommunity/brighterscript-formatter/pull/49)) + + + +## [2.27.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.26.1...v2.27.0) - 2022-01-31 +### Added + - start tracking anonymized telemetry data to give visibility into real-world usage of the extension and its features. ([#354](https://github.com/rokucommunity/vscode-brightscript-language/pull/354)) + + + +## [2.26.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.26.0...v2.26.1) - 2022-01-28 +### Changed + - updated to [brighterscript@0.43.1](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0431---2022-01-28) + - fix crash when hovering over global functions ([brighterscript#497](https://github.com/rokucommunity/brighterscript/pull/497)) + + + +## [2.26.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.25.3...v2.26.0) - 2022-01-28 +### Added + - ability to filter out devices with developer mode off ([#353](https://github.com/rokucommunity/vscode-brightscript-language/pull/353)) +### Changed + - updated to [brighterscript@0.43.0](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0430---2022-01-28). Since last update: + - show function documentation when hovering over functions. ([brighterscript#495](https://github.com/rokucommunity/brighterscript/pull/495)) + - bug preventing code to come after an interface statement. ([brighterscript#493](https://github.com/rokucommunity/brighterscript/pull/493)) + - bug in global function parameter checking that was not properly enforcing optional/required status for parameters. ([brighterscript#479](https://github.com/rokucommunity/brighterscript/pull/479)) + - updated to [brighterscript-formatter@1.6.6](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#166---2022-01-28) + - properly formats an interface that includes subs and functions ([brighterscript-formatter#46](https://github.com/rokucommunity/brighterscript-formatter/pull/46)) + - adds better support for appropriate whitespace between minus and numbers/identifiers ([brighterscript-formatter#47](https://github.com/rokucommunity/brighterscript-formatter/pull/47)) + - updated to [roku-debug@0.9.3](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#093---2022-01-28) which uses brighterscript@0.43.0 + + +## [2.25.3](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.25.2...v2.25.3) - 2022-01-14 +### Changed + - updated to [brighterscript-formatter@1.6.5](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#165---2022-01-14) + - Removed all interface snippets introduced in Adding Completion Items #105 that were partially removed a while ago. These should all be handled by the language server as we add better type tracking support. ([#348](https://github.com/rokucommunity/vscode-brightscript-language/pull/348)) + - Don't show brighterscript-specific snippets in BrightScript files ([#348](https://github.com/rokucommunity/vscode-brightscript-language/pull/348)) +### Fixed + - formatting indentation bug with `interface` statements ([brighterscript-formatter#45](https://github.com/rokucommunity/brighterscript-formatter/pull/45)) + - syntax highlighting for interface statements ([#351](https://github.com/rokucommunity/vscode-brightscript-language/pull/351)) + - Add brightscript and brighterscript snippets to BrighterScript files (they were missing for some reason) ([#348](https://github.com/rokucommunity/vscode-brightscript-language/pull/348)) + + + +## [2.25.2](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.25.1...v2.25.2) - 2022-01-12 +### Fixed + - updated to [roku-debug@0.9.2](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#092---2022-01-12) + - fixed bug with telnet debug session related to fire-and-forget commands like `step`, `continue`, etc. This was causing the debug session to stall frequently. ([roku-debug#64](https://github.com/rokucommunity/roku-debug/pull/64)) + - combine telnet output that was split due to buffer sizes ([roku-debug#64](https://github.com/rokucommunity/roku-debug/pull/64)) + + + +## [2.25.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.25.0...v2.25.1) - 2022-01-05 +### Changed + - updated to [brighterscript@0.41.6](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0416---2022-01-05) + - fixed issue in the transpiled output of the null coalescing operator where plain variable references are not properly passed into the function. ([brighterscript#474](https://github.com/rokucommunity/brighterscript/pull/474)) + - updated to [brighterscript-formatter@1.6.4](https://github.com/rokucommunity/brighterscript-formatter/blob/master/CHANGELOG.md#164---2022-01-05) + - fixed formatting issue with ternary operator and square brace in the consequent ([brighterscript-formatter#44](https://github.com/rokucommunity/brighterscript-formatter/pull/44)) + - updated to [roku-debug@0.9.1](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#091---2022-01-05) + - fixed issue where `"consoleOutput": "full"` shows no output when `enableDebugProtocol === true`. ([roku-debug#65](https://github.com/rokucommunity/roku-debug/pull/65)) + + + +## [2.25.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.24.2...v2.25.0) - 2021-12-17 +### Changed + - updated to [roku-debug@0.9.0](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#090---2021-12-17) + - Adds many new log messages at various debug levels. ([roku-debug#61](https://github.com/rokucommunity/roku-debug/pull/61)) + - Ability to inspect node children through the `[[children]]` virtual property ([#57](https://github.com/rokucommunity/roku-debug/pull/57)) + - `[[length]]` virtual property for all variables that support it. ([#57](https://github.com/rokucommunity/roku-debug/pull/57)) + - add `logLevel` launch configuration variable ([roku-debug#61](https://github.com/rokucommunity/roku-debug/pull/61)) + - rename `SceneGraph Debug Commands Log` output panel to `SceneGraph Debug Commands` ([#342](https://github.com/rokucommunity/vscode-brightscript-language/pull/342)) + - rename `BrightScript Debug Server` output panel to `BrightScript Extension` for wider usage. ([#342](https://github.com/rokucommunity/vscode-brightscript-language/pull/342)) +### Fixed + - add `brightscript.extensionLogfilePath` setting to specify an output file for debug logs ([#342](https://github.com/rokucommunity/vscode-brightscript-language/pull/342)) + - several telnet debugging issues related to the 10.5 Roku OS release.([roku-debug#57](https://github.com/rokucommunity/roku-debug/pull/57)) + + + +## [2.24.2](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.24.1...v2.24.2) - 2021-11-23 +### Changed + - updated to [brighterscript@0.41.5](https://github.com/rokucommunity/brighterscript/blob/master/CHANGELOG.md#0415---2021-11-23) +### Fixed + - critical crash in language server whenever a local variable had the same name as a javascript object function on the prototype (stuch as `constructor`). ([brighterscript#469](https://github.com/rokucommunity/brighterscript/pull/469)) + + + +## [2.24.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.24.0...v2.24.1) - 2021-11-11 +### Changed + - updated to [roku-debug@0.8.7](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#087---2021-11-11) + - Don't delete dev channel during launch, as this clears the registry. ([roku-debug#58](https://github.com/rokucommunity/roku-debug/pull/58)) + + + +## [2.24.0](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.23.1...v2.24.0) - 2021-11-04 +### Added + - limited support for running the extension in vscode for web. Currently only the syntax hightlighter works. ([#333](https://github.com/rokucommunity/vscode-brightscript-language/pull/333)) +### Fixed + - updated to [roku-debug@0.8.6](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#086---2021-11-04) + - telnet debugger to work better with RokuOS 10.5 and `run_as_process=1` projects, as well as some better detection of the `Brightscript Debugger>` prompt. + - fix ECP commands that would fail when using a hostname instead of an ip address. + - updated to [roku-deploy@3.5.2](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#352---2021-11-02) + + + ## [2.23.1](https://github.com/RokuCommunity/vscode-brightscript-language/compare/v2.23.0...v2.23.1) - 2021-10-27 ### Changed - - updated to [roku-debug@0.8.5](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#085---2021-01-27) + - updated to [roku-debug@0.8.5](https://github.com/rokucommunity/roku-debug/blob/master/CHANGELOG.md#085---2021-10-27) - add additional logging to the "BrightScript Debug Server" output panel - fixed bug with boxed primitives for telnet debugger ([roku-debug#36](https://github.com/rokucommunity/roku-debug/pull/36)) - send stdio lines as separate debug events which fixes focus bug in the output panel. ([roku-debug#51](https://github.com/rokucommunity/roku-debug/pull/51)) diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.md b/README.md index 04256e44..37d9b5ca 100644 --- a/README.md +++ b/README.md @@ -1,601 +1,59 @@ -# BrightScript Extension for VSCode +# BrightScript Language extension for VSCode -A VSCode extension to support Roku's BrightScript language. +[![build status](https://img.shields.io/github/actions/workflow/status/rokucommunity/vscode-brightscript-language/build.yml?logo=github&branch=master)](https://github.com/rokucommunity/vscode-brightscript-language/actions/workflows/build.yml) +[![coverage status](https://img.shields.io/coveralls/github/rokucommunity/vscode-brightscript-language?logo=coveralls)](https://coveralls.io/github/rokucommunity/vscode-brightscript-language?branch=master) +[![Visual Studio Marketplace](https://vsmarketplacebadges.dev/installs-short/RokuCommunity.brightscript.png?logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) +[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/RokuCommunity.brightscript.svg?logo=visual-studio-code&label=VSCode)](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) +[![OpenVSX](https://img.shields.io/open-vsx/v/RokuCommunity/brightscript.svg?label=OpenVSX)](https://open-vsx.org/extension/RokuCommunity/brightscript) +[![license](https://img.shields.io/github/license/rokucommunity/vscode-brightscript-language.svg)](LICENSE) +[![Slack](https://img.shields.io/badge/Slack-RokuCommunity-4A154B?logo=slack)](https://join.slack.com/t/rokudevelopers/shared_invite/zt-4vw7rg6v-NH46oY7hTktpRIBM_zGvwA) -[![build](https://img.shields.io/github/workflow/status/rokucommunity/vscode-brightscript-language/build.svg?logo=github)](https://github.com/rokucommunity/vscode-brightscript-language/actions?query=workflow%3Abuild) -[![Coverage Status](https://coveralls.io/repos/github/rokucommunity/vscode-brightscript-language/badge.svg?branch=master)](https://coveralls.io/github/rokucommunity/vscode-brightscript-language?branch=master) -[![Visual Studio Marketplace](https://vsmarketplacebadge.apphb.com/installs-short/RokuCommunity.brightscript.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) -[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/RokuCommunity.brightscript.svg?logo=visual-studio-code&label=VSCode marketplace)](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) -[![OpenVSX](https://img.shields.io/open-vsx/v/RokuCommunity/brightscript.svg)](https://open-vsx.org/extension/RokuCommunity/brightscript) +The popular [BrightScript Language](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) extension for [VSCode](https://code.visualstudio.com/) is used by thousands of Roku developers around the world. Revolutionize your Roku development workflow by using this powerful tool. -## Upgrading from V1 -If you're upgrading from version 1 of the extension, please review [these changes](ReleaseNotes.md#2.0.0) +--- -## Features +## Notable features -- Debugging support - Set breakpoints, launch and debug your source code running on the Roku device all from within VSCode +The extension is packed with features, but here are some highlights: - ![BrightScript-language-debugging](https://user-images.githubusercontent.com/2544493/78854455-5e08c880-79ef-11ea-8eb4-1f2d74230842.gif) +- Side-load directly to a roku device from VSCode +- In editor debugging support including breakpoints, variable inspection, and more... +- Integrated device logs and interactive console (see image below) +- Catch errors in VSCode with the built in syntax checking. (Powered by the [BrighterScript](https://github.com/rokucommunity/brighterscript) language server) +- Automatic rendezvous tracking when `logrendezvous` is enabled on the Roku device. +- Syntax highlighting, code formatting, symbol navigation, and [much more](https://rokucommunity.github.io/vscode-brightscript-language/features.html) -- Automatic Rendezvous tracking when `logrendezvous` is enabled on the Roku. See [here](https://developer.roku.com/docs/developer-program/debugging/debugging-channels.md#scenegraph-debug-server-port-8080-commands) for information on how to enable rendezvous logging your Roku. -- Real time code validation -- Syntax highlighting -- Code formatting -- Injection of the Roku Advanced Layout Editor(RALE) task from a single user managed version - - This helps avoid committing the tracker to you repo and also lets you manage what version you want installed rather then other users on the project - - See ([Extension Settings](#Extension-Settings) and [RALE Support](#RALE-Support) for more information) -- Publish directly to a roku device from VSCode (provided by [roku-deploy](https://github.com/RokuCommunity/roku-deploy)) - - Also supports zipping and static file hosting for Component Libraries ([click here](#Component-Libraries) for more information) -- Basic symbol navigation for document and workspace ("APPLE/Ctrl + SHIFT + O" for document, "APPLE/Ctrl + T" for workspace) -- Goto definition (F12) -- Peek definition (Alt+F12) -- Find usages (Shift+F12) -- XML goto definition support which navigates to xml component, code behind function, or brs script import (F12) -- Method signature help (open bracket, or APPLE/Ctrl + SHIFT + SPACE) -- Roku remote control from keyboard ([click here](#Roku-Remote-Control) for more information) -- Brightscript output log (which is searchable and can be colorized with a plugin like [IBM.output-colorizer](https://marketplace.visualstudio.com/items?itemName=IBM.output-colorizer) -- Navigate to source files (by clicking while holding alt key) referenced as `pkg:/` paths from output log, with various output formats. - - Configure `brightscript.output.hyperlinkFormat` as follows: - - **Full** `pkg:/components/KeyLogTester.brs(24:0)` - - **FilenameAndFunction** `KeyLogTester.DoSomething(24:0)` - - **Filename** `KeyLogTester.brs(24)` - - **Short** `#1` - - **Hidden** `` -- Marking the output log (CTRL+L) -- Clearing the output log (CTRL+K), which also clears the mark indexes - **be sure to use the extension's command for clearing, or you may find that your hyperlinks and filters get out of sync** -- Filtering the output log - 3 filters are available: - - LogLevel (example `^\[(info|warn|debug\]`) - - Include (example `NameOfSomeInterestingComponent`) - - Exclude (example `NameOfSomeNoisyComponent`) -- Variable `bs_const` values using the `launch.json` (see the [BS_Const](#BS_Const) section for more information) +![Debugger Demo](https://user-images.githubusercontent.com/2544493/78854455-5e08c880-79ef-11ea-8eb4-1f2d74230842.gif) +## Documentation -## Requirements +For a full list of features and settings, please see our [documentation website](https://rokucommunity.github.io/vscode-brightscript-language), or click one of the links below. -Your project must be structured in the way that Roku expects, which looks something like this: +### Extension -- manifest -- components/ - - HomeScene.brs - - HomeScene.xml -- source/ - - main.brs +- [Features](https://rokucommunity.github.io/vscode-brightscript-language/features.html) - The full list of features provided by [BrightScript Language](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) +- [KeyBindings](https://rokucommunity.github.io/vscode-brightscript-language/keyboard-shortcuts.html) - A full list of pre included keybindings +- [Extension Settings](https://rokucommunity.github.io/vscode-brightscript-language/extension-settings.html) - The full list of possible VS Code settings -If your project lives in a subdirectory, you will need to create a `bsconfig.json` file at the root of your project, and reference your subdirectory like such: +### Code Editing -```json -{ - "rootDir": "./someSubdir" -} -``` +- [Language Server Errors and Warnings](https://rokucommunity.github.io/vscode-brightscript-language/Editing/error-handling.html) - Ways to handle different errors show by the language server +- [Code formatting](https://rokucommunity.github.io/vscode-brightscript-language/Editing/code-formatting.html) - How to set up code formatting and the different formatting options. +- [Code Snippets](https://rokucommunity.github.io/vscode-brightscript-language/Editing/snippets.html) - A collection of useful code sippets -This project relies heavily on the [brighterscript](https://github.com/rokucommunity/brighterscript) project for language server support. See [this link](https://github.com/rokucommunity/brighterscript#bsconfigjson-options) to view the `bsconfig.json` options. +### Debugging -## Language Features -## Ignore errors and warnings on a per-line basis -In addition to disabling an entire class of errors in the `ignoreErrorCodes` array in `bsconfig.json`, you may also disable errors for a subset of the complier rules within a file with the following comment flags: - - `brs:disable-next-line` - - `brs:disable-next-line: code1 code2 code3` - - `brs:disable-line` - - `brs:disable-line: code1 code2 code3` - -Here are some examples: - -```brightscript -sub Main() - 'disable errors about invalid syntax here - 'brs:disable-next-line - DoSomething( - - DoSomething( 'brs:disable-line - - 'disable errors about wrong parameter count - DoSomething(1,2,3) 'brs:disable-next-line - - DoSomething(1,2,3) 'brs:disable-next-line:1002 -end sub - -sub DoSomething() -end sub -``` - - -## Debugging - -This extension supports launching and debugging your local project on a Roku device. In order to do this, you will need to create a `launch.json` configuration file. - -Here is a sample `launch.json` file where your roku project lives at the root of your workspace: - -```json -{ - "version": "0.2.0", - "configurations": [ - { - "type": "brightscript", - "request": "launch", - "name": "BrightScript Debug: Launch", - "host": "192.168.1.17", - "password": "password", - "rootDir": "${workspaceFolder}", - "stopOnEntry": false - } - ] -} -``` - -If your BrightScript project is located in a subdirectory of the workspace, you will need to update the launch configuration property called 'rootDir' to point to the root folder containing the manifest file. - -For example, if you have this structure: - -- Root Workspace Folder/ - - Images/ - - Roku App/ - - manifest - - components/ - - HomeScene.brs - - HomeScene.xml - - source/ - - main.brs - -then you would need change `rootDir` in your launch config to look like this: - -```json - -{ - "version": "0.2.0", - "configurations": [ - { - ... - "rootDir": "${workspaceFolder}/Roku App", - ... - } - ] -} -``` - -### Using both `launch.json` and `bsconfig.json` - -When launching a debug session, this extension will first read all configurations from `bsconfig.json`. Then, it will overwrite any options from the selected configuration from `launch.json`. So, it is advised to keep all common settings in `bsconfig.json`, and only add values you wish to override in `launch.json`. -## Breakpoints - -Roku devices currently do not have a way to dynamically insert breakpoints during a running application. So, in order to use breakpoints, this extension will inject a `STOP` statement into the code for each breakpoint before the app is deployed. This means that anytime you add/remove a breakpoint, you will need to stop your current debug session and start a new one. - -When injecting `STOP` statements, the extension will also generate a source map for each affected file so we can convert the debugger locations back into source locations. See the [SourceMaps](#SourceMaps) section for more information - -## Special Cases - -### Debug source files with Custom build process - -If you have a build process that moves files from a source directory to an output directory, by default you will need to place breakpoints in the output directory's versions of the files. - -**IF** your build process does not change line numbers between source files and built files, this extension will allow you to place breakpoints in your source files, and launch/run your built files. Pair this with vscode's task system, and you can build your code, then launch and debug your code with ease. - -**Example:** - -- src/ - - main.brs - - language.brs - - manifest -- languages/ - - english.brs - - french.brs -- dist/ - - main.brs - - language.brs - - manifest - -Here's a sample launch.json for this scenario: - -```json -{ - "version": "0.2.0", - "configurations": [ - { - "type": "brightscript", - "request": "launch", - "name": "BrightScript Debug: Launch", - "host": "192.168.1.100", - "password": "password", - "rootDir": "${workspaceFolder}/dist", - "sourceDirs": ["${workspaceFolder}/src"], - "preLaunchTask": "your-build-task-here" - } - ] -} -``` - -### Multiple source dirs - -If you have a custom build process that pulls in files from multiple source directories, but still want to be able to place breakpoints in those source folders without using this extension's build process, you can use the `sourceDirs` launch configuration setting to specify where the various source files exist. The extension will walk through each of the `sourceDirs` entries, in order, until it finds a file that matches the relative path of the file with the active breakpoint. - -```jsonc -{ - "version": "0.2.0", - "configurations": [ - { - "rootDir": "${workspaceFolder}/dist", - "sourceDirs": [ - "${workspaceFolder}/../ProjectA", - "${workspaceFolder}/../ProjectB", - "${workspaceFolder}/../ProjectC" - ], - "preLaunchTask": "your-build-task-here" - //... - } - ] -} -``` - -### SourceMaps - -The extension has full support for [source maps](https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Use_a_source_map). Which means that if your preprocessor has source map support then the extension will correctly translate breakpoints from source files into compiled locations and will translate compiled locations back to source locations. In this situation, you would want to set up your launch config like this: - -```javascript -//.vscode/launch.json -{ - "version": "0.2.0", - "configurations": [{ - //this is where your preprocessor puts the final code (including source maps) - "rootDir": "${workspaceFolder}/dist", - // run your preprocessor which writes the final code to `${workspaceFolder}/dist` (including source maps) - "preLaunchTask": "your-build-task-here", - //...other launch args - }] -} -``` - -Your dist folder would look something like this after running your preprocessor. - -- \${workspaceFolder}/dist/ - - manifest - - source/ - - main.brs - - main.brs.map - - components/ - - component1.xml - - component1.xml.map - - component1.brs - - component1.brs.map - -## BS_Const - -If you use `bs_const` in your project manifest you can define separate launch configs in your `launch.json` allowing for easy changing without modifying the manifest yourself. This helps prevent accidentally committing a change to the `bs_consts` in your project. You can not define a constant that is not also in your manifest. See the [Manifest constant](https://developer.roku.com/en-ca/docs/references/brightscript/language/conditional-compilation.md#manifest-constant) documentation for more info on their format. - -example config: - -```json -{ - "type": "brightscript", - "rootDir": "${workspaceFolder}/dist", - "host": "192.168.1.2", - "bsConst": { - "debug": true, - "logging": false - } -} -``` - -## Component Libraries - -If you are working on custom component libraries you can define them in the launch.json file. The extension will automatically zip and statically host your component libraries. The library folder(s) can ether be in your project or in another workspace on your machine. - -`launch.json` configuration options: - -- `componentLibraries`: This field takes an array of library configuration objects allowing you to work on more than one library at a time. For the examples, there will only be one library configured but you can simply add more if you need to. Each object in the `componentLibraries` field requires three values. - - `rootDir`: This is the relative path to the libraries source code. Since this is a relative path your library source does not need to be in the same work space. - - `outFile`: The name of the zip file that your channel code will download as a component library. You can use values in your outFile string such as `${title}` to be inferred from the libraries manifest file. - - `files`: A file path or file glob that should be copied to the deployment package. -- `componentLibrariesPort`: Port to access component libraries. Default: `8080`s - -**Example:** - -- .vscode - - launch.json -- manifest -- components/ - - HomeScene.brs - - HomeScene.xml -- source/ - - main.brs -- customLibrary - - manifest - - components/ - - CustomButton.brs - - CustomButton.xml - - CustomTextInput.brs - - CustomTextInput.xml - -Here's a sample launch.json for this scenario: - -```json -{ - "version": "0.2.0", - "configurations": [ - { - "type": "brightscript", - ... - "rootDir": "${workspaceFolder}", - "files": [ - "manifest", - "source/**/*.*", - "components/**/*.*" - ], - "componentLibraries": [ - { - "rootDir": "${workspaceFolder}/customLibrary/", - "outFile": "customLibrary.zip", - "files": [ - "manifest", - "components/**/*.*" - ] - } - ] - } - ] -} - -``` - -## Deep Linking / ECP - -You can launch a debug session with a deep link by setting the `deepLinkUrl` property in your `launch.json` configuration. - -```json -{ - "type": "brightscript", - "rootDir": "${workspaceFolder}/dist", - "host": "192.168.1.2", - "deepLinkUrl": "http://${host}:8060/launch/dev?${promptForQueryParams}" -} -``` - -There are several string placeholders you can use when defining your deep link url, but none of them are required. - -- `${host}` - the roku host. This is the `host` property set in your launch configuration. By using `${host}` in the deep link url, it prevents you from needing to update the host twice in your config when you want to change which Roku to debug. - -- `${promptForQueryParams}` - will pop up an input box at debug launch time, asking for the URL-encoded query parameters to pass to the deep link. - -- `${promptForDeepLinkUrl}` - if the entire `deepLinkUrl` is set to this, then at debug launch time, an input box will appear asking you to input the full deep link url. - -## RALE Support - -You can also have the extension automatically inject the `TrackerTack.xml` and the code snippet required to start the tracker task. -To do this you need a few simple things: - -- In your VS Code user settings add the `brightscript.debug.raleTrackerTaskFileLocation` setting. (See [Extension Settings](#Extension-Settings) for more information) -- Add the entry point comment `' vscode_rale_tracker_entry` to your code. - - This is optional as you can still include the the code to create the tracker task yourself. - - We recommend adding it to the end of your `screen.show()` call. For example: `screen.show() ' vscode_rale_tracker_entry` - - This can be added anywhere in the channel including source files but it must be on or after the call to `screen.show()` -- Set the `injectRaleTrackerTask` value to true in `launch.json`. For example: - -```json -{ - "type": "brightscript", - "rootDir": "${workspaceFolder}/dist", - "host": "192.168.1.2", - "injectRaleTrackerTask": true -} -``` - -## Extension Settings - -This extension contributes the following settings: - -- `brightscript.format.keywordCase`: specify case of keywords when formatting -- `brightscript.format.compositeKeywords`: specify whether composite words (ie: "endif", "endfor") should be broken apart into their two-word format (ie: "end if", "end for") -- `brightscript.format.removeTrailingWhiteSpace`: specify whether trailing whitespace should be removed on format -- `brightscript.format.formatInteriorWhitespace`: If true (the default), all whitespace between items is reduced to exactly 1 space character, and certain keywords and operators are padded with whitespace (i.e. `1+1` becomes `1 + 1`) -- `brightscript.format.insertSpaceBeforeFunctionParenthesis`: If true, a space is inserted to the left of an opening function declaration parenthesis. (i.e. `function main ()` or `function ()`). If false, all spacing is removed (i.e. `function main()` or `function()`). -- `brightscript.format.insertSpaceBetweenEmptyCurlyBraces`: if true, empty curly braces will contain exactly 1 whitespace char (i.e. `{ }`). If false, there will be zero whitespace chars between empty curly braces (i.e. `{}`) -- `brightscript.output.includeStackTraces`: If set to true, will print stack trace or breakpoint info in the log output. Set to false to avoid noisy logs - you'll still get the traces in the debug console, in any case -- `brightscript.output.focusOnLaunch`: If set to true, focus on the brightscript log when launching, which is convenient for controlling your roku with the extension's remote control keys. **Experimental. Does not always work** -- `brightscript.output.clearOnLaunch`: If set to true, will clear the brightscript log when launching -- `brightscript.output.clearConsoleOnChannelStart`: If set to true, will clear the brightscript log after connecting to the Roku channel after launching -- `brightscript.output.hyperlinkFormat`: specifies the display format for log output `pkg` link -- `brightscript.deviceDiscovery.showInfoMessages`: If set to true, an info toast will be shown when a Roku device has been found on the network. -- `brightscript.deviceDiscovery.enabled`: If set to true, the extension will automatically watch and scan the network for online Roku devices. This can be pared with the `${promptForHost}` option in the launch config to display a list of online Rokus, removing the need to constantly change the host IP in your config files. -- `brightscript.debug.autoRunSgDebugCommands`: Give the ability to run a list of commands on port 8080 of the device at the start of a debug session. Currently there are three supported short hands for the most commonly desired commands. These are: `chanperf` - runs chanperf with a one seconds repeating interval, `fpsdisplay` - turns on the FPS, `logrendezvous` - enables Rendezvous Logging. You can also include and command string in this array and we will attempt to run it for you. For example you could do `chanperf -r 10` or `clear_launch_caches` as another example. -- `brightscript.debug.raleTrackerTaskFileLocation`: This is an absolute path to the TrackerTask.xml file to be injected into your Roku channel during a debug session. (i.e. `/Users/user/roku/TrackerTask/TrackerTask.xml`) -- `brightscript.debug.enableSourceMaps`: Defaults to true. if set to false, then the debugger falls back to using line offsets (based on the number of breakpoints injected) to determine the actual line number. Only use this if you're noticing issues with the sourcemaps not working properly. -- `brightscript.debug.enableDebugProtocol` - If true, the debugger will use the new BrightScript debug protocol and will disable the telnet debugger. See [the official documentation](https://developer.roku.com/en-ca/docs/developer-program/debugging/socket-based-debugger.md) for more details. - -## Roku Remote Control - -You can use your keyboard as a Roku remote by clicking inside the Output or Debug Console panel of VSCode, and then pressing one of the predefined keyboard shortcuts from the table below (make sure the find widget is closed). You can also press `win+k (or cmd+k on mac)` from inside those same panels to bring up a text box to send text to the Roku device. - -This extension sends key presses to the Roku device through Roku's [External Control API](https://sdkdocs.roku.com/display/sdkdoc/External+Control+API#ExternalControlAPI-KeypressKeyValues). The 12 standard Roku remote buttons are already included. The keys are mapped using the `when` clause so it will only send remote commands if the Output or Debug Console Panel has focus (`panelFocus`) AND the Editor Find widget is NOT visible (`!findWidgetVisible`). - -### Keyboard Commands: - -| Keyboard Key | Roku Remote Key | Keybinding Command | -| ------------------------------------------- | ------------------ | --------------------------------------------- | -| `Backspace` | Back Button | `extension.brightscript.pressBackButton` | -| `win+Backspace` (or `cmd+Backspace` on mac) | Backspace | `extension.brightscript.pressBackspaceButton` | -| `Escape` | Home Button | `extension.brightscript.pressHomeButton` | -| `up` | Up Button | `extension.brightscript.pressUpButton` | -| `down` | Down Button | `extension.brightscript.pressDownButton` | -| `right` | Right Button | `extension.brightscript.pressRightButton` | -| `left` | Left Button | `extension.brightscript.pressLeftButton` | -| `Enter` | Select Button (OK) | `extension.brightscript.pressSelectButton` | -| `win+Enter` (or `cmd+Enter` on mac) | Play Button | `extension.brightscript.pressPlayButton` | -| `win+left` (or `cmd+left` on mac) | Rev Button | `extension.brightscript.pressRevButton` | -| `win+right` (or `cmd+right` on mac) | Fwd Button | `extension.brightscript.pressFwdButton` | -| `win+8` (or `cmd+8` on mac) | Info Button | `extension.brightscript.pressStarButton` | - -You also have the ability to create keybindings for any other Roku supported key by adding. Here's a example entry for `keybindings.json` of how to create a VSCode keyboard shortcut to send the space key to the Roku: - -```json -{ - "key": "Space", - "command": "extension.brightscript.sendRemoteCommand", - "args": "Lit_%20", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible" -} -``` - -## Other keyboard shortcuts - -| Keybinding (Windows) | Keybinding (Mac) | Command | Description | -| -------------------- | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------- | -| `ctrl+L` | `ctrl+L` | extension.brightscript.markLogOutput | Add a new mark line in the BrightScript output panel | -| `ctrl+alt+k` | `ctrl+alt+k` | extension.brightscript.clearLogOutput | Clear the current log output | -| `win+ctrl+l` | `cmd+ctrl+l` | extension.brightscript.setOutputLogLevelFilter | Filter the BrightScript Output by log level (info, warn, debug) | -| `win+ctrl+i` | `cmd+ctrl+i` | extension.brightscript.setOutputIncludeFilter | Filter the BrightScript Output by typing text you want to _include_ | -| `win+ctrl+x` | `cmd+ctrl+x` | extension.brightscript.setOutputExcludeFilter | Filter the BrightScript output by typing text you want to _exclude_ | - -## Config file for user-specific launch settings - -If you change your `launch.json` settings regularly, or don't want to check certain values into version control, then another option is to store those values in a `.env` file. Then, reference it in your `launch.json` and use `${env:YOUR_VAR_NAME}` in `launch.json` settings. Here's an example. - -```json -//launch.json - -{ - "version": "0.2.0", - "configurations": [ - { - ... - "envFile": "${workspaceFolder}/.env", - "username": "${env:ROKU_USERNAME}", - "password": "${env:ROKU_PASSWORD}" - ... - } - ] -} -``` - -```bash -# .env - -#the username for the roku -ROKU_USERNAME=rokudev -#the password for the roku -ROKU_PASSWORD=password123 -``` - -This extension uses the [dotenv](https://www.npmjs.com/package/dotenv) npm module for parsing the `.env` files, so see [this link](https://github.com/motdotla/dotenv#rules) for syntax information. - -## Snippets - -This extension adds some basic snippets for Roku development. - -### Example snippets in .bs/.brs files: - -Typing `sub` generates: -```brs -sub subName(params) - -end sub -``` -with "subName" and "params" editable, and cursor inside the block - -Typing `for-each` generates: -```brs -for each item in collection - -end for -``` -with "item" and "collection" editable and cursor inside the block - -### Example snippets in .xml files: - -Typing `` generates -```xml - - + + + + + +
+ +
+ <%- content %> + +
+
+ + + + \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 00000000..3297f2b9 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,86 @@ +--- +priority: 1001 +--- +# Contributing + +This extension depends on several other RokuCommunity projects. + - [BrighterScript](https://github.com/RokuCommunity/brighterscript) - provides the language server and much of the realtime valdation you see when editing code. + - [roku-debug](https://github.com/RokuCommunity/roku-debug) - Provides all the debug session functionality (like connecting via telnet, setting breakpoints, etc) + - [roku-deploy](https://github.com/RokuCommunity/roku-deploy) - Handles the packaging of roku projects and other device tasks (like sending keyboard commands to the device) + - [brighterscript-formatter](https://github.com/RokuCommunity/brighterscript-formatter) - Used to format code when the "Format Document" command is run in vscode. + + +Wiring all of these up manually is a bit tedious, so we provide a simple way to quickly get started: + +### The easy way +In a terminal, you can execute the following commands to get completely up and running. +```bash +mkdir RokuCommunity && cd RokuCommunity && git clone https://github.com/rokucommunity/vscode-brightscript-language && cd vscode-brightscript-language && npm run install-local +``` + +This will do the following automatically for you: + - create a dedicated `RokuCommunity/` folder to keep these related projects + - Clone all necessary repositories at the same folder level + - Install and build each dependency + - Update this project's `package.json` to point to the local projects using a relative file scheme (i.e. `"roku-deploy": "file:../roku-deploy"`) + - delete each dependency's folder in this project's node_modules folder to prevent conflicts. + - run `npm install` in the root of this project. + + +### The manual way +You only need to install local copies of projects you actually want to work on. You can leave the others as npm modules. This workflow will show the process of installing all projects. + + 1. Clone the following projects to the parent folder as this project. (i.e. `C:\projects\vscode-brightscript language`, `C:\projects\brighterscript`, etc...) + - [brighterscript](https://github.com/RokuCommunity/brighterscript) + - [brighterscript-formatter](https://github.com/RokuCommunity/brighterscript-formatter) + - [roku-debug](https://github.com/RokuCommunity/roku-debug) + - [roku-deploy](https://github.com/RokuCommunity/roku-deploy) + + 1. Inside each of the cloned repositories, run + ```bash + npm install && npm run build + ``` + 1. In `vscode-brightscript-language/node_modules`, delete any folders matching the above project names + 1. Open `vscode-brightscript-language/package.json` and edit the `dependencies`to look like this: + + ```js + { + "dependencies": { + //... + "brighterscript": "file:../brighterscript", + "brighterscript-formatter": "file:../brighterscript-formatter", + "roku-debug": "file:../roku-debug", + "roku-deploy": "file:../roku-debug", + //... + } + } + ``` + + 1. In the `vscode-brightscript-language` folder + ```bash + npm install && npm run build + ``` + 1. You're all set! Open the `vscode-brightscript-language` folder in vscode to start debugging. + +View our [developer guidelines](https://github.com/RokuCommunity/vscode-brightscript-language/blob/master/developer-guidelines.md) for more information on how to contribute to this extension. + +You can also chat with us [on slack](https://join.slack.com/t/rokudevelopers/shared_invite/zt-4vw7rg6v-NH46oY7hTktpRIBM_zGvwA). (We're in the #vscode-bs-lang-ext channel). + +## Releases (Project Admins) +If you need to deploy a release of any of the RokuCommunity projects, you can do the following: +1. clone the vscode-brightscript-language project + ```bash + git clone https://github.com/rokucommunity/vscode-brightscript-language + cd vscode-brightscript-language + ``` +2. Run the `releases` npm script and follow the prompts + ```bash + npm run releases + ``` +3. For every changed project, you'll see a prompt to edit the changelog. +![image](https://user-images.githubusercontent.com/2544493/179513388-fc044859-8c5e-49a2-853c-9e17ca689a80.png) + - Change `UNRELEASED` to the semantic version you want to use, save the changelog, then back in the terminal press enter on your keyboard to initialize the release. + ![image](https://user-images.githubusercontent.com/2544493/179513898-452b8ff3-f01b-4828-b3b0-d00e0c0a31ed.png) + - Delete delete any lines from the changelog that aren't overly important to the user (as changelogs should be for humans), since this process populates the changelog with every commit to the master branch for the current project and all commits to changed RokuCommunity dependencies. + + diff --git a/docs/extension-settings.md b/docs/extension-settings.md new file mode 100644 index 00000000..8d7e1623 --- /dev/null +++ b/docs/extension-settings.md @@ -0,0 +1,64 @@ +--- +priority: 4 +--- +# Extension Settings + +This extension contributes the following settings: + +
+ +### `brightscript.format.keywordCase` +specify case of keywords when formatting + +### `brightscript.format.compositeKeywords` +specify whether composite words (ie: "endif", "endfor") should be broken apart into their two-word format (ie: "end if", "end for") + +### `brightscript.format.removeTrailingWhiteSpace` +specify whether trailing whitespace should be removed on format +### `brightscript.format.formatInteriorWhitespace` +If true (the default), all whitespace between items is reduced to exactly 1 space character, and certain keywords and operators are padded with whitespace (i.e. `1+1` becomes `1 + 1`) +### `brightscript.format.insertSpaceBeforeFunctionParenthesis` +If true, a space is inserted to the left of an opening function declaration parenthesis. (i.e. `function main ()` or `function ()`). If false, all spacing is removed (i.e. `function main()` or `function()`). +### `brightscript.format.insertSpaceBetweenEmptyCurlyBraces` + +if true, empty curly braces will contain exactly 1 whitespace char (i.e. `{ }`). If false, there will be zero whitespace chars between empty curly braces (i.e. `{}`) +### `brightscript.output.includeStackTraces` +If set to true, will print stack trace or breakpoint info in the log output. Set to false to avoid noisy logs - you'll still get the traces in the debug console, in any case +### `brightscript.output.focusOnLaunch` +If set to true, focus on the brightscript log when launching, which is convenient for controlling your roku with the extension's remote control keys. **Experimental. Does not always work** +### `brightscript.output.clearOnLaunch` +If set to true, will clear the brightscript log when launching +### `brightscript.output.clearConsoleOnChannelStart` +If set to true, will clear the brightscript log after connecting to the Roku channel after launching +### `brightscript.output.hyperlinkFormat` +specifies the display format for log output `pkg` link +### `brightscript.deviceDiscovery.showInfoMessages` +If set to true, an info toast will be shown when a Roku device has been found on the network. +### `brightscript.deviceDiscovery.enabled` +If set to true, the extension will automatically watch and scan the network for online Roku devices. This can be pared with the `${promptForHost}` option in the launch config to display a list of online Rokus, removing the need to constantly change the host IP in your config files. +### `brightscript.deviceDiscovery.concealDeviceInfo` +If set to true, the extension will randomize the numbers and letters in the following fields (useful for hiding your sensitive device fields when creating public screenshots or demos). + - `udn` + - `device-id` + - `advertising-id` + - `wifi-mac` + - `ethernet-mac` + - `serial-number` + - `keyed-developer-id` + +### `brightscript.debug.autoRunSgDebugCommands` +Give the ability to run a list of commands on port 8080 of the device at the start of a debug session. Currently there are three supported short hands for the most commonly desired commands. These are: + - `chanperf` - runs chanperf with a one seconds repeating interval + - `fpsdisplay` - turns on the FPS + - `logrendezvous` - enables Rendezvous Logging. You can also include and command string in this array and we will attempt to run it for you. For example you could do `chanperf -r 10` or `clear_launch_caches` as another example. + - `brightscript_warnings` - Sets the maximum number of brightscript warnings to be displayed by the device on channel install. +### `brightscript.debug.raleTrackerTaskFileLocation` +This is an absolute path to the TrackerTask.xml file to be injected into your Roku channel during a debug session. (i.e. `/Users/user/roku/TrackerTask/TrackerTask.xml`) +### `brightscript.debug.enableSourceMaps` +Defaults to `true`. if set to `false`, then the debugger falls back to using line offsets (based on the number of breakpoints injected) to determine the actual line number. Only use this if you're noticing issues with the sourcemaps not working properly. +### `brightscript.debug.enableDebugProtocol` +If true, the debugger will use the new BrightScript debug protocol and will disable the telnet debugger. See [the official documentation](https://developer.roku.com/en-ca/docs/developer-program/debugging/socket-based-debugger.md) for more details. +### `brightscript.extensionLogfilePath` +File where the 'BrightScript Extension' output panel (i.e. debug logs for the extension) will be appended. If omitted, no file logging will be done. `${workspaceFolder}` is supported and will point to the first workspace found. +### `brightscript.remoteControlMode.enableActiveAnimation` +Enables or disables visual animations related to the remote control mode button \ No newline at end of file diff --git a/docs/features.md b/docs/features.md new file mode 100644 index 00000000..7fc0a21e --- /dev/null +++ b/docs/features.md @@ -0,0 +1,42 @@ +--- +priority: 2 +--- +# Features + +- Debugging support - Set breakpoints, launch and debug your source code running on the Roku device all from within VSCode + + + + + +- Automatic Rendezvous tracking when `logrendezvous` is enabled on the Roku. See [here](https://developer.roku.com/docs/developer-program/debugging/debugging-channels.md#scenegraph-debug-server-port-8080-commands) for information on how to enable rendezvous logging your Roku. +- Real time code validation +- Syntax highlighting +- Code formatting +- Injection of the Roku Advanced Layout Editor(RALE) task from a single user managed version + - This helps avoid committing the tracker to you repo and also lets you manage what version you want installed rather then other users on the project + - See ([Extension Settings](./extension-settings.html) and [RALE Support](./Debugging/rale.html) for more information) +- Publish directly to a roku device from VSCode (provided by [roku-deploy](https://github.com/RokuCommunity/roku-deploy)) + - Also supports zipping and static file hosting for Component Libraries ([click here](./Debugging/component-libraries.html) for more information) +- Basic symbol navigation for document and workspace ("APPLE/Ctrl + SHIFT + O" for document, "APPLE/Ctrl + T" for workspace) +- Goto definition (F12) +- Peek definition (Alt+F12) +- Find usages (Shift+F12) +- XML goto definition support which navigates to xml component, code behind function, or brs script import (F12) +- Method signature help (open bracket, or APPLE/Ctrl + SHIFT + SPACE) +- Roku remote control from keyboard ([click here](./Debugging/remote-control-mode.html) for more information) +- Brightscript output log (which is searchable and can be colorized with a plugin like [IBM.output-colorizer](https://marketplace.visualstudio.com/items?itemName=IBM.output-colorizer) +- Navigate to source files (by clicking while holding alt key) referenced as `pkg:/` paths from output log, with various output formats. + - Configure `brightscript.output.hyperlinkFormat` as follows: + - **Full** `pkg:/components/KeyLogTester.brs(24:0)` + - **FilenameAndFunction** `KeyLogTester.DoSomething(24:0)` + - **Filename** `KeyLogTester.brs(24)` + - **Short** `#1` + - **Hidden** `` +- Marking the output log (CTRL+L) +- Clearing the output log (CTRL+K), which also clears the mark indexes - **be sure to use the extension's command for clearing, or you may find that your hyperlinks and filters get out of sync** +- Filtering the output log - 3 filters are available: + - LogLevel (example `^\[(info|warn|debug\]`) + - Include (example `NameOfSomeInterestingComponent`) + - Exclude (example `NameOfSomeNoisyComponent`) +- Variable `bs_const` values using the `launch.json` (see the [BS_Const](./Debugging/bs-const.html) section for more information) diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..94f50ad7 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,16 @@ +--- +priority: 1 +--- +# Introduction +The popular BrightScript plugin for [VSCode](https://code.visualstudio.com/) used by thousands of Roku developers around the world. Revolutionize your Roku development workflow by using this powerful tool. + + + + + +## Notable features +The extension is packed with features, but here are some highlights: + - Full debugger support including breakpoints, variable inspection, and more + - Integrated telnet logs and interactive console + - client-side syntax checking powered by the [BrighterScript](https://github.com/rokucommunity/brighterscript) language server + - syntax highlighting, code formatting, symbol navigation, and [much more](features.html) diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000..17a682b5 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,24 @@ +--- +priority: 3 +title: How to Install +--- +## Installation +### From VSCode +1. Search for "BrightScript" in the vscode extensions tab +2. Click "Install" + + + + + +### From GitHub +1. Navigate our github releases page: https://github.com/rokucommunity/vscode-brightscript-language/releases +2. Download the latest release version `vsix`. For example: + + + + +3. In the VSCode extension cab, open the `...` menu, click `Install from VSIX...` and select the vsix downloaded from step 2 + + + \ No newline at end of file diff --git a/docs/keyboard-shortcuts.md b/docs/keyboard-shortcuts.md new file mode 100644 index 00000000..1f827525 --- /dev/null +++ b/docs/keyboard-shortcuts.md @@ -0,0 +1,15 @@ +--- +priority: 4 +--- +# Keyboard shortcuts + +| Keybinding (Windows) | Keybinding (Mac) | Command | Description | +| -------------------- | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------- | +| `ctrl+L` | `ctrl+L` | extension.brightscript.markLogOutput | Add a new mark line in the BrightScript output panel | +| `ctrl+alt+k` | `ctrl+alt+k` | extension.brightscript.clearLogOutput | Clear the current log output | +| `win+ctrl+l` | `cmd+ctrl+l` | extension.brightscript.setOutputLogLevelFilter | Filter the BrightScript Output by log level (info, warn, debug) | +| `win+ctrl+i` | `cmd+ctrl+i` | extension.brightscript.setOutputIncludeFilter | Filter the BrightScript Output by typing text you want to _include_ | +| `win+ctrl+x` | `cmd+ctrl+x` | extension.brightscript.setOutputExcludeFilter | Filter the BrightScript output by typing text you want to _exclude_ | +| `ctrl+k` | `cmd+k` | extension.brightscript.toggleRemoteControlMode | Enables/disables the [remote control mode](remote-control-mode.html) used to emulate a roku remote from your keyboard | + +See [the remote-control-mode](./Debugging/remote-control-mode.html) page for details about what keyboard shortcuts are available when **Remote Control Mode** is enabled. \ No newline at end of file diff --git a/docs/prerelease-versions.md b/docs/prerelease-versions.md new file mode 100644 index 00000000..63712a4f --- /dev/null +++ b/docs/prerelease-versions.md @@ -0,0 +1,16 @@ + +# Pre-release Versions + +You can occasionally find pre-release versions of this extension under the [GitHub Releases](https://github.com/RokuCommunity/vscode-brightscript-language/releases) page of this project. Unfortunately, Visual Studio Code does not currently support publishing pre-release versions of an extension, so manually installing the `.vsix` is the next-best option at this point. Here's how it works. + +1. Download `.vsix` file for version of the extension you want from [the releases page](https://github.com/RokuCommunity/vscode-brightscript-language/releases); +2. Open Visual Studio Code and click the "extensions" tab. +3. Choose "Install from VSIX..." + + ![image](https://user-images.githubusercontent.com/2544493/52904494-3f4bdf00-31fb-11e9-9a83-ceca294a4d12.png) + +4. Select the file you downloaded from step 1. + +## Reinstalling store version of the extension + +This process will REPLACE any existing version of the extension you have installed from the store. So, if you want to go back to using the store version, you need to uninstall the extension completely, and then install the extension through the VSCode store. diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md new file mode 100644 index 00000000..8d9f7510 --- /dev/null +++ b/docs/release-notes/index.md @@ -0,0 +1,7 @@ +--- +priority: 999999999 +parentTitle: Release Notes +--- + +# Release Notes +Only notable releases will be tracked here. Please see the [CHANGELOG.md](https://github.com/rokucommunity/vscode-brightscript-language/blob/master/CHANGELOG.md) for a comprehensive list of all changes for each version. diff --git a/ReleaseNotes.md b/docs/release-notes/v2.0.0.md similarity index 79% rename from ReleaseNotes.md rename to docs/release-notes/v2.0.0.md index 6c32f358..f9f1ff86 100644 --- a/ReleaseNotes.md +++ b/docs/release-notes/v2.0.0.md @@ -1,27 +1,28 @@ -# Release Notes -Only notable releases will be tracked in this file. Please see the [CHANGELOG.md](CHANGELOG.md) for a comprehensive list of changes for each version. +--- +title: v2.0.0 +priority: 9999 +--- +# Release Notes for v2.0.0 -## 2.0.0 ### roku-deploy The extension now uses [roku-deploy version 3](https://www.npmjs.com/package/roku-deploy/v/3.0.0), which made some changes to the `files` array. Standard projects should be unaffected, but more advanced projects may require modifications to their `files` array. Please take a moment to review the new `files` specification [here](https://github.com/rokucommunity/roku-deploy#files-array). The most notable changes are: - - Top-level string patterns may not reference files outside of `rootDir`. (You should use `{src;dest}` objects to accomplish this) - - Paths to folders will be ignored. If you want to copy a folder and its contents, use the glob syntax (i.e. `some_folder/**/*`) +- Top-level string patterns may not reference files outside of `rootDir`. (You should use `{src;dest}` objects to accomplish this) +- Paths to folders will be ignored. If you want to copy a folder and its contents, use the glob syntax (i.e. `some_folder/**/*`) ### The LanguageServer After being in beta for over a year, we are proud to announce that the language server is now enabled by default in the mainline version of the extension. Standard projects should work automatically, and several alternative project structures should also work with a minimal amount of configuration. (see the [README](README.md#language-features) about how customize the language server to your project's needs). -Under the hood, the language server is powered by the [Brighterscript](https://github.com/rokucommunity/brighterscript) language, which is a superset of BrightScript. Don't worry, you are not required to write any BrighterScript code, as it works just fine with standard BrightScript. +Under the hood, the language server is powered by the [Brighterscript](https://github.com/rokucommunity/brighterscript) language, which is a superset of BrightScript. Don't worry, you are not required to write any BrighterScript code, as it works just fine with standard BrightScript. The language server is still fairly new, and we expect there to be bugs. If you encounter errors for valid syntax, please file an issue. You can disable errors for a specific line by adding a comment above the erraneous line (full instructions [here](https://github.com/rokucommunity/brighterscript#ignore-errors-and-warnings-on-a-per-line-basis)). For example: -```BrightScript +```vb 'bs:disable-next-line someLineWithError() ``` The primary motivation for the ignore feature was to provide a stopgap measure to hide incorrectly-thrown errors on legitimate brightscript code due to parser bugs. It is recommended that you only use these comments when absolutely necessary. -If all else fails, you can completely disable the language server by setting `"brightscript.enableLanguageServer":false` in your user/workspace settings. +If all else fails, you can completely disable the language server by setting `"brightscript.enableLanguageServer":false` in your user/workspace settings. -Please [let us know](https://github.com/rokucommunity/vscode-brightscript-language/issues/new) about any problems you find with the language server. - +Please [let us know](https://github.com/rokucommunity/vscode-brightscript-language/issues/new) about any problems you find with the language server. diff --git a/docs/release-notes/v2.31.0.md b/docs/release-notes/v2.31.0.md new file mode 100644 index 00000000..33c74200 --- /dev/null +++ b/docs/release-notes/v2.31.0.md @@ -0,0 +1,94 @@ +--- +title: v2.31.0 +priority: 9998 +--- +# Release Notes for V2.31.0 + +In this release, we wanted to address some quality of life items as well as lay the ground work for future updates. Here is what we changed: + +## Remote Control Emulation +Our first try at emulating the Roku Remote was lacking and inconsistent. This experience was unreliable and could override functionality in these areas. Resulting in...frustration... + +We are happy to announce a complete overhaul of this feature. **Remote Control Mode** is now something you can toggle on and off from almost anywhere in VSCode. This implementation is similar in concept to togging in and out of insert mode in VIM. + +### How to use Remote Control Mode +There are tree main ways you can enter and exit this mode: + - The command pallet: + + ![image](https://user-images.githubusercontent.com/2544493/162752967-a152dfd7-89a3-4072-aa10-b8d918cd10ff.png) + + - Status bar: + + ![remote-mode](https://user-images.githubusercontent.com/2544493/162752275-e60dea72-cc78-4818-aa99-6c3a354157ce.gif) + + - Keybinding: `cmd+k(mac)` or `ctrl+k(win)` + +When this mode is enabled, most keyboard strokes will be sent to the Roku device as input rather then to your editor. Some notable exceptions include when: the command pallet is open, an input box is open, or you are in other input areas like a search box. + +When this mode is enabled there is also a status bar item that will flash to let you know that **Remote Control Mode** is active. This can be disabled by setting the `brightscript.remoteControlMode.enableActiveAnimation` user setting to `false`. + +### Text Input +One of the biggest changes is support for full text input from the keyboard when in this mode. For example, if you pressed `shift+b` while **Remote Control Mode** is active we will send `B` to the device. We support all the single press and shift press ascii characters on the keyboard (excluding the num pad). For example: `a-z`, `A-Z`, `0-9`, and all the primary characters such as `!`, `@`, `#`, `'`, `"`, etc... + +For more information on this feature and the updated list of keybindings please see our [Remote Control Mode](https://rokucommunity.github.io/vscode-brightscript-language/Debugging/remote-control-mode.html) documentation. + +**Note: We do not support sending alt charters directly from the keyboard.** This can be done via the send `sendRemoteText` command. See below! + +## Send Text to Device History +With this update, we now remember the past 30 unique strings previously sent to the device using the `extension.brightscript.sendRemoteText` command. + + - New user settings: + - `brightscript.sendRemoteTextHistory.limit` + - Sets the maximum number of `extension.brightscript.sendRemoteText` commands to remember for future use + - This is only available in the user settings. Not available in workspace settings + - `brightscript.sendRemoteTextHistory.enabled` + - If `false`, the extension will not save the history for `extension.brightscript.sendRemoteText` commands + - This is available in the user and workspace settings + - You will now be presented a history of commands in addition to the input box. (see below) + + ![image](https://user-images.githubusercontent.com/9591618/160265598-cb005da1-74bf-466d-83f0-88f6e47a36da.png) + +## Custom View in the Activity Bar + +We have finally added our own Activity Bar item in VSCode! At this time we display the devices found on the local network (see below). We will expand upon this area in the future. We have ideas for adding a Roku Remote Control UI, adding new device commands, setting your default device for side loading. + +![image](https://user-images.githubusercontent.com/9591618/163428371-eb7f6969-3eef-4dfb-bfe4-2e4132020e24.png) + +### What does this do for you? + - Shows you all the devices found on the local network + - Devices can be expanded to see more details about the device + - Clicking on a detail item will copy the value to your clipboard + - There is also an item that lets you easily open the web portal for that device + - Shows item for TV devices that lets you change the TV Input. When clicked you will be asked what input you would like to change to. + +## Missing ECP commands! + +They were missing before...now they are not! Enjoy! + - `extension.brightscript.pressInstantReplayButton` + - `extension.brightscript.pressEnterButton` + - `extension.brightscript.pressFindRemote` + - `extension.brightscript.pressVolumeDown` + - `extension.brightscript.pressVolumeMute` + - `extension.brightscript.pressVolumeUp` + - `extension.brightscript.pressPowerOff` + - `extension.brightscript.pressChannelUp` + - `extension.brightscript.pressChannelDown` + - `extension.brightscript.changeTvInput` + +## BrightScript CreateObject validation +This release includes new validations for the `CreateObject` function call. The language is now aware of all components provided by the Roku platform, as well as all custom components defined in your code. Here are some examples: + +![image](https://user-images.githubusercontent.com/2544493/163239581-8ce5ebc2-2ae0-4d74-ab95-f5766634edc3.png) +![image](https://user-images.githubusercontent.com/2544493/163239461-0ccc1d07-1544-4a30-b6f5-c52566b26bcd.png) +![image](https://user-images.githubusercontent.com/2544493/163239653-04134b82-d3fb-41e3-804a-66ff031e3c74.png) + +## BrightScript Optional Chaining Support +This release includes syntax validation for the new [optional chaining operator](https://developer.roku.com/docs/references/brightscript/language/expressions-variables-types.md#optional-chaining-operators) that was added to the BrightScript runtime in [Roku OS 11](https://developer.roku.com/docs/developer-program/release-notes/roku-os-release-notes.md#roku-os-110). + +The optional chaining operator also introduced a slight limitation to BrighterScript ternary expressions. As such, all BrighterScript ternary expressions must now have a space to the right of the question mark when followed by [ or (. See the [optional chaning](https://github.com/rokucommunity/brighterscript/blob/master/docs/ternary-operator.md#optional-chaining-considerations) section in the BrighterScript docs for more information. + +## Bug fixes and other changes + - Fixed an issue where the rendezvous ui commands would show up in the when they shouldn't + - Rendezvous timing issue ([#367](https://github.com/rokucommunity/vscode-brightscript-language/issues/367)) + - `brightscript.deviceDiscovery.enabled` not working properly ([#236](https://github.com/rokucommunity/vscode-brightscript-language/issues/236)) + - Added a new `extension.brightscript.showReleaseNotes` command accessible via the command pallet diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 00000000..9b088033 --- /dev/null +++ b/docs/style.css @@ -0,0 +1,212 @@ +@import url(https://unpkg.com/@highlightjs/cdn-assets@11.5.0/styles/github.min.css) (prefers-color-scheme: light); +@import url(https://unpkg.com/@highlightjs/cdn-assets@11.5.0/styles/github-dark-dimmed.min.css) (prefers-color-scheme: dark); + +html, +body { + margin: 0; + padding: 0; + height: 100%; + width: 100%; + overflow: auto; + font-family: sans-serif; +} + +* { + box-sizing: border-box; + line-height: 23px; +} + +body { + display: flex; + flex-direction: column; +} + +a { + text-decoration: none; + color: inherit; +} + +.heading { + position: relative; +} + +.heading:hover .link-sharp { + display: block; +} + +.link-sharp { + position: absolute; + display: none; + left: -20px; +} + +#content { + padding: 30px; + width: 100%; + overflow: auto; +} + +#content a [id] { + color: initial; +} + +#content a { + color: #0969da; + font-weight: bold; +} + +#content a:hover { + text-decoration: underline; +} + + +#footer { + height: 200px; +} + +#navbar { + background-color: #662d91; + width: 100%; + height: 50px; + box-shadow: 1px -9px 13px 9px #000000bf; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px; + flex-shrink: 0; + align-self: flex-start; + color: white; +} + +#body-area { + display: flex; + flex-direction: row; + height: calc(100% - 50px); + position: relative; +} + +#sidebar { + height: 100%; + flex: 0 0 300px; + border-right: 1px solid lightgrey; + overflow: auto; +} + +#sidebar .entry { + padding: 15px; + cursor: pointer; + display: block; +} + +#sidebar a:hover { + background-color: rgba(0, 0, 0, .05); +} + +.folder { + display: block; +} + +.folder .name { + font-weight: bold; +} + +#sidebar>.folder>.children { + padding-left: 0 !important; +} + +.folder .children { + padding-left: 25px; +} + +code { + display: inline; + padding: .2em .4em; + border-radius: 6px; +} + +.nav-left-area { + display: flex; + align-items: center; +} + +.hamburger { + cursor: pointer; + background-color: transparent; + border: none; + display: none; +} + +.hamburger span { + display: block; + width: 33px; + height: 4px; + margin-bottom: 5px; + position: relative; + + background: #cdcdcd; + border-radius: 3px; +} + +img { + max-width: 50%; + max-height: 50%; +} + +@media only screen and (max-width: 900px) { + .hamburger { + display: inline; + } + + #sidebar { + display: none; + position: absolute; + background-color: white; + box-shadow: 1px 13px 13px 9px #000000bf; + } + + #sidebar.open { + display: block; + } + + img { + max-width: 100%; + max-height: 100%; + } +} + + +@media (prefers-color-scheme: light) { + code { + background-color: #ebebeb; + } + + pre code { + background-color: #f6f8fa !important; + } + +} + +@media (prefers-color-scheme: dark) { + code { + background-color: rgba(110, 118, 129, 0.4); + } + + #content a { + color: #58a6ff; + font-weight: bold; + } + + body, + #sidebar { + background-color: #0d1117; + color: white; + } + + #content a [id] { + color: white; + } + + #sidebar a:hover { + background-color: rgba(255, 255, 255, .1); + } +} \ No newline at end of file diff --git a/docs/telemetry.md b/docs/telemetry.md new file mode 100644 index 00000000..e30a9d2e --- /dev/null +++ b/docs/telemetry.md @@ -0,0 +1,7 @@ +# Telemetry +The extension collects a small amount of telemetry data, focused on how frequently certain features are being used. We do not collect any user-specific information. This data is also incredibly useful when requesting new features from Roku, as real-world usage carries a lot more weight than simple conjecture. + +To make things as transparent as possible, we have tried to keep all telemetry logic confined to [this file](https://github.com/rokucommunity/vscode-brightscript-language/blob/master/src/managers/TelemetryManager.ts). Feel free to open an issue if you have any questions or concerns. + +### Opting out of telemetry tracking +If you would like to disable telemetry tracking, you can follow [these instructions](https://code.visualstudio.com/docs/getstarted/telemetry#_disable-telemetry-reporting) from the VSCode docs. \ No newline at end of file diff --git a/images/icons/brighterscript.svg b/images/icons/brighterscript.svg new file mode 100644 index 00000000..62e0444b --- /dev/null +++ b/images/icons/brighterscript.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/images/icons/brightscript.svg b/images/icons/brightscript.svg new file mode 100644 index 00000000..bd191fa6 --- /dev/null +++ b/images/icons/brightscript.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + diff --git a/images/icons/inspect-active.svg b/images/icons/inspect-active.svg new file mode 100644 index 00000000..0de8c1f5 --- /dev/null +++ b/images/icons/inspect-active.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/icons/logo.svg b/images/icons/logo.svg new file mode 100644 index 00000000..f666d260 --- /dev/null +++ b/images/icons/logo.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/preview-right-dark.svg b/images/icons/preview-right-dark.svg similarity index 100% rename from images/preview-right-dark.svg rename to images/icons/preview-right-dark.svg diff --git a/images/preview-right-light.svg b/images/icons/preview-right-light.svg similarity index 100% rename from images/preview-right-light.svg rename to images/icons/preview-right-light.svg diff --git a/images/icons/set-top-box-dark.svg b/images/icons/set-top-box-dark.svg new file mode 100644 index 00000000..219b296a --- /dev/null +++ b/images/icons/set-top-box-dark.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/set-top-box-light.svg b/images/icons/set-top-box-light.svg new file mode 100644 index 00000000..96b9e9aa --- /dev/null +++ b/images/icons/set-top-box-light.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + diff --git a/images/icons/streaming-stick-dark.svg b/images/icons/streaming-stick-dark.svg new file mode 100644 index 00000000..83472246 --- /dev/null +++ b/images/icons/streaming-stick-dark.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + diff --git a/images/icons/streaming-stick-light.svg b/images/icons/streaming-stick-light.svg new file mode 100644 index 00000000..99a5f0f6 --- /dev/null +++ b/images/icons/streaming-stick-light.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + diff --git a/images/icons/tv-dark.svg b/images/icons/tv-dark.svg new file mode 100644 index 00000000..3f1fa1c0 --- /dev/null +++ b/images/icons/tv-dark.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + TV + + diff --git a/images/icons/tv-light.svg b/images/icons/tv-light.svg new file mode 100644 index 00000000..04f5d15d --- /dev/null +++ b/images/icons/tv-light.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + TV + + diff --git a/images/icon.png b/images/logo.png similarity index 100% rename from images/icon.png rename to images/logo.png diff --git a/language-configuration.json b/language-configuration.json index 9e564349..c9688f08 100644 --- a/language-configuration.json +++ b/language-configuration.json @@ -14,10 +14,6 @@ [ "(", ")" - ], - [ - "<", - ">" ] ], "autoClosingPairs": [ @@ -54,10 +50,6 @@ [ "\"", "\"" - ], - [ - "<", - ">" ] ], "folding": { @@ -68,7 +60,7 @@ } }, "indentationRules": { - "increaseIndentPattern": "(((^|[=,(:])\\s*\\b(if|else|elseif|for|while|function|sub|try|catch)\\b((?!\\b(then)\\b).)*)|(\\b(then)\\b\\s*)|({\\s*))$", - "decreaseIndentPattern": "^\\s*((\\b(else|elseif|endif|endfor|endwhile|endsub|endfunction|catch|endtry)\\b)|((\\b(end)\\s+(if|for|while|sub|function|try)\\b))|})" + "increaseIndentPattern": "(((^|[=,(:])\\s*\\b(if|else|elseif|for|while|function|sub|try|catch|namespace|interface|enum|component)\\b((?!\\b(then)\\b).)*)|(\\b(then)\\b\\s*)|({\\s*))$", + "decreaseIndentPattern": "^\\s*((\\b(else|elseif|endif|endfor|endwhile|endsub|endfunction|catch|endtry|endnamespace|endinterface|endenum|endcomponent)\\b)|((\\b(end)\\s+(if|for|while|sub|function|try|namespace|interface|enum|component)\\b))|})" } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d0babb62..b67c0e95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1675 +1,15099 @@ { "name": "brightscript", - "version": "2.23.1", - "lockfileVersion": 1, + "version": "2.40.4", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "packages": { + "": { + "name": "brightscript", + "version": "2.40.4", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@vscode/extension-telemetry": "^0.4.7", + "array-sort": "^1.0.0", + "backoff": "^2.5.0", + "brighterscript": "^0.65.0", + "brighterscript-formatter": "^1.6.29", + "debounce": "^1.2.0", + "dotenv": "^6.2.0", + "fast-xml-parser": "^3.12.16", + "fs-extra": "^7.0.1", + "get-port": "^5.0.0", + "glob": "^7.1.3", + "hex-rgb": "^5.0.0", + "iconv-lite": "0.4.24", + "just-throttle": "^4.0.1", + "net": "^1.0.2", + "node-cache": "^4.2.0", + "node-ssdp": "^4.0.0", + "postman-request": "^2.88.1-postman.32", + "pretty-bytes": "^5.6.0", + "roku-debug": "^0.19.1", + "roku-deploy": "^3.10.2", + "roku-test-automation": "^2.0.0-beta.19", + "semver": "^7.1.3", + "source-map": "^0.7.3", + "thenby": "^1.3.4", + "vscode-languageclient": "^7.0.0", + "vscode-uri": "^1.0.6" + }, + "devDependencies": { + "@deboxsoft/cpx": "^1.5.0", + "@parcel/watcher": "^2.0.7", + "@types/backoff": "^2.5.2", + "@types/chai": "^4.1.5", + "@types/chalk": "^2.2.0", + "@types/fs-extra": "^5.0.4", + "@types/glob": "^7.1.1", + "@types/mocha": "^7.0.2", + "@types/node": "^12.12.0", + "@types/node-ssdp": "^3.3.0", + "@types/prompt": "^1.1.2", + "@types/semver": "^7.1.0", + "@types/sinon": "7.0.6", + "@types/vscode": "^1.53.0", + "@types/yargs": "^17.0.10", + "@typescript-eslint/eslint-plugin": "^5.14.0", + "@typescript-eslint/parser": "^5.14.0", + "@vscode/vsce": "^2.19.0", + "chai": "^4.2.0", + "chalk": "^4.1.2", + "changelog-parser": "^2.8.0", + "coveralls-next": "^4.2.0", + "dayjs": "^1.11.7", + "deferred": "^0.7.11", + "eslint": "^8.10.0", + "eslint-plugin-github": "^4.3.5", + "eslint-plugin-no-only-tests": "^2.6.0", + "latest-version": "^5.1.0", + "mocha": "^9.1.3", + "node-fetch": "^2.6.1", + "node-notifier": "^10.0.1", + "nyc": "^15.0.0", + "ovsx": "^0.5.2", + "prompt": "^1.3.0", + "rimraf": "^3.0.0", + "sinon": "^7.2.3", + "source-map-support": "^0.5.21", + "statigen": "^0.5.0", + "terminal-overwrite": "^2.0.1", + "ts-node": "^10.9.1", + "tslib": "^2.3.1", + "typescript": "^4.7.4", + "typescript-json-schema": "^0.50.1", + "undent": "^0.1.0", + "vscode-tmgrammar-test": "^0.0.11", + "yargs": "^16.2.0" + }, + "engines": { + "node": "^12.12.0", + "vscode": "^1.57.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" + "engines": { + "node": ">=0.10.0" } }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "node_modules/@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, - "requires": { - "@babel/types": "^7.10.4" + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "node_modules/@babel/core/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, - "requires": { - "@babel/types": "^7.11.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "node_modules/@babel/core/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/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "@babel/types": "^7.10.4" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "node_modules/@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "requires": { - "@babel/types": "^7.10.4" + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "node_modules/@babel/helper-compilation-targets/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, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "dependencies": { + "yallist": "^3.0.2" } }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "requires": { - "@babel/types": "^7.11.0" + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@deboxsoft/cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@deboxsoft/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha512-4hkpKja/1jn+mxpGM3oczee2qXGGChunQYYnORIc7U+91XZPzSdXtvVr/yeH//rnM3Sl9QWzUjMKN9I+IqKu9g==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "requires": { - "co": "^4.6.0", - "debounce": "^1.1.0", - "debug": "^3.1.0", - "duplexer": "^0.1.1", - "fs-extra": "^6.0.1", - "glob": "^7.1.2", - "glob2base": "0.0.12", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "safe-buffer": "^5.1.2", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" + "dependencies": { + "@babel/types": "^7.22.5" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@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==", + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "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" + "engines": { + "node": ">=6.9.0" } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@rokucommunity/bslib": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rokucommunity/bslib/-/bslib-0.1.1.tgz", - "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@rollup/plugin-commonjs": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz", - "integrity": "sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==", + "node_modules/@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@rollup/plugin-node-resolve": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz", - "integrity": "sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==", + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.17.0" + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "@rollup/plugin-typescript": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz", - "integrity": "sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" + "dependencies": { + "color-name": "1.1.3" } }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "requires": { - "type-detect": "4.0.8" + "engines": { + "node": ">=0.8.0" } }, - "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "engines": { + "node": ">=4" } }, - "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@tsconfig/svelte": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-1.0.10.tgz", - "integrity": "sha512-EBrpH2iXXfaf/9z81koiDYkp2mlwW2XzFcAqn6qh7VKyP8zBvHHAQzNhY+W9vH5arAjmGAm5g8ElWq6YmXm3ig==", - "dev": true + "node_modules/@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", - "requires": { - "@types/connect": "*", - "@types/node": "*" + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/chai": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.12.tgz", - "integrity": "sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ==", - "dev": true + "node_modules/@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "node_modules/@babel/traverse/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 + } + } }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" + "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" } }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "node_modules/@babel/traverse/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 }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" } }, - "@types/fs-extra": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", - "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "node_modules/@compodoc/live-server": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@compodoc/live-server/-/live-server-1.2.3.tgz", + "integrity": "sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "chokidar": "^3.5.2", + "colors": "1.4.0", + "connect": "^3.7.0", + "cors": "latest", + "event-stream": "4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "4.1.9", + "http-auth-connect": "^1.0.5", + "morgan": "^1.10.0", + "object-assign": "latest", + "open": "8.4.0", + "proxy-middleware": "latest", + "send": "latest", + "serve-index": "^1.9.1" + }, + "bin": { + "live-server": "live-server.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "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, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", - "requires": { - "@types/node": "*" + "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" } }, - "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "node_modules/@deboxsoft/cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@deboxsoft/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha512-4hkpKja/1jn+mxpGM3oczee2qXGGChunQYYnORIc7U+91XZPzSdXtvVr/yeH//rnM3Sl9QWzUjMKN9I+IqKu9g==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "debounce": "^1.1.0", + "debug": "^3.1.0", + "duplexer": "^0.1.1", + "fs-extra": "^6.0.1", + "glob": "^7.1.2", + "glob2base": "0.0.12", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "safe-buffer": "^5.1.2", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + }, + "bin": { + "cpx": "bin/index.js" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/@deboxsoft/cpx/node_modules/fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "node_modules/@eslint/eslintrc/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, - "optional": true + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "node_modules/@eslint/eslintrc/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 }, - "@types/mocha": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", - "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "node_modules/@github/browserslist-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", + "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", "dev": true }, - "@types/mock-fs": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.10.0.tgz", - "integrity": "sha512-FQ5alSzmHMmliqcL36JqIA4Yyn9jyJKvRSGV3mvPh108VFatX7naJDzSG4fnFQNZFq9dIx0Dzoe6ddflMB2Xkg==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "@types/node": { - "version": "12.20.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", - "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" + "node_modules/@humanwhocodes/config-array/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 + } + } }, - "@types/node-ssdp": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/node-ssdp/-/node-ssdp-3.3.1.tgz", - "integrity": "sha512-mn4ZOdKM/pgAKl7K50g97/2UnwLyQxuSweM4+1JUaUS7n2LnVHTFDJx8xk0NVyBXPYjWxhidCa5YC96k1XLcsA==", + "node_modules/@humanwhocodes/config-array/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/@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": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "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/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/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/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.7.tgz", + "integrity": "sha512-gc3hoS6e+2XdIQ4HHljDB1l0Yx2EWh/sBBtCEFNKGSMlwASWeAQsOY/fPbxOBcZ/pg0jBh4Ga+4xHlZc4faAEQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.0.tgz", + "integrity": "sha512-roLI1ul/GwzwcfcVpZYPdrgW2W/drLriObl1h+yLF5syc8/5ULWw2ALbCHUWF+4YltIqA3xFSbG4IwyJz37e9g==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.2-postman.2", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.2-postman.2.tgz", + "integrity": "sha512-nrBdX3jA5HzlxTrGI/I0g6pmUKic7xbGA4fAMLFgmJCA3DL2Ma+3MvmD+Sdiw9gLEzZJIF4fz33sT8raV/L/PQ==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@postman/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@postman/tunnel-agent": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", + "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@rokucommunity/bslib": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rokucommunity/bslib/-/bslib-0.1.1.tgz", + "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" + }, + "node_modules/@rokucommunity/logger": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@rokucommunity/logger/-/logger-0.3.3.tgz", + "integrity": "sha512-4nmLHHr6pzBoGE11idjjIfCuhXbuo6urqNLfymiqNg8BHtBVLL+PqjIXq3OFFzv2x37w64LoHK+nDk9EHrkxbw==", + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.0", + "safe-json-stringify": "^1.2.0", + "serialize-error": "^8.1.0" + } + }, + "node_modules/@rokucommunity/logger/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rokucommunity/logger/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rokucommunity/logger/node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rokucommunity/logger/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@suitest/types": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@suitest/types/-/types-4.6.0.tgz", + "integrity": "sha512-42NRmZNZ+D+ELcnbT4oRYnq5bAtsl1OhDTfuIp5x8uVh33GcipmbZLKDxBlwVTGCTbIH9xXRN9dS2o4gfzLoGw==" + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "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.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/backoff": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@types/backoff/-/backoff-2.5.2.tgz", + "integrity": "sha512-oa1YvggujhVppgeIct3LBkbCVXKh97fvOFIR6VlFLxRCeswk/KBRQKg7zoX832vlCP5bGLOFqC9hY7vsDeL9AA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "deprecated": "This is a stub types definition for chalk (https://github.com/chalk/chalk). chalk provides its own type definitions, so you don't need @types/chalk installed!", + "dev": true, + "dependencies": { + "chalk": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", + "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/@types/node-ssdp": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/node-ssdp/-/node-ssdp-3.3.1.tgz", + "integrity": "sha512-mn4ZOdKM/pgAKl7K50g97/2UnwLyQxuSweM4+1JUaUS7n2LnVHTFDJx8xk0NVyBXPYjWxhidCa5YC96k1XLcsA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prompt": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/prompt/-/prompt-1.1.4.tgz", + "integrity": "sha512-FLMcf+ol+eUJALeIYWLjQl0hYw86G0PIg7D5+4jJHwr/wKI8p3R0u+oKLbyRkzCxb7e0pHixyCj7UgSv7I/TJQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/revalidator": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/revalidator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@types/revalidator/-/revalidator-0.3.8.tgz", + "integrity": "sha512-q6KSi3PklLGQ0CesZ/XuLwly4DXXlnJuucYOG9lrBqrP8rKiuPZThav2h2+pFjaheNpnT0qKK3i304QWIePeJw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.6.tgz", + "integrity": "sha512-ldQl2p7kyCXHhr//5sQCu9jWgSiDbYuCD5dUp53r/z8T8jmgKpANpy4vqjbdho9P2ldFaQC/gpW31hch+oQ0IQ==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, + "node_modules/@types/vscode": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.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.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/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", + "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.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.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/@typescript-eslint/parser/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/@typescript-eslint/scope-manager": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.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.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.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.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/@typescript-eslint/type-utils/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/@typescript-eslint/types": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "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.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.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.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/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "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/visitor-keys": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/@vscode/extension-telemetry": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.10.tgz", + "integrity": "sha512-XgyUoWWRQExTmd9DynIIUQo1NPex/zIeetdUAXeBjVuW9ioojM1TcDaSqOa/5QLC7lx+oEXwSU1r0XSBgzyz6w==", + "engines": { + "vscode": "^1.60.0" + } + }, + "node_modules/@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vscode/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@vscode/vsce/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@vscode/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/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==", + "dev": true + }, + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "dependencies": { + "chevrotain": "7.1.1" + } + }, + "node_modules/@xml-tools/parser/node_modules/chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "dependencies": { + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "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-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "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==", + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apache-crypt": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.6.tgz", + "integrity": "sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==", + "dev": true, + "dependencies": { + "unix-crypt-td-js": "^1.1.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/apache-md5": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", + "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "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": "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/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-flat-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", + "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brighterscript": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.65.0.tgz", + "integrity": "sha512-SnBYgL5f8kReqteJYT8TASYHu2XRc2gPxZfL2Q1JVeF9i5xeK4lJGAzjK3dinuiirYzHNIIoXpkzhTFIq7+DDg==", + "dependencies": { + "@rokucommunity/bslib": "^0.1.1", + "@xml-tools/parser": "^1.0.7", + "array-flat-polyfill": "^1.0.1", + "chalk": "^2.4.2", + "chevrotain": "^7.0.1", + "chokidar": "^3.5.1", + "clear": "^0.1.0", + "coveralls-next": "^4.2.0", + "cross-platform-clear-console": "^2.3.0", + "debounce-promise": "^3.1.0", + "eventemitter3": "^4.0.0", + "fast-glob": "^3.2.12", + "file-url": "^3.0.0", + "fs-extra": "^8.1.0", + "jsonc-parser": "^2.3.0", + "long": "^3.2.0", + "luxon": "^2.5.2", + "minimatch": "^3.0.4", + "moment": "^2.23.0", + "p-settle": "^2.1.0", + "parse-ms": "^2.1.0", + "readline": "^1.3.0", + "require-relative": "^0.8.7", + "roku-deploy": "^3.10.2", + "serialize-error": "^7.0.1", + "source-map": "^0.7.4", + "vscode-languageserver": "7.0.0", + "vscode-languageserver-protocol": "3.16.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^2.1.1", + "xml2js": "^0.5.0", + "yargs": "^16.2.0" + }, + "bin": { + "bsc": "dist/cli.js" + } + }, + "node_modules/brighterscript-formatter": { + "version": "1.6.29", + "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.6.29.tgz", + "integrity": "sha512-NfFscJM+9lEyaWrY5J9pliLOhNxiBkfsBKD8XmbigrbWpY4Ff6sqojw0Op2SFhySWy7N2e4J4inshx9FgKTI1A==", + "dependencies": { + "brighterscript": "^0.65.0", + "glob-all": "^3.3.0", + "jsonc-parser": "^3.0.0", + "source-map": "^0.7.3", + "yargs": "^17.2.1" + }, + "bin": { + "brighterscript-formatter": "dist/cli.js", + "bsfmt": "dist/cli.js" + } + }, + "node_modules/brighterscript-formatter/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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/brighterscript-formatter/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==" + }, + "node_modules/brighterscript-formatter/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brighterscript-formatter/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/brighterscript-formatter/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brighterscript-formatter/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/brighterscript-formatter/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/brighterscript/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brighterscript/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brighterscript/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/brighterscript/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/brighterscript/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/brighterscript/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/brighterscript/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/brighterscript/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/brighterscript/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/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "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/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/changelog-parser": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-2.8.1.tgz", + "integrity": "sha512-tNUYFRCEeWTXmwLqoNtOEzx9wcytg72MmGQqsEs14ClYwIDln7sbQw7FJj/dulXgSlsxkemc9gpPQhZYZx1TPw==", + "dev": true, + "dependencies": { + "line-reader": "^0.2.4", + "remove-markdown": "^0.2.2" + }, + "bin": { + "changelog-parser": "bin/cli.js" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chevrotain": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz", + "integrity": "sha512-9bQsXVQ7UAvzMs7iUBBJ9Yv//exOy7bIR3PByOEk4M64vIE/LsiOiX7VIkMF/vEMlrSStwsaE884Bp9CpjtC5g==", + "dependencies": { + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clear": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", + "engines": { + "node": "*" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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==", + "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==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/coveralls-next": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/coveralls-next/-/coveralls-next-4.2.0.tgz", + "integrity": "sha512-zg41a/4QDSASPtlV6gp+6owoU43U5CguxuPZR3nPZ26M5ZYdEK3MdUe7HwE+AnCZPkucudfhqqJZehCNkz2rYg==", + "dependencies": { + "form-data": "4.0.0", + "js-yaml": "4.1.0", + "lcov-parse": "1.0.0", + "log-driver": "1.2.7", + "minimist": "1.2.7" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/coveralls-next/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/coveralls-next/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/coveralls-next/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/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-platform-clear-console": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz", + "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debounce-promise": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" + }, + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/deferred": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", + "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.50", + "event-emitter": "^0.3.5", + "next-tick": "^1.0.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/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/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ejs-include-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz", + "integrity": "sha512-OTkvS8Dm8XhaE/+EKIjYjInRkNahQwkUUacAZXvA8Gqr5KEZrOsgFk8AkKYSnoTcdvKV0wnoG7YHWb4gkZFu8Q==", + "dev": true + }, + "node_modules/ejs-lint": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ejs-lint/-/ejs-lint-1.2.2.tgz", + "integrity": "sha512-ESR/MePvJJJfkK3EUAYlPKe2JM2nRDc4uFkGgbB5Prr06nluN7JozNVFL3Ze7LV7xNY7JPWEi5H3i4hOl6mxXw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "ejs": "3.1.7", + "ejs-include-regex": "^1.0.0", + "globby": "^11.0.0", + "read-input": "^0.3.1", + "slash": "^3.0.0", + "syntax-error": "^1.1.6", + "yargs": "^16.0.0" + }, + "bin": { + "ejslint": "cli.js" + } + }, + "node_modules/ejs-lint/node_modules/ejs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emitter-component": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", + "integrity": "sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/empty-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empty-dir/-/empty-dir-2.0.0.tgz", + "integrity": "sha512-XAedXlNAQZxMmbllXY9cxuESlNVjZ8xd67bSIUZwbS7VoLyhlNehVN3Iy35yDTGFHKR1opBRgORkp3am0so+WQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "node_modules/es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "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": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "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.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "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-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-escompat": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.3.4.tgz", + "integrity": "sha512-d/k6JwRzGRY6uZ426l6Ut6Eb2S/pi/079Ykj2GdWSzwm6WJHkdm28tECUWfLtpFA5ObApjPw6wR9bgY+uWAhag==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.0" + }, + "peerDependencies": { + "eslint": ">=5.14.1" + } + }, + "node_modules/eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "engines": { + "node": ">=6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", + "dev": true, + "dependencies": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-github": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.6.0.tgz", + "integrity": "sha512-6VMH3wLUPEnV/0VuV3f0F74LF93N522Ht9KBYWDuPWKhr1NBzCqySIbQsxjPINIynoLtsErSc/YgICrocCc2zw==", + "dev": true, + "dependencies": { + "@github/browserslist-config": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint-config-prettier": ">=8.0.0", + "eslint-plugin-escompat": "^3.3.3", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-i18n-text": "^1.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-no-only-tests": "^3.0.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-rule-documentation": ">=1.0.0", + "jsx-ast-utils": "^3.3.2", + "prettier": "^2.2.1", + "svg-element-attributes": "^1.3.1" + }, + "bin": { + "eslint-ignore-errors": "bin/eslint-ignore-errors.js" + }, + "peerDependencies": { + "eslint": "^8.0.1" + } + }, + "node_modules/eslint-plugin-github/node_modules/eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true, + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-i18n-text": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", + "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", + "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-rule-documentation": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", + "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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/eslint/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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "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==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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/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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "dev": true, + "engines": { + "node": "> 0.1.90" + } + }, + "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==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "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/fast-xml-parser": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", + "dependencies": { + "strnum": "^1.0.4" + }, + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "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/file-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", + "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", + "engines": { + "node": ">=8" + } + }, + "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.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", + "integrity": "sha512-jPrupTOe/pO//3a9Ty2o4NqQCp0L46UG+swUnfFtdmtQVN8pEltKpAqR7Nuf6vWn0GBXx5w+R1MyZzqwjEIqdA==", + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-in-files": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", + "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "dependencies": { + "find": "^0.1.5", + "q": "^1.0.1" + } + }, + "node_modules/find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", + "dev": true + }, + "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.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "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/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-all": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", + "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", + "dependencies": { + "glob": "^7.2.3", + "yargs": "^15.3.1" + }, + "bin": { + "glob-all": "bin/glob-all" + } + }, + "node_modules/glob-all/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/glob-all/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==" + }, + "node_modules/glob-all/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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/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==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-all/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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/glob-all/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-all/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", + "dev": true, + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globals": { + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "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/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/hex-rgb": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-5.0.0.tgz", + "integrity": "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-auth": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-4.1.9.tgz", + "integrity": "sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ==", + "dev": true, + "dependencies": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.4.3", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-auth-connect": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.6.tgz", + "integrity": "sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-network-proxy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/http-network-proxy/-/http-network-proxy-1.0.11.tgz", + "integrity": "sha512-FIslCoJqiqwZIf4vGwjTNSYEr43VpXvM9S0rSjM/kAlVh/Cog+QjbV+qJFSYEhy5zL9qDyWWzE7wr+grP53XFA==", + "dependencies": { + "@types/express": "^4.17.6", + "express": "^4.17.1", + "fast-xml-parser": "^3.17.4", + "fs-extra": "^9.0.1", + "http-proxy-middleware": "^1.0.4", + "portfinder": "^1.0.26", + "rimraf": "^3.0.2", + "stream-array": "^1.1.2", + "typescript": "^3.9.5" + } + }, + "node_modules/http-network-proxy/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-network-proxy/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/http-network-proxy/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/http-network-proxy/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "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/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "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/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.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.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/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "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/jake/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "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": "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/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/just-throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-throttle/-/just-throttle-4.1.1.tgz", + "integrity": "sha512-OK1iESPWjZZnKRYpMsaFb0TSAv74OtbB8CiCRA1tNub1/R0S47n7edXsQ64GtpfIuiGVwSjPNLwkePl4owlDug==" + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/keytar/node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "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/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/line-reader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.2.4.tgz", + "integrity": "sha512-342xzyZZS9uTiKwHJcMacopVl/WjrMMCZS1Qg4Uhl/WBknWRrGFdKOIS1Kec6SaiTcZMtmuxWvvIbPXj/+FMjA==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "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/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "engines": { + "node": ">=0.8.6" + } + }, + "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/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/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==", + "dev": true + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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/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/mocha/node_modules/glob/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/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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "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/natural-orderby": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", + "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", + "engines": { + "node": "*" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-abi": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", + "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/node-cache": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", + "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", + "dependencies": { + "clone": "2.x", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 0.4.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-notifier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", + "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.5", + "shellwords": "^0.1.1", + "uuid": "^8.3.2", + "which": "^2.0.2" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/node-ssdp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-4.0.1.tgz", + "integrity": "sha512-uJXkLZVuyaMg1qNbMbGQ6YzNzyOD+NLxYyxIJocPTKTVECPDokOiCZA686jTLXHMUnV34uY/lcUSJ+/5fhY43A==", + "dependencies": { + "async": "^2.6.0", + "bluebird": "^3.5.1", + "debug": "^3.1.0", + "extend": "^3.0.1", + "ip": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ovsx": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-0.5.2.tgz", + "integrity": "sha512-UbLultRCk46WddeA0Cly4hoRhzBJUiLgbIEViXlgOvV54LbsppClDkMLoCevUUBHoiNdMX2NuiSgURAEXgCZdw==", + "dev": true, + "dependencies": { + "commander": "^6.1.0", + "follow-redirects": "^1.14.6", + "is-ci": "^2.0.0", + "leven": "^3.1.0", + "tmp": "^0.2.1", + "vsce": "^2.6.3" + }, + "bin": { + "ovsx": "lib/ovsx" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-reflect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz", + "integrity": "sha512-rlngKS+EX3nvI7xIzA0xKNVEAguWdIqAZVbn02z1m73ehXBdX66aTdD0bCvIu0cDwbU3TK9w3RYrppKpO3EnKQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-settle": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.1.0.tgz", + "integrity": "sha512-NHFIUYc+fQTFRrzzAugq0l1drwi57PB522smetcY8C/EoTYs6cU/fC6TJj0N3rq5NhhJJbhf0VGWziL3jZDnjA==", + "dependencies": { + "p-limit": "^1.2.0", + "p-reflect": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-settle/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-settle/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "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==", + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "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/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "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/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/postman-request": { + "version": "2.88.1-postman.32", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.32.tgz", + "integrity": "sha512-Zf5D0b2G/UmnmjRwQKhYy4TBkuahwD0AMNyWwFK3atxU1u5GS38gdd7aw3vyR6E7Ii+gD//hREpflj2dmpbE7w==", + "dependencies": { + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.2-postman.1", + "@postman/tunnel-agent": "^0.6.3", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "brotli": "^1.3.3", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postman-request/node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postman-request/node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "engines": { + "node": ">= 0.6" + } + }, + "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/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prompt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", + "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "async": "3.2.3", + "read": "1.0.x", + "revalidator": "0.1.x", + "winston": "2.x" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/prompt/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-input": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/read-input/-/read-input-0.3.1.tgz", + "integrity": "sha512-J1ZkWCnB4altU7RTe+62PSfa21FrEtfKyO9fuqR3yP8kZku3nIwaw2Krj383JC7egAIl5Zyz2w+EOu9uXH5HZw==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/remove-markdown": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.2.2.tgz", + "integrity": "sha512-jwgEf3Yh/xi4WodWi/vPlasa9C9pMv1kz5ITOIAGjBW7PeZ/CHZCdBfJzQnn2VX2cBvf1xCuJv0tUJqn/FCMNA==", + "dev": true + }, + "node_modules/replace-in-file": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", + "integrity": "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==", + "dependencies": { + "chalk": "^4.1.2", + "glob": "^7.2.0", + "yargs": "^17.2.1" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/replace-in-file/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==" + }, + "node_modules/replace-in-file/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/replace-in-file/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace-in-file/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/replace-in-file/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/replace-last": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/replace-last/-/replace-last-1.2.6.tgz", + "integrity": "sha512-Cj+MK38VtNu1S5J73mEZY3ciQb9dJajNq1Q8inP4dn/MhJMjHwoAF3Z3FjspwAEV9pfABl565MQucmrjOkty4g==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "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/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "dev": true, + "engines": { + "node": ">= 0.4.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==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roku-debug": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/roku-debug/-/roku-debug-0.19.1.tgz", + "integrity": "sha512-Y67K2k6o0QeOq7BH2MWInj7DegSk2azHTdkcuihpBgLNlGLKvXWTJdA4bnpytzM61Oj0izFWewdeA5r3VBOAeA==", + "dependencies": { + "@rokucommunity/logger": "^0.3.3", + "@types/request": "^2.48.8", + "brighterscript": "^0.65.0", + "dateformat": "~4", + "eol": "^0.9.1", + "eventemitter3": "^4.0.7", + "fast-glob": "^3.2.11", + "find-in-files": "^0.5.0", + "fs-extra": "^10.0.0", + "natural-orderby": "^2.0.3", + "postman-request": "^2.88.1-postman.32", + "replace-in-file": "^6.3.2", + "replace-last": "^1.2.6", + "roku-deploy": "^3.10.2", + "semver": "^7.3.5", + "serialize-error": "^8.1.0", + "smart-buffer": "^4.2.0", + "source-map": "^0.7.4", + "telnet-client": "^1.4.9", + "vscode-debugadapter": "^1.49.0", + "vscode-debugprotocol": "^1.49.0", + "vscode-languageserver": "^6.1.1", + "xml2js": "^0.5.0" + } + }, + "node_modules/roku-debug/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/roku-debug/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/roku-debug/node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roku-debug/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/roku-debug/node_modules/vscode-languageserver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", + "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", + "dependencies": { + "vscode-languageserver-protocol": "^3.15.3" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/roku-deploy": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.10.2.tgz", + "integrity": "sha512-oKMw8+CpbvFrNjf3g7PmhSRInTXitaFmtFhxb0ANiE+sC2p+/8wn/1/KqnYsTWPdEKUOLh0xIz2FHK9Nd5o9UA==", + "dependencies": { + "chalk": "^2.4.2", + "dateformat": "^3.0.3", + "dayjs": "^1.11.0", + "fast-glob": "^3.2.12", + "fs-extra": "^7.0.1", + "is-glob": "^4.0.3", + "jsonc-parser": "^2.3.0", + "jszip": "^3.6.0", + "micromatch": "^4.0.4", + "moment": "^2.29.1", + "parse-ms": "^2.1.0", + "postman-request": "^2.88.1-postman.32", + "temp-dir": "^2.0.0", + "xml2js": "^0.5.0" + }, + "bin": { + "roku-deploy": "dist/cli.js" + } + }, + "node_modules/roku-deploy/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/roku-deploy/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/roku-deploy/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/roku-deploy/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/roku-deploy/node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "engines": { + "node": "*" + } + }, + "node_modules/roku-deploy/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/roku-deploy/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/roku-deploy/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/roku-test-automation": { + "version": "2.0.0-beta.20", + "resolved": "https://registry.npmjs.org/roku-test-automation/-/roku-test-automation-2.0.0-beta.20.tgz", + "integrity": "sha512-k0LFT4D010aunJvXmNEr09TM2QcRt9fpAQrUxIICWuK5NKX1cVizy++Z3HzWVMoVyMvJv2MOLy7OE/umf4ZAHg==", + "dependencies": { + "@suitest/types": "^4.6.0", + "ajv": "^6.12.6", + "fs-extra": "^7.0.1", + "http-network-proxy": "^1.0.11", + "needle": "^2.9.1", + "path": "^0.12.7", + "roku-deploy": "^3.9.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "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==", + "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/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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/shell-quote": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/statigen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/statigen/-/statigen-0.5.0.tgz", + "integrity": "sha512-W9qp6ZDtHZzlQ3OhbQ+UWMNEh5s7p5RQ7YKl+MPUj7gjHRzrTjlc6/Qp+f1YiWusgGdW/Dt02Q0lDHfNMCG22g==", + "dev": true, + "dependencies": { + "@compodoc/live-server": "^1.2.3", + "@parcel/watcher": "^2.0.5", + "chalk": "^4.1.2", + "chokidar": "^3.5.1", + "debounce": "^1.2.1", + "ejs": "^3.1.8", + "ejs-lint": "^1.2.2", + "empty-dir": "^2.0.0", + "fast-glob": "^3.2.11", + "front-matter": "^4.0.2", + "fs-extra": "^10.0.1", + "latest-version": "^7.0.0", + "marked": "^4.0.12", + "moment": "^2.29.2", + "yargs": "^17.4.0" + }, + "bin": { + "statigen": "dist/cli.js" + } + }, + "node_modules/statigen/node_modules/@sindresorhus/is": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz", + "integrity": "sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/statigen/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/statigen/node_modules/cacheable-request": { + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.10.tgz", + "integrity": "sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/statigen/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/statigen/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/statigen/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/statigen/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/statigen/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/statigen/node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/statigen/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/statigen/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/statigen/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/statigen/node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/statigen/node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/statigen/node_modules/package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/statigen/node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statigen/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/statigen/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/statigen/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/statigen/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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", + "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", + "dependencies": { + "emitter-component": "^1.1.1" + } + }, + "node_modules/stream-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz", + "integrity": "sha512-1yWdVsMEm/btiMa2YyHiC3mDrtAqlmNNaDRylx2F7KHhm3C4tA6kSR2V9mpeMthv+ujvbl8Kamyh5xaHHdFvyQ==", + "dependencies": { + "readable-stream": "~2.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-array/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" + }, + "node_modules/stream-array/node_modules/readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw==", + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-array/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "dependencies": { + "bluebird": "^2.6.2" + } + }, + "node_modules/stream-length/node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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-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/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/svg-element-attributes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", + "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/telnet-client": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.4.11.tgz", + "integrity": "sha512-m15pRh7F74ZzWmqjUtOg3SYp8iSnH7xY1lD9hWk8icjuLRSItABPk1vRJFwSM7op6TgZuEXOWOSbiK9nknloSw==", + "dependencies": { + "bluebird": "^3.5.4", + "net": "^1.0.2", + "stream": "^0.0.2" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-overwrite": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/terminal-overwrite/-/terminal-overwrite-2.0.1.tgz", + "integrity": "sha512-CP8KtcHQjSlKtaXIZTJt4I4II8oEdXyGJtx54gXVVys9plYIaK4ahiXPD6XxZ2efrqayH1B7uR/5Wr7N2cTgFA==", + "dev": true, + "dependencies": { + "cli-cursor": "^2.0.0", + "string-width": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "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/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/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/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "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/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": 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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "dev": true, + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typed-rest-client/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typescript-json-schema": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz", + "integrity": "sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@types/node": "^14.14.33", + "glob": "^7.1.6", + "json-stable-stringify": "^1.0.1", + "ts-node": "^9.1.1", + "typescript": "~4.2.3", + "yargs": "^16.2.0" + }, + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" + } + }, + "node_modules/typescript-json-schema/node_modules/@types/node": { + "version": "14.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", + "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", + "dev": true + }, + "node_modules/typescript-json-schema/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/typescript-json-schema/node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/typescript-json-schema/node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undent": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/undent/-/undent-0.1.0.tgz", + "integrity": "sha512-vohX7ywgBjRxDNw+f3wHclSXmO0z9HsEfmGObOuG7G0yi7kZ6OtCG8kAxtDSNklmua5KR6ev2drTFqMGqpYEbg==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vsce": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", + "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.4.23", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/vsce/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vscode-debugadapter": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", + "integrity": "sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==", + "deprecated": "This package has been renamed to @vscode/debugadapter, please update to the new name", + "dependencies": { + "mkdirp": "^1.0.4", + "vscode-debugprotocol": "1.51.0" + } + }, + "node_modules/vscode-debugadapter/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-debugprotocol": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz", + "integrity": "sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==", + "deprecated": "This package has been renamed to @vscode/debugprotocol, please update to the new name" + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "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.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.5.0.tgz", + "integrity": "sha512-jToQkPGMNKn0eyKyitYeINJF0NoD240aYyKPIWJv5W2jfPt++jIRg0OSergubtGhbw6SoefkvBYEpX7TsfoSUQ==", + "dev": true + }, + "node_modules/vscode-tmgrammar-test": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/vscode-tmgrammar-test/-/vscode-tmgrammar-test-0.0.11.tgz", + "integrity": "sha512-Bd60x/OeBLAQnIxiR2GhUic1CQZOFfWM8Pd43HjdEUBf/0vcvYAlFQikOXvv+zkItHLznjKaDX7VWKPVYUF9ug==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "commander": "^2.20.3", + "diff": "^4.0.2", + "glob": "^7.1.6", + "vscode-oniguruma": "^1.5.1", + "vscode-textmate": "^5.4.0" + }, + "bin": { + "vscode-tmgrammar-snap": "dist/src/snapshot.js", + "vscode-tmgrammar-test": "dist/src/unit.js" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/vscode-tmgrammar-test/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/vscode-tmgrammar-test/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/vscode-tmgrammar-test/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vscode-tmgrammar-test/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/winston": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", + "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/winston/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "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==", + "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/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==" + }, + "node_modules/wrap-ansi/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "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==", + "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/yargs-unparser/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/yargs-unparser/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/yargs-unparser/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/yargs/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==" + }, + "node_modules/yargs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "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": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true + }, + "@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true + }, + "@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@compodoc/live-server": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@compodoc/live-server/-/live-server-1.2.3.tgz", + "integrity": "sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "colors": "1.4.0", + "connect": "^3.7.0", + "cors": "latest", + "event-stream": "4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "4.1.9", + "http-auth-connect": "^1.0.5", + "morgan": "^1.10.0", + "object-assign": "latest", + "open": "8.4.0", + "proxy-middleware": "latest", + "send": "latest", + "serve-index": "^1.9.1" + } + }, + "@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" + } + } + } + }, + "@deboxsoft/cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@deboxsoft/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha512-4hkpKja/1jn+mxpGM3oczee2qXGGChunQYYnORIc7U+91XZPzSdXtvVr/yeH//rnM3Sl9QWzUjMKN9I+IqKu9g==", + "dev": true, + "requires": { + "co": "^4.6.0", + "debounce": "^1.1.0", + "debug": "^3.1.0", + "duplexer": "^0.1.1", + "fs-extra": "^6.0.1", + "glob": "^7.1.2", + "glob2base": "0.0.12", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "safe-buffer": "^5.1.2", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + } + } + }, + "@github/browserslist-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", + "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@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": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "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": { + "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" + } + }, + "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 + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@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==", + "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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@parcel/watcher": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.7.tgz", + "integrity": "sha512-gc3hoS6e+2XdIQ4HHljDB1l0Yx2EWh/sBBtCEFNKGSMlwASWeAQsOY/fPbxOBcZ/pg0jBh4Ga+4xHlZc4faAEQ==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true + }, + "@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "requires": { + "graceful-fs": "4.2.10" + } + }, + "@pnpm/npm-conf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.0.tgz", + "integrity": "sha512-roLI1ul/GwzwcfcVpZYPdrgW2W/drLriObl1h+yLF5syc8/5ULWw2ALbCHUWF+4YltIqA3xFSbG4IwyJz37e9g==", + "dev": true, + "requires": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + } + }, + "@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "@postman/tough-cookie": { + "version": "4.1.2-postman.2", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.2-postman.2.tgz", + "integrity": "sha512-nrBdX3jA5HzlxTrGI/I0g6pmUKic7xbGA4fAMLFgmJCA3DL2Ma+3MvmD+Sdiw9gLEzZJIF4fz33sT8raV/L/PQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "@postman/tunnel-agent": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", + "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "@rokucommunity/bslib": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rokucommunity/bslib/-/bslib-0.1.1.tgz", + "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" + }, + "@rokucommunity/logger": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@rokucommunity/logger/-/logger-0.3.3.tgz", + "integrity": "sha512-4nmLHHr6pzBoGE11idjjIfCuhXbuo6urqNLfymiqNg8BHtBVLL+PqjIXq3OFFzv2x37w64LoHK+nDk9EHrkxbw==", + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.0", + "safe-json-stringify": "^1.2.0", + "serialize-error": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "@suitest/types": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@suitest/types/-/types-4.6.0.tgz", + "integrity": "sha512-42NRmZNZ+D+ELcnbT4oRYnq5bAtsl1OhDTfuIp5x8uVh33GcipmbZLKDxBlwVTGCTbIH9xXRN9dS2o4gfzLoGw==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "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.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/backoff": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@types/backoff/-/backoff-2.5.2.tgz", + "integrity": "sha512-oa1YvggujhVppgeIct3LBkbCVXKh97fvOFIR6VlFLxRCeswk/KBRQKg7zoX832vlCP5bGLOFqC9hY7vsDeL9AA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "dev": true, + "requires": { + "chalk": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/fs-extra": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", + "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "@types/node-ssdp": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/node-ssdp/-/node-ssdp-3.3.1.tgz", + "integrity": "sha512-mn4ZOdKM/pgAKl7K50g97/2UnwLyQxuSweM4+1JUaUS7n2LnVHTFDJx8xk0NVyBXPYjWxhidCa5YC96k1XLcsA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/prompt": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/prompt/-/prompt-1.1.4.tgz", + "integrity": "sha512-FLMcf+ol+eUJALeIYWLjQl0hYw86G0PIg7D5+4jJHwr/wKI8p3R0u+oKLbyRkzCxb7e0pHixyCj7UgSv7I/TJQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/revalidator": "*" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "@types/revalidator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@types/revalidator/-/revalidator-0.3.8.tgz", + "integrity": "sha512-q6KSi3PklLGQ0CesZ/XuLwly4DXXlnJuucYOG9lrBqrP8rKiuPZThav2h2+pFjaheNpnT0qKK3i304QWIePeJw==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.6.tgz", + "integrity": "sha512-ldQl2p7kyCXHhr//5sQCu9jWgSiDbYuCD5dUp53r/z8T8jmgKpANpy4vqjbdho9P2ldFaQC/gpW31hch+oQ0IQ==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, + "@types/vscode": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@typescript-eslint/parser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", + "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "debug": "^4.3.4" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@typescript-eslint/types": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.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.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" + } + }, + "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 + } + } + }, + "@typescript-eslint/utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "@vscode/extension-telemetry": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.10.tgz", + "integrity": "sha512-XgyUoWWRQExTmd9DynIIUQo1NPex/zIeetdUAXeBjVuW9ioojM1TcDaSqOa/5QLC7lx+oEXwSU1r0XSBgzyz6w==" + }, + "@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "requires": { + "chevrotain": "7.1.1" + }, + "dependencies": { + "chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "requires": { + "regexp-to-ast": "0.5.0" + } + } + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "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-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apache-crypt": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.6.tgz", + "integrity": "sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==", + "dev": true, + "requires": { + "unix-crypt-td-js": "^1.1.4" + } + }, + "apache-md5": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", + "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", + "dev": true + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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" + } + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "array-flat-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", + "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + } + }, + "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 + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "dev": true + }, + "axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, + "azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "requires": { + "precond": "0.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "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==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "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==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brighterscript": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.65.0.tgz", + "integrity": "sha512-SnBYgL5f8kReqteJYT8TASYHu2XRc2gPxZfL2Q1JVeF9i5xeK4lJGAzjK3dinuiirYzHNIIoXpkzhTFIq7+DDg==", + "requires": { + "@rokucommunity/bslib": "^0.1.1", + "@xml-tools/parser": "^1.0.7", + "array-flat-polyfill": "^1.0.1", + "chalk": "^2.4.2", + "chevrotain": "^7.0.1", + "chokidar": "^3.5.1", + "clear": "^0.1.0", + "coveralls-next": "^4.2.0", + "cross-platform-clear-console": "^2.3.0", + "debounce-promise": "^3.1.0", + "eventemitter3": "^4.0.0", + "fast-glob": "^3.2.12", + "file-url": "^3.0.0", + "fs-extra": "^8.1.0", + "jsonc-parser": "^2.3.0", + "long": "^3.2.0", + "luxon": "^2.5.2", + "minimatch": "^3.0.4", + "moment": "^2.23.0", + "p-settle": "^2.1.0", + "parse-ms": "^2.1.0", + "readline": "^1.3.0", + "require-relative": "^0.8.7", + "roku-deploy": "^3.10.2", + "serialize-error": "^7.0.1", + "source-map": "^0.7.4", + "vscode-languageserver": "7.0.0", + "vscode-languageserver-protocol": "3.16.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^2.1.1", + "xml2js": "^0.5.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + } + } + }, + "brighterscript-formatter": { + "version": "1.6.29", + "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.6.29.tgz", + "integrity": "sha512-NfFscJM+9lEyaWrY5J9pliLOhNxiBkfsBKD8XmbigrbWpY4Ff6sqojw0Op2SFhySWy7N2e4J4inshx9FgKTI1A==", + "requires": { + "brighterscript": "^0.65.0", + "glob-all": "^3.3.0", + "jsonc-parser": "^3.0.0", + "source-map": "^0.7.3", + "yargs": "^17.2.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==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.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==" + }, + "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==" + }, + "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==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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==" + } + } + }, + "brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "requires": { - "@types/node": "*" + "base64-js": "^1.1.2" } }, - "@types/pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz", - "integrity": "sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=" - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "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 }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "@types/node": "*" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, - "@types/sass": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz", - "integrity": "sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "requires": { - "@types/node": "*" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "@types/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-WrIesso5O0K9S/T87Uct2AvmEFqul11PnprQ98BZEyWILz8QYJt6/tlmqSOVKLNUtAgYHU7D9WGsOFVDb35nPA==", + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.6.tgz", - "integrity": "sha512-ldQl2p7kyCXHhr//5sQCu9jWgSiDbYuCD5dUp53r/z8T8jmgKpANpy4vqjbdho9P2ldFaQC/gpW31hch+oQ0IQ==", + "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 }, - "@types/vscode": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.52.0.tgz", - "integrity": "sha512-Kt3bvWzAvvF/WH9YEcrCICDp0Z7aHhJGhLJ1BxeyNP6yRjonWqWnAIh35/pXAjswAnWOABrYlF7SwXR9+1nnLA==", - "dev": true + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==" }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true }, - "@xml-tools/parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", - "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, "requires": { - "chevrotain": "7.1.1" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "dependencies": { - "chevrotain": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", - "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "requires": { - "regexp-to-ast": "0.5.0" + "pump": "^3.0.0" } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true } } }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" } }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "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" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.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==", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "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==" + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, "requires": { - "color-convert": "^1.9.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "changelog-parser": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-2.8.1.tgz", + "integrity": "sha512-tNUYFRCEeWTXmwLqoNtOEzx9wcytg72MmGQqsEs14ClYwIDln7sbQw7FJj/dulXgSlsxkemc9gpPQhZYZx1TPw==", "dev": true, "requires": { - "default-require-extensions": "^3.0.0" + "line-reader": "^0.2.4", + "remove-markdown": "^0.2.2" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, - "array-flat-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", - "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "chevrotain": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz", + "integrity": "sha512-9bQsXVQ7UAvzMs7iUBBJ9Yv//exOy7bIR3PByOEk4M64vIE/LsiOiX7VIkMF/vEMlrSStwsaE884Bp9CpjtC5g==", + "requires": { + "regexp-to-ast": "0.5.0" + } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { - "safer-buffer": "~2.1.0" + "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" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "clear": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "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==" + }, + "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==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, - "azure-devops-node-api": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz", - "integrity": "sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A==", + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" + "mimic-response": "^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=" + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "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==", "requires": { - "tweetnacl": "^0.14.3" + "color-name": "~1.1.4" } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "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==" }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } + "delayed-stream": "~1.0.0" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "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==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, "requires": { - "fill-range": "^7.0.1" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "brighterscript": { - "version": "0.41.3", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.41.3.tgz", - "integrity": "sha512-ouqxbwBIRVRb5P64OOgcbOvbF4wSRxr0K+DVSdQKWM1KA3TmGD1k0wfYXZMwG3x5BQIkyudRMw9o1DQbZSaapA==", + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, "requires": { - "@rokucommunity/bslib": "^0.1.1", - "@xml-tools/parser": "^1.0.7", - "array-flat-polyfill": "^1.0.1", - "chalk": "^2.4.2", - "chevrotain": "^7.0.1", - "chokidar": "^3.5.1", - "clear": "^0.1.0", - "cross-platform-clear-console": "^2.3.0", - "debounce-promise": "^3.1.0", - "eventemitter3": "^4.0.0", - "file-url": "^3.0.0", - "fs-extra": "^7.0.1", - "glob": "^7.1.6", - "jsonc-parser": "^2.3.0", - "long": "^3.2.0", - "luxon": "^1.8.3", - "minimatch": "^3.0.4", - "moment": "^2.23.0", - "p-settle": "^2.1.0", - "parse-ms": "^2.1.0", - "roku-deploy": "^3.5.0", - "serialize-error": "^7.0.1", - "source-map": "^0.7.3", - "vscode-languageserver": "7.0.0", - "vscode-languageserver-protocol": "3.16.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^2.1.1", - "xml2js": "^0.4.19", - "yargs": "^16.2.0" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ms": "2.0.0" } }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, "requires": { - "type-fest": "^0.13.1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" } }, - "vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" - }, - "vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "requires": { - "vscode-languageserver-protocol": "3.16.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, "requires": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" + "ee-first": "1.1.1" } }, - "vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - }, - "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==" + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true } } }, - "brighterscript-formatter": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.6.3.tgz", - "integrity": "sha512-r7uWYg1fqvExqe+X/Dyw/12y9BBVUgFFNSgnQiO3LSolZmNZSW6fnoGDNNmO4/6/eC+z4y06GHFgKF0yTZlL9w==", + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "brighterscript": "^0.41.3", - "glob-all": "^3.2.1", - "jsonc-parser": "^3.0.0", - "source-map": "^0.7.3", - "yargs": "^17.2.1" + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "coveralls-next": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/coveralls-next/-/coveralls-next-4.2.0.tgz", + "integrity": "sha512-zg41a/4QDSASPtlV6gp+6owoU43U5CguxuPZR3nPZ26M5ZYdEK3MdUe7HwE+AnCZPkucudfhqqJZehCNkz2rYg==", + "requires": { + "form-data": "4.0.0", + "js-yaml": "4.1.0", + "lcov-parse": "1.0.0", + "log-driver": "1.2.7", + "minimist": "1.2.7" }, "dependencies": { - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "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" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "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" } } } }, - "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==", + "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 }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "cross-platform-clear-console": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz", + "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==" }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "dev": true }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "assert-plus": "^1.0.0" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, + "debounce-promise": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "ms": "^2.1.1" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "mimic-response": "^3.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "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 - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "changelog-parser": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-2.8.0.tgz", - "integrity": "sha512-ZtSwN0hY7t+WpvaXqqXz98RHCNhWX9HsvCRAv1aBLlqJ7BpKtqdM6Nu6JOiUhRAWR7Gov0aN0fUnmflTz0WgZg==", + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { - "line-reader": "^0.2.4", - "remove-markdown": "^0.2.2" + "type-detect": "^4.0.0" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "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 + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" + "kind-of": "^5.0.2" } }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "dependencies": { - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", - "dev": true - } + "strip-bom": "^4.0.0" } }, - "chevrotain": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz", - "integrity": "sha512-9bQsXVQ7UAvzMs7iUBBJ9Yv//exOy7bIR3PByOEk4M64vIE/LsiOiX7VIkMF/vEMlrSStwsaE884Bp9CpjtC5g==", + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "deferred": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", + "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", + "dev": true, "requires": { - "regexp-to-ast": "0.5.0" + "d": "^1.0.1", + "es5-ext": "^0.10.50", + "event-emitter": "^0.3.5", + "next-tick": "^1.0.0", + "timers-ext": "^0.1.7" } }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "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" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - } + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, - "ci-info": { + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true }, - "clear": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", - "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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 }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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": { - "color-name": "1.1.3" + "path-type": "^4.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "esutils": "^2.0.2" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "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=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, "requires": { - "safe-buffer": "5.1.2" + "domelementtype": "^2.3.0" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true }, - "coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", - "dev": true, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "create-require": { + "ee-first": { "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-platform-clear-console": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz", - "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "jake": "^10.8.5" + } + }, + "ejs-include-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz", + "integrity": "sha512-OTkvS8Dm8XhaE/+EKIjYjInRkNahQwkUUacAZXvA8Gqr5KEZrOsgFk8AkKYSnoTcdvKV0wnoG7YHWb4gkZFu8Q==", + "dev": true + }, + "ejs-lint": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ejs-lint/-/ejs-lint-1.2.2.tgz", + "integrity": "sha512-ESR/MePvJJJfkK3EUAYlPKe2JM2nRDc4uFkGgbB5Prr06nluN7JozNVFL3Ze7LV7xNY7JPWEi5H3i4hOl6mxXw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ejs": "3.1.7", + "ejs-include-regex": "^1.0.0", + "globby": "^11.0.0", + "read-input": "^0.3.1", + "slash": "^3.0.0", + "syntax-error": "^1.1.6", + "yargs": "^16.0.0" }, "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "ejs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, "requires": { - "isexe": "^2.0.0" + "jake": "^10.8.5" } } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + "emitter-component": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", + "integrity": "sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ==" }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, - "debounce-promise": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", - "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" + "empty-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empty-dir/-/empty-dir-2.0.0.tgz", + "integrity": "sha512-XAedXlNAQZxMmbllXY9cxuESlNVjZ8xd67bSIUZwbS7VoLyhlNehVN3Iy35yDTGFHKR1opBRgORkp3am0so+WQ==", + "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { - "ms": "2.0.0" + "once": "^1.4.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" } }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-compare": { + "es-shim-unscopables": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "requires": { - "kind-of": "^5.0.2" + "has": "^1.0.3" } }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "strip-bom": "^4.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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 }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "eslint": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "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.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 } } }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + } }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "eslint-plugin-escompat": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.3.4.tgz", + "integrity": "sha512-d/k6JwRzGRY6uZ426l6Ut6Eb2S/pi/079Ykj2GdWSzwm6WJHkdm28tECUWfLtpFA5ObApjPw6wR9bgY+uWAhag==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "browserslist": "^4.21.0" } }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" } }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + "eslint-plugin-github": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.6.0.tgz", + "integrity": "sha512-6VMH3wLUPEnV/0VuV3f0F74LF93N522Ht9KBYWDuPWKhr1NBzCqySIbQsxjPINIynoLtsErSc/YgICrocCc2zw==", + "dev": true, + "requires": { + "@github/browserslist-config": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint-config-prettier": ">=8.0.0", + "eslint-plugin-escompat": "^3.3.3", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-i18n-text": "^1.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-no-only-tests": "^3.0.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-rule-documentation": ">=1.0.0", + "jsx-ast-utils": "^3.3.2", + "prettier": "^2.2.1", + "svg-element-attributes": "^1.3.1" + }, + "dependencies": { + "eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true + } + } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "eslint-plugin-i18n-text": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", + "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", + "dev": true, + "requires": {} }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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==" + "eslint-plugin-no-only-tests": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", + "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", + "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "eslint-rule-documentation": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", + "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", "dev": true }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + "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-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } }, "esprima": { "version": "4.0.1", @@ -1677,74 +15101,168 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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 }, "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true } } }, @@ -1756,37 +15274,125 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "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==" }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "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 + }, "fast-xml-parser": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.17.4.tgz", - "integrity": "sha512-qudnQuyYBgnvzf5Lj/yxMcf4L9NcVWihXJg7CiU1L+oUCq8MUnFEfH2/nXR/W5uq+yvUN1h7z6s7vs2v1WkL1A==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", + "requires": { + "strnum": "^1.0.4" + } + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "requires": { "pend": "~1.2.0" } }, + "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" + } + }, "file-url": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==" }, + "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.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1796,31 +15402,46 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "find": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", - "integrity": "sha1-yGyHrxqxjyIrvjjeyGy8dg0Wpvs=", + "integrity": "sha512-jPrupTOe/pO//3a9Ty2o4NqQCp0L46UG+swUnfFtdmtQVN8pEltKpAqR7Nuf6vWn0GBXx5w+R1MyZzqwjEIqdA==", "requires": { "traverse-chain": "~0.1.0" } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -1840,15 +15461,16 @@ "find-index": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", "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==", + "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": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -1858,10 +15480,26 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "foreground-child": { "version": "2.0.0", @@ -1876,18 +15514,24 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, + "form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1896,12 +15540,33 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true }, "fromentries": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", - "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, "fs-extra": { @@ -1917,25 +15582,41 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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": { @@ -1946,18 +15627,17 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -1971,68 +15651,66 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==" }, - "get-stack-trace": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/get-stack-trace/-/get-stack-trace-2.1.1.tgz", - "integrity": "sha512-dhqSDD9lHU/6FvIZ9KbXGmVK6IKr9ZskZtNOUvhlCiONlnqatu4FmAeRbxCfJJVuQ0NWfz6dAbibKQg19B7AmQ==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { - "bluebird": "^3.7.1", - "source-map": "^0.8.0-beta.0" - }, - "dependencies": { - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "requires": { - "whatwg-url": "^7.0.0" - } - } + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-all": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz", - "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.3.1.tgz", + "integrity": "sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q==", "requires": { - "glob": "^7.1.2", + "glob": "^7.2.3", "yargs": "^15.3.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2043,18 +15721,58 @@ "wrap-ansi": "^6.2.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==", + "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==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "color-name": "~1.1.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "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==" + "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==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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==", + "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==", + "requires": { + "p-limit": "^2.2.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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } }, "wrap-ansi": { "version": "6.2.0", @@ -2111,22 +15829,84 @@ "glob2base": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", "dev": true, "requires": { "find-index": "^0.1.1" } }, "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 + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "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" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + } + } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true }, "growl": { "version": "1.10.5", @@ -2134,10 +15914,16 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", @@ -2152,26 +15938,48 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } }, "hasha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "requires": { "is-stream": "^2.0.0", @@ -2192,15 +16000,15 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" + "hex-rgb": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-5.0.0.tgz", + "integrity": "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w==" }, "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -2213,34 +16021,51 @@ "dev": true }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, + "http-auth": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-4.1.9.tgz", + "integrity": "sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ==", + "dev": true, + "requires": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.4.3", + "uuid": "^8.3.2" + } + }, + "http-auth-connect": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.6.tgz", + "integrity": "sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-network-proxy": { @@ -2279,6 +16104,11 @@ "universalify": "^2.0.0" } }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -2286,6 +16116,12 @@ } } }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -2306,32 +16142,16 @@ "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" - }, - "dependencies": { - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" } }, "iconv-lite": { @@ -2342,21 +16162,37 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "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": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { @@ -2368,7 +16204,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -2379,16 +16215,42 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2397,6 +16259,22 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -2406,28 +16284,53 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "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==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -2435,30 +16338,73 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { - "@types/estree": "*" + "call-bind": "^1.0.2" } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-unicode-supported": { "version": "0.1.0", @@ -2466,32 +16412,50 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -2524,18 +16488,17 @@ } }, "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "uuid": "^8.3.2" } }, "istanbul-lib-report": { @@ -2547,29 +16510,12 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "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", @@ -2578,12 +16524,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -2601,43 +16547,41 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "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==", + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "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" - } } } }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2645,9 +16589,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "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", @@ -2657,7 +16601,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsesc": { "version": "2.5.2", @@ -2665,10 +16609,16 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -2676,27 +16626,30 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", "dev": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "^0.0.1" } }, + "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 + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "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.3.1", @@ -2706,55 +16659,109 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } }, "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" } }, "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" + "setimmediate": "^1.0.5" } }, "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "just-throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-throttle/-/just-throttle-4.1.1.tgz", + "integrity": "sha512-OK1iESPWjZZnKRYpMsaFb0TSAv74OtbB8CiCRA1tNub1/R0S47n7edXsQ64GtpfIuiGVwSjPNLwkePl4owlDug==" + }, + "keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "requires": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + }, + "dependencies": { + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + } + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", - "dev": true + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==" }, "leven": { "version": "3.1.0", @@ -2762,6 +16769,16 @@ "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" + } + }, "lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -2773,24 +16790,25 @@ "line-reader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.2.4.tgz", - "integrity": "sha1-xDkrWH3qOFgMlnhXDm6OSfzlJiI=", + "integrity": "sha512-342xzyZZS9uTiKwHJcMacopVl/WjrMMCZS1Qg4Uhl/WBknWRrGFdKOIS1Kec6SaiTcZMtmuxWvvIbPXj/+FMjA==", "dev": true }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -2798,22 +16816,46 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "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 + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, "log-symbols": { "version": "4.1.0", @@ -2834,7 +16876,22 @@ "long": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lru-cache": { "version": "6.0.0", @@ -2845,18 +16902,9 @@ } }, "luxon": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", - "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==" }, "make-dir": { "version": "3.1.0", @@ -2881,83 +16929,78 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true } } }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "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==" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "dependencies": { - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -2966,71 +17009,84 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, - "min-indent": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -3043,9 +17099,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -3059,32 +17115,10 @@ } } }, - "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 - }, - "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 - }, - "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" - } - }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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", @@ -3093,14 +17127,19 @@ "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "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" + } + } } }, - "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 - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3110,80 +17149,74 @@ "argparse": "^2.0.1" } }, - "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==", + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "requires": { - "p-locate": "^5.0.0" + "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==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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": { - "yocto-queue": "^0.1.0" + "has-flag": "^4.0.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==", + } + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "p-limit": "^3.0.2" + "ms": "2.0.0" } }, - "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" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "ee-first": "1.1.1" } } } }, - "mocha-param": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mocha-param/-/mocha-param-2.0.1.tgz", - "integrity": "sha512-TDrDAChx9XtkGmRKWGOzMoQefwHsfYUxyjNWgkfAze+EFRIRT28yJVcpcNhw9iWg2NvfeMQZnSwWCNMYwPxZew==", - "dev": true - }, - "mock-fs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==", - "dev": true - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "mute-stream": { "version": "0.0.8", @@ -3192,9 +17225,27 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "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 }, "natural-orderby": { @@ -3203,39 +17254,30 @@ "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==" }, "needle": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", - "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" - }, - "dependencies": { - "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" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "net": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true }, "nise": { "version": "1.5.3", @@ -3250,6 +17292,12 @@ "path-to-regexp": "^1.7.0" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "lolex": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", @@ -3258,9 +17306,33 @@ "requires": { "@sinonjs/commons": "^1.7.0" } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } } } }, + "node-abi": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz", + "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, "node-cache": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", @@ -3271,36 +17343,32 @@ } }, "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dev": true, "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } + } + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true + }, + "node-notifier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", + "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.5", + "shellwords": "^0.1.1", + "uuid": "^8.3.2", + "which": "^2.0.2" } }, "node-preload": { @@ -3312,31 +17380,22 @@ "process-on-spawn": "^1.0.0" } }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, "node-ssdp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-4.0.0.tgz", - "integrity": "sha512-JQoNKfRYj/MvOFvE5de/SRJEhkLIHx2MVyiYi46rEGWkH+LuFZhSHvWP7JaFiVs+C+GOdl3c1qC9yDs8lSV4Fg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-4.0.1.tgz", + "integrity": "sha512-uJXkLZVuyaMg1qNbMbGQ6YzNzyOD+NLxYyxIJocPTKTVECPDokOiCZA686jTLXHMUnV34uY/lcUSJ+/5fhY43A==", "requires": { "async": "^2.6.0", "bluebird": "^3.5.1", "debug": "^3.1.0", "extend": "^3.0.1", "ip": "^1.1.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "normalize-path": { @@ -3344,10 +17403,16 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -3388,41 +17453,83 @@ "yargs": "^15.0.2" }, "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" - } - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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 + }, + "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" + } + }, + "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 + }, + "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" } }, - "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==", + "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": { - "color-name": "~1.1.4" + "p-limit": "^2.2.0" } }, - "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==", + "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 }, + "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" + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -3476,175 +17583,160 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" } }, "ovsx": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-0.2.0.tgz", - "integrity": "sha512-V34++29aa2HRU/5rbOMTyGDhX7XPBZDxLLjlr5cE7KKPQ/cD6OFwxD/U6HERQnz4W34sQnJlFGjJT86tgYxsYw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-0.5.2.tgz", + "integrity": "sha512-UbLultRCk46WddeA0Cly4hoRhzBJUiLgbIEViXlgOvV54LbsppClDkMLoCevUUBHoiNdMX2NuiSgURAEXgCZdw==", "dev": true, "requires": { "commander": "^6.1.0", - "follow-redirects": "^1.13.2", + "follow-redirects": "^1.14.6", "is-ci": "^2.0.0", "leven": "^3.1.0", "tmp": "^0.2.1", - "vsce": "~1.93.0" - }, - "dependencies": { - "azure-devops-node-api": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", - "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", - "dev": true, - "requires": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "vsce": { - "version": "1.93.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.93.0.tgz", - "integrity": "sha512-RgmxwybXenP6tTF0PLh97b/RRLp1RkzjAHNya3QAfv1EZVg+lfoBiAaXogpmOGjYr8OskkqP5tIa3D/Q6X9lrw==", - "dev": true, - "requires": { - "azure-devops-node-api": "^10.2.2", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "ignore": "^5.1.8", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "mime": "^1.3.4", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - } - } - } - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "requires": { - "p-timeout": "^3.1.0" + "vsce": "^2.6.3" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.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==", + "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": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "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==" - } + "p-limit": "^3.0.2" } }, "p-map": { @@ -3659,7 +17751,7 @@ "p-reflect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz", - "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=" + "integrity": "sha512-rlngKS+EX3nvI7xIzA0xKNVEAguWdIqAZVbn02z1m73ehXBdX66aTdD0bCvIu0cDwbU3TK9w3RYrppKpO3EnKQ==" }, "p-settle": { "version": "2.1.0", @@ -3668,20 +17760,27 @@ "requires": { "p-limit": "^1.2.0", "p-reflect": "^1.0.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + } } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-hash": { "version": "4.0.0", @@ -3695,11 +17794,40 @@ "release-zalgo": "^1.0.0" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "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-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -3708,7 +17836,7 @@ "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", "dev": true, "requires": { "semver": "^5.1.0" @@ -3723,18 +17851,22 @@ } }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } }, "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dev": true, "requires": { - "parse5": "^6.0.1" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" } }, "parseurl": { @@ -3745,7 +17877,7 @@ "path": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", "requires": { "process": "^0.11.1", "util": "^0.10.3" @@ -3759,7 +17891,7 @@ "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=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -3774,43 +17906,52 @@ "dev": true }, "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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 }, "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", @@ -3819,37 +17960,160 @@ "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" + } + } } }, "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + } + }, + "postman-request": { + "version": "2.88.1-postman.32", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.32.tgz", + "integrity": "sha512-Zf5D0b2G/UmnmjRwQKhYy4TBkuahwD0AMNyWwFK3atxU1u5GS38gdd7aw3vyR6E7Ii+gD//hREpflj2dmpbE7w==", "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.2-postman.1", + "@postman/tunnel-agent": "^0.6.3", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "brotli": "^1.3.3", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "requires": { - "ms": "^2.1.1" + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } } } }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==" + }, + "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 + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true + }, + "prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } }, "pretty-bytes": { "version": "5.6.0", @@ -3859,7 +18123,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "process-nextick-args": { "version": "2.0.1", @@ -3872,9 +18136,36 @@ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { - "fromentries": "^1.2.0" + "fromentries": "^1.2.0" + } + }, + "prompt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", + "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "async": "3.2.3", + "read": "1.0.x", + "revalidator": "0.1.x", + "winston": "2.x" + }, + "dependencies": { + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + } } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3884,10 +18175,26 @@ "ipaddr.js": "1.9.1" } }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", + "dev": true + }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "punycode": { "version": "2.1.1", @@ -3897,12 +18204,28 @@ "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true }, "randombytes": { "version": "2.1.0", @@ -3919,25 +18242,51 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + } + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" } }, + "read-input": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/read-input/-/read-input-0.3.1.tgz", + "integrity": "sha512-J1ZkWCnB4altU7RTe+62PSfa21FrEtfKyO9fuqR3yP8kZku3nIwaw2Krj383JC7egAIl5Zyz2w+EOu9uXH5HZw==", + "dev": true + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -3950,6 +18299,13 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "readdirp": { @@ -3960,15 +18316,61 @@ "picomatch": "^2.2.1" } }, + "readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, "regexp-to-ast": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "requires": { "es6-error": "^4.0.1" @@ -3977,103 +18379,67 @@ "remove-markdown": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.2.2.tgz", - "integrity": "sha1-ZrDO66n7d8qWNrsbAwfOIaMqEqY=", + "integrity": "sha512-jwgEf3Yh/xi4WodWi/vPlasa9C9pMv1kz5ITOIAGjBW7PeZ/CHZCdBfJzQnn2VX2cBvf1xCuJv0tUJqn/FCMNA==", "dev": true }, "replace-in-file": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-4.3.1.tgz", - "integrity": "sha512-FqVvfmpqGTD2JRGI1JjJ86b24P17x/WWwGdxExeyJxnh/2rVQz2+jXfD1507UnnhEQw092X0u0DPCBf1WC4ooQ==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", + "integrity": "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==", "requires": { - "chalk": "^2.4.2", - "glob": "^7.1.6", - "yargs": "^15.0.2" + "chalk": "^4.1.2", + "glob": "^7.2.0", + "yargs": "^17.2.1" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "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==", "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.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==", - "requires": { - "color-name": "~1.1.4" - } + "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==" }, - "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==" + "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==" }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "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==", "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==", - "requires": { - "color-convert": "^2.0.1" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" } } }, @@ -4082,37 +18448,10 @@ "resolved": "https://registry.npmjs.org/replace-last/-/replace-last-1.2.6.tgz", "integrity": "sha512-Cj+MK38VtNu1S5J73mEZY3ciQb9dJajNq1Q8inP4dn/MhJMjHwoAF3Z3FjspwAEV9pfABl565MQucmrjOkty4g==" }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-main-filename": { "version": "2.0.0", @@ -4122,27 +18461,64 @@ "require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==" }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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 + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", "dev": true }, "rimraf": { @@ -4154,92 +18530,45 @@ } }, "roku-debug": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/roku-debug/-/roku-debug-0.8.5.tgz", - "integrity": "sha512-+ovmQ19sltDfWu26cleLq3RLzs0RYeI8mmmJLyA+tlJWwsuClnEjhsJex1XzhhJ3kd7ONCKu+qkeYUd0Sb75Zg==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/roku-debug/-/roku-debug-0.19.1.tgz", + "integrity": "sha512-Y67K2k6o0QeOq7BH2MWInj7DegSk2azHTdkcuihpBgLNlGLKvXWTJdA4bnpytzM61Oj0izFWewdeA5r3VBOAeA==", "requires": { - "brighterscript": "^0.41.2", - "dateformat": "^4.6.3", + "@rokucommunity/logger": "^0.3.3", + "@types/request": "^2.48.8", + "brighterscript": "^0.65.0", + "dateformat": "~4", "eol": "^0.9.1", + "eventemitter3": "^4.0.7", + "fast-glob": "^3.2.11", "find-in-files": "^0.5.0", "fs-extra": "^10.0.0", "natural-orderby": "^2.0.3", + "postman-request": "^2.88.1-postman.32", "replace-in-file": "^6.3.2", "replace-last": "^1.2.6", - "roku-deploy": "^3.5.0", + "roku-deploy": "^3.10.2", "semver": "^7.3.5", "serialize-error": "^8.1.0", "smart-buffer": "^4.2.0", - "source-map": "^0.7.3", + "source-map": "^0.7.4", "telnet-client": "^1.4.9", "vscode-debugadapter": "^1.49.0", "vscode-debugprotocol": "^1.49.0", - "vscode-languageserver": "^6.1.1" + "vscode-languageserver": "^6.1.1", + "xml2js": "^0.5.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==", - "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==", - "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==", - "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==" - }, - "dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" - }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -4249,29 +18578,6 @@ "universalify": "^2.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "replace-in-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.2.tgz", - "integrity": "sha512-Dbt5pXKvFVPL3WAaEB3ZX+95yP0CeAtIPJDwYzHbPP5EAHn+0UoegH/Wg3HKflU9dYBH8UnBC2NvY3P+9EZtTg==", - "requires": { - "chalk": "^4.1.2", - "glob": "^7.2.0", - "yargs": "^17.2.1" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, "serialize-error": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", @@ -4280,38 +18586,11 @@ "type-fest": "^0.20.2" } }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "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==" - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "vscode-debugadapter": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.50.0.tgz", - "integrity": "sha512-KHtwd6uHOqB1C2/1hpKQcD4JY/88QXkieubzKQfT1PTLztnoM53Pz+pTNgH+VXrGDI50BzjLV6YOluPTufUaMQ==", - "requires": { - "mkdirp": "^1.0.4", - "vscode-debugprotocol": "1.50.1" - } - }, - "vscode-debugprotocol": { - "version": "1.50.1", - "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.50.1.tgz", - "integrity": "sha512-kIHIipklHnSjBm2KkRqTJLKL2FMZlJl0+/qpJt2y62YOamMNwcxNATnXXRgAwnzKKRMweqp93tJ83UTJ8+O7SQ==" - }, "vscode-languageserver": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", @@ -4319,132 +18598,129 @@ "requires": { "vscode-languageserver-protocol": "^3.15.3" } - }, - "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "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" - } } } }, "roku-deploy": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.5.0.tgz", - "integrity": "sha512-F8Y+0g+xkXr54I0i/GKwLrUxXD3FgSPbxcQmGOQ0oSM7w3lY0BacdncDtuL3FUw8VkRWa1jiHtGHc77oSy5jaw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.10.2.tgz", + "integrity": "sha512-oKMw8+CpbvFrNjf3g7PmhSRInTXitaFmtFhxb0ANiE+sC2p+/8wn/1/KqnYsTWPdEKUOLh0xIz2FHK9Nd5o9UA==", "requires": { "chalk": "^2.4.2", "dateformat": "^3.0.3", + "dayjs": "^1.11.0", + "fast-glob": "^3.2.12", "fs-extra": "^7.0.1", - "glob": "^7.1.6", + "is-glob": "^4.0.3", "jsonc-parser": "^2.3.0", "jszip": "^3.6.0", - "minimatch": "^3.0.4", + "micromatch": "^4.0.4", "moment": "^2.29.1", "parse-ms": "^2.1.0", - "path": "^0.12.7", - "request": "^2.88.0", - "xml2js": "^0.4.23" + "postman-request": "^2.88.1-postman.32", + "temp-dir": "^2.0.0", + "xml2js": "^0.5.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" } } } }, "roku-test-automation": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/roku-test-automation/-/roku-test-automation-1.1.2.tgz", - "integrity": "sha512-0wKRGC6JoIqRE9WOawNALs+BtQZ4GsS8k8mEUVy7BswhXm6o0v457n2Z5mgaSjsSLmPi1++f6QAk88qCMP8s4Q==", + "version": "2.0.0-beta.20", + "resolved": "https://registry.npmjs.org/roku-test-automation/-/roku-test-automation-2.0.0-beta.20.tgz", + "integrity": "sha512-k0LFT4D010aunJvXmNEr09TM2QcRt9fpAQrUxIICWuK5NKX1cVizy++Z3HzWVMoVyMvJv2MOLy7OE/umf4ZAHg==", "requires": { - "ajv": "^6.12.2", - "express": "^4.17.1", + "@suitest/types": "^4.6.0", + "ajv": "^6.12.6", "fs-extra": "^7.0.1", - "get-stack-trace": "^2.0.3", "http-network-proxy": "^1.0.11", - "needle": "^2.3.2", + "needle": "^2.9.1", "path": "^0.12.7", - "portfinder": "^1.0.26", - "roku-deploy": "^3.1.1" - } - }, - "rollup": { - "version": "2.35.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.35.1.tgz", - "integrity": "sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" + "roku-deploy": "^3.9.2" } }, - "rollup-plugin-css-only": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.0.0.tgz", - "integrity": "sha512-v6ZZuApxXl/Z07jAmH+p5HsLPMW2BHIRJ4Tpxv22S+jpINZ1QFxWoeMDMyFDd+XM1jFcQeshkjuD8xUVOJJG7Q==", - "dev": true, + "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==", "requires": { - "@rollup/pluginutils": "3 || 4" + "queue-microtask": "^1.2.2" } }, - "rollup-plugin-svelte": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.0.0.tgz", - "integrity": "sha512-cw4yv/5v1NQV3nPbpOJtikgkB+9mfSJaqKUdq7x5fVQJnwLtcdc2JOszBs5pBY+SemTs5pmJbdEMseEavbUtjQ==", - "dev": true, - "requires": { - "require-relative": "^0.8.7", - "rollup-pluginutils": "^2.8.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==" }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - } + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==" }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4456,86 +18732,167 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "requires": { + "lru-cache": "^6.0.0" + } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } } } }, "serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "requires": { - "type-fest": "^0.8.0" + "type-fest": "^0.13.1" }, "dependencies": { "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" } } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "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" } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -4553,16 +18910,21 @@ "dev": true }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -4570,11 +18932,28 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "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 + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "sinon": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", @@ -4588,22 +18967,51 @@ "lolex": "^4.2.0", "nise": "^1.5.2", "supports-color": "^5.5.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4615,71 +19023,332 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true + }, + "statigen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/statigen/-/statigen-0.5.0.tgz", + "integrity": "sha512-W9qp6ZDtHZzlQ3OhbQ+UWMNEh5s7p5RQ7YKl+MPUj7gjHRzrTjlc6/Qp+f1YiWusgGdW/Dt02Q0lDHfNMCG22g==", + "dev": true, + "requires": { + "@compodoc/live-server": "^1.2.3", + "@parcel/watcher": "^2.0.5", + "chalk": "^4.1.2", + "chokidar": "^3.5.1", + "debounce": "^1.2.1", + "ejs": "^3.1.8", + "ejs-lint": "^1.2.2", + "empty-dir": "^2.0.0", + "fast-glob": "^3.2.11", + "front-matter": "^4.0.2", + "fs-extra": "^10.0.1", + "latest-version": "^7.0.0", + "marked": "^4.0.12", + "moment": "^2.29.2", + "yargs": "^17.4.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz", + "integrity": "sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "cacheable-request": { + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.10.tgz", + "integrity": "sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + } + }, + "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" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "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 + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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 + }, + "got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + } + }, + "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 + }, + "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 + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "requires": { + "package-json": "^8.1.0" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true + }, + "normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, + "requires": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + } + }, + "registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "requires": { + "@pnpm/npm-conf": "^2.1.0" + } + }, + "registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "requires": { + "lowercase-keys": "^3.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" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "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": { - "isexe": "^2.0.0" + "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 } } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", + "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "emitter-component": "^1.1.1" } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, "stream-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz", - "integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=", + "integrity": "sha512-1yWdVsMEm/btiMa2YyHiC3mDrtAqlmNNaDRylx2F7KHhm3C4tA6kSR2V9mpeMthv+ujvbl8Kamyh5xaHHdFvyQ==", "requires": { "readable-stream": "~2.1.0" }, @@ -4687,12 +19356,12 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" }, "readable-stream": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "integrity": "sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw==", "requires": { "buffer-shims": "^1.0.0", "core-util-is": "~1.0.0", @@ -4706,18 +19375,33 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" } } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "requires": { + "bluebird": "^2.6.2" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==" + } } }, "string_decoder": { @@ -4726,14 +19410,70 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -4742,70 +19482,116 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, "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 }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", "dev": true, "requires": { "minimist": "^1.1.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" + "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 + }, + "svg-element-attributes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", + "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", + "dev": true + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" } }, - "svelte": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.37.0.tgz", - "integrity": "sha512-TRF30F4W4+d+Jr2KzUUL1j8Mrpns/WM/WacxYlo5MMb2E5Qy2Pk1Guj6GylxsW9OnKQl1tnF8q3hG/hQ3h6VUA==" + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } }, - "svelte-preprocess": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.7.0.tgz", - "integrity": "sha512-iNrY4YGqi0LD2e6oT9YbdSzOKntxk8gmzfqso1z/lUJOZh4o6fyIqkirmiZ8/dDJFqtIE1spVgDFWgkfhLEYlw==", + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, "requires": { - "@types/pug": "^2.0.4", - "@types/sass": "^1.16.0", - "detect-indent": "^6.0.0", - "strip-indent": "^3.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "telnet-client": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.4.9.tgz", - "integrity": "sha512-ryF0E3mg6am1EnCQZj7OoBnueS3l8IT7lDyDyFR8FdIshRRKBpbKjX7AUnt1ImVd43WKl/AxYE5MTkX3LjhGaQ==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.4.11.tgz", + "integrity": "sha512-m15pRh7F74ZzWmqjUtOg3SYp8iSnH7xY1lD9hWk8icjuLRSItABPk1vRJFwSM7op6TgZuEXOWOSbiK9nknloSw==", "requires": { - "bluebird": "^3.5.4" + "bluebird": "^3.5.4", + "net": "^1.0.2", + "stream": "^0.0.2" } }, - "terser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", - "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "terminal-overwrite": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/terminal-overwrite/-/terminal-overwrite-2.0.1.tgz", + "integrity": "sha512-CP8KtcHQjSlKtaXIZTJt4I4II8oEdXyGJtx54gXVVys9plYIaK4ahiXPD6XxZ2efrqayH1B7uR/5Wr7N2cTgFA==", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "cli-cursor": "^2.0.0", + "string-width": "^2.0.0" } }, "test-exclude": { @@ -4819,6 +19605,33 @@ "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 + }, + "thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -4831,7 +19644,13 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, "to-regex-range": { @@ -4843,209 +19662,95 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "traverse-chain": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=" - }, - "ts-mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-7.0.0.tgz", - "integrity": "sha512-7WfkQw1W6JZXG5m4E1w2e945uWzBoZqmnOHvpMu0v+zvyKLdUQeTtRMfcQsVEKsUnYL6nTyH4okRt2PZucmFXQ==", - "dev": true, - "requires": { - "ts-node": "7.0.1", - "tsconfig-paths": "^3.5.0" - }, - "dependencies": { - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - } - } - } + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==" }, "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "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", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "optional": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "optional": true - } - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "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 - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "dependencies": { - "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.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { - "tslib": "^1.8.1" + "minimist": "^1.2.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true } } }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "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" @@ -5068,7 +19773,8 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -5076,7 +19782,22 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "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", @@ -5085,9 +19806,9 @@ "dev": true }, "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" + "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==" }, "type-is": { "version": "1.6.18", @@ -5099,9 +19820,9 @@ } }, "typed-rest-client": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", - "integrity": "sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", "dev": true, "requires": { "qs": "^6.9.1", @@ -5110,9 +19831,9 @@ }, "dependencies": { "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -5130,9 +19851,10 @@ } }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true }, "typescript-json-schema": { "version": "0.50.1", @@ -5150,9 +19872,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", - "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==", + "version": "14.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", + "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", "dev": true }, "diff": { @@ -5180,12 +19902,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true } } }, @@ -5195,10 +19911,28 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undent": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/undent/-/undent-0.1.0.tgz", + "integrity": "sha512-vohX7ywgBjRxDNw+f3wHclSXmO0z9HsEfmGObOuG7G0yi7kZ6OtCG8kAxtDSNklmua5KR6ev2drTFqMGqpYEbg==", + "dev": true + }, "underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "universalify": { @@ -5206,25 +19940,59 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -5236,70 +20004,90 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" } } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "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 }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + } } }, "vsce": { - "version": "1.100.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.100.1.tgz", - "integrity": "sha512-1VjLyse5g6e2eQ6jUpslu7IDq44velwF8Jy8s7ePdwGNuG8EzfmaOfVyig3ZSMJ0l8DiJmZllx5bRAB4RMdnHg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", "commander": "^6.1.0", - "denodeify": "^1.2.1", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", + "markdown-it": "^12.3.2", "mime": "^1.3.4", "minimatch": "^3.0.3", - "osenv": "^0.1.3", "parse-semver": "^1.1.1", "read": "^1.0.7", "semver": "^5.1.0", "tmp": "^0.2.1", "typed-rest-client": "^1.8.4", - "url-join": "^1.1.0", + "url-join": "^4.0.1", "xml2js": "^0.4.23", "yauzl": "^2.3.1", "yazl": "^2.2.2" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5311,10 +20099,31 @@ "supports-color": "^5.3.0" } }, - "commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "semver": { @@ -5322,36 +20131,53 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, "vscode-debugadapter": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.33.0.tgz", - "integrity": "sha512-GsSD6PyVokjyW+7LU3FRXbu8SINv9muQtMQEDvwB6SIGQfrQzld8kECpQRr71j3mgXW+sTY+44/XMzueeaU6/Q==", - "requires": { - "mkdirp": "^0.5.1", - "vscode-debugprotocol": "1.33.0" - } - }, - "vscode-debugadapter-testsupport": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.33.0.tgz", - "integrity": "sha512-HusC7JpYQyVGzV08hYgjv+9Cm0v+6/ZbXxAlQLMFXjQNZgbFCrk2kTflurxrQCt+beb05cjin9RbSFWWaYH8PQ==", - "dev": true, + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", + "integrity": "sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==", "requires": { - "vscode-debugprotocol": "1.33.0" + "mkdirp": "^1.0.4", + "vscode-debugprotocol": "1.51.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } } }, "vscode-debugprotocol": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.33.0.tgz", - "integrity": "sha512-d+l4lrEz6OP2kmGpweqe37x9H7icAMV8S4m8azTWGAIlNJxBP4rlSTnZa7NMLcbgqWkWG9lTGY7fJ+rSPaW7yg==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz", + "integrity": "sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==" }, "vscode-jsonrpc": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz", - "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" }, "vscode-languageclient": { "version": "7.0.0", @@ -5361,64 +20187,130 @@ "minimatch": "^3.0.4", "semver": "^7.3.4", "vscode-languageserver-protocol": "3.16.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" - }, - "vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "requires": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - } } }, "vscode-languageserver": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.4.2.tgz", - "integrity": "sha512-61y8Raevi9EigDgg9NelvT9cUAohiEbUl1LOwQQgOCAaNX62yKny/ddi0uC+FUTm4CzsjhBu+06R+vYgfCYReA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", "requires": { - "vscode-languageserver-protocol": "^3.10.3", - "vscode-uri": "^1.0.5" + "vscode-languageserver-protocol": "3.16.0" } }, "vscode-languageserver-protocol": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz", - "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", "requires": { - "vscode-jsonrpc": "^5.0.1", - "vscode-languageserver-types": "3.15.1" + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" } }, "vscode-languageserver-textdocument": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.2.tgz", - "integrity": "sha512-T7uPC18+f8mYE4lbVZwb3OSmvwTZm3cuFhrdx9Bn2l11lmp3SvSuSVjy2JtvrghzjAo4G6Trqny2m9XGnFnWVA==" + "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.15.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", - "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.5.0.tgz", + "integrity": "sha512-jToQkPGMNKn0eyKyitYeINJF0NoD240aYyKPIWJv5W2jfPt++jIRg0OSergubtGhbw6SoefkvBYEpX7TsfoSUQ==", + "dev": true + }, + "vscode-tmgrammar-test": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/vscode-tmgrammar-test/-/vscode-tmgrammar-test-0.0.11.tgz", + "integrity": "sha512-Bd60x/OeBLAQnIxiR2GhUic1CQZOFfWM8Pd43HjdEUBf/0vcvYAlFQikOXvv+zkItHLznjKaDX7VWKPVYUF9ug==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^2.20.3", + "diff": "^4.0.2", + "glob": "^7.1.6", + "vscode-oniguruma": "^1.5.1", + "vscode-textmate": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "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 + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "vscode-uri": { "version": "1.0.8", @@ -5426,18 +20318,36 @@ "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which": { @@ -5449,15 +20359,50 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "winston": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", + "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true + } + } }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "wrap-ansi": { @@ -5470,33 +20415,32 @@ "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==", - "requires": { - "color-convert": "^2.0.1" - } + "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==" }, - "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==", + "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==" + }, + "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==", "requires": { - "color-name": "~1.1.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } - }, - "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==" } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "3.0.3", @@ -5511,9 +20455,9 @@ } }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -5524,6 +20468,12 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5546,6 +20496,28 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "dependencies": { + "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==" + }, + "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==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "yargs-parser": { @@ -5566,9 +20538,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "decamelize": { @@ -5588,7 +20560,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "requires": { "buffer-crc32": "~0.2.3", @@ -5605,9 +20577,9 @@ } }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { diff --git a/package.json b/package.json index 02155c4a..e9fc9036 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,20 @@ { "name": "brightscript", "displayName": "BrightScript Language", - "version": "2.23.1", + "version": "2.40.4", "publisher": "RokuCommunity", "description": "Language support for Roku's BrightScript language.", "author": { "name": "Bronley Plumb", "email": "bronley@gmail.com" }, - "icon": "images/icon.png", + "icon": "images/logo.png", "license": "MIT", "keywords": [ "multi-root-ready" ], "engines": { - "vscode": "^1.52.0", + "vscode": "^1.57.0", "node": "^12.12.0" }, "repository": { @@ -25,14 +25,18 @@ "url": "https://github.com/RokuCommunity/vscode-brightscript-language/issues" }, "scripts": { - "preversion": "npm run build && npm run lint && npm run test && npm run check-extraneous && node scripts/preversion.js", + "postinstall": "cd webviews && npm install", + "preversion": "npm run build && npm run lint && npm run test && npm run check-extraneous", "vscode:prepublish": "npm run build", "copy-schema": "cpx ./node_modules/brighterscript/bsconfig.schema.json ./dist -L", - "build": "npm run copy-schema && tsc -p ./ && npm run svelte-build", - "lint": "tslint \"./src/**/*.ts\"", + "build": "npm run copy-schema && tsc -p ./ && npm run build-webviews", + "build-webviews": "cd ./webviews && npm run build && cd ..", + "lint": "eslint \"./src/**/*.ts\"", "watch": "npm run copy-schema && tsc -w -p ./", - "test": "nyc mocha \"src/**/*.spec.ts\" \"ui/**/*.spec.ts\" --full-trace --bail", - "test:nocover": "ts-mocha \"src/**/*.spec.ts\" \"ui/**/*.spec.ts\" --full-trace", + "watch-webviews": "cd ./webviews && npm run watch", + "watch-all": "ts-node ./scripts/watch-all.ts", + "test": "nyc mocha", + "test:nocover": "mocha", "publish-coverage": "nyc report --reporter=text-lcov | coveralls", "check-extraneous": "npm list --production --parseable --depth=99999", "package": "vsce package", @@ -42,107 +46,106 @@ "install-local": "node scripts/install-local.js", "install-pull-local": "node scripts/install-local.js --pull", "uninstall-local": "node scripts/uninstall-local.js", - "validate": "svelte-check", - "svelte-build": "rollup -c", - "svelte-watch": "rollup -c -w", + "build-docs": "statigen -s docs -o .tmp/docs", + "watch-docs": "npm run build-docs -- --watch", + "releases": "ts-node scripts/releases.ts", "sync-syntaxes": "node scripts/sync-scenegraph-tmlanguage.js" }, "dependencies": { + "@vscode/extension-telemetry": "^0.4.7", "array-sort": "^1.0.0", "backoff": "^2.5.0", - "brighterscript": "^0.41.3", - "brighterscript-formatter": "^1.6.3", - "chokidar": "^3.5.2", + "brighterscript": "^0.65.0", + "brighterscript-formatter": "^1.6.29", "debounce": "^1.2.0", "dotenv": "^6.2.0", - "eol": "^0.9.1", "fast-xml-parser": "^3.12.16", - "find-in-files": "^0.5.0", "fs-extra": "^7.0.1", "get-port": "^5.0.0", "glob": "^7.1.3", - "hoek": "^6.1.2", + "hex-rgb": "^5.0.0", "iconv-lite": "0.4.24", - "merge-source-map": "^1.1.0", - "micromatch": "^4.0.4", - "natural-orderby": "^2.0.3", + "just-throttle": "^4.0.1", "net": "^1.0.2", "node-cache": "^4.2.0", "node-ssdp": "^4.0.0", - "p-event": "^4.1.0", - "path": "^0.12.7", + "postman-request": "^2.88.1-postman.32", "pretty-bytes": "^5.6.0", - "q": "^1.5.1", - "replace-in-file": "^4.1.0", - "replace-last": "^1.2.6", - "roku-debug": "^0.8.5", - "roku-deploy": "^3.5.0", - "roku-test-automation": "^1.1.1", + "roku-debug": "^0.19.1", + "roku-deploy": "^3.10.2", + "roku-test-automation": "^2.0.0-beta.19", "semver": "^7.1.3", - "serialize-error": "^5.0.0", "source-map": "^0.7.3", - "svelte": "^3.37.0", - "svelte-preprocess": "^4.7.0", - "vscode-debugadapter": "1.33.0", - "vscode-debugprotocol": "1.33.0", + "thenby": "^1.3.4", "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^4.1.3", "vscode-uri": "^1.0.6" }, "devDependencies": { "@deboxsoft/cpx": "^1.5.0", - "@rollup/plugin-commonjs": "^16.0.0", - "@rollup/plugin-node-resolve": "^10.0.0", - "@rollup/plugin-typescript": "^6.0.0", - "@tsconfig/svelte": "^1.0.10", + "@parcel/watcher": "^2.0.7", + "@types/backoff": "^2.5.2", "@types/chai": "^4.1.5", + "@types/chalk": "^2.2.0", "@types/fs-extra": "^5.0.4", "@types/glob": "^7.1.1", "@types/mocha": "^7.0.2", - "@types/mock-fs": "^4.10.0", "@types/node": "^12.12.0", "@types/node-ssdp": "^3.3.0", - "@types/q": "^1.5.1", + "@types/prompt": "^1.1.2", "@types/semver": "^7.1.0", "@types/sinon": "7.0.6", - "@types/vscode": "^1.42.0", + "@types/vscode": "^1.53.0", + "@types/yargs": "^17.0.10", + "@typescript-eslint/eslint-plugin": "^5.14.0", + "@typescript-eslint/parser": "^5.14.0", + "@vscode/vsce": "^2.19.0", "chai": "^4.2.0", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "changelog-parser": "^2.8.0", - "coveralls": "^3.0.11", + "coveralls-next": "^4.2.0", + "dayjs": "^1.11.7", + "deferred": "^0.7.11", + "eslint": "^8.10.0", + "eslint-plugin-github": "^4.3.5", + "eslint-plugin-no-only-tests": "^2.6.0", + "latest-version": "^5.1.0", "mocha": "^9.1.3", - "mocha-param": "^2.0.0", - "mock-fs": "^4.10.3", "node-fetch": "^2.6.1", + "node-notifier": "^10.0.1", "nyc": "^15.0.0", - "ovsx": "^0.2.0", + "ovsx": "^0.5.2", + "prompt": "^1.3.0", "rimraf": "^3.0.0", - "rollup": "^2.3.4", - "rollup-plugin-css-only": "^3.0.0", - "rollup-plugin-svelte": "^7.0.0", - "rollup-plugin-terser": "^7.0.0", "sinon": "^7.2.3", - "source-map-support": "^0.5.16", - "ts-mocha": "^7.0.0", - "ts-node": "^8.9.1", + "source-map-support": "^0.5.21", + "statigen": "^0.5.0", + "terminal-overwrite": "^2.0.1", + "ts-node": "^10.9.1", "tslib": "^2.3.1", - "tslint": "^5.11.0", - "tslint-eslint-rules": "^5.4.0", - "typescript": "^3.8.3", + "typescript": "^4.7.4", "typescript-json-schema": "^0.50.1", - "vsce": "^1.81.1", - "vscode-debugadapter-testsupport": "1.33.0", + "undent": "^0.1.0", + "vscode-tmgrammar-test": "^0.0.11", "yargs": "^16.2.0" }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, "main": "./dist/extension", + "browser": "./dist/extension-web", "activationEvents": [ "onDebug", "onLanguage:brightscript", "onLanguage:brighterscript", "onLanguage:xml", "workspaceContains:**/manifest", - "workspaceContains:**/brsconfig.json", + "workspaceContains:**/bsconfig.json", + "onView:onlineDevicesView", + "onCommand:extension.brightscript.refreshDeviceList", "onCommand:extension.brightscript.sendRemoteCommand", + "onCommand:extension.brightscript.toggleRemoteControlMode", + "onCommand:extension.brightscript.enableRemoteControlMode", + "onCommand:extension.brightscript.disableRemoteControlMode", "onCommand:extension.brightscript.pressBackButton", "onCommand:extension.brightscript.pressHomeButton", "onCommand:extension.brightscript.pressUpButton", @@ -154,30 +157,64 @@ "onCommand:extension.brightscript.pressRevButton", "onCommand:extension.brightscript.pressFwdButton", "onCommand:extension.brightscript.pressStarButton", + "onCommand:extension.brightscript.pressInstantReplayButton", + "onCommand:extension.brightscript.pressSearchButton", + "onCommand:extension.brightscript.pressEnterButton", + "onCommand:extension.brightscript.pressFindRemote", + "onCommand:extension.brightscript.pressVolumeDown", + "onCommand:extension.brightscript.pressVolumeMute", + "onCommand:extension.brightscript.pressVolumeUp", + "onCommand:extension.brightscript.pressPowerOff", + "onCommand:extension.brightscript.pressChannelUp", + "onCommand:extension.brightscript.pressChannelDown", + "onCommand:extension.brightscript.changeTvInput", "onCommand:extension.brightscript.sendRemoteText", "onCommand:brighterscript.showPreview", "onCommand:brighterscript.showPreviewToSide" ], "contributes": { + "viewsContainers": { + "activitybar": [ + { + "id": "vscode-brightscript-language", + "title": "BrightScript Language", + "icon": "images/icons/logo.svg" + } + ] + }, "views": { + "vscode-brightscript-language": [ + { + "id": "onlineDevicesView", + "name": "Devices" + } + ], "debug": [ { "id": "rendezvousView", "name": "Rendezvous", - "when": "debugType == 'brightscript'", - "group": "Rendezvous" + "when": "debugType == 'brightscript'" }, { - "type": "webview", - "id": "RDBRegistryView", - "name": "Registry", - "when": "debugType == 'brightscript'" + "id": "sceneGraphInspectorView", + "name": "SceneGraph Inspector", + "type": "webview" }, { - "type": "webview", - "id": "RDBCommandsView", - "name": "Commands", - "when": "debugType == 'brightscript'" + "id": "rokuDeviceView", + "contextualTitle": "Roku", + "name": "Device View", + "type": "webview" + }, + { + "id": "rokuRegistryView", + "name": "Roku Registry", + "type": "webview" + }, + { + "id": "rokuCommandsView", + "name": "Roku Commands", + "type": "webview" } ] }, @@ -192,20 +229,71 @@ "view/title": [ { "command": "extension.brightscript.rendezvous.toggleSortMethod", - "when": "debugType == 'brightscript'", + "when": "debugType == 'brightscript' && view == rendezvousView", "group": "Rendezvous" }, { "command": "extension.brightscript.rendezvous.toggleSortDirection", - "when": "debugType == 'brightscript'", + "when": "debugType == 'brightscript' && view == rendezvousView", "group": "Rendezvous" }, { "command": "extension.brightscript.rendezvous.clearHistory", - "when": "debugType == 'brightscript'", - "group": "Rendezvous" + "when": "debugType == 'brightscript' && view == rendezvousView", + "group": "navigation" + }, + { + "command": "extension.brightscript.refreshDeviceList", + "when": "view == onlineDevicesView", + "group": "navigation" + }, + { + "command": "extension.brightscript.rokuRegistry.refreshRegistry", + "when": "view == rokuRegistryView", + "group": "navigation" + }, + { + "command": "extension.brightscript.rokuRegistry.importRegistry", + "when": "view == rokuRegistryView", + "group": "navigation" + }, + { + "command": "extension.brightscript.rokuRegistry.exportRegistry", + "when": "view == rokuRegistryView", + "group": "navigation" + }, + { + "command": "extension.brightscript.rokuRegistry.clearRegistry", + "when": "view == rokuRegistryView", + "group": "navigation" + }, + { + "command": "extension.brightscript.rokuDeviceView.refreshScreenshot", + "when": "view == rokuDeviceView && !brightscript.rokuDeviceView.enableScreenshotCapture", + "group": "navigation@1" + }, + { + "command": "extension.brightscript.rokuDeviceView.resumeScreenshotCapture", + "when": "view == rokuDeviceView && !brightscript.rokuDeviceView.enableScreenshotCapture && !brightscript.rokuDeviceView.isInspectingNodes", + "group": "navigation@2" + }, + { + "command": "extension.brightscript.rokuDeviceView.pauseScreenshotCapture", + "when": "view == rokuDeviceView && brightscript.rokuDeviceView.enableScreenshotCapture && !brightscript.rokuDeviceView.isInspectingNodes", + "group": "navigation@2" + }, + { + "command": "extension.brightscript.rokuDeviceView.enableNodeInspector", + "when": "view == rokuDeviceView && brightscript.isOnDeviceComponentAvailable && !brightscript.rokuDeviceView.isInspectingNodes", + "group": "navigation@3" + }, + { + "command": "extension.brightscript.rokuDeviceView.disableNodeInspector", + "when": "view == rokuDeviceView && brightscript.isOnDeviceComponentAvailable && brightscript.rokuDeviceView.isInspectingNodes", + "group": "navigation@3" } - ] + ], + "commandPalette": [] }, "breakpoints": [ { @@ -220,8 +308,8 @@ ], "debuggers": [ { - "type": "brightscript", "label": "BrightScript Debug", + "type": "brightscript", "program": "./dist/debugAdapter.js", "runtime": "node", "configurationAttributes": { @@ -414,6 +502,13 @@ "logrendezvous" ] }, + { + "type": "string", + "description": "Changes the maximum number of brightscript warnings displayed on channel install to zero.", + "enum": [ + "brightscript_warnings 0" + ] + }, { "type": "string", "description": "Custom SGDebug command that will be run on port 8080" @@ -421,6 +516,123 @@ ] } }, + "fileLogging": { + "oneOf": [ + { + "type": "object", + "description": "Configure file logging for debug console logs as well as RokuCommunity debugger logs", + "default": { + "dir": "${workspaceFolder}/logs", + "rokuDevice": { + "enabled": true, + "filename": "rokuDevice.log", + "mode": "session", + "logLimit": 5 + }, + "debugger": { + "enabled": true, + "filename": "debugger.log", + "mode": "session", + "logLimit": 5 + } + }, + "properties": { + "enabled": { + "type": "boolean", + "description": "Should file logging be enabled" + }, + "dir": { + "type": "string", + "description": "Directory where log files should be stored. used when filename is relative", + "default": "${workspaceFolder}/logs" + }, + "logLimit": { + "type": "number", + "description": "The number of log files to keep. `null` means keep all logs", + "default": null + }, + "rokuDevice": { + "oneOf": [ + { + "type": "object", + "description": "File logging for the telnet or IO output from the Roku device currently being debugged. (i.e. all the stuff produced by `print` statements in your code)", + "properties": { + "enabled": { + "type": "boolean", + "description": "Should file logging be enabled" + }, + "dir": { + "type": "string", + "description": "Directory where log files should be stored. used when filename is relative", + "default": "${workspaceFolder}/logs" + }, + "logLimit": { + "type": "number", + "description": "The number of log files to keep. `null` means keep all logs", + "default": null + }, + "mode": { + "type": "string", + "description": "`'session'` means a unique timestamped file will be created on every debug session.`'append'` means all logs will be appended to a single file", + "default": "session", + "enum": [ + "session", + "append" + ] + } + } + }, + { + "type": "boolean", + "description": "Enable file logging for debug console logs as well as RokuCommunity debugger logs" + } + ] + }, + "debugger": { + "oneOf": [ + { + "type": "object", + "description": "File logging for the debugger. Mostly used to provide crash logs to the RokuCommunity team.", + "properties": { + "enabled": { + "type": "boolean", + "description": "Should file logging be enabled" + }, + "dir": { + "type": "string", + "description": "Directory where log files should be stored. used when filename is relative", + "default": "${workspaceFolder}/logs" + }, + "logLimit": { + "type": "number", + "description": "The number of log files to keep. `null` means keep all logs", + "default": null + }, + "mode": { + "type": "string", + "description": "`'session'` means a unique timestamped file will be created on every debug session.`'append'` means all logs will be appended to a single file", + "default": "session", + "enum": [ + "session", + "append" + ] + } + } + }, + { + "type": "boolean", + "description": "Enable file logging for debug console logs as well as RokuCommunity debugger logs" + } + ] + } + } + }, + { + "type": "boolean", + "description": "Enable file logging for debug console logs as well as RokuCommunity debugger logs" + } + ] + }, "outDir": { "type": "string", "description": "The folder where the the build artifacts are placed (like the staging folder and .zip files of the apps)", @@ -428,7 +640,7 @@ }, "stopOnEntry": { "type": "boolean", - "description": "Have the debugger break on on the first line of the program after launch.", + "description": "Should the debugger stop on the first line of the program after launch.", "default": false }, "retainStagingFolder": { @@ -446,6 +658,11 @@ "description": "Enables automatic population of the debug variable panel on a breakpoint or runtime errors.", "default": true }, + "showHiddenVariables": { + "type": "boolean", + "description": "Show variables that are prefixed with a special prefix designated to be hidden", + "default": false + }, "envFile": { "type": "string", "description": "A path to an environment variables file.", @@ -470,6 +687,16 @@ "description": "Will inject the Roku Advanced Layout Editor(RALE) TrackerTask into your channel if one is defined in your user settings.", "default": false }, + "injectRdbOnDeviceComponent": { + "type": "boolean", + "description": "Will inject the OnDeviceComponent used by RDB for RALE like functionality inside of the extension", + "default": false + }, + "disableScreenSaver": { + "type": "boolean", + "description": "If injectRdbOnDeviceComponent is true and this is true the screen saver will be be disabled while the deployed application is running.", + "default": true + }, "files": { "type": "array", "description": "An array of file paths, file globs, or {src:string;dest:string} objects that will be copied into the deployment package. This will override the defaults, so if specified, you must provide ALL files. See https://npmjs.com/roku-deploy for examples.", @@ -545,26 +772,39 @@ }, "logfilePath": { "type": "string", + "deprecationMessage": "Use `fileLogging` option instead", "description": "A path to a file where all brightscript console output will be written. If null or empty, file logging will be disabled." }, "enableDebugProtocol": { "type": "boolean", + "default": false, "description": "If true, the debugger will use the new BrightScript debug protocol, and will disable the telnet debugger. See this link for more details: https://developer.roku.com/en-ca/docs/developer-program/debugging/socket-based-debugger.md" + }, + "logLevel": { + "type": "string", + "enum": [ + "off", + "error", + "warn", + "log", + "info", + "debug", + "trace" + ], + "default": "log", + "description": "The level of logging that should be done during a debug session." } } } }, "initialConfigurations": [ { + "name": "BrightScript Debug: Launch", "type": "brightscript", "request": "launch", - "name": "BrightScript Debug: Launch", - "stopOnEntry": false, "host": "${promptForHost}", "password": "${promptForPassword}", - "rootDir": "${workspaceFolder}", - "enableDebuggerAutoRecovery": false, - "stopDebuggerOnAppExit": false + "rootDir": "${workspaceFolder}" } ], "configurationSnippets": [ @@ -572,15 +812,12 @@ "label": "BrightScript Debug: Launch", "description": "Package, deploy and debug a BrightScript project on a remote Roku device", "body": { + "name": "BrightScript Debug: Launch", "type": "brightscript", "request": "launch", - "name": "BrightScript Debug: Launch", - "stopOnEntry": false, - "host": "${promptForHost}", - "password": "${promptForPassword}", - "rootDir": "^\"\\${workspaceFolder}\"", - "enableDebuggerAutoRecovery": false, - "stopDebuggerOnAppExit": false + "host": "^\"\\${promptForHost}\"", + "password": "^\"\\${promptForPassword}\"", + "rootDir": "^\"\\${workspaceFolder}\"" } } ] @@ -604,7 +841,11 @@ "aliases": [ "BrightScript" ], - "configuration": "./language-configuration.json" + "configuration": "./language-configuration.json", + "icon": { + "light": "./images/icons/brightscript.svg", + "dark": "./images/icons/brightscript.svg" + } }, { "id": "brighterscript", @@ -614,7 +855,11 @@ "aliases": [ "BrighterScript" ], - "configuration": "./language-configuration.json" + "configuration": "./language-configuration.json", + "icon": { + "light": "./images/icons/brighterscript.svg", + "dark": "./images/icons/brighterscript.svg" + } }, { "id": "scenegraph", @@ -674,14 +919,14 @@ "snippets": [ { "language": "brightscript", - "path": "./snippets.json" + "path": "./snippets/brightscript.json" }, { - "language": "brightscript", + "language": "brighterscript", "path": "./snippets/brightscript.json" }, { - "language": "brightscript", + "language": "brighterscript", "path": "./snippets/brighterscript.json" }, { @@ -689,1213 +934,2583 @@ "path": "./snippets/xml.json" } ], - "configuration": { - "type": "object", - "title": "BrightScript configuration", - "properties": { - "brightscript.format.formatIndent": { - "type": "boolean", - "default": true, - "description": "If true, lines are indented based on what they are nested inside of. If false, all leading whitespace is left alone.", - "scope": "resource" - }, - "brightscript.format.keywordCase": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ], - "default": "lower", - "description": "Replaces all keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all.", - "scope": "resource" - }, - "brightscript.format.typeCase": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ], - "default": "lower", - "description": "Replaces all type keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all.", - "scope": "resource" - }, - "brightscript.format.compositeKeywords": { - "type": "string", - "enum": [ - "split", - "combine", - "original" - ], - "default": "split", - "description": "Forces all composite keywords (i.e. 'elseif', 'endwhile', etc...) to be consistent. If 'split', they are split into their alternatives ('else if', 'end while'). If 'combine', they are combined ('elseif', 'endwhile'). If null, they are not modified.", - "scope": "resource" - }, - "brightscript.format.removeTrailingWhiteSpace": { - "type": "boolean", - "default": true, - "description": "Removes all trailing whitespace at the end of each line.", - "scope": "resource" - }, - "brightscript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": { - "type": "boolean", - "default": true, - "description": "if true, ensure exactly 1 space after leading and before trailing curly braces. If false, REMOVE all whitespace after leading and before trailing curly braces (excluding beginning-of-line indentation spacing)", - "scope": "resource" - }, - "brightscript.format.formatMultiLineObjectsAndArrays": { - "type": "boolean", - "default": true, - "description": "if true, insert newlines and indents for multi-line objects and arrays.", - "scope": "resource" - }, - "brightscript.format.keywordCaseOverride": { - "type": "object", - "description": "Allows overriding case at the individual keyword level.\nExample {\"string\": \"title\"} would make string always lower case regardless of keywordCase", - "properties": { - "endfunction": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endif": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endsub": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endwhile": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "exitwhile": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "exitfor": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endfor": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "elseif": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "#elseif": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "#endif": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endclass": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "endnamespace": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "and": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "eval": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "if": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "then": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "else": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "for": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "to": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "step": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "exit": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "each": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "while": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "function": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "sub": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "as": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "return": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "print": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "goto": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "dim": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "stop": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "void": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "boolean": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "integer": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "longinteger": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "float": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "double": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "string": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "object": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "interface": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "invalid": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "dynamic": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "or": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "let": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "next": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "not": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "#if": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "#else": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "#const": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "class": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "namespace": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "import": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - } + "configuration": [ + { + "id": "formatting", + "title": "Formatting", + "properties": { + "brightscript.format.formatIndent": { + "type": "boolean", + "default": true, + "description": "If true, lines are indented based on what they are nested inside of. If false, all leading whitespace is left alone.", + "scope": "resource" }, - "scope": "resource" - }, - "brightscript.format.typeCaseOverride": { - "type": "object", - "description": " Provides a way to override type keyword case at the individual TokenType level. Types are defined as keywords that are preceeded by an `as` token.", - "properties": { - "boolean": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "double": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "dynamic": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "float": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "function": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "integer": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "invalid": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "longinteger": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "object": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "string": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - }, - "void": { - "type": "string", - "enum": [ - "lower", - "upper", - "title", - "original" - ] - } - } - }, - "brightscript.format.formatInteriorWhitespace": { - "type": "boolean", - "default": true, - "description": "If true, all whitespace between items is reduced to exactly 1 space character,and certain keywords and operators are padded with whitespace (i.e. `1+1` becomes `1 + 1`)", - "scope": "resource" - }, - "brightscript.format.insertSpaceBeforeFunctionParenthesis": { - "type": "boolean", - "default": false, - "description": "If true, a space is inserted to the left of an opening function declaration parenthesis. (i.e. `function main ()` or `function ()`). If false, all spacing is removed (i.e. `function main()` or `function()`).", - "scope": "resource" - }, - "brightscript.format.insertSpaceBetweenEmptyCurlyBraces": { - "type": "boolean", - "default": false, - "description": "If true, empty curly braces will contain exactly 1 whitespace char (i.e. `{ }`). If false, there will be zero whitespace chars between empty curly braces (i.e. `{}`)", - "scope": "resource" - }, - "brightscript.format.insertSpaceBetweenAssociativeArrayLiteralKeyAndColon": { - "type": "boolean", - "default": false, - "description": "If true, ensure exactly 1 space between an associative array literal key and its colon. If false, all space between the key and its colon will be removed", - "scope": "resource" - }, - "brightscript.format.formatSingleLineCommentType": { - "type": "string", - "description": "Forces all single-line comments to use the same style", - "enum": [ - "singlequote", - "rem", - "original" - ], - "scope": "resource" - }, - "brightscript.remoteControl.host": { - "type": "string", - "default": "${promptForHost}", - "description": "IP address of the roku to remotely control", - "scope": "resource" - }, - "brightscript.configFile": { - "type": "string", - "description": "Path to the brsconfig.json for this project. This is an absolute path, or a path relative to the workspace root.", - "scope": "resource" - }, - "brightscript.output.includeStackTraces": { - "type": "boolean", - "default": true, - "description": "If set to true, will print stack trace or breakpoint info in the log output. Set to false to avoid noisy logs - you'll still get the traces in the debug console, in any case.", - "scope": "resource" - }, - "brightscript.output.focusOnLaunch": { - "type": "boolean", - "default": true, - "description": "If set to true, focus on the brightscript log when launching, which is convenient for controlling your roku with the extension's remote control keys.", - "scope": "resource" - }, - "brightscript.output.clearOnLaunch": { - "type": "boolean", - "default": true, - "description": "If set to true, will clear the brightscript log when launching.", - "scope": "resource" - }, - "brightscript.output.clearConsoleOnChannelStart": { - "type": "boolean", - "default": true, - "description": "If set to true, will clear the brightscript log after connecting to the Roku channel after launching.", - "scope": "resource" - }, - "brightscript.output.hyperlinkFormat": { - "type": [ - "string", - "null" - ], - "enum": [ - "Full", - "Filename", - "FilenameAndFunction", - "Short", - "Hidden" - ], - "default": "FilenameAndFunction", - "description": "Determines the format of roku hyperlinks in the output panel. For example, given pkg:/components/KeyLogTester.brs(24:0) The hyperlink will appear as follows: \n Full pkg:/components/KeyLogTester.brs(24:0) [INFO] retrieving videos for category id 23 \n Filename KeyLogTester.brs(24) [INFO] retrieving videos for category id 23 \n FilenameAndFunction KeyLogTester.getVideos(24) [INFO] retrieving videos for category id 23 \n Short #1 [INFO] retrieving videos for category id 23 \n Hidden [INFO] retrieving videos for category id 23", - "scope": "resource" - }, - "brightscript.deviceDiscovery.showInfoMessages": { - "type": "boolean", - "default": true, - "description": "If set to true, an info toast will be shown when a Roku device has been found on the network.", - "scope": "resource" - }, - "brightscript.deviceDiscovery.enabled": { - "type": "boolean", - "default": true, - "description": "If set to true, the extension will automatically watch and scan the network for online Roku devices. This can be pared with the ${promptForHost} option in the launch config to display a list of online Rokus, removing the need to constantly change the host IP in your config files.", - "scope": "resource" - }, - "brightscript.debug.raleTrackerTaskFileLocation": { - "type": "string", - "description": "This is an absolute path to the TrackerTask.xml file to be injected into your Roku channel during a debug session.", - "scope": "resource" - }, - "brightscript.debug.autoRunSgDebugCommands": { - "type": "array", - "items": { - "anyOf": [ - { + "brightscript.format.keywordCase": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ], + "default": "lower", + "description": "Replaces all keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all.", + "scope": "resource" + }, + "brightscript.format.typeCase": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ], + "default": "lower", + "description": "Replaces all type keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all.", + "scope": "resource" + }, + "brightscript.format.compositeKeywords": { + "type": "string", + "enum": [ + "split", + "combine", + "original" + ], + "default": "split", + "description": "Forces all composite keywords (i.e. 'elseif', 'endwhile', etc...) to be consistent. If 'split', they are split into their alternatives ('else if', 'end while'). If 'combine', they are combined ('elseif', 'endwhile'). If null, they are not modified.", + "scope": "resource" + }, + "brightscript.format.removeTrailingWhiteSpace": { + "type": "boolean", + "default": true, + "description": "Removes all trailing whitespace at the end of each line.", + "scope": "resource" + }, + "brightscript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": { + "type": "boolean", + "default": true, + "description": "if true, ensure exactly 1 space after leading and before trailing curly braces. If false, REMOVE all whitespace after leading and before trailing curly braces (excluding beginning-of-line indentation spacing)", + "scope": "resource" + }, + "brightscript.format.formatMultiLineObjectsAndArrays": { + "type": "boolean", + "default": true, + "description": "if true, insert newlines and indents for multi-line objects and arrays.", + "scope": "resource" + }, + "brightscript.format.keywordCaseOverride": { + "type": "object", + "description": "Allows overriding case at the individual keyword level.\nExample {\"string\": \"title\"} would make string always lower case regardless of keywordCase", + "properties": { + "endfunction": { "type": "string", - "description": "Enables running the 'chanperf' command with a 1 second reporting interval at the start of a debug session.", "enum": [ - "chanperf" + "lower", + "upper", + "title", + "original" ] }, - { + "endif": { "type": "string", - "description": "Enables running of the 'fps_display 1' command at the start of a debug session.", "enum": [ - "fpsdisplay" + "lower", + "upper", + "title", + "original" ] }, - { + "endsub": { "type": "string", - "description": "Enables running of the 'logrendezvous on' command at the start of a debug session.", "enum": [ - "logrendezvous" + "lower", + "upper", + "title", + "original" ] }, - { + "endwhile": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "exitwhile": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "exitfor": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "endfor": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "elseif": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "#elseif": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "#endif": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "endclass": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "endnamespace": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "and": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "eval": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "if": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "then": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "else": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "for": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "to": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "step": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "exit": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "each": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "while": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "function": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "sub": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "as": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "return": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "print": { "type": "string", - "description": "Custom SGDebug command that will be run on port 8080" + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "goto": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "dim": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "stop": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "void": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "boolean": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "integer": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "longinteger": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "float": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "double": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "string": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "object": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "interface": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "invalid": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "dynamic": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "or": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "let": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "next": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "not": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "#if": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "#else": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "#const": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "class": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "namespace": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "import": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] } - ] - } - }, - "brightscript.debug.enableDebugProtocol": { - "type": "boolean", - "default": false, - "description": "If true, the debugger will use the new BrightScript debug protocol, and will disable the telnet debugger. See this link for more details: https://developer.roku.com/en-ca/docs/developer-program/debugging/socket-based-debugger.md", - "scope": "resource" - }, - "brightscript.debug.enableSourceMaps": { - "type": "boolean", - "default": true, - "description": "If true, the debugger will read any available sourcemaps and attempt to convert debugger locations into their original source locations.", - "scope": "resource" - }, - "brightscript.debug.logfilePath": { - "type": "string", - "description": "A path to a file where all brightscript console output will be written. If null or empty, file logging will be disabled.", - "scope": "resource" - }, - "brightscript.enableLanguageServer": { - "type": "boolean", - "description": "Enable experimental language support, which includes things like syntax checking smarter intellisense.", - "default": true, - "scope": "resource" - }, - "brightscript.focusOutputPanelOnStartup": { - "type": "boolean", - "description": "If enabled, the 'BrightScript Log' output channel will be focused as soon as this extension is initialized", - "deprecationMessage": "Deprecated. Use 'outputPanelStartupBehavior' instead", - "default": false, - "scope": "resource" - }, - "brightscript.outputPanelStartupBehavior": { - "type": "string", - "description": "Used to configure if the 'BrightScript Log' output channel will be shown, shown and be focused, or nothing happens as soon as this extension is initialized", - "enum": [ - "show", - "focus", - "nothing" - ], - "default": "nothing", - "scope": "resource" - }, - "brightscript.bsdk": { - "type": "string", - "description": "Path to the BrighterScript module to use for the BrightScript and BrighterScript language features", - "scope": "resource" - } - } - }, - "commands": [ + }, + "scope": "resource" + }, + "brightscript.format.typeCaseOverride": { + "type": "object", + "description": " Provides a way to override type keyword case at the individual TokenType level. Types are defined as keywords that are preceeded by an `as` token.", + "properties": { + "boolean": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "double": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "dynamic": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "float": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "function": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "integer": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "invalid": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "longinteger": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "object": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "string": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + }, + "void": { + "type": "string", + "enum": [ + "lower", + "upper", + "title", + "original" + ] + } + } + }, + "brightscript.format.formatInteriorWhitespace": { + "type": "boolean", + "default": true, + "description": "If true, all whitespace between items is reduced to exactly 1 space character,and certain keywords and operators are padded with whitespace (i.e. `1+1` becomes `1 + 1`)", + "scope": "resource" + }, + "brightscript.format.insertSpaceBeforeFunctionParenthesis": { + "type": "boolean", + "default": false, + "description": "If true, a space is inserted to the left of an opening function declaration parenthesis. (i.e. `function main ()` or `function ()`). If false, all spacing is removed (i.e. `function main()` or `function()`).", + "scope": "resource" + }, + "brightscript.format.insertSpaceBetweenEmptyCurlyBraces": { + "type": "boolean", + "default": false, + "description": "If true, empty curly braces will contain exactly 1 whitespace char (i.e. `{ }`). If false, there will be zero whitespace chars between empty curly braces (i.e. `{}`)", + "scope": "resource" + }, + "brightscript.format.insertSpaceBetweenAssociativeArrayLiteralKeyAndColon": { + "type": "boolean", + "default": false, + "description": "If true, ensure exactly 1 space between an associative array literal key and its colon. If false, all space between the key and its colon will be removed", + "scope": "resource" + }, + "brightscript.format.formatSingleLineCommentType": { + "type": "string", + "description": "Forces all single-line comments to use the same style", + "enum": [ + "singlequote", + "rem", + "original" + ], + "scope": "resource" + } + } + }, + { + "id": "projectSettings", + "title": "Project Settings", + "properties": { + "brightscript.configFile": { + "type": "string", + "description": "Path to the bsconfig.json for this project. This is an absolute path, or a path relative to ${workspaceFolder}.", + "scope": "resource" + }, + "brightscript.bsdk": { + "type": "string", + "description": "Path to the BrighterScript module to use for the BrightScript and BrighterScript language features", + "scope": "resource" + }, + "brightscript.enableLanguageServer": { + "type": "boolean", + "description": "Enable the Language Server, which includes things like syntax checking, intellisense, completions, etc.", + "default": true, + "scope": "resource" + } + } + }, + { + "id": "debugLogging", + "title": "Debug Logging", + "properties": { + "brightscript.output.clearConsoleOnChannelStart": { + "type": "boolean", + "default": true, + "description": "If set to true, will clear the brightscript log after connecting to the Roku channel after launching.", + "scope": "resource" + }, + "brightscript.output.clearOnLaunch": { + "type": "boolean", + "default": true, + "description": "If set to true, will clear the brightscript log when launching.", + "scope": "resource" + }, + "brightscript.output.focusOnLaunch": { + "type": "boolean", + "default": true, + "description": "If set to true, focus on the brightscript log when launching, which is convenient for controlling your roku with the extension's remote control keys.", + "scope": "resource" + }, + "brightscript.output.hyperlinkFormat": { + "type": [ + "string", + "null" + ], + "enum": [ + "Full", + "Filename", + "FilenameAndFunction", + "Short", + "Hidden" + ], + "default": "FilenameAndFunction", + "description": "Determines the format of roku hyperlinks in the output panel. For example, given pkg:/components/KeyLogTester.brs(24:0) The hyperlink will appear as follows: \n (Full) pkg:/components/KeyLogTester.brs(24:0) [INFO] retrieving videos for category id 23 \n (Filename) KeyLogTester.brs(24) [INFO] retrieving videos for category id 23 \n (FilenameAndFunction) KeyLogTester.getVideos(24) [INFO] retrieving videos for category id 23 \n (Short) #1 [INFO] retrieving videos for category id 23 \n (Hidden) [INFO] retrieving videos for category id 23", + "scope": "resource" + }, + "brightscript.output.includeStackTraces": { + "type": "boolean", + "default": true, + "description": "If set to true, will print stack trace or breakpoint info in the log output. Set to false to avoid noisy logs - you'll still get the traces in the debug console, in any case.", + "scope": "resource" + }, + "brightscript.outputPanelStartupBehavior": { + "type": "string", + "description": "Used to configure if the 'BrightScript Log' output channel will be shown, shown and be focused, or nothing happens as soon as this extension is initialized", + "enum": [ + "show", + "focus", + "nothing" + ], + "default": "nothing", + "scope": "resource" + }, + "brightscript.focusOutputPanelOnStartup": { + "type": "boolean", + "description": "If enabled, the 'BrightScript Log' output channel will be focused as soon as this extension is initialized", + "deprecationMessage": "Deprecated. Use 'outputPanelStartupBehavior' instead", + "default": false, + "scope": "resource" + } + } + }, + { + "id": "deviceDiscovery", + "title": "Device Discovery", + "properties": { + "brightscript.deviceDiscovery.showInfoMessages": { + "type": "boolean", + "default": true, + "description": "If set to true, an info toast will be shown when a Roku device has been found on the network.", + "scope": "resource" + }, + "brightscript.deviceDiscovery.enabled": { + "type": "boolean", + "default": true, + "description": "If set to true, the extension will automatically watch and scan the network for online Roku devices. This can be pared with the ${promptForHost} option in the launch config to display a list of online Rokus, removing the need to constantly change the host IP in your config files.", + "scope": "resource" + }, + "brightscript.deviceDiscovery.includeNonDeveloperDevices": { + "type": "boolean", + "default": false, + "description": "If set to true, the extension will also include devices that do not have their developer mode enabled that are found on the network.", + "scope": "resource" + }, + "brightscript.deviceDiscovery.concealDeviceInfo": { + "type": "boolean", + "default": false, + "description": "If set to true, the extension will randomize the numbers and letters in the following fields (useful for hiding your sensitive device fields when creating public screenshots or demos). ['udn', 'device-id', 'advertising-id', 'wifi-mac', 'ethernet-mac', 'serial-number', 'keyed-developer-id']", + "scope": "resource" + } + } + }, + { + "id": "debug", + "title": "Debugging", + "properties": { + "brightscript.debug.raleTrackerTaskFileLocation": { + "type": "string", + "description": "This is an absolute path to the TrackerTask.xml file to be injected into your Roku channel during a debug session.", + "scope": "resource" + }, + "brightscript.debug.autoRunSgDebugCommands": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "description": "Enables running the 'chanperf' command with a 1 second reporting interval at the start of a debug session.", + "enum": [ + "chanperf" + ] + }, + { + "type": "string", + "description": "Enables running of the 'fps_display 1' command at the start of a debug session.", + "enum": [ + "fpsdisplay" + ] + }, + { + "type": "string", + "description": "Enables running of the 'logrendezvous on' command at the start of a debug session.", + "enum": [ + "logrendezvous" + ] + }, + { + "type": "string", + "description": "Changes the maximum number of brightscript warnings displayed on channel install to zero.", + "enum": [ + "brightscript_warnings 0" + ] + }, + { + "type": "string", + "description": "Custom SGDebug command that will be run on port 8080" + } + ] + }, + "scope": "resource" + }, + "brightscript.debug.enableDebugProtocol": { + "type": "boolean", + "default": false, + "description": "If true, the debugger will use the new BrightScript debug protocol, and will disable the telnet debugger. See this link for more details: https://developer.roku.com/en-ca/docs/developer-program/debugging/socket-based-debugger.md", + "scope": "resource" + }, + "brightscript.debug.enableSourceMaps": { + "type": "boolean", + "default": true, + "description": "If true, the debugger will read any available sourcemaps and attempt to convert debugger locations into their original source locations.", + "scope": "resource" + }, + "brightscript.debug.logfilePath": { + "type": "string", + "deprecationMessage": "Use `fileLogging` option instead", + "description": "A path to a file where all brightscript console output will be written. If null or empty, file logging will be disabled.", + "scope": "resource" + }, + "brightscript.debug.host": { + "type": "string", + "description": "The host or ip address for the target Roku", + "default": "${promptForHost}", + "scope": "resource" + }, + "brightscript.debug.deepLinkUrl": { + "type": "string", + "description": "A full deep link url to start the debugging session. There's no pretty way of launching directly to a deep link, so the app must be side-loaded, it auto-runs, we stop the app, and then launch it again using the deep link. You may use ${promptForHost}, ${host}, ${promptForQueryParams} which only asks for the URL-encoded querystring, and ${promptForDeepLinkUrl} to enter the entire deep link url at launch-time.", + "default": "http://${host}:8060/launch/dev?${promptForQueryParams}", + "scope": "resource" + }, + "brightscript.debug.password": { + "type": "string", + "description": "The password for the developer page on the target Roku", + "default": "${promptForPassword}", + "scope": "resource" + }, + "brightscript.debug.rootDir": { + "type": "string", + "description": "The root directory that contains your Roku project. This path should point to the folder containing your manifest file", + "default": "${workspaceFolder}", + "scope": "resource" + }, + "brightscript.debug.debugRootDir": { + "type": "string", + "deprecationMessage": "Deprecated. Use sourceDirs instead", + "description": "If you have a build system, rootDir will point to the build output folder, and this path should point to the actual source folder so that breakpoints can be set in the source files when debugging. In order for this to work, your build process cannot change line offsets between source files and built files, otherwise debugger lines will be out of sync.", + "default": "${workspaceFolder}", + "scope": "resource" + }, + "brightscript.debug.sourceDirs": { + "type": "array", + "description": "If you have a build system, this array will point to paths of actual source folders so that breakpoints can be set in the source files when debugging. In order for this to work, your build process cannot change line offsets between source files and built files, otherwise, debugger lines will be out of sync.", + "default": [ + "${workspaceFolder}" + ], + "scope": "resource" + }, + "brightscript.debug.bsConst": { + "type": "object", + "description": "An object of bs_const values to be updated in the manifest before side loading.", + "patternProperties": { + "^[\\w]+$": { + "type": "boolean", + "required": true + } + }, + "additionalProperties": false, + "scope": "resource" + }, + "brightscript.debug.componentLibrariesPort": { + "type": "number", + "description": "Port to access component libraries.", + "default": 8080, + "scope": "resource" + }, + "brightscript.debug.componentLibrariesOutDir": { + "type": "string", + "deprecationMessage": "This no longer user-configurable. This value will be set to \"${outDir}/component-libraries\" by the extension.", + "default": "", + "scope": "resource" + }, + "brightscript.debug.componentLibraries": { + "type": "array", + "description": "An array of file path sets. One for each component library. Each index is an array of file paths, file globs. This will override the defaults, so if specified, you must provide ALL files. See https://npmjs.com/roku-deploy for examples. You must specify a componentLibrariesOutDir to use this.", + "default": [ + { + "rootDir": "${workspaceFolder}/LibDir/", + "outFile": "LibName.zip", + "files": [ + "manifest", + "source/**/*.*", + "components/**/*.*", + "images/**/*.*" + ] + } + ], + "items": { + "type": "object", + "description": "Component Library Schema.", + "default": { + "rootDir": "${workspaceFolder}/LibDir/", + "outFile": "LibName.zip", + "files": [ + "manifest", + "source/**/*.*", + "components/**/*.*", + "images/**/*.*" + ] + }, + "required": [ + "rootDir", + "outFile", + "files" + ], + "properties": { + "rootDir": { + "type": "string", + "description": "Root directory of source files for this component library.", + "examples": [ + "${workspaceFolder}/LibDir/" + ] + }, + "outFile": { + "type": "string", + "description": "A file name and extension used as the static file name for the zip. You can use manifest values in this property such as ${title} to be inferred from the library's manifest file.", + "default": "", + "examples": [ + "LibName.zip" + ], + "pattern": "^(.*)(\\.zip)$" + }, + "files": { + "type": "array", + "description": "A file path or file glob that should be copied to the component library zip.", + "default": [ + "manifest", + "source/**/*.*", + "components/**/*.*", + "assets/**/*.*" + ], + "items": { + "anyOf": [ + { + "type": "string", + "description": "A file path or file glob that should be copied to the component library zip." + }, + { + "type": "object", + "properties": { + "src": { + "anyOf": [ + { + "type": "string", + "description": "A file path or glob pattern of source file(s) to be included in the component library zip." + }, + { + "type": "array", + "description": "An array of file path or globs", + "items": { + "type": "string", + "description": "A file path or glob pattern of source file(s) to be included in the component library zip." + } + } + ] + }, + "dest": { + "type": "string", + "description": "The destination for the file(s) found in 'src'. If this path is a directory, you must end it in a trailing slash" + } + }, + "required": [ + "src", + "dest" + ] + } + ] + } + }, + "sourceDirs": { + "type": "array", + "description": "If you have a build system, this array will point to paths of actual source folders so that breakpoints can be set in the source files when debugging. In order for this to work, your build process cannot change line offsets between source files and built files, otherwise, debugger lines will be out of sync.", + "default": [ + "${workspaceFolder}" + ] + } + } + }, + "scope": "resource" + }, + "brightscript.debug.outDir": { + "type": "string", + "description": "The folder where the the build artifacts are placed (like the staging folder and .zip files of the apps)", + "default": "${workspaceFolder}/out", + "scope": "resource" + }, + "brightscript.debug.stopOnEntry": { + "type": "boolean", + "description": "Should the debugger stop on the first line of the program after launch.", + "default": false, + "scope": "resource" + }, + "brightscript.debug.retainStagingFolder": { + "type": "boolean", + "description": "Prevent the staging folder from being deleted after the deployment package is created. This is helpful for troubleshooting why your package isn't being created the way you expected.", + "default": false, + "scope": "resource" + }, + "brightscript.debug.retainDeploymentArchive": { + "type": "boolean", + "description": "Prevent the deployment package from being deleted after launching a debug session.", + "default": true, + "scope": "resource" + }, + "brightscript.debug.enableVariablesPanel": { + "type": "boolean", + "description": "Enables automatic population of the debug variable panel on a breakpoint or runtime errors.", + "default": true, + "scope": "resource" + }, + "brightscript.debug.envFile": { + "type": "string", + "description": "A path to an environment variables file.", + "default": ".env", + "scope": "resource" + }, + "brightscript.debug.consoleOutput": { + "type": "string", + "description": "Determines which console output event to listen for. 'full' is every console message (including the ones from the adapter). 'normal' excludes output initiated by the adapter and rendezvous logs if enabled on the device.", + "default": "normal", + "enum": [ + "full", + "normal" + ], + "scope": "resource" + }, + "brightscript.debug.injectRaleTrackerTask": { + "type": "boolean", + "description": "Will inject the Roku Advanced Layout Editor(RALE) TrackerTask into your channel if one is defined in your user settings.", + "default": false, + "scope": "resource" + }, + "brightscript.debug.injectRdbOnDeviceComponent": { + "type": "boolean", + "description": "Will inject the OnDeviceComponent used by RDB for RALE like functionality inside of the extension", + "default": false, + "scope": "resource" + }, + "brightscript.debug.disableScreenSaver": { + "type": "boolean", + "description": "If injectRdbOnDeviceComponent is true and this is true the screen saver will be be disabled while the deployed application is running.", + "default": true, + "scope": "resource" + }, + "brightscript.debug.rdbCallbackPort": { + "type": "number", + "description": "By default the OnDeviceComponent tries to find an open callback port on the server. This allows you to set one explicitly", + "scope": "resource" + }, + "brightscript.debug.files": { + "type": "array", + "description": "An array of file paths, file globs, or {src:string;dest:string} objects that will be copied into the deployment package. This will override the defaults, so if specified, you must provide ALL files. See https://npmjs.com/roku-deploy for examples.", + "default": [ + "manifest", + "source/**/*.*", + "components/**/*.*", + "images/**/*.*" + ], + "items": { + "anyOf": [ + { + "type": "string", + "description": "A file path or file glob that should be copied to the deployment package." + }, + { + "type": "object", + "properties": { + "src": { + "anyOf": [ + { + "type": "string", + "description": "A file path or glob pattern of source file(s) to be included in the deployment package" + }, + { + "type": "array", + "description": "An array of file path or globs", + "items": { + "type": "string", + "description": "A file path or glob pattern of source file(s) to be included in the deployment package" + } + } + ] + }, + "dest": { + "type": "string", + "description": "The destination for the file(s) found in 'src'. If this path is a directory, you must end it in a trailing slash" + } + }, + "required": [ + "src", + "dest" + ] + } + ] + }, + "scope": "resource" + }, + "brightscript.debug.enableDebuggerAutoRecovery": { + "type": "boolean", + "description": "Enables automatic continue when hitting an incorrect 'break in' breakpoint, which are produced by a bug in the roku microdebugger, mishandling multiple runloops. This flag will enable you to recover in most cases - wait until the skipping bogus breakpoint messages have all stopped before continuing to use your app, for best results.", + "default": true, + "scope": "resource" + }, + "brightscript.debug.stopDebuggerOnAppExit": { + "type": "boolean", + "description": "If true, will terminate the debug session if app exit is detected. This currently relies on 9.1+ launch beacon notifications, so will not work on a pre 9.1 device.", + "default": true, + "scope": "resource" + }, + "brightscript.debug.packagePort": { + "type": "number", + "description": "The port used for package-related requests. This is mainly used for things like emulators, or when your roku is behind a firewall with a port-forward.", + "default": 80, + "scope": "resource" + }, + "brightscript.debug.remotePort": { + "type": "number", + "description": "The port used for sending remote control commands (like home press or back press). This is mainly used for things like emulators, or when your roku is behind a firewall with a port-forward.", + "default": 8060, + "scope": "resource" + }, + "brightscript.debug.logLevel": { + "type": "string", + "enum": [ + "off", + "error", + "warn", + "log", + "info", + "debug", + "trace" + ], + "default": "log", + "description": "The level of logging that should be done during a debug session.", + "scope": "resource" + } + } + }, + { + "id": "deviceControl", + "title": "Device Control (ECP)", + "properties": { + "brightscript.remoteControl.host": { + "type": "string", + "default": "${promptForHost}", + "description": "IP address of the roku to remotely control", + "scope": "resource" + }, + "brightscript.sendRemoteTextHistory.enabled": { + "type": "boolean", + "default": true, + "description": "If true, the extension will not save the history for 'extension.brightscript.sendRemoteText' commands", + "scope": "resource" + }, + "brightscript.sendRemoteTextHistory.limit": { + "type": "number", + "default": 30, + "description": "Sets the maximum number of 'extension.brightscript.sendRemoteText' commands to remember for future use", + "scope": "application" + }, + "brightscript.remoteControlMode.enableActiveAnimation": { + "type": "boolean", + "default": true, + "description": "Enables or disables visual animations related to the remote control mode button", + "scope": "resource" + } + } + }, + { + "id": "miscellaneous", + "title": "Miscellaneous", + "properties": { + "brightscript.extensionLogfilePath": { + "type": "string", + "deprecationMessage": "Use `fileLogging` option instead", + "description": "File where the 'BrightScript Extension' output panel (i.e. debug logs for the extension) will be appended. If omitted, no file logging will be done. ${workspaceFolder} is supported and will point to the first workspace found.", + "scope": "resource" + } + } + } + ], + "commands": [ + { + "command": "extension.brightscript.showReleaseNotes", + "title": "Show Release Notes", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.bsprofPause", + "title": "bsprof-pause - Pause BS profiling", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.bsprofResume", + "title": "bsprof-resume - Resume BS profiling", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.bsprofStatus", + "title": "bsprof-status - Get BS profiling status", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.chanperf", + "title": "chanperf - Show channel CPU and memory usage", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.chanperfChangeInterval", + "title": "chanperf - Change how often to show channel CPU and memory usage", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.clearLaunchCaches", + "title": "clear_launch_caches - Clear all caches that can affect channel launch time", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.fpsDisplay", + "title": "fps_display - Display onscreen graphics statistics", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.free", + "title": "free - Return the output of the free(1) command", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.genkey", + "title": "genkey - Generate a new developer key", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.loadedTextures", + "title": "loaded_textures - Show loaded textures", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.logrendezvous", + "title": "logrendezvous - Turn Rendezvous Logging on or off", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.plugins", + "title": "plugins - Show list of all installed plugins", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.r2d2bitmaps", + "title": "r2d2_bitmaps - Enumerate R2D2 bitmaps", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.removePlugin", + "title": "remove_plugin - Remove a plugin from the account and device", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgnodesAll", + "title": "sgnodes all - Logs every existing node created by the currently running channel", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgnodesRoots", + "title": "sgnodes roots - Logs every existing node without a parent created by the currently running channel", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgnodesNodeId", + "title": "sgnodes node_ID - Logs node(s) with an id field matching the supplied node_ID", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgperfStart", + "title": "sgperf start - Enables tracking of basic node operation performance metrics", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgperfStop", + "title": "sgperf stop - Disabled tracking of basic node operation performance metrics", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgperfClear", + "title": "sgperf clear - Resets basic node operation performance metrics", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.sgperfReport", + "title": "sgperf report - Logs the current node operation performance metrics", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.showkey", + "title": "showkey - Show the current developer key.", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.press", + "title": "press - Simulate a list of keypress'", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.brightscriptWarnings", + "title": "brightscript_warnings - Sets the maximum number of brightscript warnings to be displayed by the device on channel install'", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.custom8080Command", + "title": "custom - Enter any command string to be run on port 8080'", + "category": "Brightscript Debug" + }, + { + "command": "extension.brightscript.clearGlobalState", + "title": "Clear Global State", + "description": "Clear the BrightScript extension's global state.", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.toggleXML", + "title": "Toggle XML/BRS", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.sendRemoteCommand", + "title": "Send 'arg' button key press to Roku as a remote control", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.clearLogOutput", + "title": "Clear the brightscript log output", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.toggleRemoteControlMode", + "title": "Toggle remote control mode", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.enableRemoteControlMode", + "title": "Enable remote control mode", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.disableRemoteControlMode", + "title": "Disable remote control mode", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressBackButton", + "title": "Press the Back button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressBackspaceButton", + "title": "Press the Backspace button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressHomeButton", + "title": "Press the Home button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressUpButton", + "title": "Press the Up button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressDownButton", + "title": "Press the Down button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressRightButton", + "title": "Press the Right button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressLeftButton", + "title": "Press the Left button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressSelectButton", + "title": "Press the Select button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressPlayButton", + "title": "Press the Play button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressRevButton", + "title": "Press the Rev button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressFwdButton", + "title": "Press the Fwd button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressStarButton", + "title": "Press the Star button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressInstantReplayButton", + "title": "Press the Instant Replay button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressSearchButton", + "title": "Press the Search button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressEnterButton", + "title": "Press the Enter button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressFindRemote", + "title": "Press the FindRemote button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressVolumeDown", + "title": "Press the VolumeDown button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressVolumeMute", + "title": "Press the VolumeMute button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressVolumeUp", + "title": "Press the VolumeUp button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressPowerOff", + "title": "Press the PowerOff button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressPowerOn", + "title": "Press the PowerOn button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressChannelUp", + "title": "Press the ChannelUp button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.pressChannelDown", + "title": "Press the ChannelDown button on the Roku remote", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.changeTvInput", + "title": "Provides a list of possible inputs to change to", + "shortTitle": "Change TV Input", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.sendRemoteText", + "title": "Send text characters to the Roku Device", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.markLogOutput", + "title": "Mark Log Output", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.clearLogOutput", + "title": "Clear Log Output", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.setOutputIncludeFilter", + "title": "Set Log Output Include Filter", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.setOutputLogLevelFilter", + "title": "Set Log Output Level Filter", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.setOutputExcludeFilter", + "title": "Set Log Output Exclude Filter", + "category": "Brightscript" + }, + { + "command": "extension.brightscript.rendezvous.toggleSortMethod", + "title": "Toggle Sorting Method (smart > alphabetic)", + "category": "Brightscript Rendezvous", + "enablement": "debugType == 'brightscript'" + }, + { + "command": "extension.brightscript.rendezvous.toggleSortDirection", + "title": "Toggle Asc - Desc Sorting ", + "category": "Brightscript Rendezvous", + "enablement": "debugType == 'brightscript'" + }, + { + "command": "extension.brightscript.rendezvous.clearHistory", + "title": "Clear History", + "category": "Brightscript Rendezvous", + "icon": "$(clear-all)" + }, + { + "command": "brighterscript.showPreview", + "title": "Preview Transpiled code", + "category": "BrighterScript" + }, + { + "command": "brighterscript.showPreviewToSide", + "title": "Preview Transpiled code to the Side", + "category": "BrighterScript", + "icon": { + "light": "./images/icons/preview-right-light.svg", + "dark": "./images/icons/preview-right-dark.svg" + } + }, + { + "command": "extension.brightscript.refreshDeviceList", + "title": "Refresh", + "category": "BrightScript", + "icon": "$(refresh)" + }, + { + "command": "extension.brightscript.rokuRegistry.refreshRegistry", + "title": "Refresh Registry", + "category": "Roku Registry", + "icon": "$(refresh)" + }, + { + "command": "extension.brightscript.rokuRegistry.clearRegistry", + "title": "Clear Registry", + "category": "BrighterScript", + "icon": "$(trash)" + }, + { + "command": "extension.brightscript.rokuRegistry.importRegistry", + "title": "Import Registry", + "category": "BrighterScript", + "icon": "$(arrow-down)" + }, + { + "command": "extension.brightscript.rokuRegistry.exportRegistry", + "title": "Export Registry", + "category": "BrighterScript", + "icon": "$(arrow-up)" + }, + { + "command": "extension.brightscript.languageServer.restart", + "title": "Restart Language Server", + "category": "BrighterScript", + "icon": "$(refresh)" + }, + { + "command": "extension.brightscript.languageServer.info", + "title": "View BrighterScript LanguageServer Info", + "category": "BrighterScript" + }, + { + "command": "extension.brightscript.rokuDeviceView.enableNodeInspector", + "title": "Inspect nodes", + "category": "BrighterScript", + "icon": "$(inspect)" + }, + { + "command": "extension.brightscript.rokuDeviceView.disableNodeInspector", + "title": "Stop inspecting nodes", + "category": "BrighterScript", + "icon": "./images/icons/inspect-active.svg" + }, + { + "command": "extension.brightscript.rokuDeviceView.pauseScreenshotCapture", + "title": "Pause Screenshot Capture", + "category": "BrighterScript", + "icon": "$(debug-pause)" + }, + { + "command": "extension.brightscript.rokuDeviceView.resumeScreenshotCapture", + "title": "Resume Screenshot Capture", + "category": "BrighterScript", + "icon": "$(debug-start)" + }, + { + "command": "extension.brightscript.rokuDeviceView.refreshScreenshot", + "title": "Refresh Screenshot", + "category": "BrighterScript", + "icon": "$(refresh)" + }, + { + "command": "extension.brightscript.sceneGraphInspectorView.refreshNodeTree", + "title": "Refresh Nodetree", + "category": "BrighterScript", + "icon": "$(refresh)" + } + ], + "keybindings": [ + { + "command": "brighterscript.showPreview", + "key": "Ctrl+Shift+v", + "when": "editorLangId == brighterscript" + }, + { + "command": "extension.brightscript.pressBackButton", + "key": "Escape", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressBackButton", + "key": "Delete", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Ctrl+Delete", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Delete", + "mac": "Option+Delete", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Delete", + "mac": "Cmd+Delete", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressHomeButton", + "key": "Home", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressHomeButton", + "key": "Shift+Escape", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressHomeButton", + "key": "Ctrl+Escape", + "mac": "Cmd+Escape", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressInstantReplayButton", + "key": "Backspace", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressBackspaceButton", + "key": "Ctrl+Backspace", + "mac": "Cmd+Backspace", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Backspace", + "mac": "Option+Backspace", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Backspace", + "mac": "Ctrl+Backspace", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressUpButton", + "key": "Up", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Ctrl+Up", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Up", + "mac": "Option+Up", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Up", + "mac": "Cmd+Up", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressDownButton", + "key": "Down", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Ctrl+Down", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Down", + "mac": "Option+Down", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Down", + "mac": "Cmd+Down", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressRightButton", + "key": "Right", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressLeftButton", + "key": "Left", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressSelectButton", + "key": "Enter", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressPlayButton", + "key": "Ctrl+Enter", + "mac": "Cmd+Enter", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressPlayButton", + "key": "End", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Enter", + "mac": "Option+Enter", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Enter", + "mac": "Ctrl+Enter", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressPlayButton", + "key": "MediaPlayPause", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressRevButton", + "key": "Ctrl+Left", + "mac": "Cmd+Left", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Left", + "mac": "Option+Left", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Left", + "mac": "Ctrl+Left", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressRevButton", + "key": "PageDown", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressRevButton", + "key": "MediaTrackPrevious", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressFwdButton", + "key": "Ctrl+Right", + "mac": "Cmd+Right", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Alt+Right", + "mac": "Option+Right", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.doNothing", + "key": "Win+Right", + "mac": "Ctrl+Right", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressFwdButton", + "key": "PageUp", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressFwdButton", + "key": "MediaTrackNext", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressStarButton", + "key": "Ctrl+8", + "mac": "Cmd+8", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressStarButton", + "key": "Ctrl+Shift+8", + "mac": "Cmd+Shift+8", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.pressStarButton", + "key": "Insert", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.toggleRemoteControlMode", + "key": "Ctrl+k", + "mac": "Cmd+k" + }, + { + "command": "extension.brightscript.pressVolumeMute", + "key": "AudioVolumeMute", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+SPACE", + "key": "Space", + "args": " ", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+TAB", + "key": "Tab", + "args": "\t", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+!", + "key": "Shift+1", + "args": "!", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+@", + "key": "Shift+2", + "args": "@", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+#", + "key": "Shift+3", + "args": "#", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+$", + "key": "Shift+4", + "args": "$", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+%", + "key": "Shift+5", + "args": "%", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+^", + "key": "Shift+6", + "args": "^", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+&", + "key": "Shift+7", + "args": "&", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, { - "command": "extension.brightscript.bsprofPause", - "title": "bsprof-pause - Pause BS profiling", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+*", + "key": "Shift+8", + "args": "*", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.bsprofResume", - "title": "bsprof-resume - Resume BS profiling", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+(", + "key": "Shift+9", + "args": "(", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.bsprofStatus", - "title": "bsprof-status - Get BS profiling status", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+)", + "key": "Shift+0", + "args": ")", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.chanperf", - "title": "chanperf - Show channel CPU and memory usage", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+'", + "key": "'", + "args": "'", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.chanperfChangeInterval", - "title": "chanperf - Change how often to show channel CPU and memory usage", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+\"", + "key": "Shift+'", + "args": "\"", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.clearLaunchCaches", - "title": "clear_launch_caches - Clear all caches that can affect channel launch time", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii++", + "key": "Shift+=", + "args": "+", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.fpsDisplay", - "title": "fps_display - Display onscreen graphics statistics", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+,", + "key": ",", + "args": ",", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.free", - "title": "free - Return the output of the free(1) command", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+-", + "key": "-", + "args": "-", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.genkey", - "title": "genkey - Generate a new developer key", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+.", + "key": ".", + "args": ".", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.loadedTextures", - "title": "loaded_textures - Show loaded textures", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+/", + "key": "/", + "args": "/", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.logrendezvous", - "title": "logrendezvous - Turn Rendezvous Logging on or off", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+0", + "key": "0", + "args": "0", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.plugins", - "title": "plugins - Show list of all installed plugins", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+1", + "key": "1", + "args": "1", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.r2d2bitmaps", - "title": "r2d2_bitmaps - Enumerate R2D2 bitmaps", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+2", + "key": "2", + "args": "2", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.removePlugin", - "title": "remove_plugin - Remove a plugin from the account and device", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+3", + "key": "3", + "args": "3", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgnodesAll", - "title": "sgnodes all - Logs every existing node created by the currently running channel", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+4", + "key": "4", + "args": "4", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgnodesRoots", - "title": "sgnodes roots - Logs every existing node without a parent created by the currently running channel", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+5", + "key": "5", + "args": "5", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgnodesNodeId", - "title": "sgnodes node_ID - Logs node(s) with an id field matching the supplied node_ID", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+6", + "key": "6", + "args": "6", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgperfStart", - "title": "sgperf start - Enables tracking of basic node operation performance metrics", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+7", + "key": "7", + "args": "7", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgperfStop", - "title": "sgperf stop - Disabled tracking of basic node operation performance metrics", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+8", + "key": "8", + "args": "8", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgperfClear", - "title": "sgperf clear - Resets basic node operation performance metrics", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+9", + "key": "9", + "args": "9", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sgperfReport", - "title": "sgperf report - Logs the current node operation performance metrics", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+:", + "key": "Shift+;", + "args": ":", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.showkey", - "title": "showkey - Show the current developer key.", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+;", + "key": ";", + "args": ";", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.press", - "title": "press - Simulate a list of keypress'", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+<", + "key": "Shift+,", + "args": "<", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.custom8080Command", - "title": "custom - Enter any command string to be run on port 8080'", - "category": "Brightscript Debug" + "command": "extension.brightscript.sendAscii+=", + "key": "=", + "args": "=", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.clearGlobalState", - "title": "Clear Global State", - "description": "Clear the BrightScript extension's global state.", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+>", + "key": "Shift+.", + "args": ">", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.toggleXML", - "title": "Toggle XML/BRS", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+?", + "key": "Shift+/", + "args": "?", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sendRemoteCommand", - "title": "Send 'arg' button key press to Roku as a remote control", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+A", + "key": "Shift+a", + "args": "A", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.clearLogOutput", - "title": "Clear the brightscript log output", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+B", + "key": "Shift+b", + "args": "B", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressBackButton", - "title": "Press the Back button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+C", + "key": "Shift+c", + "args": "C", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressBackspaceButton", - "title": "Press the Backspace button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+D", + "key": "Shift+d", + "args": "D", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressHomeButton", - "title": "Press the Home button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+E", + "key": "Shift+e", + "args": "E", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressUpButton", - "title": "Press the Up button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+F", + "key": "Shift+f", + "args": "F", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressDownButton", - "title": "Press the Down button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+G", + "key": "Shift+g", + "args": "G", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressRightButton", - "title": "Press the Right button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+H", + "key": "Shift+h", + "args": "H", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressLeftButton", - "title": "Press the Left button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+I", + "key": "Shift+i", + "args": "I", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressSelectButton", - "title": "Press the Select button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+J", + "key": "Shift+j", + "args": "J", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressPlayButton", - "title": "Press the Play button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+K", + "key": "Shift+k", + "args": "K", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressRevButton", - "title": "Press the Rev button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+L", + "key": "Shift+l", + "args": "L", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressFwdButton", - "title": "Press the Fwd button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+M", + "key": "Shift+m", + "args": "M", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.pressStarButton", - "title": "Press the Star button on the Roku remote", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+N", + "key": "Shift+n", + "args": "N", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.sendRemoteText", - "title": "Send text characters to the Roku Device", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+O", + "key": "Shift+o", + "args": "O", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.markLogOutput", - "title": "Mark Log Output", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+P", + "key": "Shift+p", + "args": "P", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.clearLogOutput", - "title": "Clear Log Output", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+Q", + "key": "Shift+q", + "args": "Q", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.setOutputIncludeFilter", - "title": "Set Log Output Include Filter", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+R", + "key": "Shift+r", + "args": "R", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.setOutputLogLevelFilter", - "title": "Set Log Output Level Filter", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+S", + "key": "Shift+s", + "args": "S", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.setOutputExcludeFilter", - "title": "Set Log Output Exclude Filter", - "category": "Brightscript" + "command": "extension.brightscript.sendAscii+T", + "key": "Shift+t", + "args": "T", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.rendezvous.toggleSortMethod", - "title": "Toggle Sorting Method (smart > alphabetic)", - "category": "Brightscript Rendezvous", - "enablement": "debugType == 'brightscript'" + "command": "extension.brightscript.sendAscii+U", + "key": "Shift+u", + "args": "U", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.rendezvous.toggleSortDirection", - "title": "Toggle Asc - Desc Sorting ", - "category": "Brightscript Rendezvous", - "enablement": "debugType == 'brightscript'" + "command": "extension.brightscript.sendAscii+V", + "key": "Shift+v", + "args": "V", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.rendezvous.clearHistory", - "title": "Clear History", - "category": "Brightscript Rendezvous", - "enablement": "debugType == 'brightscript'" + "command": "extension.brightscript.sendAscii+W", + "key": "Shift+w", + "args": "W", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "brighterscript.showPreview", - "title": "Preview Transpiled code", - "category": "BrighterScript" + "command": "extension.brightscript.sendAscii+X", + "key": "Shift+x", + "args": "X", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "brighterscript.showPreviewToSide", - "title": "Preview Transpiled code to the Side", - "category": "BrighterScript", - "icon": { - "light": "./images/preview-right-light.svg", - "dark": "./images/preview-right-dark.svg" - } + "command": "extension.brightscript.sendAscii+Y", + "key": "Shift+y", + "args": "Y", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.languageServer.restart", - "title": "Restart Language Server", - "category": "BrightScript", - "icon": "$(refresh)" + "command": "extension.brightscript.sendAscii+Z", + "key": "Shift+z", + "args": "Z", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "command": "extension.brightscript.languageServer.info", - "title": "View BrighterScript LanguageServer Info", - "category": "BrightScript" - } - ], - "keybindings": [ + "command": "extension.brightscript.sendAscii+[", + "key": "[", + "args": "[", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, { - "key": "ctrl+shift+v", - "command": "brighterscript.showPreview", - "when": "editorLangId == brighterscript" + "command": "extension.brightscript.sendAscii+\\", + "key": "\\", + "args": "\\", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "ctrl+k v", - "command": "brighterscript.showPreviewToSide", - "when": "editorLangId == brighterscript" + "command": "extension.brightscript.sendAscii+]", + "key": "]", + "args": "]", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "Backspace", - "command": "extension.brightscript.pressBackButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+_", + "key": "Shift+-", + "args": "_", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+Backspace", - "mac": "cmd+Backspace", - "command": "extension.brightscript.pressBackspaceButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+`", + "key": "`", + "args": "`", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "Escape", - "command": "extension.brightscript.pressHomeButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+a", + "key": "a", + "args": "a", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "up", - "command": "extension.brightscript.pressUpButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+b", + "key": "b", + "args": "b", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "down", - "command": "extension.brightscript.pressDownButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+c", + "key": "c", + "args": "c", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "right", - "command": "extension.brightscript.pressRightButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+d", + "key": "d", + "args": "d", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "left", - "command": "extension.brightscript.pressLeftButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+e", + "key": "e", + "args": "e", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "Enter", - "command": "extension.brightscript.pressSelectButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+f", + "key": "f", + "args": "f", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+Enter", - "mac": "cmd+Enter", - "command": "extension.brightscript.pressPlayButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+g", + "key": "g", + "args": "g", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+left", - "mac": "cmd+left", - "command": "extension.brightscript.pressRevButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+h", + "key": "h", + "args": "h", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+right", - "mac": "cmd+right", - "command": "extension.brightscript.pressFwdButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+i", + "key": "i", + "args": "i", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+8", - "mac": "cmd+8", - "command": "extension.brightscript.pressStarButton", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible && !searchViewletVisible" + "command": "extension.brightscript.sendAscii+j", + "key": "j", + "args": "j", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+k", - "mac": "cmd+k", - "command": "extension.brightscript.sendRemoteText", - "when": "panelFocus && !inDebugRepl && !findWidgetVisible" + "command": "extension.brightscript.sendAscii+k", + "key": "k", + "args": "k", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+l", + "key": "l", + "args": "l", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "ctrl+l", - "mac": "ctrl+l", - "command": "extension.brightscript.markLogOutput" + "command": "extension.brightscript.sendAscii+m", + "key": "m", + "args": "m", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "ctrl+alt+k", - "mac": "ctrl+alt+k", - "command": "extension.brightscript.clearLogOutput" + "command": "extension.brightscript.sendAscii+n", + "key": "n", + "args": "n", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+ctrl+l", - "mac": "cmd+ctrl+l", - "command": "extension.brightscript.setOutputLogLevelFilter" + "command": "extension.brightscript.sendAscii+o", + "key": "o", + "args": "o", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+ctrl+i", - "mac": "cmd+ctrl+i", - "command": "extension.brightscript.setOutputIncludeFilter" + "command": "extension.brightscript.sendAscii+p", + "key": "p", + "args": "p", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" }, { - "key": "win+ctrl+x", - "mac": "cmd+ctrl+x", - "command": "extension.brightscript.setOutputExcludeFilter" + "command": "extension.brightscript.sendAscii+q", + "key": "q", + "args": "q", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+r", + "key": "r", + "args": "r", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+s", + "key": "s", + "args": "s", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+t", + "key": "t", + "args": "t", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+u", + "key": "u", + "args": "u", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+v", + "key": "v", + "args": "v", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+w", + "key": "w", + "args": "w", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+x", + "key": "x", + "args": "x", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+y", + "key": "y", + "args": "y", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+z", + "key": "z", + "args": "z", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+{", + "key": "Shift+[", + "args": "{", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+|", + "key": "Shift+\\", + "args": "|", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+}", + "key": "Shift+]", + "args": "}", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.sendAscii+~", + "key": "Shift+`", + "args": "~", + "when": "!searchInputBoxFocus && !findInputFocussed && !inCommandsPicker && !inQuickOpen && brightscript.isRemoteControlMode" + }, + { + "command": "extension.brightscript.markLogOutput", + "key": "Ctrl+l", + "mac": "Ctrl+l" + }, + { + "command": "extension.brightscript.clearLogOutput", + "key": "Ctrl+Alt+k", + "mac": "Ctrl+Option+k" + }, + { + "command": "extension.brightscript.setOutputLogLevelFilter", + "key": "Win+Ctrl+l", + "mac": "Cmd+Ctrl+l" + }, + { + "command": "extension.brightscript.setOutputIncludeFilter", + "key": "Win+Ctrl+i", + "mac": "Cmd+Ctrl+i" + }, + { + "command": "extension.brightscript.setOutputExcludeFilter", + "key": "Win+Ctrl+x", + "mac": "Cmd+Ctrl+x" + } + ], + "problemPatterns": [ + { + "name": "bsc", + "regexp": "^(.+?):(\\d+):(\\d+)(?:-(\\d+):(\\d+))?\\s*-\\s*(error|warning|info|hint)\\s+([a-zA-Z_\\-\\d]+):\\s*(.*)$", + "file": 1, + "line": 2, + "column": 3, + "endLine": 4, + "endColumn": 5, + "severity": 6, + "code": 7, + "message": 8 + } + ], + "problemMatchers": [ + { + "name": "bsc", + "label": "BrighterScript problems", + "owner": "brightscript", + "source": "brightscript", + "applyTo": "allDocuments", + "fileLocation": [ + "relative", + "${cwd}" + ], + "pattern": "$bsc" + }, + { + "name": "bsc-watch", + "label": "BrighterScript problems (watch mode)", + "owner": "brightscript", + "source": "brs", + "applyTo": "allDocuments", + "fileLocation": [ + "relative", + "${cwd}" + ], + "pattern": "$bsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "^\\[(?:\\d+|:|\\s|AM|PM)+\\]\\s*((File change detected\\.+\\s*Starting incremental compilation)|(Starting compilation in watch mode))\\.+" + }, + "endsPattern": { + "regexp": "^\\[(?:\\d+|:|\\s|AM|PM)+\\]\\s*(?:Compilation complete\\.|Found \\d+ errors?\\.)?\\s*Watching for file changes\\.+" + } + } + }, + { + "name": "bsc-watch-silent", + "label": "BrighterScript problems (watch mode) but don't emit any diagnostics", + "owner": "brightscript", + "source": "brs", + "applyTo": "allDocuments", + "pattern": { + "regexp": "^neverMatchThisPattern_likeSeriously,weShouldNeverMatchAnything$" + }, + "fileLocation": [ + "relative", + "${cwd}" + ], + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "^\\[(?:\\d+|:|\\s|AM|PM)+\\]\\s*((File change detected\\.+\\s*Starting incremental compilation)|(Starting compilation in watch mode))\\.+" + }, + "endsPattern": { + "regexp": "^\\[(?:\\d+|:|\\s|AM|PM)+\\]\\s*(?:Compilation complete\\.|Found \\d+ errors?\\.)?\\s*Watching for file changes\\.+" + } + } } ] }, @@ -1907,10 +3522,25 @@ ] } }, + "mocha": { + "spec": [ + "src/**/*.spec.ts", + "webviews/src/**/*.spec.ts" + ], + "require": [ + "source-map-support/register", + "ts-node/register" + ], + "bail": false, + "fullTrace": true, + "watchExtensions": [ + "ts" + ] + }, "nyc": { "include": [ "src/**/!(*.spec).ts", - "ui/**/!(*.spec).ts" + "webviews/**/!(*.spec).ts" ], "extension": [ ".ts" diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 0a9705eb..00000000 --- a/rollup.config.js +++ /dev/null @@ -1,52 +0,0 @@ -import svelte from 'rollup-plugin-svelte'; -import resolve from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import { terser } from 'rollup-plugin-terser'; -import autoPreprocess from 'svelte-preprocess'; -import typescript from '@rollup/plugin-typescript'; -import css from 'rollup-plugin-css-only'; - -const production = !process.env.ROLLUP_WATCH; - -export default { - input: 'ui/rdb/index.ts', - output: { - dir: "dist/ui/rdb", - sourcemap: true, - format: 'iife', - name: 'app' - }, - plugins: [ - css({ - output: 'bundle.css' - }), - svelte({ - compilerOptions: { - dev: !production - }, - preprocess: autoPreprocess() - }), - typescript({ - tsconfig: "./ui/tsconfig.json", - sourceMap: true - }), - - // If you have external dependencies installed from - // npm, you'll most likely need these plugins. In - // some cases you'll need additional configuration - - // consult the documentation for details: - // https://github.com/rollup/plugins/tree/master/packages/commonjs - resolve({ - browser: true, - dedupe: ['svelte'] - }), - commonjs(), - - // If we're building for production (npm run build - // instead of npm run dev), minify - production && terser() - ], - watch: { - clearScreen: false - } -}; diff --git a/scripts/create-vsix.js b/scripts/create-vsix.js index 2016fb35..acd8b480 100644 --- a/scripts/create-vsix.js +++ b/scripts/create-vsix.js @@ -18,7 +18,7 @@ function main() { 'vscode-brightscript-language', hasBranch('vscode-brightscript-language', branch) ? branch : 'master' ); - const buildVersion = `9001.0.0-${branch.replace(/[^a-zA-Z_0-9]/g, '-')}.${Date.now()}`; + const buildVersion = `9001.0.0-${branch.replace(/[^a-zA-Z0-9]/g, '-')}.${Date.now()}`; //bump the version for this build changeVersion('vscode-brightscript-language', buildVersion); diff --git a/scripts/install-local.js b/scripts/install-local.js index e7a54c04..1436f2ba 100644 --- a/scripts/install-local.js +++ b/scripts/install-local.js @@ -2,12 +2,19 @@ * Installs a local version of all the rokucommunity dependent packages into this project */ -var fsExtra = require('fs-extra'); -var path = require('path'); -var childProcess = require('child_process'); -var chalk = require('chalk'); +let path = require('path'); +let childProcess = require('child_process'); -var argv = require('yargs').argv; +//run `npm install` first before the rest of this script +childProcess.execSync('npm install', { + cwd: path.normalize(path.join(__dirname, '../')), + stdio: 'inherit' +}); + +let fsExtra = require('fs-extra'); +let chalk = require('chalk'); + +let argv = require('yargs').argv; let packages = [ 'roku-debug', @@ -43,7 +50,7 @@ for (let packageName of packages) { }); } - //install all npm dependencies + //install all npm dependencies console.log(`Installing npm packages for '${packageName}'`); try { childProcess.execSync(`npm install`, { diff --git a/scripts/releases.ts b/scripts/releases.ts new file mode 100644 index 00000000..724af873 --- /dev/null +++ b/scripts/releases.ts @@ -0,0 +1,515 @@ +/** + * This script automates the releases of all the RokuCommunity projects. + * You must have push and tag access to the repositories to use this script. + */ +import * as yargs from 'yargs'; +import * as fsExtra from 'fs-extra'; +import { standardizePath as s } from 'brighterscript'; +import { execSync, exec } from 'child_process'; +import * as chalk from 'chalk'; +import * as semver from 'semver'; +import * as prompt from 'prompt'; +import latestVersion from 'latest-version'; +import * as terminalOverwrite from 'terminal-overwrite'; +import * as notifier from 'node-notifier'; + +class Runner { + private tempDir = s`${__dirname}/../.tmp/.releases`; + + private options: { + groups: string[]; + projects: string[]; + test: boolean; + force: boolean; + }; + + public async run(options: Runner['options']) { + this.options = options; + console.log('Creating tempDir', this.tempDir); + fsExtra.emptyDirSync(this.tempDir); + + options.groups ??= []; + + //clone all projects + console.log('Cloning projects'); + for (const project of this.projects) { + this.cloneProject(project); + } + + const projects = this.projects + //filter by group + .filter(x => options.groups.length === 0 || x?.groups?.find(g => options.groups.includes(g))) + //filter by project name + .filter(x => options.projects.length === 0 || options.projects.includes(x.name)); + + console.log('Selected projects:', projects.map(x => x.name)); + + for (const project of projects) { + console.log(''); + await this.processProject(project); + } + } + + private async processProject(project: Project) { + const lastTag = this.getLastTag(project.dir); + const latestReleaseVersion = lastTag.replace(/^v/, ''); + this.log(project, `Last release was ${lastTag}`); + + this.log(project, 'installing npm packages'); + execSync(`npm install`, { cwd: project.dir }); + + this.installDependencies(project, latestReleaseVersion); + + this.computeChanges(project, lastTag); + + if (!this.options.force && project.changes.length === 0) { + this.log(project, 'Nothing has changed since last release'); + return; + } + await this.doRelease(project, lastTag); + } + + /** + * Prompt the user for a response, and only accept certain values + */ + private async prompt(message: string, actions: string[]) { + const input = await prompt.get({ + properties: { + action: { + description: message, + pattern: new RegExp(`^((${actions.join(')|(')}))$`, 'i'), + required: true + } + } + }); + const action = input?.action?.toString()?.toLowerCase(); + return action; + } + + /** + * Find the year-month-day of the specified release from git logs + */ + private getVersionDate(cwd: string, version: string) { + const logOutput = execSync('git log --tags --simplify-by-decoration --pretty="format:%ci %d"', { cwd: cwd }).toString(); + const [, date] = new RegExp(String.raw`(\d+-\d+-\d+).*?tag:[ \t]*v${version.replace('.', '\\.')}`, 'gmi').exec(logOutput) ?? []; + return date; + } + + private async doRelease(project: Project, lastTag: string) { + const [month, day, year] = new Date().toLocaleDateString().split('/'); + + function getReflink(project: Project, commit: Commit, includeProjectName = false) { + let preHashName = includeProjectName ? project.name : undefined; + if (commit.prNumber) { + return `[${preHashName ?? ''}#${commit.prNumber}](${project.repositoryUrl}/pull/${commit.prNumber})`; + } else { + preHashName = preHashName ? '#' + preHashName : ''; + return `[${preHashName}${commit.hash}](${project.repositoryUrl}/commit/${commit.hash})`; + } + } + + const lines = [ + '', '', '', '', + `## [UNRELEASED](${project.repositoryUrl}/compare/${lastTag}...UNRELEASED) - ${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`, + `### Changed` + ]; + //add lines for each commit since last release + for (const commit of this.getCommitLogs(project.name, lastTag, 'HEAD')) { + lines.push(` - ${commit.message} (${getReflink(project, commit)})`); + } + + //build changelog entries for each new dependency + for (const dependency of [...project.dependencies, ...project.devDependencies]) { + if (dependency.previousReleaseVersion !== dependency.newVersion) { + const dependencyProject = this.getProject(dependency.name); + lines.push([ + ` - upgrade to [${dependency.name}@${dependency.newVersion}]`, + `(${dependencyProject.repositoryUrl}/blob/master/CHANGELOG.md#`, + `${dependency.newVersion.replace(/\./g, '')}---${this.getVersionDate(dependencyProject.dir, dependency.newVersion)}). `, + `Notable changes since ${dependency.previousReleaseVersion}:` + ].join('')); + for (const commit of this.getCommitLogs(dependencyProject.name, dependency.previousReleaseVersion, dependency.newVersion)) { + lines.push(` - ${commit.message} (${getReflink(dependencyProject, commit, true)})`); + } + } + } + + const changelogPath = s`${project.dir}/CHANGELOG.md`; + + let changelog = fsExtra.readFileSync(changelogPath).toString(); + const [eolChar] = /\r?\n/.exec(changelog) ?? ['\r\n']; + const marker = 'this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).'; + + changelog = changelog.replace( + marker, + marker + lines.join(eolChar) + ); + fsExtra.outputFileSync(changelogPath, changelog); + try { + notifier.notify({ + title: `${project.name}: ready to release`, + message: `Please review the changelog for ${project.name}` + }); + } catch { } + let targetVersion = ''; + while (true) { + console.log('\nChangelog for ', chalk.green(project.name), ': ', chalk.yellow(changelogPath)); + const action = await this.prompt( + 'Review and edit the changelog (link shown above). Type "continue" to continue, or "skip" to skip this release.', + ['skip', 'continue'] + ); + if (action === 'skip') { + this.log(project, 'Skipping release'); + return; + } else if (action === 'continue') { + //get the latest version from the changelog. that's what we'll use for the `npm version` call + [, targetVersion] = /##\s*\[(.*?)\]/.exec( + fsExtra.readFileSync(changelogPath).toString() + ) ?? []; + if (!semver.valid(targetVersion)) { + console.error(`Invalid version "${targetVersion}"`); + } else { + break; + } + } else { + console.error('Invalid input. Please enter a valid action'); + } + } + + this.log(project, 'Committing changelog'); + execSync(`git add -A && git commit -m "Update changelog for v${targetVersion}"`, { cwd: project.dir, stdio: 'inherit' }); + + //keep trying to run `npm version` until it succeeds, or until the user cancels + while (true) { + try { + this.log(project, `Executing "npm version ${targetVersion}"`); + execSync(`npm version ${targetVersion}`, { cwd: project.dir, stdio: 'inherit' }); + //no exceptions occurred. escape this loop + break; + } catch { + const action = await this.prompt( + `Encountered an exception while versioning "${chalk.green(project.name)}". Fix the issues in "${chalk.green(project.dir)}", then type "retry". Type "skip" to skip this release, or "cancel" to cancel the entire process"`, + ['retry', 'cancel', 'skip'] + ); + if (action === 'retry') { + //commit any changes in the directory (so the dev doesn't have to do that manually themselves) + execSync(`git commit --all -m "Fixing issues before release ${targetVersion}"`, { cwd: project.dir, stdio: 'inherit' }); + continue; + } else if (action === 'cancel') { + throw new Error('Cancelling release'); + } else if (action === 'skip') { + this.log(project, 'Release skipped'); + return; + } + } + } + + this.log(project, 'pushing release to github'); + if (this.options.test) { + this.log(project, 'TEST MODE: skipping command "git push origin master --tags"'); + } else { + execSync('git push origin master --tags', { cwd: project.dir, stdio: 'inherit' }); + } + + //wait for the npm package to show up in the registry, then move on to the next project + await this.waitForLatestVersion(project, targetVersion); + } + + private async waitForLatestVersion(project: Project, targetVersion: string) { + let isFinished; + const interval = 15 * 1000; + const initialDelay = (60 * 1000) - interval; + + //if in test mode, do a small timeout to simulate waiting for latest version, then mark finished + if (this.options.test) { + setTimeout(() => { + isFinished = true; + }, 5000); + } else { + setTimeout(() => { + const handle = setInterval(() => { + void latestVersion(project.npmName).then((result) => { + if (result === targetVersion) { + isFinished = true; + clearInterval(handle); + } + }); + }, interval); + //publishing takes several minutes, so don't start monitoring for a little while... + }, initialDelay); + } + const startTime = Date.now(); + while (true) { + await this.sleep(1000); + if (isFinished) { + break; + } + const totalSeconds = Math.round((Date.now() - startTime) / 1000) + 's'; + terminalOverwrite(`${chalk.green(project.name)}: Waiting for npm to publish package (${totalSeconds})`); + } + terminalOverwrite(`${chalk.green(project.name)}: package successfully published to npm`); + } + + private sleep(timeout: number) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, timeout); + }); + } + + /** + * read the dependency version from the specified release commit + */ + private getDependencyVersionFromRelease(project: Project, releaseVersion: string, packageName: string, dependencyType: 'dependencies' | 'devDependencies') { + const output = execSync(`git show v${releaseVersion}:package.json`, { cwd: project.dir }).toString(); + const packageJson = JSON.parse(output); + const version = packageJson?.[dependencyType][packageName]; + return /\d+\.\d+\.\d+/.exec(version)?.[0] as string; + } + + private installDependencies(project: Project, latestReleaseVersion: string) { + this.log(project, 'installing', project.dependencies.length, 'dependencies and', project.devDependencies.length, 'devDependencies'); + + const install = (project: Project, dependencyType: 'dependencies' | 'devDependencies', flags?: string) => { + for (const dependency of project[dependencyType]) { + dependency.previousReleaseVersion = this.getDependencyVersionFromRelease(project, latestReleaseVersion, dependency.name, dependencyType); + const currentVersion = fsExtra.readJsonSync(s`${project.dir}/node_modules/${dependency.name}/package.json`).version; + + execSync(`npm install ${dependency.name}@latest`, { cwd: project.dir, stdio: 'inherit' }); + + dependency.newVersion = fsExtra.readJsonSync(s`${project.dir}/node_modules/${dependency.name}/package.json`).version; + + if (dependency.newVersion !== currentVersion) { + this.log(project, `Updated ${chalk.green(dependency.name)} from ${chalk.yellow(currentVersion)} to ${chalk.yellow(dependency.newVersion)}`); + } + } + }; + + install(project, 'dependencies'); + install(project, 'devDependencies', '--save-dev'); + } + + private computeChanges(project: Project, lastTag: string) { + project.changes.push( + ...this.getCommitLogs(project.name, lastTag, 'HEAD') + ); + //get commits from any changed dependencies + for (const dependency of [...project.dependencies, ...project.devDependencies]) { + //the dependency has changed + if (dependency.previousReleaseVersion !== dependency.newVersion) { + project.changes.push( + ...this.getCommitLogs(dependency.name, dependency.previousReleaseVersion, dependency.newVersion) + ); + } + } + } + + /** + * Get the project with the specified name + */ + private getProject(projectName: string) { + return this.projects.find(x => x.name === projectName)!; + } + + private getCommitLogs(projectName: string, startVersion: string, endVersion: string) { + startVersion = startVersion.startsWith('v') ? startVersion : 'v' + startVersion; + endVersion = endVersion.startsWith('v') || endVersion === 'HEAD' ? endVersion : 'v' + endVersion; + const project = this.getProject(projectName); + const commitMessages = execSync(`git log ${startVersion}...${endVersion} --oneline`, { + cwd: project?.dir + }).toString() + .split(/\r?\n/g) + //exclude empty lines + .filter(x => x.trim()) + .map(x => { + const [, hash, branchInfo, message, prNumber] = /\s*([a-z0-9]+)\s*(?:\((.*?)\))?\s*(.*?)\s*(?:\(#(\d+)\))?$/gm.exec(x) ?? []; + return { + hash: hash, + branchInfo: branchInfo, + message: message ?? x, + prNumber: prNumber + }; + }) + //exclude version-only commit messages + .filter(x => !semver.valid(x.message)) + //exclude those "update changelog for..." message + .filter(x => !x.message.toLowerCase().startsWith('update changelog for ')); + + + return commitMessages; + } + + /** + * Find the highest non-prerelease tag for this repository + */ + private getLastTag(cwd: string) { + const allTags = semver.sort( + execSync(`git tag --sort version:refname`, { cwd: cwd }) + .toString() + .split(/\r?\n/) + .map(x => x.trim()) + //only keep valid version tags + .filter(x => semver.valid(x)) + //exclude prerelease versions + .filter(x => !semver.prerelease(x)) + ).reverse(); + + return allTags[0]; + } + + private log(project: Project, ...messages: any[]) { + console.log(`${chalk.green(project.name)}:`, ...messages); + } + + private cloneProject(project: Project) { + const repoName = project.name.split('/').pop(); + + let url = project.repositoryUrl; + if (!url) { + url = `https://github.com/rokucommunity/${repoName}`; + } + + //clone the project + project.dir = s`${this.tempDir}/${repoName}`; + console.log(`Cloning ${url}`); + execSync(`git clone "${url}" "${project.dir}"`); + } + + private projects: Project[] = [{ + name: 'roku-deploy', + dependencies: [], + groups: ['vscode'] + }, { + name: '@rokucommunity/logger', + dependencies: [], + groups: ['vscode'] + }, { + name: '@rokucommunity/bslib', + dependencies: [], + groups: ['vscode'] + }, { + name: 'brighterscript', + dependencies: [ + '@rokucommunity/bslib', + 'roku-deploy' + ], + groups: ['vscode'] + }, { + name: 'roku-debug', + dependencies: [ + 'brighterscript', + '@rokucommunity/logger', + 'roku-deploy' + ], + groups: ['vscode'] + }, { + name: 'brighterscript-formatter', + dependencies: [ + 'brighterscript' + ], + groups: ['vscode'] + }, { + name: 'bslint', + npmName: '@rokucommunity/bslint', + dependencies: [], + devDependencies: [ + 'brighterscript' + ] + }, { + name: 'ropm', + dependencies: [ + 'brighterscript', + 'roku-deploy' + ] + }, { + name: 'roku-report-analyzer', + dependencies: [ + '@rokucommunity/logger', + 'brighterscript' + ] + }, { + name: 'vscode-brightscript-language', + dependencies: [ + 'roku-deploy', + 'roku-debug', + 'brighterscript', + 'brighterscript-formatter' + ], + groups: ['vscode'] + }, { + name: 'roku-promise', + dependencies: [] + }].map(project => { + const repoName = project.name.split('/').pop(); + return { + ...project, + dir: s`${this.tempDir}/${repoName}`, + dependencies: project.dependencies?.map(d => ({ + name: d, + previousReleaseVersion: undefined as any, + newVersion: undefined as any + })) ?? [], + devDependencies: project.devDependencies?.map(d => ({ + name: d, + previousReleaseVersion: undefined as any, + newVersion: undefined as any + })) ?? [], + npmName: project.npmName ?? project.name, + repositoryUrl: (project as any).repositoryUrl ?? `https://github.com/rokucommunity/${repoName}`, + changes: [] + }; + }); +} + + +interface Project { + name: string; + /** + * The name of the package on npm. Defaults to `project.name` + */ + npmName: string; + repositoryUrl: string; + /** + * The directory where this project is cloned. + */ + dir: string; + dependencies: Array<{ + name: string; + previousReleaseVersion: string; + newVersion: string; + }>; + devDependencies: Array<{ + name: string; + previousReleaseVersion: string; + newVersion: string; + }>; + groups?: string[]; + /** + * A list of changes to be included in the changelog. If non-empty, this indicates the package needs a new release + */ + changes: Commit[]; +} + +interface Commit { + hash: string; + branchInfo: string; + message: string; + prNumber: string; +} + +let options = yargs + .usage('$0', 'BrighterScript, a superset of Roku\'s BrightScript language') + .help('help', 'View help information about this tool.') + .option('groups', { type: 'array', description: 'What project groups should be run. Defaults to every registered project', default: [] }) + .option('projects', { alias: 'project', type: 'array', description: 'What projects should be run. Defaults to every registered project', default: [] }) + .option('force', { type: 'boolean', description: 'Should releases be forced, even if there were no changes?', default: false }) + .option('test', { type: 'boolean', description: 'Tests a release but does not actually publish the release.', default: false }) + .argv; + +let builder = new Runner(); +builder.run(options).catch((error) => { + console.error(error); + process.exit(1); +}); + diff --git a/scripts/sync-launch-settings.ts b/scripts/sync-launch-settings.ts new file mode 100644 index 00000000..def4de14 --- /dev/null +++ b/scripts/sync-launch-settings.ts @@ -0,0 +1,56 @@ +console.log('Sync settings from launch to debug`'); +console.log('==================================='); +const packageJsonFile = '../package.json'; +const packageJson = require(packageJsonFile); +const { EOL } = require('os'); +const fs = require('fs'); + +// extract object from 'package.json' +const configurationArray = packageJson.contributes.configuration; + +const newDebugProperties = {}; +let debugIndex; + +for (let index = 0; index < configurationArray.length; index++) { + const configurationItem = configurationArray[index]; + if (configurationItem.id === 'debug') { + debugIndex = index; + const debugProperties = configurationItem.properties; + for (const [key, data] of Object.entries(debugProperties)) { + // start off by just copying over the existing values (straight 1-1 copy) + newDebugProperties[key] = data; + } + } +} + +// now have to also join in data from package.json .... other part of file ... +const launchProperties = packageJson.contributes.debuggers[0].configurationAttributes.launch.properties; + +for (const [key, data] of Object.entries(launchProperties)) { + const launchProperty = {}; + for (const [dataKey, dataValue] of Object.entries(data)) { + launchProperty[dataKey] = dataValue; + } + const scope = 'scope'; + launchProperty[scope] = 'resource'; + const brightscriptDebugKey = 'brightscript.debug.' + key; + // note: if duplicate keys exist, we overwrite (new source data should be identical anyway) + newDebugProperties[brightscriptDebugKey] = launchProperty; +} + +// have to parse final output object to get clean JSON +const newDebugPropertiesParsed = JSON.parse(JSON.stringify(newDebugProperties)) + +// finally replace elements back into 'package.json' file +configurationArray[debugIndex].properties = newDebugPropertiesParsed; +packageJson.contributes.configuration = configurationArray; + +try { + fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 4), 'utf8'); + fs.appendFileSync(packageJsonFile, EOL, 'utf8'); +} catch (e) { + console.error(e); +} + +console.log('launch settings synchronised with debug settings inside package.json file'); +console.log(packageJson.contributes.configuration); diff --git a/scripts/watch-all.ts b/scripts/watch-all.ts new file mode 100644 index 00000000..298f25a4 --- /dev/null +++ b/scripts/watch-all.ts @@ -0,0 +1,165 @@ +import * as fsExtra from 'fs-extra'; +import * as path from 'path'; +import { spawn } from 'child_process'; +import * as debounce from 'debounce'; +import * as chalk from 'chalk'; +import * as dayjs from 'dayjs'; +import * as deferred from 'deferred'; + +class Logger { + private canReplaceLine = false; + public writeLine(message = '', isReplaceable = false) { + if (this.canReplaceLine && isReplaceable) { + process.stdout.write('\r'); + } else { + process.stdout.write('\r\n'); + } + process.stdout.write(message); + this.canReplaceLine = isReplaceable; + } +} + +const logger = new Logger(); + +logger.writeLine(`${timestamp()} Starting compilation in watch mode...`); + +//run watch tasks for every related project, in a single output window so we don't have 7 console tabs open +const projects = [{ + name: 'brighterscript' +}, { + name: 'roku-deploy' +}, { + name: 'roku-debug' +}, { + name: 'brighterscript-formatter' +}, { + name: 'vscode-brightscript-language', + dependencies: [ + 'brighterscript', + 'roku-deploy', + 'roku-debug', + 'brighterscript-formatter' + ] +}].map(x => { + return { + ...x, + dependencies: x.dependencies ?? [], + path: path.resolve(__dirname, '..', '..', x.name), + state: 'pending' as 'pending' | 'error' | 'success', + diagnostics: [] as undefined | ReturnType, + firstCompletion: deferred() as { resolve: () => void; reject: () => void; resolved: boolean; promise: Promise } + }; +}).filter(x => { + return fsExtra.pathExistsSync(x.path); +}); +type Project = typeof projects[0]; + +function timestamp() { + return dayjs(Date.now()).format('h:mm:ss A'); +} + +function processData(project: Project, source: 'stdout' | 'stderr', data: string) { + for (const line of data?.split(/\r?\n/g) ?? []) { + const [, errorCount] = /Found\s+(\d+)\s+error[s]?\.\s+Watching\s+for\s+file\s+changes/i.exec(line) ?? []; + if (errorCount === '0') { + project.state = 'success'; + if (!project.firstCompletion.resolved) { + project.firstCompletion.resolve(); + } + } else if (errorCount !== undefined) { + project.state = 'error'; + if (!project.firstCompletion.resolved) { + project.firstCompletion.resolve(); + } + } + + //if file changes were detected, clear the diagnostics + if (/File change detected. Starting incremental compilation/.exec(line)) { + //don't log "changes detected" if we're already pending + if (project.state !== 'pending') { + logger.writeLine(chalk.yellow(project.name)); + logger.writeLine(`[${timestamp()}] File change detected. Starting incremental compilation...`); + } + project.state = 'pending'; + project.diagnostics = []; + } + + //collect any new diagnostics that were emitted + (project.diagnostics ??= []).push( + ...getDiagnostics(line) + ); + + if (source === 'stderr') { + process[source].write(chalk.red('---' + chalk.green(project.name) + '---\n' + line)); + } + } + printStatus(); +} + +const printStatus = debounce(() => { + let errorCount = 0; + let pendingCount = 0; + const diagnostics = []; + let status = projects.map(project => { + if (project.state === 'success') { + return chalk.green(`✔ ${project.name}`); + } else if (project.state === 'error') { + return chalk.red(`✖ ${project.name}`); + } else { + pendingCount++; + return chalk.grey(`◌ ${project.name}`); + } + }); + + // .replace(/\x1b/g, ''); + logger.writeLine(status.join(', '), true); + if (pendingCount === 0) { + for (const project of projects) { + if ((project.diagnostics?.length ?? 0) > 0) { + logger.writeLine(`${chalk.red(project.name)} diagnostics:\n`); + for (const diagnostic of project.diagnostics ?? []) { + logger.writeLine( + diagnostic.raw?.replace(diagnostic.path!, path.normalize(path.join('../', diagnostic.path!))) + ); + } + } + } + logger.writeLine(`\n[${timestamp()}] Found ${errorCount} errors. Watching for file changes.\n`); + } +}, 100, false); + +function getDiagnostics(data: string) { + return [...data.matchAll(/^([^\s].*)[\(:](\d+)[,:](\d+)(?:\):\s+|\s+-\s+)(error|warning|info)\s+TS(\d+)\s*:\s*(.*)$/gm)].map((match) => { + return { + raw: match.shift(), + path: match.shift(), + line: match.shift(), + character: match.shift(), + severity: match.shift(), + code: match.shift(), + message: match.shift() + }; + }); +} + + +// eslint-disable-next-line +projects.forEach(async (project) => { + //wait for all dependencies to finish their first run + await Promise.all( + projects.filter(x => project.dependencies.includes(x.name)).map(x => x.firstCompletion.promise) + ); + const watcher = spawn('npm', ['run', 'watch'], { + cwd: project.path, + env: { ...process.env }, + shell: true + }); + + watcher.stdout.on('data', (data) => { + processData(project, 'stdout', data.toString()); + }); + + watcher.stderr.on('data', (data) => { + processData(project, 'stderr', data.toString()); + }); +}); diff --git a/snippets.json b/snippets.json deleted file mode 100644 index 513f788a..00000000 --- a/snippets.json +++ /dev/null @@ -1,292 +0,0 @@ -{ - "ifAppInfo": { - "prefix": "ifAppInfo", - "body": "ifAppInfo", - "description": "Implemented By:\nroAppInfo\n" - }, - "ifAppManager": { - "prefix": "ifAppManager", - "body": "ifAppManager", - "description": "Implemented By:\nroAppManager\n" - }, - "ifArray": { - "prefix": "ifArray", - "body": "ifArray", - "description": "Implemented By:\nroArray\nroByteArray\nroList\nroXMLList\n" - }, - "ifArrayJoin": { - "prefix": "ifArrayJoin", - "body": "ifArrayJoin", - "description": "Implemented By:\nroArray\n" - }, - "ifArraySort": { - "prefix": "ifArraySort", - "body": "ifArraySort", - "description": "Implemented By:\nroArray\n" - }, - "ifAssociativeArray": { - "prefix": "ifAssociativeArray", - "body": "ifAssociativeArray", - "description": "Implemented By:\nroAssociativeArray\nroSGNode\n" - }, - "ifAudioGuide": { - "prefix": "ifAudioGuide", - "body": "ifAudioGuide", - "description": "Implemented By:\nroAudioGuide\n" - }, - "ifAudioMetadata": { - "prefix": "ifAudioMetadata", - "body": "ifAudioMetadata", - "description": "Implemented By:\nroAudioMetadata\n" - }, - "ifAudioPlayer": { - "prefix": "ifAudioPlayer", - "body": "ifAudioPlayer", - "description": "Implemented By:\nroAudioPlayer\n" - }, - "ifAudioResource": { - "prefix": "ifAudioResource", - "body": "ifAudioResource", - "description": "Implemented By:\nroAudioResource\n" - }, - "ifByteArray": { - "prefix": "ifByteArray", - "body": "ifByteArray", - "description": "Implemented By:\nroByteArray\n" - }, - "ifChannelStore": { - "prefix": "ifChannelStore", - "body": "ifChannelStore", - "description": "Implemented By:\nroChannelStore\n" - }, - "ifCompositor": { - "prefix": "ifCompositor", - "body": "ifCompositor", - "description": "Implemented By:\nroCompositor\n" - }, - "ifDateTime": { - "prefix": "ifDateTime", - "body": "ifDateTime", - "description": "Implemented By:\nroDateTime\n" - }, - "ifDeviceInfo": { - "prefix": "ifDeviceInfo", - "body": "ifDeviceInfo", - "description": "Implemented By:\nroDeviceInfo\n" - }, - "ifDraw2D": { - "prefix": "ifDraw2D", - "body": "ifDraw2D", - "description": "Implemented By:\nroBitmap\nroRegion\nroScreen\n" - }, - "ifEnum": { - "prefix": "ifEnum", - "body": "ifEnum", - "description": "Implemented By:\nroArray\nroAssociativeArray\nroByteArray\nroList\nroMessagePort\nroXMLList\n" - }, - "ifEVPCipher": { - "prefix": "ifEVPCipher", - "body": "ifEVPCipher", - "description": "Implemented By:\nroEVPCipher\n" - }, - "ifEVPDigest": { - "prefix": "ifEVPDigest", - "body": "ifEVPDigest", - "description": "Implemented By:\nroEVPDigest\n" - }, - "ifFileSystem": { - "prefix": "ifFileSystem", - "body": "ifFileSystem", - "description": "Implemented By:\nroFileSystem\n" - }, - "ifFont": { - "prefix": "ifFont", - "body": "ifFont", - "description": "Implemented By:\nroFont\n" - }, - "ifFontRegistry": { - "prefix": "ifFontRegistry", - "body": "ifFontRegistry", - "description": "Implemented By:\nroFontRegistry\n" - }, - "ifHdmiStatus": { - "prefix": "ifHdmiStatus", - "body": "ifHdmiStatus", - "description": "Implemented By:\nroHdmiStatus\n" - }, - "ifHMAC": { - "prefix": "ifHMAC", - "body": "ifHMAC", - "description": "Implemented By:\nroHMAC\n" - }, - "ifHttpAgent": { - "prefix": "ifHttpAgent", - "body": "ifHttpAgent", - "description": "Implemented By:\nroAppManager\nroAudioPlayer\nroImageCanvas\nroSGNode\nroTextureManager\nroTextureRequest\nroUrlTransfer\nroVideoPlayer\n" - }, - "ifImageMetadata": { - "prefix": "ifImageMetadata", - "body": "ifImageMetadata", - "description": "Implemented By:\nroImageMetadata\n" - }, - "ifList": { - "prefix": "ifList", - "body": "ifList", - "description": "Implemented By:\nroList\nroXMLList\n" - }, - "ifLocalization": { - "prefix": "ifLocalization", - "body": "ifLocalization", - "description": "Implemented By:\nroLocalization\n" - }, - "ifMessagePort": { - "prefix": "ifMessagePort", - "body": "ifMessagePort", - "description": "Implemented By:\nroMessagePort\n" - }, - "ifMicrophone": { - "prefix": "ifMicrophone", - "body": "ifMicrophone", - "description": "Implemented By:\nroMicrophone\n" - }, - "ifPath": { - "prefix": "ifPath", - "body": "ifPath", - "description": "Implemented By:\nroPath\n" - }, - "ifRegex": { - "prefix": "ifRegex", - "body": "ifRegex", - "description": "Implemented By:\nroRegex\n" - }, - "ifRegion": { - "prefix": "ifRegion", - "body": "ifRegion", - "description": "Implemented By:\nroRegion\n" - }, - "ifRegistry": { - "prefix": "ifRegistry", - "body": "ifRegistry", - "description": "Implemented By:\nroRegistry\n" - }, - "ifRegistrySection": { - "prefix": "ifRegistrySection", - "body": "ifRegistrySection", - "description": "Implemented By:\nroRegistrySection\n" - }, - "ifRSA": { - "prefix": "ifRSA", - "body": "ifRSA", - "description": "Implemented By:\nroRSA\n" - }, - "ifScreen": { - "prefix": "ifScreen", - "body": "ifScreen", - "description": "Implemented By:\nroScreen\n" - }, - "ifSocket": { - "prefix": "ifSocket", - "body": "ifSocket", - "description": "Implemented By:\nroDataGramSocket\nroStreamSocket\n" - }, - "ifSocketAddress": { - "prefix": "ifSocketAddress", - "body": "ifSocketAddress", - "description": "Implemented By:\nroSocketAddress\n" - }, - "ifSocketAsync": { - "prefix": "ifSocketAsync", - "body": "ifSocketAsync", - "description": "Implemented By:\nroDataGramSocket\nroStreamSocket\n" - }, - "ifSocketCastOption": { - "prefix": "ifSocketCastOption", - "body": "ifSocketCastOption", - "description": "Implemented By:\nroDataGramSocket\n" - }, - "ifSocketConnection": { - "prefix": "ifSocketConnection", - "body": "ifSocketConnection", - "description": "Implemented By:\nroStreamSocket\n" - }, - "ifSocketConnectionOption": { - "prefix": "ifSocketConnectionOption", - "body": "ifSocketConnectionOption", - "description": "Implemented By:\nroStreamSocket\n" - }, - "ifSocketConnectionStatus": { - "prefix": "ifSocketConnectionStatus", - "body": "ifSocketConnectionStatus", - "description": "Implemented By:\nroStreamSocket\n" - }, - "ifSocketOption": { - "prefix": "ifSocketOption", - "body": "ifSocketOption", - "description": "Implemented By:\nroDataGramSocket\nroStreamSocket\n" - }, - "ifSocketStatus": { - "prefix": "ifSocketStatus", - "body": "ifSocketStatus", - "description": "Implemented By:\nroDataGramSocket\nroStreamSocket\n" - }, - "ifSourceIdentity": { - "prefix": "ifSourceIdentity", - "body": "ifSourceIdentity", - "description": "Implemented By:\nroChannelStoreEvent\nroUrlEvent\n" - }, - "ifSprite": { - "prefix": "ifSprite", - "body": "ifSprite", - "description": "Implemented By:\nroSprite\n" - }, - "ifStringOps": { - "prefix": "ifStringOps", - "body": "ifStringOps", - "description": "Implemented By:\nroString\n" - }, - "ifSystemLog": { - "prefix": "ifSystemLog", - "body": "ifSystemLog", - "description": "Implemented By:\nroSystemLog\n" - }, - "ifTextToSpeech": { - "prefix": "ifTextToSpeech", - "body": "ifTextToSpeech", - "description": "Implemented By:\nroTextToSpeech\n" - }, - "ifTextureManager": { - "prefix": "ifTextureManager", - "body": "ifTextureManager", - "description": "Implemented By:\nroTextureManager\n" - }, - "ifTextureRequest": { - "prefix": "ifTextureRequest", - "body": "ifTextureRequest", - "description": "Implemented By:\nroTextureRequest\n" - }, - "ifTimespan": { - "prefix": "ifTimespan", - "body": "ifTimespan", - "description": "Implemented By:\nroTimespan\n" - }, - "ifUrlTransfer": { - "prefix": "ifUrlTransfer", - "body": "ifUrlTransfer", - "description": "Implemented By:\nroUrlTransfer\n" - }, - "ifVideoPlayer": { - "prefix": "ifVideoPlayer", - "body": "ifVideoPlayer", - "description": "Implemented By:\nroVideoPlayer\n" - }, - "ifXMLElement": { - "prefix": "ifXMLElement", - "body": "ifXMLElement", - "description": "Implemented By:\nroXMLElement\n" - }, - "ifXMLList": { - "prefix": "ifXMLList", - "body": "ifXMLList", - "description": "Implemented By:\nroXMLList\n" - } -} diff --git a/snippets/brightscript.json b/snippets/brightscript.json index 9f07c1d3..5f0859cc 100644 --- a/snippets/brightscript.json +++ b/snippets/brightscript.json @@ -1,12 +1,4 @@ { - "CreateObject": { - "prefix": "createObject", - "body": [ - "${2:variableName} = CreateObject(\"${1:objectType}\")" - ], - "description": "Simple CreateObject" - }, - "For Each": { "prefix": "for-each", "body": [ diff --git a/src/ActiveDeviceManager.ts b/src/ActiveDeviceManager.ts index de300e2d..8d292c72 100644 --- a/src/ActiveDeviceManager.ts +++ b/src/ActiveDeviceManager.ts @@ -3,8 +3,10 @@ import { EventEmitter } from 'events'; import * as xmlParser from 'fast-xml-parser'; import * as http from 'http'; import * as NodeCache from 'node-cache'; -import { Client as Client, SsdpHeaders } from 'node-ssdp'; -import * as url from 'url'; +import type { SsdpHeaders } from 'node-ssdp'; +import { Client } from 'node-ssdp'; +import { URL } from 'url'; +import { util } from './util'; import * as vscode from 'vscode'; const DEFAULT_TIMEOUT = 10000; @@ -17,16 +19,27 @@ export class ActiveDeviceManager extends EventEmitter { this.firstRequestForDevices = true; let config: any = vscode.workspace.getConfiguration('brightscript') || {}; - this.enabled = (config.deviceDiscovery || {}).enabled; - this.showInfoMessages = (config.deviceDiscovery || {}).showInfoMessages; - vscode.workspace.onDidChangeConfiguration((e) => { + this.enabled = config.deviceDiscovery?.enabled; + this.showInfoMessages = config.deviceDiscovery?.showInfoMessages; + vscode.workspace.onDidChangeConfiguration((event) => { let config: any = vscode.workspace.getConfiguration('brightscript') || {}; - this.enabled = (config.deviceDiscovery || {}).enabled; - this.showInfoMessages = (config.deviceDiscovery || {}).showInfoMessages; + this.enabled = config.deviceDiscovery?.enabled; + this.showInfoMessages = config.deviceDiscovery?.showInfoMessages; + + //if the `concealDeviceInfo` setting was changed, refresh the list + if (event.affectsConfiguration('brightscript.deviceDiscovery.concealDeviceInfo')) { + //stop (which clears the list), and then the `processEnabledState` below will re-start it if enabled + this.stop(); + } + this.processEnabledState(); }); this.deviceCache = new NodeCache({ stdTTL: 3600, checkperiod: 120 }); + //anytime a device leaves the cache (either expired or manually deleted) + this.deviceCache.on('del', (deviceId, device) => { + this.emit('expiredDevice', deviceId, device); + }); this.processEnabledState(); } @@ -49,10 +62,18 @@ export class ActiveDeviceManager extends EventEmitter { return this.deviceCache.getStats(); } + /** + * Clear the list and re-scan the whole network for devices + */ + public refresh() { + this.stop(); + this.start(); + } + // Will ether stop or start the watching process based on the running state and user settings private processEnabledState() { if (this.enabled && !this.isRunning) { - this.findDevices(); + this.start(); } else if (!this.enabled && this.isRunning) { this.stop(); } @@ -63,25 +84,34 @@ export class ActiveDeviceManager extends EventEmitter { this.exponentialBackoff.reset(); } + this.deviceCache.del( + this.deviceCache.keys() + ); this.deviceCache.flushAll(); this.isRunning = false; } - // Begin searching and watching for devices - private findDevices() { - this.exponentialBackoff = backoff.exponential({ - randomisationFactor: 0, - initialDelay: 1000, - maxDelay: 30000 - }); + /** + * Begin searching and watching for devices + */ + private start() { + if (!this.isRunning) { + this.exponentialBackoff = backoff.exponential({ + randomisationFactor: 0, + initialDelay: 2000, + maxDelay: 60000 + }); - this.exponentialBackoff.on('ready', (eventNumber, delay) => { - this.discoverAll(delay); - this.exponentialBackoff.backoff(); - }); + void this.discoverAll(1000); + + this.exponentialBackoff.on('ready', (eventNumber, delay) => { + void this.discoverAll(delay); + this.exponentialBackoff.backoff(); + }); - this.exponentialBackoff.backoff(); - this.isRunning = true; + this.exponentialBackoff.backoff(); + this.isRunning = true; + } } // Discover all Roku devices on the network and watch for new ones that connect @@ -90,24 +120,23 @@ export class ActiveDeviceManager extends EventEmitter { const finder = new RokuFinder(); const devices: string[] = []; - finder.on('found', (device) => { - if (devices.indexOf(device) === -1) { - if (this.showInfoMessages && this.deviceCache.get(device.deviceInfo['device-id']) === undefined) { + finder.on('found', (device: RokuDeviceDetails) => { + if (!devices.includes(device.id)) { + if (this.showInfoMessages && this.deviceCache.get(device.id) === undefined) { // New device found - vscode.window.showInformationMessage(`Device found: ${device.deviceInfo['default-device-name']}`); + void vscode.window.showInformationMessage(`Device found: ${device.deviceInfo['default-device-name']}`); } - this.deviceCache.set(device.deviceInfo['device-id'], device); - devices.push(device); + this.deviceCache.set(device.id, device); + devices.push(device.id); + this.emit('foundDevice', device.id, device); } }); finder.on('timeout', () => { - if (devices.length > 0) { - // debug('found Roku devices at %o after %dms', addresses, elapsedTime()); - resolve(devices); - } else { - reject(new Error(`Could not find any Roku devices after ${timeout / 1000} seconds`)); + if (devices.length === 0) { + console.info(`Could not find any Roku devices after ${timeout / 1000} seconds`); } + resolve(devices); }); finder.start(timeout); @@ -120,7 +149,10 @@ class RokuFinder extends EventEmitter { constructor() { super(); - this.client = new Client(); + this.client = new Client({ + //Bind sockets to each discovered interface explicitly instead of relying on the system. Might help with issues with multiple NICs. + explicitSocketBind: true + }); this.client.on('response', (headers: SsdpHeaders) => { if (!this.running) { @@ -128,7 +160,7 @@ class RokuFinder extends EventEmitter { } const { ST, LOCATION } = headers; - if (ST && LOCATION && ST.indexOf('roku') !== -1) { + if (ST && LOCATION && ST.includes('roku')) { http.get(`${LOCATION}/query/device-info`, { headers: { 'User-Agent': 'https://github.com/RokuCommunity/vscode-brightscript-language' @@ -145,9 +177,26 @@ class RokuFinder extends EventEmitter { resp.on('end', () => { // The whole response has been received. let info = xmlParser.parse(data); - const device = this.parseAddress(LOCATION); - device.deviceInfo = info['device-info']; - this.emit('found', device); + for (const key in info['device-info']) { + let value = info['device-info'][key]; + if (typeof value === 'string') { + // Clean up the string results to make them more readable + info['device-info'][key] = util.decodeHtmlEntities(value); + } + } + + let config: any = vscode.workspace.getConfiguration('brightscript') || {}; + let includeNonDeveloperDevices = config?.deviceDiscovery?.includeNonDeveloperDevices === true; + if (includeNonDeveloperDevices || info['device-info']['developer-enabled']) { + const url = new URL(LOCATION); + const device: RokuDeviceDetails = { + location: url.origin, + ip: url.hostname, + id: info['device-info']['device-id'], + deviceInfo: info['device-info'] + }; + this.emit('found', device); + } }); }); } @@ -157,13 +206,13 @@ class RokuFinder extends EventEmitter { private readonly client: Client; private intervalId: NodeJS.Timer | null = null; private timeoutId: NodeJS.Timer | null = null; - private running: boolean = false; + private running = false; public start(timeout: number) { this.running = true; const search = () => { - this.client.search('roku:ecp'); + void this.client.search('roku:ecp'); }; const done = () => { @@ -177,16 +226,86 @@ class RokuFinder extends EventEmitter { } public stop() { - clearInterval(this.intervalId!); - clearTimeout(this.timeoutId!); + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); this.running = false; this.client.stop(); } +} - private parseAddress(location: string): any { - const parts = url.parse(location); - parts.path = undefined; - parts.pathname = undefined; - return { location: url.format(parts), ip: parts.hostname, deviceInfo: {} }; - } +export interface RokuDeviceDetails { + location: string; + id: string; + ip: string; + deviceInfo: { + 'udn'?: string; + 'serial-number'?: string; + 'device-id'?: string; + 'advertising-id'?: string; + 'vendor-name'?: string; + 'model-name'?: string; + 'model-number'?: string; + 'model-region'?: string; + 'is-tv'?: boolean; + 'is-stick'?: boolean; + 'ui-resolution'?: string; + 'supports-ethernet'?: boolean; + 'wifi-mac'?: string; + 'wifi-driver'?: string; + 'has-wifi-extender'?: boolean; + 'has-wifi-5G-support'?: boolean; + 'can-use-wifi-extender'?: boolean; + 'ethernet-mac'?: string; + 'network-type'?: string; + 'network-name'?: string; + 'friendly-device-name'?: string; + 'friendly-model-name'?: string; + 'default-device-name'?: string; + 'user-device-name'?: string; + 'user-device-location'?: string; + 'build-number'?: string; + 'software-version'?: string; + 'software-build'?: number; + 'secure-device'?: boolean; + 'language'?: string; + 'country'?: string; + 'locale'?: string; + 'time-zone-auto'?: boolean; + 'time-zone'?: string; + 'time-zone-name'?: string; + 'time-zone-tz'?: string; + 'time-zone-offset'?: number; + 'clock-format'?: string; + 'uptime'?: number; + 'power-mode'?: string; + 'supports-suspend'?: boolean; + 'supports-find-remote'?: boolean; + 'find-remote-is-possible'?: boolean; + 'supports-audio-guide'?: boolean; + 'supports-rva'?: boolean; + 'developer-enabled'?: boolean; + 'keyed-developer-id'?: string; + 'search-enabled'?: boolean; + 'search-channels-enabled'?: boolean; + 'voice-search-enabled'?: boolean; + 'notifications-enabled'?: boolean; + 'notifications-first-use'?: boolean; + 'supports-private-listening'?: boolean; + 'headphones-connected'?: boolean; + 'supports-audio-settings'?: boolean; + 'supports-ecs-textedit'?: boolean; + 'supports-ecs-microphone'?: boolean; + 'supports-wake-on-wlan'?: boolean; + 'supports-airplay'?: boolean; + 'has-play-on-roku'?: boolean; + 'has-mobile-screensaver'?: boolean; + 'support-url'?: string; + 'grandcentral-version'?: string; + 'trc-version'?: number; + 'trc-channel-version'?: string; + 'davinci-version'?: string; + 'av-sync-calibration-enabled'?: number; + // Anything nre they might add that we do not know about + [key: string]: any; + }; } diff --git a/src/BrightScriptCommands.spec.ts b/src/BrightScriptCommands.spec.ts index 9bb05c7e..fb234c74 100644 --- a/src/BrightScriptCommands.spec.ts +++ b/src/BrightScriptCommands.spec.ts @@ -1,5 +1,3 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ import * as sinon from 'sinon'; let Module = require('module'); @@ -24,7 +22,7 @@ describe('BrightScriptFileUtils ', () => { let languagesMock; beforeEach(() => { - commands = new BrightScriptCommands(); + commands = new BrightScriptCommands({} as any, {} as any, {} as any, {} as any); commandsMock = sinon.mock(commands); languagesMock = sinon.mock(vscode.languages); }); @@ -38,7 +36,7 @@ describe('BrightScriptFileUtils ', () => { it('does nothing when no active document', () => { vscode.window.activeTextEditor = undefined; - commands.onToggleXml(); + void commands.onToggleXml(); languagesMock.verify(); commandsMock.verify(); @@ -46,7 +44,7 @@ describe('BrightScriptFileUtils ', () => { it('tries to ascertain alternate filename', () => { vscode.window.activeTextEditor = { document: { fileName: 'notValid.json' } }; - commands.onToggleXml(); + void commands.onToggleXml(); languagesMock.verify(); commandsMock.verify(); @@ -56,7 +54,7 @@ describe('BrightScriptFileUtils ', () => { vscode.window.activeTextEditor = { document: { fileName: 'valid.brs' } }; commandsMock.expects('openFile').once(); - commands.onToggleXml(); + void commands.onToggleXml(); languagesMock.verify(); commandsMock.verify(); diff --git a/src/BrightScriptCommands.ts b/src/BrightScriptCommands.ts index 98c528b0..5a5fd6f8 100644 --- a/src/BrightScriptCommands.ts +++ b/src/BrightScriptCommands.ts @@ -1,115 +1,275 @@ -import * as request from 'request'; +import * as request from 'postman-request'; import * as vscode from 'vscode'; import BrightScriptFileUtils from './BrightScriptFileUtils'; import { GlobalStateManager } from './GlobalStateManager'; import { brighterScriptPreviewCommand } from './commands/BrighterScriptPreviewCommand'; import { languageServerInfoCommand } from './commands/LanguageServerInfoCommand'; -import { SceneGraphDebugCommandController } from 'roku-debug'; +import { util } from './util'; +import { util as rokuDebugUtil } from 'roku-debug/dist/util'; +import type { RemoteControlManager, RemoteControlModeInitiator } from './managers/RemoteControlManager'; +import type { WhatsNewManager } from './managers/WhatsNewManager'; +import type { ActiveDeviceManager } from './ActiveDeviceManager'; export class BrightScriptCommands { - constructor() { + constructor( + private remoteControlManager: RemoteControlManager, + private whatsNewManager: WhatsNewManager, + private context: vscode.ExtensionContext, + private activeDeviceManager: ActiveDeviceManager + ) { this.fileUtils = new BrightScriptFileUtils(); } private fileUtils: BrightScriptFileUtils; - private context: vscode.ExtensionContext; private host: string; - public registerCommands(context: vscode.ExtensionContext) { - this.context = context; + public registerCommands() { - brighterScriptPreviewCommand.register(context); - languageServerInfoCommand.register(context); + brighterScriptPreviewCommand.register(this.context); + languageServerInfoCommand.register(this.context); - let subscriptions = context.subscriptions; + this.registerGeneralCommands(); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.toggleXML', () => { - this.onToggleXml(); - })); + this.registerCommand('sendRemoteCommand', async (key: string) => { + await this.sendRemoteCommand(key); + }); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.clearGlobalState', () => { - new GlobalStateManager(this.context).clear(); - vscode.window.showInformationMessage('BrightScript Language extension global state cleared'); - })); + //the "Refresh" button in the Devices list + this.registerCommand('refreshDeviceList', (key: string) => { + this.activeDeviceManager.refresh(); + }); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.sendRemoteCommand', (key: string) => { - this.sendRemoteCommand(key); - })); + this.registerCommand('sendRemoteText', async () => { + let items: vscode.QuickPickItem[] = []; + for (const item of new GlobalStateManager(this.context).sendRemoteTextHistory) { + items.push({ label: item }); + } - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.sendRemoteText', async () => { - let stuffUserTyped: string = await vscode.window.showInputBox({ - placeHolder: 'Press enter to send all typed characters to the Roku', - value: '' + const stuffUserTyped = await util.showQuickPickInputBox({ + placeholder: 'Press enter to send all typed characters to the Roku', + items: items }); + console.log('userInput', stuffUserTyped); + if (stuffUserTyped) { + new GlobalStateManager(this.context).addTextHistory(stuffUserTyped); let fallbackToHttp = true; await this.getRemoteHost(); - try { - let commandController = new SceneGraphDebugCommandController(this.host); - let response = await commandController.type(stuffUserTyped); - if (!response.error) { - fallbackToHttp = false; - } - } catch (error) { - // Let this fallback to the old HTTP based logic - } + //TODO fix SceneGraphDebugCommandController to not timeout so quickly + // try { + // let commandController = new SceneGraphDebugCommandController(this.host); + // let response = await commandController.type(stuffUserTyped); + // if (!response.error) { + // fallbackToHttp = false; + // } + // } catch (error) { + // console.error(error); + // // Let this fallback to the old HTTP based logic + // } if (fallbackToHttp) { for (let character of stuffUserTyped) { - let commandToSend: string = 'Lit_' + encodeURIComponent(character); - await this.sendRemoteCommand(commandToSend); + await this.sendAsciiToDevice(character); } } } - vscode.commands.executeCommand('workbench.action.focusPanel'); - })); - - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressBackButton', () => { - this.sendRemoteCommand('Back'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressBackspaceButton', () => { - this.sendRemoteCommand('Backspace'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressHomeButton', () => { - this.sendRemoteCommand('Home'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressUpButton', () => { - this.sendRemoteCommand('Up'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressDownButton', () => { - this.sendRemoteCommand('Down'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressRightButton', () => { - this.sendRemoteCommand('Right'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressLeftButton', () => { - this.sendRemoteCommand('Left'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressSelectButton', () => { - this.sendRemoteCommand('Select'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressPlayButton', () => { - this.sendRemoteCommand('Play'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressRevButton', () => { - this.sendRemoteCommand('Rev'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressFwdButton', () => { - this.sendRemoteCommand('Fwd'); - })); - subscriptions.push(vscode.commands.registerCommand('extension.brightscript.pressStarButton', () => { - this.sendRemoteCommand('Info'); - })); + await vscode.commands.executeCommand('workbench.action.focusPanel'); + }); + + this.registerCommand('toggleRemoteControlMode', (initiator: RemoteControlModeInitiator) => { + return this.remoteControlManager.toggleRemoteControlMode(initiator); + }); + + this.registerCommand('enableRemoteControlMode', () => { + return this.remoteControlManager.setRemoteControlMode(true, 'command'); + }); + + this.registerCommand('disableRemoteControlMode', () => { + return this.remoteControlManager.setRemoteControlMode(false, 'command'); + }); + + this.registerCommand('pressBackButton', async () => { + await this.sendRemoteCommand('Back'); + }); + + this.registerCommand('pressBackspaceButton', async () => { + await this.sendRemoteCommand('Backspace'); + }); + + this.registerCommand('pressHomeButton', async () => { + await this.sendRemoteCommand('Home'); + }); + + this.registerCommand('pressUpButton', async () => { + await this.sendRemoteCommand('Up'); + }); + + this.registerCommand('pressDownButton', async () => { + await this.sendRemoteCommand('Down'); + }); + + this.registerCommand('pressRightButton', async () => { + await this.sendRemoteCommand('Right'); + }); + + this.registerCommand('pressLeftButton', async () => { + await this.sendRemoteCommand('Left'); + }); + + this.registerCommand('pressSelectButton', async () => { + await this.sendRemoteCommand('Select'); + }); + + this.registerCommand('pressPlayButton', async () => { + await this.sendRemoteCommand('Play'); + }); + + this.registerCommand('pressRevButton', async () => { + await this.sendRemoteCommand('Rev'); + }); + + this.registerCommand('pressFwdButton', async () => { + await this.sendRemoteCommand('Fwd'); + }); + + this.registerCommand('pressStarButton', async () => { + await this.sendRemoteCommand('Info'); + }); + + this.registerCommand('pressInstantReplayButton', async () => { + await this.sendRemoteCommand('InstantReplay'); + }); + + this.registerCommand('pressSearchButton', async () => { + await this.sendRemoteCommand('Search'); + }); + + this.registerCommand('pressEnterButton', async () => { + await this.sendRemoteCommand('Enter'); + }); + + this.registerCommand('pressFindRemote', async () => { + await this.sendRemoteCommand('FindRemote'); + }); + + this.registerCommand('pressVolumeDown', async () => { + await this.sendRemoteCommand('VolumeDown'); + }); + + this.registerCommand('pressVolumeMute', async () => { + await this.sendRemoteCommand('VolumeMute'); + }); + + this.registerCommand('pressVolumeUp', async () => { + await this.sendRemoteCommand('FindVolumeUp'); + }); + + this.registerCommand('pressPowerOff', async () => { + await this.sendRemoteCommand('PowerOff'); + }); + + this.registerCommand('pressPowerOn', async () => { + await this.sendRemoteCommand('PowerOn'); + }); + + this.registerCommand('pressChannelUp', async () => { + await this.sendRemoteCommand('ChannelUp'); + }); + + this.registerCommand('pressChannelDown', async () => { + await this.sendRemoteCommand('ChannelDown'); + }); + + this.registerCommand('changeTvInput', async (host?: string) => { + const selectedInput = await vscode.window.showQuickPick([ + 'InputHDMI1', + 'InputHDMI2', + 'InputHDMI3', + 'InputHDMI4', + 'InputAV1', + 'InputTuner' + ]); + + if (selectedInput) { + await this.sendRemoteCommand(selectedInput, host); + } + }); + + this.registerKeyboardInputs(); + } + + /** + * Registers all the commands for a-z, A-Z, 0-9, and all the primary character such as !, @, #, ', ", etc... + */ + private registerKeyboardInputs() { + // Get all the keybindings from our package.json + const extension = vscode.extensions.getExtension('RokuCommunity.brightscript'); + const keybindings = (extension.packageJSON.contributes.keybindings as Array<{ + key: string; + command: string; + when: string; + args: any; + }>); + + for (let keybinding of keybindings) { + // Find every keybinding that is related to sending text characters to the device + if (keybinding.command.includes('.sendAscii+')) { + + if (!keybinding.args) { + throw new Error(`Can not register command: ${keybinding.command}. Missing Arguments.`); + } + + // Dynamically register the the command defined in the keybinding + this.registerCommand(keybinding.command, async (character: string) => { + await this.sendAsciiToDevice(character); + }); + } + } } - public async openFile(filename: string, range: vscode.Range = null, preview: boolean = false): Promise { + private registerGeneralCommands() { + //a command that does absolutely nothing. It's here to allow us to absorb unsupported keypresses when in **remote control mode**. + this.registerCommand('doNothing', () => { }); + + this.registerCommand('toggleXML', async () => { + await this.onToggleXml(); + }); + + this.registerCommand('clearGlobalState', async () => { + new GlobalStateManager(this.context).clear(); + await vscode.window.showInformationMessage('BrightScript Language extension global state cleared'); + }); + + this.registerCommand('copyToClipboard', async (value: string) => { + try { + await vscode.env.clipboard.writeText(value); + await vscode.window.showInformationMessage(`Copied to clipboard: ${value}`); + } catch (error) { + await vscode.window.showErrorMessage(`Could not copy value to clipboard`); + } + }); + + this.registerCommand('openUrl', async (url: string) => { + try { + await vscode.env.openExternal(vscode.Uri.parse(url)); + } catch (error) { + await vscode.window.showErrorMessage(`Tried to open url but failed: ${url}`); + } + }); + + this.registerCommand('showReleaseNotes', () => { + this.whatsNewManager.showReleaseNotes(); + }); + } + + public async openFile(filename: string, range: vscode.Range = null, preview = false): Promise { let uri = vscode.Uri.file(filename); try { let doc = await vscode.workspace.openTextDocument(uri); // calls back into the provider await vscode.window.showTextDocument(doc, { preview: preview }); if (range) { - this.gotoRange(range); + await this.gotoRange(range); } } catch (e) { return false; @@ -117,7 +277,7 @@ export class BrightScriptCommands { return true; } - private gotoRange(range: vscode.Range) { + private async gotoRange(range: vscode.Range) { let editor = vscode.window.activeTextEditor; editor.selection = new vscode.Selection( range.start.line, @@ -125,7 +285,7 @@ export class BrightScriptCommands { range.start.line, range.start.character ); - vscode.commands.executeCommand('revealLine', { + await vscode.commands.executeCommand('revealLine', { lineNumber: range.start.line, at: 'center' }); @@ -136,21 +296,29 @@ export class BrightScriptCommands { const currentDocument = vscode.window.activeTextEditor.document; let alternateFileName = this.fileUtils.getAlternateFileName(currentDocument.fileName); if (alternateFileName) { - if (! await this.openFile(alternateFileName) - && alternateFileName.toLowerCase().endsWith('.brs')) { + if ( + !await this.openFile(alternateFileName) && + alternateFileName.toLowerCase().endsWith('.brs') + ) { await this.openFile(this.fileUtils.getBsFileName(alternateFileName)); } } } } - public async sendRemoteCommand(key: string) { - await this.getRemoteHost(); - if (this.host) { - let clickUrl = `http://${this.host}:8060/keypress/${key}`; + public async sendRemoteCommand(key: string, host?: string) { + // do we have a temporary override? + if (!host) { + // Get the long lived host ip + await this.getRemoteHost(); + host = this.host; + } + + if (host) { + let clickUrl = `http://${host}:8060/keypress/${key}`; console.log(`send ${clickUrl}`); - return new Promise(function(resolve, reject) { - request.post(clickUrl, function(err, response) { + return new Promise((resolve, reject) => { + request.post(clickUrl, (err, response) => { if (err) { return reject(err); } @@ -163,8 +331,9 @@ export class BrightScriptCommands { public async getRemoteHost() { this.host = await this.context.workspaceState.get('remoteHost'); if (!this.host) { - let config = await vscode.workspace.getConfiguration('brightscript.remoteControl', null); + let config = vscode.workspace.getConfiguration('brightscript.remoteControl', null); this.host = config.get('host'); + // eslint-disable-next-line no-template-curly-in-string if (this.host === '${promptForHost}') { this.host = await vscode.window.showInputBox({ placeHolder: 'The IP address of your Roku device', @@ -177,8 +346,24 @@ export class BrightScriptCommands { } else { await this.context.workspaceState.update('remoteHost', this.host); } + if (this.host) { + //try resolving the hostname. (sometimes it fails for no reason, so just ignore the crash if it does) + try { + this.host = await rokuDebugUtil.dnsLookup(this.host); + } catch (e) { + console.error('Error doing dns lookup for host ', this.host, e); + } + } } -} + private registerCommand(name: string, callback: (...args: any[]) => any, thisArg?: any) { + const prefix = 'extension.brightscript.'; + const commandName = name.startsWith(prefix) ? name : prefix + name; + this.context.subscriptions.push(vscode.commands.registerCommand(commandName, callback, thisArg)); + } -export const brightScriptCommands = new BrightScriptCommands(); + private async sendAsciiToDevice(character: string) { + let commandToSend: string = 'Lit_' + encodeURIComponent(character); + await this.sendRemoteCommand(commandToSend); + } +} diff --git a/src/BrightScriptCompletionItemProvider.ts b/src/BrightScriptCompletionItemProvider.ts deleted file mode 100644 index c8a87eb5..00000000 --- a/src/BrightScriptCompletionItemProvider.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - CancellationToken, - CompletionItem, - CompletionItemKind, - CompletionItemProvider, - Position, TextDocument -} from 'vscode'; - -import * as vscode from 'vscode'; - -import { ifAppInfoCompletionItems } from './BrightScriptCompletionItems/ifAppInfoCompletionItems'; -import { ifAppManagerCompletionItems } from './BrightScriptCompletionItems/ifAppManagerCompletionItems'; -import { ifArrayCompletionItems } from './BrightScriptCompletionItems/ifArrayCompletionItems'; -import { ifArrayJoinCompletionItems } from './BrightScriptCompletionItems/ifArrayJoinCompletionItems'; -import { ifArraySortCompletionItems } from './BrightScriptCompletionItems/ifArraySortCompletionItems'; -import { ifAssociativeArrayCompletionItems } from './BrightScriptCompletionItems/ifAssociativeArrayCompletionItems'; -import { ifAudioGuideCompletionItems } from './BrightScriptCompletionItems/ifAudioGuideCompletionItems'; -import { ifAudioMetadataCompletionItems } from './BrightScriptCompletionItems/ifAudioMetadataCompletionItems'; -import { ifAudioPlayerCompletionItems } from './BrightScriptCompletionItems/ifAudioPlayerCompletionItems'; -import { ifAudioResourceCompletionItems } from './BrightScriptCompletionItems/ifAudioResourceCompletionItems'; -import { ifByteArrayCompletionItems } from './BrightScriptCompletionItems/ifByteArrayCompletionItems'; -import { ifChannelStoreCompletionItems } from './BrightScriptCompletionItems/ifChannelStoreCompletionItems'; -import { ifCompositorCompletionItems } from './BrightScriptCompletionItems/ifCompositorCompletionItems'; -import { ifDateTimeCompletionItems } from './BrightScriptCompletionItems/ifDateTimeCompletionItems'; -import { ifDeviceInfoCompletionItems } from './BrightScriptCompletionItems/ifDeviceInfoCompletionItems'; -import { ifDraw2DCompletionItems } from './BrightScriptCompletionItems/ifDraw2DCompletionItems'; -import { ifEnumCompletionItems } from './BrightScriptCompletionItems/ifEnumCompletionItems'; -import { ifEVPCipherCompletionItems } from './BrightScriptCompletionItems/ifEVPCipherCompletionItems'; -import { ifEVPDigestCompletionItems } from './BrightScriptCompletionItems/ifEVPDigestCompletionItems'; -import { ifFileSystemCompletionItems } from './BrightScriptCompletionItems/ifFileSystemCompletionItems'; -import { ifFontCompletionItems } from './BrightScriptCompletionItems/ifFontCompletionItems'; -import { ifFontRegistryCompletionItems } from './BrightScriptCompletionItems/ifFontRegistryCompletionItems'; -import { ifHdmiStatusCompletionItems } from './BrightScriptCompletionItems/ifHdmiStatusCompletionItems'; -import { ifHMACCompletionItems } from './BrightScriptCompletionItems/ifHMACCompletionItems'; -import { ifHttpAgentCompletionItems } from './BrightScriptCompletionItems/ifHttpAgentCompletionItems'; -import { ifImageMetadataCompletionItems } from './BrightScriptCompletionItems/ifImageMetadataCompletionItems'; -import { ifListCompletionItems } from './BrightScriptCompletionItems/ifListCompletionItems'; -import { ifLocalizationCompletionItems } from './BrightScriptCompletionItems/ifLocalizationCompletionItems'; -import { ifMessagePortCompletionItems } from './BrightScriptCompletionItems/ifMessagePortCompletionItems'; -import { ifMicrophoneCompletionItems } from './BrightScriptCompletionItems/ifMicrophoneCompletionItems'; -import { ifPathCompletionItems } from './BrightScriptCompletionItems/ifPathCompletionItems'; -import { ifRegexCompletionItems } from './BrightScriptCompletionItems/ifRegexCompletionItems'; -import { ifRegionCompletionItems } from './BrightScriptCompletionItems/ifRegionCompletionItems'; -import { ifRegistryCompletionItems } from './BrightScriptCompletionItems/ifRegistryCompletionItems'; -import { ifRegistrySectionCompletionItems } from './BrightScriptCompletionItems/ifRegistrySectionCompletionItems'; -import { ifRSACompletionItems } from './BrightScriptCompletionItems/ifRSACompletionItems'; -import { ifScreenCompletionItems } from './BrightScriptCompletionItems/ifScreenCompletionItems'; -import { ifSocketAddressCompletionItems } from './BrightScriptCompletionItems/ifSocketAddressCompletionItems'; -import { ifSocketAsyncCompletionItems } from './BrightScriptCompletionItems/ifSocketAsyncCompletionItems'; -import { ifSocketCastOptionCompletionItems } from './BrightScriptCompletionItems/ifSocketCastOptionCompletionItems'; -import { ifSocketCompletionItems } from './BrightScriptCompletionItems/ifSocketCompletionItems'; -import { ifSocketConnectionCompletionItems } from './BrightScriptCompletionItems/ifSocketConnectionCompletionItems'; -import { ifSocketConnectionOptionCompletionItems } from './BrightScriptCompletionItems/ifSocketConnectionOptionCompletionItems'; -import { ifSocketConnectionStatusCompletionItems } from './BrightScriptCompletionItems/ifSocketConnectionStatusCompletionItems'; -import { ifSocketOptionCompletionItems } from './BrightScriptCompletionItems/ifSocketOptionCompletionItems'; -import { ifSocketStatusCompletionItems } from './BrightScriptCompletionItems/ifSocketStatusCompletionItems'; -import { ifSourceIdentityCompletionItems } from './BrightScriptCompletionItems/ifSourceIdentityCompletionItems'; -import { ifSpriteCompletionItems } from './BrightScriptCompletionItems/ifSpriteCompletionItems'; -import { ifStringOpsCompletionItems } from './BrightScriptCompletionItems/ifStringOpsCompletionItems'; -import { ifSystemLogCompletionItems } from './BrightScriptCompletionItems/ifSystemLogCompletionItems'; -import { ifTextToSpeechCompletionItems } from './BrightScriptCompletionItems/ifTextToSpeechCompletionItems'; -import { ifTextureManagerCompletionItems } from './BrightScriptCompletionItems/ifTextureManagerCompletionItems'; -import { ifTextureRequestCompletionItems } from './BrightScriptCompletionItems/ifTextureRequestCompletionItems'; -import { ifTimespanCompletionItems } from './BrightScriptCompletionItems/ifTimespanCompletionItems'; -import { ifUrlTransferCompletionItems } from './BrightScriptCompletionItems/ifUrlTransferCompletionItems'; -import { ifVideoPlayerCompletionItems } from './BrightScriptCompletionItems/ifVideoPlayerCompletionItems'; -import { ifXMLElementCompletionItems } from './BrightScriptCompletionItems/ifXMLElementCompletionItems'; -import { ifXMLListCompletionItems } from './BrightScriptCompletionItems/ifXMLListCompletionItems'; - -export default class BrightScriptCompletionItemProvider implements CompletionItemProvider { - private interfaceDictionary: { [key: string]: CompletionItem[] } = { - ifAppInfo: ifAppInfoCompletionItems, - ifAppManager: ifAppManagerCompletionItems, - ifArray: ifArrayCompletionItems, - ifArrayJoin: ifArrayJoinCompletionItems, - ifArraySort: ifArraySortCompletionItems, - ifAssociativeArray: ifAssociativeArrayCompletionItems, - ifAudioGuide: ifAudioGuideCompletionItems, - ifAudioMetadata: ifAudioMetadataCompletionItems, - ifAudioPlayer: ifAudioPlayerCompletionItems, - ifAudioResource: ifAudioResourceCompletionItems, - ifByteArray: ifByteArrayCompletionItems, - ifChannelStore: ifChannelStoreCompletionItems, - ifCompositor: ifCompositorCompletionItems, - ifDateTime: ifDateTimeCompletionItems, - ifDeviceInfo: ifDeviceInfoCompletionItems, - ifDraw2D: ifDraw2DCompletionItems, - ifEnum: ifEnumCompletionItems, - ifEVPCipher: ifEVPCipherCompletionItems, - ifEVPDigest: ifEVPDigestCompletionItems, - ifFileSystem: ifFileSystemCompletionItems, - ifFont: ifFontCompletionItems, - ifFontRegistry: ifFontRegistryCompletionItems, - ifHdmiStatus: ifHdmiStatusCompletionItems, - ifHMAC: ifHMACCompletionItems, - ifHttpAgent: ifHttpAgentCompletionItems, - ifImageMetadata: ifImageMetadataCompletionItems, - ifList: ifListCompletionItems, - ifLocalization: ifLocalizationCompletionItems, - ifMessagePort: ifMessagePortCompletionItems, - ifMicrophone: ifMicrophoneCompletionItems, - ifPath: ifPathCompletionItems, - ifRegex: ifRegexCompletionItems, - ifRegion: ifRegionCompletionItems, - ifRegistry: ifRegistryCompletionItems, - ifRegistrySection: ifRegistrySectionCompletionItems, - ifRSA: ifRSACompletionItems, - ifScreen: ifScreenCompletionItems, - ifSocketAddress: ifSocketAddressCompletionItems, - ifSocketAsync: ifSocketAsyncCompletionItems, - ifSocketCastOption: ifSocketCastOptionCompletionItems, - ifSocket: ifSocketCompletionItems, - ifSocketConnection: ifSocketConnectionCompletionItems, - ifSocketConnectionOption: ifSocketConnectionOptionCompletionItems, - ifSocketConnectionStatus: ifSocketConnectionStatusCompletionItems, - ifSocketOption: ifSocketOptionCompletionItems, - ifSocketStatus: ifSocketStatusCompletionItems, - ifSourceIdentity: ifSourceIdentityCompletionItems, - ifSprite: ifSpriteCompletionItems, - ifStringOps: ifStringOpsCompletionItems, - ifSystemLog: ifSystemLogCompletionItems, - ifTextToSpeech: ifTextToSpeechCompletionItems, - ifTextureManager: ifTextureManagerCompletionItems, - ifTextureRequest: ifTextureRequestCompletionItems, - ifTimespan: ifTimespanCompletionItems, - ifUrlTransfer: ifUrlTransferCompletionItems, - ifVideoPlayer: ifVideoPlayerCompletionItems, - ifXMLElement: ifXMLElementCompletionItems, - ifXMLList: ifXMLListCompletionItems - }; - - public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: vscode.CompletionContext): CompletionItem[] { - let linePrefix = document.lineAt(position).text.substr(0, position.character).toLowerCase(); - - for (let key in this.interfaceDictionary) { - if (linePrefix.endsWith('.' + key.toLowerCase() + '.')) { - return this.interfaceDictionary[key]; - } - } - - return undefined; - } -} diff --git a/src/BrightScriptCompletionItems/ifAppInfoCompletionItems.ts b/src/BrightScriptCompletionItems/ifAppInfoCompletionItems.ts deleted file mode 100644 index 1624d3ac..00000000 --- a/src/BrightScriptCompletionItems/ifAppInfoCompletionItems.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAppInfoCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetID', - insertText: new SnippetString('GetID()'), - documentation: new MarkdownString( -` - GetID() as String - -Returns the app's channel ID, e.g. "12345" or "dev". -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsDev', - insertText: new SnippetString('IsDev()'), - documentation: new MarkdownString( -` - IsDev() as Boolean - -Returns true if the application is side-loaded, i.e. the channel ID is "dev" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVersion', - insertText: new SnippetString('GetVersion()'), - documentation: new MarkdownString( -` - GetVersion() as String - -Returns the conglomerate version number from the manifest, e.g. "1.2.3", as formatted major_version + minor_version + build_version. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTitle', - insertText: new SnippetString('GetTitle()'), - documentation: new MarkdownString( -` - GetTitle() as String - -Returns the title value from the manifest. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSubtitle', - insertText: new SnippetString('GetSubtitle()'), - documentation: new MarkdownString( -` - GetSubtitle() as String - -Returns the subtitle value from the manifest. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDevID', - insertText: new SnippetString('GetDevID()'), - documentation: new MarkdownString( -` - GetDevID() as String - -Returns the app's developer ID, or the keyed developer ID, if the application is side-loaded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetValue', - insertText: new SnippetString('GetValue(${1:key as String})'), - documentation: new MarkdownString( -` - GetValue(key as String) as String - -Returns the named manifest value, or an empty string if the entry is does not exist. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAppManagerCompletionItems.ts b/src/BrightScriptCompletionItems/ifAppManagerCompletionItems.ts deleted file mode 100644 index 86cd7994..00000000 --- a/src/BrightScriptCompletionItems/ifAppManagerCompletionItems.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAppManagerCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetTheme', - insertText: new SnippetString('SetTheme(${1:attributeArray as Object})'), - documentation: new MarkdownString( -` - SetTheme(attributeArray as Object) as Void - -Set a group of theme attributes for the application. The attributeArray is an roAssociativeArray of attribute/value pairs. -The program may create the roAssociativeArray at runtime or read it from an XML file using the roXMLElement object. -Existing values for attributes will be overwritten by the values provided. Any values set by a previous SetTheme or SetThemeAttribute call, -but not included in the array currently provided by with the subsequent call will remain unchanged. See roAppManager the list of valid attributes. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetThemeAttribute', - insertText: new SnippetString('SetThemeAttribute(${1:attributeName as String}, ${2:attributeValue as String})'), - documentation: new MarkdownString( -` - SetThemeAttribute(attributeName as String, attributeValue as String) as Void - -Set an individual theme attribute for the application. The attributeName is the name of one of the settable theme attributes and the value is the desired setting. -This value will override the default value for that attribute or modify the value provided by a previous SetTheme or SetThemeAttribute call to the new value provided. -If the attributeName is not valid, no action is performed. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ClearThemeAttribute', - insertText: new SnippetString('ClearThemeAttribute(${1:attributeName as String})'), - documentation: new MarkdownString( -` - ClearThemeAttribute(attributeName as String) as Void - -Clears a previously set attribute and reverts to its default value. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetUptime', - insertText: new SnippetString('GetUptime()'), - documentation: new MarkdownString( -` - GetUptime() as Object - -Returns an roTimespan object which is "marked" when the user clicked on the application button on the home screen. -Calling TotalMilliseconds() on the returned roTimespan object returns the total number of milliseconds since the application started. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetScreensaverTimeout', - insertText: new SnippetString('GetScreensaverTimeout()'), - documentation: new MarkdownString( -` - GetScreensaverTimeout() as Integer - -Returns the user's screensaver wait time setting in number of minutes, or zero if the screensaver is disabled. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'UpdateLastKeyPressTime', - insertText: new SnippetString('UpdateLastKeyPressTime()'), - documentation: new MarkdownString( -` - UpdateLastKeyPressTime() as Void - -UpdateLastKeyPressTime can be called to simulate user activity. -This resets the idle timer that is used to count down to screensaver activation, so if a screensaver is not already displayed it will reset the timer and defer the activation. -This should only be used when the user has specifically initiated a playback mode in your app, -in which case you can call UpdateLastKeyPressTime periodically, such as when advancing the slideshow image. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetUserSignedIn', - insertText: new SnippetString('SetUserSignedIn(${1:signedIn as Boolean})'), - documentation: new MarkdownString( -` - SetUserSignedIn(signedIn as Boolean) as Void - -This method allows a channel to tell Roku when the user is signed in or signed out of the channel. -If the channel is removed, then the firmware will call SetUserSignedIn(false) on the channel's behalf. -This method accepts the signedIn parameter, which if set to true indicates the user is signed in, and if set to false, indicates the user is signed out. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetAutomaticAudioGuideEnabled', - insertText: new SnippetString('SetAutomaticAudioGuideEnabled(${1:enabled as Boolean})'), - documentation: new MarkdownString( -` - SetAutomaticAudioGuideEnabled(enabled as Boolean) as Void - -_Available since firmware version 7.5_\\ -Enables or disables automatic Audio Guide and override any manifest setting. This is useful for channels that want to temporarily turn off automatic Audio Guide for specific screens. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsAppInstalled', - insertText: new SnippetString('IsAppInstalled(${1:channelID as String}, ${2:version as String})'), - documentation: new MarkdownString( -` - IsAppInstalled(channelID as String, version as String) as Boolean - -This method returns true if a channel with the specified channelID and the minimum version required is installed. -Version field could be an empty string to avoid a version check. This is useful for developers who want to cross-promote their apps. -For example, if a developer writes a game A and an app B, in game A they would want to know if the user has app B installed so they -know whether to advertise app B in game A to promote the app. If it is already installed, the developer would not need to advertise app B. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifArrayCompletionItems.ts b/src/BrightScriptCompletionItems/ifArrayCompletionItems.ts deleted file mode 100644 index 655f13dc..00000000 --- a/src/BrightScriptCompletionItems/ifArrayCompletionItems.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifArrayCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Peek', - insertText: new SnippetString('Peek()'), - documentation: new MarkdownString( -` - Peek() as Dynamic - -Returns the last (highest index) array entry without removing it. If the array is empty, returns invalid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Pop', - insertText: new SnippetString('Pop()'), - documentation: new MarkdownString( -` - Pop() as Dynamic - -Returns the last (highest index) array entry and removes it from the array. If the array is empty, returns invalid and does not change the array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Push', - insertText: new SnippetString('Push(${1:tvalue as Dynamic})'), - documentation: new MarkdownString( -` - Push(tvalue as Dynamic) as Void - -Adds tvalue as the new highest index entry in the array (adds to the end of the array). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Shift', - insertText: new SnippetString('Shift()'), - documentation: new MarkdownString( -` - Shift() as Dynamic - -Removes the index zero entry from the array and shifts every other entry down one to fill the hole. Returns the removed entry. -This is like a Pop from the start of the array instead of the end. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Unshift', - insertText: new SnippetString('Unshift(${1:tvalue as Dynamic})'), - documentation: new MarkdownString( -` - Unshift(tvalue as Dynamic) as Void - -Adds a new index zero to the array and shifts every other entry up one to accommodate. This is like a Push to the start of the array instead of the end. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Delete', - insertText: new SnippetString('Delete(${1:index as Integer})'), - documentation: new MarkdownString( -` - Delete(index as Integer) as Boolean - -Deletes the indicated array entry, and shifts down all entries above to fill the hole. The array length is decreased by one. -If the entry was successfully deleted, returns true. If index is out of range, returns false and does not change the array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Count', - insertText: new SnippetString('Count()'), - documentation: new MarkdownString( -` - Count() as Integer - -Returns the length of the array; that is, one more than the index of highest entry. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Clear', - insertText: new SnippetString('Clear()'), - documentation: new MarkdownString( -` - Clear() as Void - -Deletes every entry in the array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Append', - insertText: new SnippetString('Append(${1:array as Object})'), - documentation: new MarkdownString( -` - Append(array as Object) as Void - -Appends each entry of one roArray to another. If the passed Array contains "holes" (entries that were never set to a value), they are not appended. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifArrayJoinCompletionItems.ts b/src/BrightScriptCompletionItems/ifArrayJoinCompletionItems.ts deleted file mode 100644 index ddd9cc4b..00000000 --- a/src/BrightScriptCompletionItems/ifArrayJoinCompletionItems.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifArrayJoinCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Join', - insertText: new SnippetString('Join(${1:separator as String})'), - documentation: new MarkdownString( -` - Join(separator as String) as String - -Creates a string by joining all array elements together separated by the specified separator. -All elements must be of type string, otherwise an empty string is returned.\\ -_This function is available in firmware 7.5 or later._ - -Examples - - a = ["ant","bat","cat"] - s = a.Join(",") - print """" + s + """" - ' "ant,bat,cat" - - a = "abc".Split("") - s = a.Join("--") - print """" + s + """" - ' "a--b--c" -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifArraySortCompletionItems.ts b/src/BrightScriptCompletionItems/ifArraySortCompletionItems.ts deleted file mode 100644 index c2b67af2..00000000 --- a/src/BrightScriptCompletionItems/ifArraySortCompletionItems.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifArraySortCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Sort', - insertText: new SnippetString('Sort(${1|"","i","r","ir"|})'), - documentation: new MarkdownString( -` - Sort(flags = "" as String) as Void - -Performs a stable sort. - -Items are arbitrarily grouped by comparable type of number or string, and are sorted within the group with a logical comparison. - -If "r" is included in flags, a reverse sort is performed. If "i" is included in flags, a case-insensitive sort is performed. If invalid flags are specified, the sort is not performed.\\ -_This function is available in firmware 7.1 or later._ - -Examples - - a=[3, 1, 2] - a.Sort() - print a - ' sets the array to [1, 2, 3] - - a=[3, 1, 2.5] - a.Sort("r") ' reverse order sort - print a - ' sets the array to [3, 2.5, 1] - - a=["cat", "DOG", "bee"] - a.Sort() ' case-sensitive sort by default - print a - ' sets the array to ["DOG", "bee", "cat"] - - a=["cat", "DOG", "bee"] - a.Sort("i") ' case-insensitive sort - print a - ' sets the array to ["bee", "cat", "DOG"] - - a=["cat", "DOG", "bee"] - a.Sort("ir") ' case-insensitive, reverse order sort - print a - ' sets the array to ["DOG", "cat", "bee"] -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SortBy', - insertText: new SnippetString('SortBy(${1:fieldName as String}, ${2|"","i","r","ir"|})'), - documentation: new MarkdownString( -` - SortBy(fieldName as String, flags = "" as String) as Void - -Performs a stable sort of an array of associative arrays by value of a common field. - -Items are arbitrarily grouped by comparable value type of number or string, and are sorted within the group with a logical comparison. - -If "r" is included in flags, a reverse sort is performed. If "i" is included in flags, a case-insensitive sort is performed. If invalid flags are specified, the sort is not performed.\\ -_This function is available in firmware 7.1 or later._ - -Examples - - a=[ {id:3, name:"Betty"}, {id:1, name:"Carol"}, {id:2, name:"Anne"} ] - a.SortBy("name") - ' sets the array to [ {id:2, name:"Anne"}, {id:3, name:"Betty"}, {id:1, name:"Carol"} ] - - a.SortBy("id") - ' sets the array to [ {id:1, name:"Carol"}, {id:2, name:"Anne"}, {id:3, name:"Betty"} ] - - a.SortBy("name", "r") ' reverse order sort - ' sets the array to [ {id:1, name:"Carol"}, {id:3, name:"Betty"}, {id:2, name:"Anne"} ] -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Reverse', - insertText: new SnippetString('Reverse()'), - documentation: new MarkdownString( -` - Reverse() as Void - -Reverses the order of elements in an array.\\ -_This function is available in firmware 7.1 or later._ - -Example - - a=[1, "one", 2, "two"] - a.Reverse() - ' sets the array to ["two", 2, "one", 1] -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAssociativeArrayCompletionItems.ts b/src/BrightScriptCompletionItems/ifAssociativeArrayCompletionItems.ts deleted file mode 100644 index dddce752..00000000 --- a/src/BrightScriptCompletionItems/ifAssociativeArrayCompletionItems.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAssociativeArrayCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'AddReplace', - insertText: new SnippetString('AddReplace(${1:key as String}, ${2:value as Dynamic})'), - documentation: new MarkdownString( -` - AddReplace(key as String, value as Dynamic) as Void - -Add a new entry to the array associating the supplied value with the supplied key string. Only one value may be associated with a key. -If the key is already associated with a value, the existing value is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Lookup', - insertText: new SnippetString('Lookup(${1:key as String})'), - documentation: new MarkdownString( -` - Lookup(key as String) as Dynamic - -Return the value in the array associated with the specified key. If there is no value associated with the key then type "invalid" is returned. -Key comparison is case-insensitive, unless SetModeCaseSensitive() has been called. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DoesExist', - insertText: new SnippetString('DoesExist(${1:key as String})'), - documentation: new MarkdownString( -` - DoesExist(key as String) as Boolean - -Look for an entry in the array associated with the specified key. If there is no associated object then false is returned. If there is such an object then true is returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Delete', - insertText: new SnippetString('Delete(${1:key as String})'), - documentation: new MarkdownString( -` - Delete(key as String) as Boolean - -Look for an entry in the array associated with the specified key. If there is such an value then it is deleted and true is returned. If not then false is returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Clear', - insertText: new SnippetString('Clear()'), - documentation: new MarkdownString( -` - Clear() as Void - -Remove all key/values from the associative array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Keys', - insertText: new SnippetString('Keys()'), - documentation: new MarkdownString( -` - Keys() as Object - -Returns an array containing the associative array keys in lexicographical order.\\ -_This function is available in firmware 7.0 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Items', - insertText: new SnippetString('Items()'), - documentation: new MarkdownString( -` - Items() as Object - -Returns an array containing the associative array key/value pairs in lexicographical order of key. -Each item is in the returned array is an associative array with 'key' and 'value' fields.\\ -_This function is available in firmware 7.5 or later._ - -Examples - - aa = {one:1, two:2, three:3} - for each item in aa.Items() - print item.key, item.value - end for - ' prints "one 1", "three 3", "two 2" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetModeCaseSensitive', - insertText: new SnippetString('SetModeCaseSensitive()'), - documentation: new MarkdownString( -` - SetModeCaseSensitive() as Void - -Associative Array lookups are case insensitive by default. This call makes all subsequent actions case sensitive. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'LookupCI', - insertText: new SnippetString('LookupCI(${1:key as String})'), - documentation: new MarkdownString( -` - LookupCI(key as String) as Dynamic - -Same as "Lookup" except key comparison is always case insensitive, regardless of case mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Append', - insertText: new SnippetString('Append(${1:aa as Object})'), - documentation: new MarkdownString( -` - Append(aa as Object) as Void - -Append an AssociativeArray to this one. If any key in aa is already associated with a value in this AssociativeArray, the current value is discarded and is replaced with the value in aa. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Count', - insertText: new SnippetString('Count()'), - documentation: new MarkdownString( -` - Count() as Integer - -Returns the number of keys in the associative array. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAudioGuideCompletionItems.ts b/src/BrightScriptCompletionItems/ifAudioGuideCompletionItems.ts deleted file mode 100644 index f39aa8f4..00000000 --- a/src/BrightScriptCompletionItems/ifAudioGuideCompletionItems.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAudioGuideCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Say', - insertText: new SnippetString('Say(${1:text as String}, ${2:flushSpeech as Boolean}, ${3:dontRepeat as Boolean})'), - documentation: new MarkdownString( -` - Say(text as String, flushSpeech as Boolean, dontRepeat as Boolean) as Integer - -Speaks the specified text string. This method does nothing if Audio Guide is currently disabled. - -This method returns an ID for the spoken string to notify observer callbacks about a specific spoken string. This ID can be used with roTextToSpeechEvent. - -This method will automatically split up text to reduce lag. Due to this automatic splitting, the roTextToSpeechEvent 0 -("Started speech") event for the returned ID may not be sent until later than expected. The roTextToSpeechEvents 1 -("Speech has completed") and 2 ("Speech has been flushed") events are sent at the expected times. - -This method also uses the correct voice, language, volume, and speech rate for Audio Guide and tries to be "smart" -by pre-processing the text for correct pronunciation of items such as currency, email addresses, acronyms, media-related names and titles, etc. - -For more control over what is said, use roTextToSpeech.Say() which does not pre-process the text, set volume, rate, etc. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Flush', - insertText: new SnippetString('Flush()'), - documentation: new MarkdownString( -` - Flush() as Void - -Interrupts and stops any current text to speech spoken string, to be used when the application does not want the text to speech to continue. -Note that this call is equivalent to roTextToSpeech.Flush(), and stops speech started using both roAudioGuide.Say() and roTextToSpeech.Say(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Silence', - insertText: new SnippetString('Silence(${1:duration as Integer})'), - documentation: new MarkdownString( -` - Silence(duration as Integer) as Integer - -If Audio Guide is enabled, causes text to speech to continue to suppress any application background sound for the amount of time specified by duration (in milliseconds). -This can be used to add clarity for longer spoken text that may have pauses that might otherwise allow application background sound to be heard. -This method does nothing if Audio Guide is currently disabled. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAudioMetadataCompletionItems.ts b/src/BrightScriptCompletionItems/ifAudioMetadataCompletionItems.ts deleted file mode 100644 index ed8199b1..00000000 --- a/src/BrightScriptCompletionItems/ifAudioMetadataCompletionItems.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAudioMetadataCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetUrl', - insertText: new SnippetString('SetUrl(${1:url as String})'), - documentation: new MarkdownString( -` - SetUrl(url as String) as Void - -Sets the URL to the audio file. Only file URLs are initially supported. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTags', - insertText: new SnippetString('GetTags()'), - documentation: new MarkdownString( -` - GetTags() as Object - -Returns an associative array that contains a simple set of tags that are common to most audio formats. This associative array contains: - -Name | Type ---- | --- -album | String -artist | String -comment | String -composer | String -genre | String -title | String -track | Integer -year | Integer -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAudioProperties', - insertText: new SnippetString('GetAudioProperties()'), - documentation: new MarkdownString( -` - GetAudioProperties() as Object - -Returns an associative array with a simple set of audio properties. These are values which may involve reading a larger portion of the -file and thus may take longer to retrieve than the tags. The associative array contains: - -Name | Type | Notes ---- | --- | --- -length | Integer | Duration in seconds -bitrate | Integer | In kilobytes per second -samplerate | Integer | Samples per second -channels | Integer | Number of channels - -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCoverArt', - insertText: new SnippetString('GetCoverArt()'), - documentation: new MarkdownString( -` - GetCoverArt() as Object - -Returns the cover art if available. Returns an associative array with two entries: "bytes" and "type". -"bytes" is an roByteArray containing the image data. "type" specifies the mime-type of the image which is almost always either "image/jpeg" or "image/png". -Looks for the picture designated as the cover art if there is more than one picture in the file. If there is no FrontCover picture then the first picture is used. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAudioPlayerCompletionItems.ts b/src/BrightScriptCompletionItems/ifAudioPlayerCompletionItems.ts deleted file mode 100644 index a970957a..00000000 --- a/src/BrightScriptCompletionItems/ifAudioPlayerCompletionItems.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAudioPlayerCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetContentList', - insertText: new SnippetString('SetContentList(${1:contentList as Object})'), - documentation: new MarkdownString( -` - SetContentList(contentList as Object) as Void - -Set the content list to be played by the Audio Player. The caller passes an Array of AssociativeArrays (Content Meta-Data objects) -representing the information for each stream to be played. See Content Meta-Data for details on the attributes for each element in the array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddContent', - insertText: new SnippetString('AddContent(${1:contentItem as Object})'), - documentation: new MarkdownString( -` - AddContent(contentItem as Object) as Void - -Add a new ContentMetaData item to the content list for the Audio Player. The new item is added to the end of the content list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ClearContent', - insertText: new SnippetString('ClearContent()'), - documentation: new MarkdownString( -` - ClearContent() as Void - -Clear the content list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Play', - insertText: new SnippetString('Play()'), - documentation: new MarkdownString( -` - Play() as Boolean - -Put the Audio Player into _play_ mode starting at the current item in the Content List. This will stop any currently playing content. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Stop', - insertText: new SnippetString('Stop()'), - documentation: new MarkdownString( -` - Stop() as Boolean - -Stop Audio Player from playing or pausing and cleanup. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Pause', - insertText: new SnippetString('Pause()'), - documentation: new MarkdownString( -` - Pause() as Boolean - -Put Audio Player into _pause_ mode. It is an error to Pause if player is not in _play_ mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Resume', - insertText: new SnippetString('Resume()'), - documentation: new MarkdownString( -` - Resume() as Boolean - -Put Audio Player into _play_ mode starting from the pause point. It is an error to Resume if the player is not in _pause_ mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetLoop', - insertText: new SnippetString('SetLoop(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetLoop(enable as Boolean) as Void - -Enable/disable the automatic replaying of the Content List. When enabled, after playing the last item in the content list, the player begins playing the first item. -When disabled, after playing the last item in the content list, the player stops. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetNext', - insertText: new SnippetString('SetNext(${1:item as Integer})'), - documentation: new MarkdownString( -` - SetNext(item as Integer) as Void - -Set what the next item to be played within the Content List should be. -item is the zero-based index of the item in the content list. This item will be played after the currently playing item finishes. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Seek', - insertText: new SnippetString('Seek(${1:offsetMs as Integer})'), - documentation: new MarkdownString( -` - Seek(offsetMs as Integer) as Boolean - -Set the start point of playback for the current item to offsetMs milliseconds. -If the item is currently playing, playback will be interrupted and will restart at the specified offset. -If the item is not currently playing, playback will begin at the specified offset when Play() is called. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetTimeMetaDataForKeys', - insertText: new SnippetString('SetTimeMetaDataForKeys(${1:keys as Dynamic})'), - documentation: new MarkdownString( -` - SetTimeMetaDataForKeys(keys[] as Dynamic) as Void - -This method is called to specify the timedMetaData keys that the BrightScript channel is interested in receiving from the timedMetaData event. -If the keys array is empty, all the timed metadata associated with the current stream is sent with the isTimedMetaData event. -If the keys array is invalid, then do not return any keys to the BrightScript channel. -Any keys not specified with this method are deleted by the firmware and never returned to the BrightScript application. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifAudioResourceCompletionItems.ts b/src/BrightScriptCompletionItems/ifAudioResourceCompletionItems.ts deleted file mode 100644 index c1b88a30..00000000 --- a/src/BrightScriptCompletionItems/ifAudioResourceCompletionItems.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifAudioResourceCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Trigger', - insertText: new SnippetString('Trigger(${1:volume as Integer})'), - documentation: new MarkdownString( -` - Trigger(volume as Integer) as Void - -This method triggers the start of the audio resource sound playback. -The volume is a number between 0 and 100 (percentage of full volume). 50 should be used for normal volume. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsPlaying', - insertText: new SnippetString('IsPlaying()'), - documentation: new MarkdownString( -` - IsPlaying() as Boolean - -Returns true if this audio resource is currently playing. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Stop', - insertText: new SnippetString('Stop()'), - documentation: new MarkdownString( -` - Stop() as Void - -Stops playing the audio resource. If the resource is not currently playing, has no effect. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'MaxSimulStreams', - insertText: new SnippetString('MaxSimulStreams()'), - documentation: new MarkdownString( -` - MaxSimulStreams() as Integer - -Returns the maximum number of audio resources which can be played simultaneous. -Some Roku models support playing multiple resources and mix the output, others support playing only one stream at a time. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMetaData', - insertText: new SnippetString('GetMetaData()'), - documentation: new MarkdownString( -` - GetMetaData() as Object - -Returns an roAssociativeArray array containing the following meta data parameters about the audio resource. All values are integers. - -* Length (number of samples) -* SamplesPerSecond -* NumChannels -* BitsPerSample -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifByteArrayCompletionItems.ts b/src/BrightScriptCompletionItems/ifByteArrayCompletionItems.ts deleted file mode 100644 index 751e08e0..00000000 --- a/src/BrightScriptCompletionItems/ifByteArrayCompletionItems.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifByteArrayCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'WriteFile', - insertText: new SnippetString('WriteFile(${1:path as String})'), - documentation: new MarkdownString( -` - WriteFile(path as String) as Boolean - -Writes the bytes contained in the Byte Array to the specified file. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'WriteFile', - insertText: new SnippetString('WriteFile(${1:path as String}, ${2:start_index as Integer}, ${3:length as Integer})'), - documentation: new MarkdownString( -` - WriteFile(path as String, start_index as Integer, length as Integer) as Boolean - -Writes a subset of the bytes contained in the Byte Array to the specified file. -"length" bytes are written, starting at the zero-based start_index. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ReadFile', - insertText: new SnippetString('ReadFile(${1:path as String})'), - documentation: new MarkdownString( -` - ReadFile(path as String) as Boolean - -Reads the specified file into the Byte Array. - -Any data currently in the Byte Array is discarded. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ReadFile', - insertText: new SnippetString('ReadFile(${1:path as String}, ${2:start_pos as Integer}, ${3:length as Integer})'), - documentation: new MarkdownString( -` - ReadFile(path as String, start_pos as Integer, length as Integer) as Boolean - -Reads a section of the file into the Byte Array. -"length" bytes are read, starting at the zero-based start_pos. - -*Note that in WriteFile, start_index is an index into the Byte Array, but in ReadFile, start_pos is an index into the file.* - -Any data currently in the Byte Array is discarded. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AppendFile', - insertText: new SnippetString('AppendFile(${1:path as String})'), - documentation: new MarkdownString( -` - AppendFile(path as String) as Boolean - -Appends the contents of the Byte Array to the specified file. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AppendFile', - insertText: new SnippetString('AppendFile(${1:path as String}, ${2:start_pos as Integer}, ${3:length as Integer})'), - documentation: new MarkdownString( -` - AppendFile(path as String, start_pos as Integer, length as Integer) as Boolean - -Appends a subset of the bytes contained in the Byte Array to the specified file. -"length" bytes are written, starting at the zero-based start_index. - -Returns true if successful. - -_This function is available in firmware 7.5 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetResize', - insertText: new SnippetString('SetResize(${1:min_size as Integer}, ${2:auto_resize as Boolean})'), - documentation: new MarkdownString( -` - SetResize(min_size as Integer, auto_resize as Boolean) as Boolean - -If the size of the Byte Array is less than min_size, expands the Byte Array to min_size. -Also sets the auto-resize attribute of the Byte Array to the specified value. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToHexString', - insertText: new SnippetString('ToHexString()'), - documentation: new MarkdownString( -` - ToHexString() as String - -Returns a hexadecimal string representing the contents of the Byte Array, two digits per byte. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FromHexString', - insertText: new SnippetString('FromHexString(${1:hexstring as String})'), - documentation: new MarkdownString( -` - FromHexString(hexstring as String) as Void - -Sets the contents of the Byte Array to the specified value. -The string must be an even number of hexadecimal digits. -The string must contain valid hexadecimal digits, or the result is undefined. - -Any data currently in the Byte Array is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToBase64String', - insertText: new SnippetString('ToBase64String()'), - documentation: new MarkdownString( -` - ToBase64String() as String - -Returns a base-64 string representing the contents of the Byte Array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FromBase64String', - insertText: new SnippetString('FromBase64String(${1:s as String})'), - documentation: new MarkdownString( -` - FromBase64String(s as String) as Void - -Sets the contents of the Byte Array to the specified value. -The string must be a valid base-64 encoding. - -Any data currently in the Byte Array is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToAsciiString', - insertText: new SnippetString('ToAsciiString()'), - documentation: new MarkdownString( -` - ToAsciiString() as String - -Returns the contents of the Byte Array as a string. -The contents must be valid UTF-8 (or ASCII subset), or the result is undefined. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FromAsciiString', - insertText: new SnippetString('FromAsciiString(${1:s as String})'), - documentation: new MarkdownString( -` - FromAsciiString(s as String) as Void - -Sets the contents of the Byte Array to the specified string using UTF-8 encoding. -Any data currently in the Byte Array is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSignedByte', - insertText: new SnippetString('GetSignedByte(${1:index as Integer})'), - documentation: new MarkdownString( -` - GetSignedByte(index as Integer) as Integer - -Returns the signed byte at the specified zero-based index in the Byte Array. -Use ifArrayGet.GetEntry() or the [] array operator to read an unsigned byte in the Byte Array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSignedLong', - insertText: new SnippetString('GetSignedLong(${1:index as Integer})'), - documentation: new MarkdownString( -` - GetSignedLong(index as Integer) as Integer - -Returns the signed long (four bytes) starting at the specified zero-based index in the Byte Array. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCRC32', - insertText: new SnippetString('GetCRC32()'), - documentation: new MarkdownString( -` - GetCRC32() as Integer - -Calculates a CRC-32 of the contents of the Byte Array. - -_This function is available in firmware 7.5 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCRC32', - insertText: new SnippetString('GetCRC32(${1:start as Integer}, ${2:length as Integer})'), - documentation: new MarkdownString( -` - GetCRC32(start as Integer, length as Integer) as Integer - -Calculates a CRC-32 of a subset of the bytes in the Byte Array. - -_This function is available in firmware 7.5 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsLittleEndianCPU', - insertText: new SnippetString('IsLittleEndianCPU()'), - documentation: new MarkdownString( -` - IsLittleEndianCPU() as Boolean - -Returns true if the CPU architecture is little-endian. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifChannelStoreCompletionItems.ts b/src/BrightScriptCompletionItems/ifChannelStoreCompletionItems.ts deleted file mode 100644 index cdc30492..00000000 --- a/src/BrightScriptCompletionItems/ifChannelStoreCompletionItems.ts +++ /dev/null @@ -1,367 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifChannelStoreCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetIdentity', - insertText: new SnippetString('GetIdentity()'), - documentation: new MarkdownString( -` - GetIdentity() as Integer - -Returns a unique number for this object that can be used to identify whether a roChannelStoreEvent event originated from this object, -by comparing with the roChannelStoreEvent object's GetSourceIdentity() value. - -Note that the value can be any arbitrary value as assigned by the firmware, and should only be used for comparison purposes. -For example, the value should not be used as an array index. -For use as a look-up key, one option would be to use GetIdentity().ToStr() as an associative array key. - -_This function is available in firmware 7.5 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCatalog', - insertText: new SnippetString('GetCatalog()'), - documentation: new MarkdownString( -` - GetCatalog() as Void - -Requests the list of In-Channel products which are linked to the running channel. - -If successful, a later roChannelStoreEvent will be received which contains an roList of roAssociativeArray items where each item contains the following parameter names with specified value type: - -* String code -* String name -* String description -* String SDPosterUrl -* String HDPosterUrl -* String cost (Localized cost with local currency symbol) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetStoreCatalog', - insertText: new SnippetString('GetStoreCatalog()'), - documentation: new MarkdownString( -` - GetStoreCatalog() as Void - -Requests the list of globally available In-Channel products, which are available to all channels. - -If successful, a later roChannelStoreEvent will be received which contains an roList of roAssociativeArray items, where each item contains the following parameter names with specified value type: - -* String code -* String name -* String description -* String SDPosterUrl -* String HDPosterUrl -* String cost (Localized cost with local currency symbol) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPurchases', - insertText: new SnippetString('GetPurchases()'), - documentation: new MarkdownString( -` - GetPurchases() as Void - -Requests the list of purchases associated with the current user account. - -If successful, a later roChannelStoreEvent will be received which contains an roList of roAssociativeArray items, where each item contains the following parameter names with specified value type: - -Parameter | Type | Description ---- | --- | --- -code | String | The product identifier -cost | String | Localized cost of the item with local currency symbol -expirationDate | String | The subscription expiration date (ISO 8601 format) -freeTrialQuantity | Integer | The free trial amount associated with the freeTrialType -freeTrialType | String | The free trial type ("Days" or "Months") -name | String | The item name -productType | String | The product type (ex. "MonthlySub") -purchaseDate | String | The purchase date (ISO 8601 format) -purchaseId | String | The transaction ID -qty | Integer | The quantity purchased -renewalDate | String | The subscription renewal date (ISO 8601 format) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetOrder', - insertText: new SnippetString('SetOrder(${1:order as Object})'), - documentation: new MarkdownString( -` - SetOrder(order as Object) as Void - -Sets the current Order (shopping cart) to the elements specified in the parameter, which must be an roList of roAssociativeArray items, -where each item contains the following parameter names with specified value type: - -* String code -* Integer qty - -Passing an empty roList clears the Order, like calling ClearOrder(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ClearOrder', - insertText: new SnippetString('ClearOrder()'), - documentation: new MarkdownString( -` - ClearOrder() as Void - -Clears the current Order (shopping cart). After this call, the Order is empty. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DeltaOrder', - insertText: new SnippetString('DeltaOrder(${1:code as Object}, ${2:qty as Integer})'), - documentation: new MarkdownString( -` - DeltaOrder(code as Object, qty as Integer) as Integer - -Applies a change in quantity to one item in the current Order (shopping cart). If the item identified by code is not in the Order, it is added with the specified quantity. -If the item already exists in the Order, qty is added to the quantity of this item in the Order. qty may be negative. -The returned value is the quantity of the item remaining in the Order after applying the change. If this number is zero or negative, the item is deleted from the Order. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetOrder', - insertText: new SnippetString('GetOrder()'), - documentation: new MarkdownString( -` - GetOrder() as Object - -Retrieves the current Order. The returned object is an roList of roAssociativeArray items, where each item contains the following parameter names with specified value type: - -* String code -* Integer qty -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DoOrder', - insertText: new SnippetString('DoOrder()'), - documentation: new MarkdownString( -` - DoOrder() as Boolean - -Displays the Roku Channel Store Product Purchase Screen populated with information from the current Order. -The user can then either approve and complete the purchase, or cancel the purchase. If the user approves the order, this function returns true. -Otherwise it returns false. In the case that the user approves, -the channel should wait for and respond to the roChannelStoreEvent.isRequestSucceeded event to get the details of the completed transaction. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FakeServer', - insertText: new SnippetString('FakeServer(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - FakeServer(enable as Boolean) as Void - -If enable is true, enables a test mode for the roChannelStore component. -This test mode short circuits communication to the Roku Channel store. -It makes other methods get their responses to async queries and operations from configuration files, rather than actual server communication. - -This should never be called in a production channel. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetUserData', - insertText: new SnippetString('GetUserData()'), - documentation: new MarkdownString( -` - GetUserData() as Dynamic - -When called, the method presents a dialog screen containing the user’s account information, along with two buttons labeled Share and Don’t Share. -If the user presses the Don’t Share button, GetUserData() returns invalid. If the user presses the Share button, -GetUserData() returns an roAssociativeArray containing the following Roku account information for the channel user. All values are Strings. - -* firstname -* lastname -* email -* street1 -* street2 -* city -* state -* zip -* country -* phone -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPartialUserData', - insertText: new SnippetString('GetPartialUserData(${1:properties as String})'), - documentation: new MarkdownString( -` - GetPartialUserData(properties as String) as Dynamic - -This function works like GetUserData(), but allows the caller to specify which user data elements to return. -The specified values are also displayed in the user data dialog screen. To tell the function which properties to return, pass a string with a comma separated list of the attribute names. -For example, to return only the email address and first name of the user's account, you would call GetPartialUserData("email, firstname"). -The full set of user account properties that can be queried with the function is: - -* firstname -* lastname -* email -* street -* city -* state -* zip -* country -* phone -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'StoreChannelCredData', - insertText: new SnippetString('StoreChannelCredData(${1:data as String})'), - documentation: new MarkdownString( -` - StoreChannelCredData(data as String) as Object - -_Available since firmware version 8.1_ - -This method can be used to store custom data (such as an OAuth token or a custom token) that can be retrieved by calling GetChannelCred. -This data is stored securely in the cloud and can be retrieved by other devices linked to the same Roku account. -Your channel can use the Roku StoreChannelCredData method to store an authentication artifact with Roku for a signed in user, -associating that user with a particular Roku account. For more information, see Universal Authentication Protocol for Single Sign-On. - -If the transaction is successful, an roAssociativeArray will be returned containing the following value: - -Key | Type | Value ---- | --- | --- -status | Integer | An integer representing the request status. A successful request will return a status of 0 - -If the transaction failed, the roAssociativeArray will contain the following value: - -Key | Type | Value ---- | --- | --- -errorCode | String | An error code representing why the transaction failed. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetChannelCred', - insertText: new SnippetString('GetChannelCred()'), - documentation: new MarkdownString( -` - GetChannelCred() as Object - -_Available since firmware version 7.2_ - -This function can be used to retrieve a Roku Partner Unique Customer Identifier (roku_pucid). -The PUCID can be used in place of requiring the user to enter their email address or username again (ex. when setting up a new device on the same Roku account). - -It returns an roAssociativeArray containing the following values: - -Key | Type | Description ---- | --- | --- -channelID | String | A string representing the channel ID -json | String | A string in JSON format with the following key values: error as String, roku_pucid as String, token_type as String. If the request fails this _json_ string will be empty. -publisherDeviceID | String | A unique identifier of the device. See GetPublisherId() for more details. -status | Integer | An integer representing the request status. A successful request will return a status of 0. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RequestPartnerOrder', - insertText: new SnippetString('RequestPartnerOrder(${1:orderInfo as Object}, ${2:productID as String})'), - documentation: new MarkdownString( -` - RequestPartnerOrder(orderInfo as Object, productID as String) as Object - -_Available since firmware version 7.6_ - -This function checks the user's billing status and is a prerequisite for ConfirmPartnerOrder() when doing transactional purchases. This function requires the following parameters: - -Key | Type | Description ---- | --- | --- -orderInfo | Object | An roAssociativeArray that contains two String key-value pairs: priceDisplay as String, price as String. -productID | String | The product identifier as entered on the Developer Dashboard when the product was created. - -This function returns an roAssociativeArray containing the following values: - -Key | Type | Description ---- | --- | --- -id | String | This ID must be passed in the confirmOrderInfo parameter in ConfirmPartnerOrder() -status | String | Success -tax | String | Cost of tax (if applicable) -total | String | Total cost of transaction - -If status is Failure, the roAssociativeArray will contain the following values: - -Key | Type | Description ---- | --- | --- -errorCode | String | An error code representing why the transaction failed -errorMessage | String | An error message explaining why the transaction failed -status | String | Failure -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ConfirmPartnerOrder', - insertText: new SnippetString('ConfirmPartnerOrder(${1:confirmOrderInfo as Object}, ${2:productID as String})'), - documentation: new MarkdownString( -` - ConfirmPartnerOrder(confirmOrderInfo as Object, productID as String) as Object - -_Available since firmware version 7.6_ - -This function is equivalent to doOrder() for transactional purchases. -The user's billing status must first be confirmed with RequestPartnerOrder() prior to calling this function. -productID is the product identifier as entered on the Developer Dashboard when the product was created. confirmOrderInfo is an roAssociativeArray with the following info: - -Key | Type | Description ---- | --- | --- -title | String | The name of the content item (shown on user's invoice) -priceDisplay | String | The original price displayed -price | String | The price to charge -orderID | String | The ID returned from RequestPartnerOrder() - -_Note: The currency symbol must not be included for price and priceDisplay_ - -If the transaction is successful, an roAssociativeArray will be returned containing the following values: - -Key | Type | Description ---- | --- | --- -purchaseID | String | The transaction ID -status | String | Success - -If the transaction failed, the roAssociativeArray will contain the following values: - -Key | Type | Description ---- | --- | --- -errorCode | String | An error code representing why the transaction failed -errorMessage | String | An error message explaining why the transaction failed -status | String | Failure -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifCompositorCompletionItems.ts b/src/BrightScriptCompletionItems/ifCompositorCompletionItems.ts deleted file mode 100644 index 91740a40..00000000 --- a/src/BrightScriptCompletionItems/ifCompositorCompletionItems.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifCompositorCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetDrawTo', - insertText: new SnippetString('SetDrawTo(${1:destBitmap as Object}, ${2:rgbaBackground as Integer})'), - documentation: new MarkdownString( -` - SetDrawTo(destBitmap as Object, rgbaBackground as Integer) as Void - -Set the destBitmap (roBitmap or roScreen) and the background color. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Draw', - insertText: new SnippetString('Draw()'), - documentation: new MarkdownString( -` - Draw() as Void - -Draw any dirty sprites (that is, whatever is new or has changed since the last Draw). No compositor or sprite operations will be reflected on the display until Draw() is called. - -After calling Draw(), you must call Finish() (if single buffered) or SwapBuffers() (if double buffered) before the changes will be user visible. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawAll', - insertText: new SnippetString('DrawAll()'), - documentation: new MarkdownString( -` - DrawAll() as Void - -Redraw all sprites even if not dirty. - -After calling Draw(), you must call Finish() (if single buffered) or SwapBuffers() (if double buffered) before the changes will be user visible. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'NewSprite', - insertText: new SnippetString('NewSprite(${1:x as Integer}, ${2:y as Integer}, ${3:region as Object}, ${4:z as Integer})'), - documentation: new MarkdownString( -` - NewSprite(x as Integer, y as Integer, region as Object, z as Integer) as Object - -Returns an roSprite object - -Create a new sprite, using an roRegion to define the sprite's bitmap. Position the sprite at coordinate x,y. - -If z is provided, position the sprite in front of all other sprites with equal or lower z value. Sprites with negative z values are not rendered or displayed on the screen. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'NewAnimatedSprite', - insertText: new SnippetString('NewAnimatedSprite(${1:x as Integer}, ${2:y as Integer}, ${3:regionArray as Object}, ${4:z as Integer})'), - documentation: new MarkdownString( -` - NewAnimatedSprite(x as Integer, y as Integer, regionArray as Object, z as Integer) as Object - -Returns an roSprite object. - -Create a new sprite that consists of a sequence of frames to be animated. The frames are defined by the regionArray which is an roArray of roRegions - -Position the sprite at coordinate x,y. - -If z is provided, position the sprite in front of all other sprites with equal or lower z value -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AnimationTick', - insertText: new SnippetString('AnimationTick(${1:duration as Integer})'), - documentation: new MarkdownString( -` - AnimationTick(duration as Integer) as Void - -Duration is the number of ms since the last call. - -Moves all animated sprites. - -Sprites will not animate unless you call this function regularly. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ChangeMatchingRegions', - insertText: new SnippetString('ChangeMatchingRegions(${1:oldRegion as Object}, ${2:newRegion as Object})'), - documentation: new MarkdownString( -` - ChangeMatchingRegions(oldRegion as Object, newRegion as Object) as Void - -Global search and replace of Sprite roRegions. - -Replaces regions that match oldRegion with newRegion. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifDateTimeCompletionItems.ts b/src/BrightScriptCompletionItems/ifDateTimeCompletionItems.ts deleted file mode 100644 index 01ebacc9..00000000 --- a/src/BrightScriptCompletionItems/ifDateTimeCompletionItems.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifDateTimeCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Mark', - insertText: new SnippetString('Mark()'), - documentation: new MarkdownString( -` - Mark() as Void - -Set the date/time value to the current UTC date and time. - -_Note: roDateTime objects are automatically Marked on creation._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToLocalTime', - insertText: new SnippetString('ToLocalTime()'), - documentation: new MarkdownString( -` - ToLocalTime() as Void - -Offsets the date/time value from an assumed UTC date/time to a local date/time using the system time zone setting. - -This function is not idempotent, and multiple calls will do multiple timezone adjustments to the time yielding an incorrect result. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTimeZoneOffset', - insertText: new SnippetString('GetTimeZoneOffset()'), - documentation: new MarkdownString( -` - GetTimeZoneOffset() as Integer - -Returns the offset in minutes from the system time zone to UTC. -For example, if the system time zone is in PDT / UTC-7 the value returned would be 420. - -Note: the time zone offset is returned for the current date/time, regardless of the object's date/time value. - -_This function is available in firmware 6.2 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsSeconds', - insertText: new SnippetString('AsSeconds()'), - documentation: new MarkdownString( -` - AsSeconds() as Integer - -Returns the date/time as the number of seconds from the Unix epoch (00:00:00 1/1/1970 GMT). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FromSeconds', - insertText: new SnippetString('FromSeconds(${1:numSeconds as Integer})'), - documentation: new MarkdownString( -` - FromSeconds(numSeconds as Integer) as Void - -Set the date/time value using the number of seconds from the Unix epoch. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToISOString', - insertText: new SnippetString('ToISOString()'), - documentation: new MarkdownString( -` - ToISOString() as String - -Return an ISO 8601 representation of the date/time value, e.g. "2015-01-27T13:21:58Z". - -_This function is available in firmware 6.2 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FromISO8601String', - insertText: new SnippetString('FromISO8601String(${1:dateString as String})'), - documentation: new MarkdownString( -` - FromISO8601String(dateString as String) as Void - -Set the date/time using a string in the ISO 8601 format. For example "YYYY-MM-DD HH:MM:SS" e.g "2009-01-01 01:00:00.000" or "2009-01-01T01:00:00.000". -Note that this function is unaware of the local time zone, so these time formats are effectively UTC even though the ISO 8601 spec says they should be in local time. -The above formats are also the only formats recognized by this function, even though the ISO 8601 spec contains other valid formats. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsDateString', - insertText: new SnippetString( - 'AsDateString(${1|"long-date","short-weekday","no-weekday","short-month","short-month-short-weekday","short-month-no-weekday","short-date","short-date-dashes"|})' - ), - documentation: new MarkdownString( -` - AsDateString(format as String) as String - -Returns the date/time as a formatted string in one of the following formats: - -Format | Example ---- | --- -long-date | Tuesday October 9, 2012 -short-weekday | Tue October 9, 2012 -no-weekday | October 9, 2012 -short-month | Tuesday Oct 9, 2012 -short-month-short-weekday | Tue Oct 9, 2012 -short-month-no-weekday | Oct 9, 2012 -short-date | 10/9/12 -short-date-dashes | 10-9-12 - -Note that day names, month names, separators, and order of fields may vary depending on the current locale. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsDateStringNoParam', - insertText: new SnippetString('AsDateStringNoParam()'), - documentation: new MarkdownString( -` - AsDateStringNoParam() as String - -Same as AsDateString("long-date"). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetWeekday', - insertText: new SnippetString('GetWeekday()'), - documentation: new MarkdownString( -` - GetWeekday() as String - -Returns the day of the week as a String (e.g. "Monday"). - -Note: this function always returns the canonical English day of week names, regardless of the current locale. For a locale-independent index, see GetDayOfWeek(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetYear', - insertText: new SnippetString('GetYear()'), - documentation: new MarkdownString( -` - GetYear() as Integer - -Returns the date/time value's year as an Integer, e.g. 2015. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMonth', - insertText: new SnippetString('GetMonth()'), - documentation: new MarkdownString( -` - GetMonth() as Integer - -Returns the date/time value's month as an Integer (1=Jan, 12=Dec). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDayOfMonth', - insertText: new SnippetString('GetDayOfMonth()'), - documentation: new MarkdownString( -` - GetDayOfMonth() as Integer - -Returns the date/time value's day of the month as an Integer (1-31). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHours', - insertText: new SnippetString('GetHours()'), - documentation: new MarkdownString( -` - GetHours() as Integer - -Returns the date/time value's hour within the day as an Integer (0-23). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMinutes', - insertText: new SnippetString('GetMinutes()'), - documentation: new MarkdownString( -` - GetMinutes() as Integer - -Returns the date/time value's minute within the hour as an Integer (0-59). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSeconds', - insertText: new SnippetString('GetSeconds()'), - documentation: new MarkdownString( -` - GetSeconds() as Integer - -Returns the date/time value's second within the minute as an Integer (0-59). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMilliseconds', - insertText: new SnippetString('GetMilliseconds()'), - documentation: new MarkdownString( -` - GetMilliseconds() as Integer - -Returns the date/time value's millisecond within the second as an Integer (0-999). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetLastDayOfMonth', - insertText: new SnippetString('GetLastDayOfMonth()'), - documentation: new MarkdownString( -` - GetLastDayOfMonth() as Integer - -Returns the date/time value's last day of the month as an Integer (28-31). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDayOfWeek', - insertText: new SnippetString('GetDayOfWeek()'), - documentation: new MarkdownString( -` - GetDayOfWeek() as Integer - -Returns the date/time value's day of week as an Integer (Sunday=0, Monday=1, ..., Saturday=6). - -_This function is available in firmware 6.2 or later._ -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifDeviceInfoCompletionItems.ts b/src/BrightScriptCompletionItems/ifDeviceInfoCompletionItems.ts deleted file mode 100644 index 7e9d35a7..00000000 --- a/src/BrightScriptCompletionItems/ifDeviceInfoCompletionItems.ts +++ /dev/null @@ -1,869 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifDeviceInfoCompletionItems: CompletionItem[] = [ - // ############### Device Properties ############### - { - kind: CompletionItemKind.Method, - label: 'GetModel', - insertText: new SnippetString('GetModel()'), - documentation: new MarkdownString( -` - GetModel() as String - -Returns the model name for the Roku Streaming Player device running the script. -This is a five-character alphanumeric string; for example, "3050X". Please see Roku Models and Features of the Developer Guide for a list of the current and classic models. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetModelDisplayName', - insertText: new SnippetString('GetModelDisplayName()'), - documentation: new MarkdownString( -` - GetModelDisplayName() as String - -Returns the model display name for the Roku Streaming Player device running the script (for example, "Roku 2 XD"). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetModelType', - insertText: new SnippetString('GetModelType()'), - documentation: new MarkdownString( -` - GetModelType() as String - -Returns a string describing what type of device it is. For future compatibility, -the caller should by default assume "STB" when anything other than described value is returned. Current possible values are: - -"STB" Set-top box type device. -"TV" Roku TV type device. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetModelDetails', - insertText: new SnippetString('GetModelDetails()'), - documentation: new MarkdownString( -` - GetModelDetails() as Object - -Returns an associative array containing more information about the device model. The following keys are defined: - -VendorName - string describing model vendor -ModelNumber - string describing model number -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetFriendlyName', - insertText: new SnippetString('GetFriendlyName()'), - documentation: new MarkdownString( -` - GetFriendlyName() as String - -Returns a string describing the device that may be used for network device selection. -The string may be a user-assigned device name or a description of the device such as model name and/or serial number. The string is subject to change and should not be used as a persistent key or ID. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVersion', - insertText: new SnippetString('GetVersion()'), - documentation: new MarkdownString( -` - GetVersion() as String - -Returns the version number of the Roku Streaming Player firmware running on the device. This is a 13 character string; for example "034.08E01185A". -The third through sixth characters are the major/minor version number ("4.08") and the ninth through twelfth are the build number ("1185"). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRIDA', - insertText: new SnippetString('GetRIDA()'), - documentation: new MarkdownString( -` - GetRIDA() as String - -_Available since firmware 8.1_ - -GetRIDA() returns a unique identifier of the unit running the script. -The string returned is a Universally Unique Identifier (UUID). -This identifier is persistent but can be reset by the user from the device's Settings menu or by performing a factory reset on the device. -If the user has set "Limit ad tracking" (RIDA is disabled) from the Settings menu, then this identifier should not be used for targeted advertising. -Additionally, if the viewer’s country is an EU member country, any data collection must be compliant with the EU General Data Protection Regulation. - -IsRIDADisabled() should be called to check if the user has disabled RIDA tracking and GetUserCountryCode() should be called to check the user’s country. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsRIDADisabled', - insertText: new SnippetString('IsRIDADisabled()'), - documentation: new MarkdownString( -` - IsRIDADisabled() as Boolean - -_Available since firmware 8.1_ - -IsRIDADisabled() returns True if the user has disabled RIDA tracking by selecting "Limit tracking" from the Roku Settings menu. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetChannelClientId', - insertText: new SnippetString('GetChannelClientId()'), - documentation: new MarkdownString( -` - GetChannelClientId() as String - -_Available since firmware 8.1_ - -GetChannelClientId() returns a unique identifier of the unit running the script. -This identifier is different across channels so each channel will get a different identifier when calling this function. - -The ID is persistent and cannot be reset. It is, therefore, the recommended alternative to the ESN returned by GetDeviceUniqueId(). - -This value can be used to manage or identify devices linked to the channel’s content services. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetUserCountryCode', - insertText: new SnippetString('GetUserCountryCode()'), - documentation: new MarkdownString( -` - GetUserCountryCode() as String - -_Available since firmware 8.1_ - -To determine the country associated with a user’s Roku account, a new method GetUserCountryCode() as String was added to roDeviceInfo. -Typically, the value returned will be an ISO 3166-1 (2-letter) country code representing the country. - -Note: If the channel owner entered into an additional agreement to have the channel published to a curated Roku Powered Channel Store instead of the user country, -a Roku Powered Channel Store Identifier will instead be returned. - -A future enhancement to GetUserCountryCode() will return the 2-letter country code instead of the Roku Powered Channel Store Identifier. -We, therefore, recommend that channels utilize both to avoid having to update later. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRandomUUID', - insertText: new SnippetString('GetRandomUUID()'), - documentation: new MarkdownString( -` - GetRandomUUID() as String - -Returns a randomly generated unique identifier. -The string returned is a Universally Unique Identifier (UUID) version 4 as specified in IETF-RFC 4122 with 36 characters (32 alphanumeric characters and four hyphens). -The characters are grouped in the form 8-4-4-4-12, for example "123e4567-e89b-12d3-a456-426655440000". Each time this function is called, a different identifier is returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTimeZone', - insertText: new SnippetString('GetTimeZone()'), - documentation: new MarkdownString( -` - GetTimeZone() as String - -Returns a string representing the user's current system time zone setting. Current possible values are: - -* "US/Puerto Rico-Virgin Islands" -* "US/Guam" -* "US/Samoa" -* "US/Hawaii" -* "US/Aleutian" -* "US/Alaska" -* "US/Pacific" -* "US/Arizona" -* "US/Mountain" -* "US/Central" -* "US/Eastern" -* "Canada/Pacific" -* "Canada/Mountain" -* "Canada/Central Standard" -* "Canada/Central" -* "Canada/Eastern" -* "Canada/Atlantic" -* "Canada/Newfoundland" -* "Europe/Iceland" -* "Europe/Ireland" -* "Europe/United Kingdom" -* "Europe/Portugal" -* "Europe/Central European Time" -* "Europe/Greece/Finland" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'HasFeature', - insertText: new SnippetString( - 'HasFeature(${1|"5.1_surround_sound","can_output_5.1_surround_sound","sd_only_hardware","usb_hardware","sdcard_hardware","ethernet_hardware","gaming_hardware","energy_star_compliant"|})' - ), - documentation: new MarkdownString( -` - HasFeature() as Boolean - -Returns true if the current device/firmware supports the passed in feature string. - -Valid features to query for are: - -* "5.1_surround_sound" -* "can_output_5.1_surround_sound" -* "sd_only_hardware" -* "usb_hardware" -* "sdcard_hardware" -* "ethernet_hardware" -* "gaming_hardware" -* "energy_star_compliant" ** - -** Note: "energy_star_compliant" available for Roku powered TV's as of firmware version 8.1 -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCurrentLocale', - insertText: new SnippetString('GetCurrentLocale()'), - documentation: new MarkdownString( -` - GetCurrentLocale() as String - -Returns a string representing the current locale based on the user's language setting. -The string is an ISO 639-1 (2-letter) language code followed by an underscore and a ISO 3166-1 (2-letter) country code. Current possible values are: - -Value | Language ---- | --- -"en_US" | US English -"en_GB" | British English -"fr_CA" | Canadian French -"es_ES" | International Spanish -"de_DE" | German -"it_IT" | Italian -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCountryCode', - insertText: new SnippetString('GetCountryCode()'), - documentation: new MarkdownString( -` - GetCountryCode() as String - -Returns a value that designates the Roku Channel Store associated with a user’s Roku account. -Typically, the value returned will be an ISO 3166-1 (2-letter) country code representing the country. -Alternatively, if the channel owner entered into an additional agreement to have the channel published to a curated Roku Powered Channel Store instead of the user country, -then a Roku Powered Channel Store Identifier will instead be returned. - -Current possible values are: - -Value | Country ---- | --- -"CA" | Canada -"Econet" | Econet Zimbabwe -"FR" | France -"GB" | Great Britain -"globe" | Globe Philippines -"IE" | Republic of Ireland -"MX" | Mexico -"OT" | Rest of World -"PLDT" | PLDT Philippines -"Telstra" | Telstra Australia -"skyde" | Sky Germany -"skyes" | Sky Spain -"skyie" | Sky Ireland -"skyit" | Sky Italy -"skyuk" | Sky UK -"US" | United States - -This does not necessarily match the physical location of the device, nor does it necessarily match the last two letters of the current locale string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'TimeSinceLastKeypress', - insertText: new SnippetString('TimeSinceLastKeypress()'), - documentation: new MarkdownString( -` - TimeSinceLastKeypress() as Integer - -Returns the number of seconds since the last remote keypress was received. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDrmInfoEx', - insertText: new SnippetString('GetDrmInfoEx()'), - documentation: new MarkdownString( -` - GetDrmInfoEx() as Object - -_Available since firmware version 8.1_ - -A new API, GetDrmInfoEx(), returns an associative array with the supported DRM system and features. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCaptionsMode', - insertText: new SnippetString('GetCaptionsMode()'), - documentation: new MarkdownString( -` - GetCaptionsMode() as String - -This function returns the current global setting for the Mode property. In other words, this function is used to determine whether global captions are turned on or off, or are in instant replay mode. - -Possible Values: - -* On -* Off -* Instant replay - -Note: On a Roku TV, when the user selects On Mute this function will return On when the TV is muted and Off when it is not muted. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCaptionsMode', - insertText: new SnippetString('SetCaptionsMode(${1:mode as String})'), - documentation: new MarkdownString( -` - SetCaptionsMode(mode as String) as Boolean - -This function sets the current global setting for the Mode property. -In other words, this function is used to determine whether global captions are turned on or off, or are in instant replay mode or enabled onMute. -The possible parameter values are those listed for the Mode property. The function returns true if the mode was successfully set. - -Possible Values: - -* On -* Off -* Instant replay -* When mute (Roku tv only) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCaptionsOption', - insertText: new SnippetString('GetCaptionsOption(${1:option as String})'), - documentation: new MarkdownString( -` - GetCaptionsOption(option as String) as String - -This function returns the current value of the specified global setting property. The value returned is one of the possible values for the specified property. - -See online documentation for more info on possible properties and values -https://sdkdocs.roku.com/display/sdkdoc/ifDeviceInfo -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetClockFormat', - insertText: new SnippetString('GetClockFormat()'), - documentation: new MarkdownString( -` - GetClockFormat() as Integer - -GetClockFormat lets the channel query whether the system settings for -Time (Setting --> System --> Time) is set to a 12 or 24-hour format. The API returns 0 for the 12-hour format and 1 for the 24-hour format. - -_This function is available in firmware 8.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableAppFocusEvent', - insertText: new SnippetString('EnableAppFocusEvent(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableAppFocusEvent() as Void - -Channels can get notified when a system overlay event (such as the confirm partner button HUD or the caption control overlay) is displayed. -This notification gives the channel the opportunity to do any processing they may want to when the channel loses or regains focus. The default is the overlay event display is disabled (false). - -_This function is available in firmware 8.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableScreensaverExitedEvent', - insertText: new SnippetString('EnableScreensaverExitedEvent(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableScreensaverExitedEvent() as Void - -Enables (true) or disables (false) sending an roDeviceInfoEvent when a user has exited the screensaver. The default is disabled (false). - -To receive events, you must have first called SetMessagePort on the roDeviceInfo object specifying the message port that is to receive the events. - -_This function is available in firmware 7.5 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableLowGeneralMemoryEvent', - insertText: new SnippetString('EnableLowGeneralMemoryEvent(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableLowGeneralMemoryEvent() as Void - -_Available since firmware version 8.1_ - -If enabled, requests the OS to send a roDeviceInfoEvent with generalMemoryLevel field set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetGeneralMemoryLevel', - insertText: new SnippetString('GetGeneralMemoryLevel()'), - documentation: new MarkdownString( -` - GetGeneralMemoryLevel() as String - -_Available since firmware version 8.1_ - -Returns "normal", "low", or "critical" depending on the general memory levels for the application. -` - ) - }, - // ############### Network Info ############### - { - kind: CompletionItemKind.Method, - label: 'GetLinkStatus', - insertText: new SnippetString('GetLinkStatus()'), - documentation: new MarkdownString( -` - GetLinkStatus() as Boolean - -Returns true if the player seems to have an active network connection. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableLinkStatusEvent', - insertText: new SnippetString('EnableLinkStatusEvent(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableLinkStatusEvent() as Boolean - -Enables or disables sending an roDeviceInfoEvent when the network connection status changes. The default is disabled. - -To receive events, you must have first called SetMessagePort on the roDeviceInfo object specifying the message port that is to receive the events. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetConnectionType', - insertText: new SnippetString('GetConnectionType()'), - documentation: new MarkdownString( -` - GetConnectionType() as String - -If the unit is connected via WiFi, returns the string "WiFiConnection". -If the unit is connected via a wired connection, returns "WiredConnection". If the unit is not connected, returns an empty string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetExternalIp', - insertText: new SnippetString('GetExternalIp()'), - documentation: new MarkdownString( -` - GetExternalIp() as String - -Returns the external IP address of the Roku player. This is the address seen by the Internet and all other computers outside your local network. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetIPAddrs', - insertText: new SnippetString('GetIPAddrs()'), - documentation: new MarkdownString( -` - GetIPAddrs() as Object - -Returns roAssociativeArray. Each key in the AA is the name of a network interface and the value is the IP-address of the interface. Normally there will be only one interface in the AA. - -Provides a way for your application to get the local IP address of the Roku box. -This can be used in conjunction with the ECP (see the External Control Protocol Guide) command "launch" (or "install" for uninstalled channels) to start a different channel from the current channel. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetConnectionInfo', - insertText: new SnippetString('GetConnectionInfo()'), - documentation: new MarkdownString( -` - GetConnectionInfo() as Object - -Returns an Associative Array with these entries: - -Name | Value ---- | --- -type | Same as the value returned from GetConnectionType() -name | Name of the connection interface -ip | IP Address used by the connection -mac | MAC address of the connection's hardware -ssid | The SSID of the Access Point (present only if type = "WiFiConnection") -gateway | IP Address of the connection gateway (usually the router) -dns.0 | IP Address of first DNS server associated with the connection -dns.1 | IP Address of the second DNS server, if any - -_This function is available in firmware 6.1 and above._ -` - ) - }, - // ############### Video Info ############### - { - kind: CompletionItemKind.Method, - label: 'GetDisplayType', - insertText: new SnippetString('GetDisplayType()'), - documentation: new MarkdownString( -` - GetDisplayType() as String - -Returns the text corresponding to the button selection in the Player Info Settings/Display Type page. Either "HDTV", "4:3 standard", or "16:9 anamorphic". -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDisplayMode', - insertText: new SnippetString('GetDisplayMode()'), - documentation: new MarkdownString( -` - GetDisplayMode() as String - -Returns the configured graphics layer resolution: "480i" or "480p" (if the ui_resolutions manifest entry includes sd as a supported resolution, otherwise "720p" is returned), -"720p", or "1080p" (if the ui_resolutions manifest file entry includes fhd as a supported resolution, otherwise "720p" is returned). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDisplayAspectRatio', - insertText: new SnippetString('GetDisplayAspectRatio()'), - documentation: new MarkdownString( -` - GetDisplayAspectRatio() as String - -Returns "4x3" or "16x9" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDisplaySize', - insertText: new SnippetString('GetDisplaySize()'), - documentation: new MarkdownString( -` - GetDisplaySize() as Object - -Returns an roAssociativeArray with keys "w" and "h" that contain the values for the screen width and height respectively, either 720 and 480, or 1280 and 720. Example: { w:1280, h:720 }. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVideoMode', - insertText: new SnippetString('GetVideoMode()'), - documentation: new MarkdownString( -` - GetVideoMode() as String - -Returns a string representing the video playback resolution. The possible strings are: - -String | Resolution | Ratio | Rate | Bit Depth ---- | --- | --- | --- | --- -"480i" | 720x480 | 4:3 | 60Hz | 8 Bit -"480p" | 720x480 | 4:3 | 60Hz | 8 Bit -"576i25" | 720x576 | 4:3 | 25Hz | 8 Bit -"576p50" | 720x576 | 4:3 | 50Hz | 8 Bit -"576p60" | 720x576 | 4:3 | 60Hz | 8 Bit -"720p50" | 1280x720 | 16:9 | 50Hz | 8 Bit -"720p" | 1280x720 | 16:9 | 60Hz | 8 Bit -"1080i50" | 1920x1080 | 16:9 | 50Hz | 8 Bit -"1080i" | 1920x1080 | 16:9 | 60Hz | 8 Bit -"1080p24" | 1920x1080 | 16:9 | 24Hz | 8 Bit -"1080p25" | 1920x1080 | 16:9 | 25Hz | 8 Bit -"1080p30" | 1920x1080 | 16:9 | 30Hz | 8 Bit -"1080p50" | 1920x1080 | 16:9 | 50Hz | 8 Bit -"1080p" | 1920x1080 | 16:9 | 60Hz | 8 Bit -"2160p24" | 3840x2160 | 16:9 | 24Hz | 8 Bit -"2160p25" | 3840x2160 | 16:9 | 25Hz | 8 Bit -"2160p30" | 3840x2160 | 16:9 | 30Hz | 8 Bit -"2160p50" | 3840x2160 | 16:9 | 50Hz | 8 Bit -"2160p60" | 3840x2160 | 16:9 | 60Hz | 8 Bit -"2160p24b10" | 3840x2160 | 16:9 | 24Hz | 10 Bit -"2160p25b10" | 3840x2160 | 16:9 | 25Hz | 10 Bit -"2160p30b10" | 3840x2160 | 16:9 | 30Hz | 10 Bit -"2160p50b10" | 3840x2160 | 16:9 | 50Hz | 10 Bit -"2160p60b10" | 3840x2160 | 16:9 | 60Hz | 10 Bit -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDisplayProperties', - insertText: new SnippetString('GetDisplayProperties()'), - documentation: new MarkdownString( -` - GetDisplayProperties() as Object - -Returns an roAssociativeArray with the following key/value pairs: - -Key | Type ---- | --- -Width | Integer -Height | Integer -Internal | Boolean -Hdr10 | Boolean -DolbyVision | Boolean - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSupportedGraphicsResolutions', - insertText: new SnippetString('GetSupportedGraphicsResolutions()'), - documentation: new MarkdownString( -` - GetSupportedGraphicsResolutions() as Object - -Return the list of supported graphics resolutions as a list of roAssociative arrays. Each array has the following keys: - -Key | Type ---- | --- -width | Integer -height | Integer -name | String -ui | Boolean -preferred | Boolean - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CanDecodeVideo', - insertText: new SnippetString('CanDecodeVideo(${1:video_format as Object})'), - documentation: new MarkdownString( -` - CanDecodeVideo(video_format as Object) as Object - -Checks if the Roku Player can decode and play a video format specified as an associative array, -and returns an associative array that includes a Boolean value indicating if the video format can be played, and the closest video format supported by the Roku Player. - -For example, if the application wants to check if the Roku Player can play an AVC stream at high profile and level 4.2, it calls CanDecodeVideo() with the following video_format: - -{Codec: "mpeg4 avc", Profile: "high", Level: "4.2"} - -If the Roku Player cannot play that video format, it will return false, and return the closest video format it can play, with the changed fields, such as: - -{“Result”:false,"Updated": "level;profile", "Codec": "mpeg4 avc", "Profile": "main", "Level": "4.1"} - -The return value shows the Roku Player cannot play requested video format, -shows the updated keys of the requested video format (level and profile) that it can support, -and the all the key values of the requested video format supported by the Roku Player. -Format keys that are not provided by the caller are not taken into account and not updated. -For example, calling CanDecodeVideo() with a format description that has only a codec key -(such as {"codec": "vp9"}) will return that same format if the device can decode and play that codec at all, -even if the decode capability is limited to one specific container, profile, and level. - -The following are the keys of the requested video format and supported video format associative arrays: - -Key | Value | Required ---- | --- | --- -Codec | “mpeg2”, “mpeg4 avc”, “hevc”, “vp9” | Yes -Profile | Specifies the profile | No -Level | Specifies the level | No -Container | “mp4”, “hls”, “mkv”, “ism”, “dash”, “ts” | No - -Codec | Profile | Level ---- | --- | --- -"mpeg2" | n/a | "main", "high" -"mpeg4 avc" | "main", "high" | "4.1", "4.2" -"hevc" | "main", "main 10" | "4.1", "5.0", "5.1" -"vp9" | "profile 0", "profile 2" | "4.1", "5.0", "5.1" - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetUIResolution', - insertText: new SnippetString('GetUIResolution()'), - documentation: new MarkdownString( -` - GetUIResolution() as Object - -Returns an associative array describing the current UI resolution. The associative array contains the following possible key-value pairs: - -Key | Values ---- | --- -name | "SD", "HD", "FHD" -width | 720, 1280, 1920 -height | 480, 720, 1080 - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetGraphicsPlatform', - insertText: new SnippetString('GetGraphicsPlatform()'), - documentation: new MarkdownString( -` - GetGraphicsPlatform() as String - -Returns a string specifying the device's graphics platform, either opengl or directfb. - -_This function is available in firmware 7.6 and above._ -` - ) - }, - // ############### Audio Info ############### - { - kind: CompletionItemKind.Method, - label: 'GetAudioOutputChannel', - insertText: new SnippetString('GetAudioOutputChannel()'), - documentation: new MarkdownString( -` - GetAudioOutputChannel() as String - -Returns a string representing the selected audio output ("Stereo" or "5.1 surround"). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAudioDecodeInfo', - insertText: new SnippetString('GetAudioDecodeInfo()'), - documentation: new MarkdownString( -` - GetAudioDecodeInfo() as Object - -Returns an roAssociativeArray with the EDID (EIA.2FCEA-861) audio decoder information for the device connected to the HDMI port(or the device itself for a Roku TV). -Each audio decoder supported by the device is listed, with up to four numbers describing the decoder from the EDID SAD (Short Audio Descriptor). -Each value is of the form "::::". -For example, the name "DD+" may have the value "8:6:0:1" where there are 8 independent audio tracks (7.1 audio), -6 is the SAD1 byte, 0 is the SAD2 byte, and 1 is the binary value that indicates this is a pass-through audio device (not a Roku TV). -The SAD1 and SAD2 bytes are interpreted differently for different codecs and -more information about their values can be found here: http://en.wikipedia.org/wiki/Extended_display_identification_data#CEA_EDID_Timing_Extension_Version_3_data_format -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CanDecodeAudio', - insertText: new SnippetString('CanDecodeAudio(${1:audio_format as Object})'), - documentation: new MarkdownString( -` - CanDecodeAudio(audio_format as Object) as Object - -Checks if the Roku Player can decode and play an audio format specified as an associative array, -and returns an associative array that includes a Boolean value indicating if the audio format can be played, and the closest audio format supported by the Roku Player. -The general format of the associative arrays for CanDecodeAudio() is similar to the parameter and return associative arrays used in CanDecodeVideo(). - -The following are the keys of the requested audio format and supported audio format associative arrays: - -Key | Type | Value | Required ---- | --- | --- | --- -Codec | String | “aac”, “ac3”, “eac3”, "alac", "flac", “mp2”, “mp3”, “vorbis”, “wma”, “wma pro”, “dts” | Yes -Profile | String | Specifies the profile. | No -ChCnt | Integer | Specifies the number of audio channels. | No -SampleRate | Integer | Specifies the sample rate. | No -BitRate | Integer | Specifies the bit rate in Kbit/sec. | No -Container | String | Specifies the container format. | No - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSoundEffectsVolume', - insertText: new SnippetString('GetSoundEffectsVolume()'), - documentation: new MarkdownString( -` - GetSoundEffectsVolume() as Integer - -Returns the user interface sounds effects volume as a percentage. -A return value of 0 indicates that UI sound effects are muted, and a value of 100 indicates that they are set to the maximum volume level. - -_This function is available in firmware 7.0 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsAudioGuideEnabled', - insertText: new SnippetString('IsAudioGuideEnabled()'), - documentation: new MarkdownString( -` - IsAudioGuideEnabled() as Boolean - -Returns true if Audio Guide is enabled (on supported devices), otherwise false. - -_This function is available in firmware 7.5 and above._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableAudioGuideChangedEvent', - insertText: new SnippetString('EnableAudioGuideChangedEvent(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableAudioGuideChangedEvent() as Boolean - -Enables (true) or disables (false) sending an roDeviceInfoEvent when Audio Guide is enabled. The default is disabled (false). - -To receive events, you must have first called SetMessagePort on the roDeviceInfo object specifying the message port that is to receive the events. - -_This function is available in firmware 7.5 and above._ -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifDraw2DCompletionItems.ts b/src/BrightScriptCompletionItems/ifDraw2DCompletionItems.ts deleted file mode 100644 index 71e0466c..00000000 --- a/src/BrightScriptCompletionItems/ifDraw2DCompletionItems.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifDraw2DCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Clear', - insertText: new SnippetString('Clear(${1:rgba as Integer})'), - documentation: new MarkdownString( -` - Clear(rgba as Integer) as Void - -Clear the bitmap, and fill with the specified RGBA color. - -Note that the alpha channel will be filled into the bitmap, even when not used. Once AlphaEnable is set to true, -the alpha channel will be taken into account when using this bitmap as a source. See SetAlphaEnable() for more information on alpha blending. - -Note that Clear() is not the same as a DrawRect() for the entire bitmap. Clear() fills the bitmap with the specified RGBA; it does not perform any alpha blending operations. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetWidth', - insertText: new SnippetString('GetWidth()'), - documentation: new MarkdownString( -` - GetWidth() as Integer - -Returns the width of the bitmap in pixels. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHeight', - insertText: new SnippetString('GetHeight()'), - documentation: new MarkdownString( -` - GetHeight() as Integer - -Returns the height of the bitmap in pixels. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetByteArray', - insertText: new SnippetString('GetByteArray(${1:x as Integer}, ${2:y as Integer}, ${3:width as Integer}, ${4:height as Integer})'), - documentation: new MarkdownString( -` - GetByteArray(x as Integer, y as Integer, width as Integer, height as Integer) as Object - -Returns an roByteArray representing the RGBA pixel values for the rectangle described by the parameters. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPng', - insertText: new SnippetString('GetPng(${1:x as Integer}, ${2:y as Integer}, ${3:width as Integer}, ${4:height as Integer})'), - documentation: new MarkdownString( -` - GetPng(x as Integer, y as Integer, width as Integer, height as Integer) as Object - -If successful, returns an roByteArray object containing PNG image data for the specified area of the bitmap. - -If the coordinates are out of bounds, or the PNG conversion fails for any reason, then invalid is returned. - -The PNG is in 32-bit RGBA format. - -_This function is available in firmware 7.0 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAlphaEnable', - insertText: new SnippetString('GetAlphaEnable()'), - documentation: new MarkdownString( -` - GetAlphaEnable() as Boolean - -Returns true if alpha blending is enabled. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetAlphaEnable', - insertText: new SnippetString('SetAlphaEnable(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetAlphaEnable(enable as Boolean) as Void - -If enable is true, do alpha blending when this bitmap is the destination. The setting of the source bitmap's alpha enable is ignored. - -When turned on, each pixel in the destination bitmap is set by combining the destination and source pixels according to the alpha value in the source bitmap (or rectangle). -The destination alpha is not used. (In OpenGL this is referred to as GL_ONE_MINUS_SRC_ALPHA). - -By default, alpha blending is off. - -Even when alpha blending is off, the alpha value is still present in the bitmap, and must be passed when a function parameter is a color (which are always RGBA). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawRect', - insertText: new SnippetString('DrawRect(${1:x as Integer}, ${2:y as Integer}, ${3:width as Integer}, ${4:height as Integer}, ${5:rgba as Integer})'), - documentation: new MarkdownString( -` - DrawRect(x as Integer, y as Integer, width as Integer, height as Integer, rgba as Integer) as Void - -Fill the specified rectangle from left (x), top (y) to right (x + width), bottom (y + height) with the RGBA color. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawPoint', - insertText: new SnippetString('DrawPoint(${1:x as Integer}, ${2:y as Integer}, ${3:size as Float}, ${4:rgba as Integer})'), - documentation: new MarkdownString( -` - DrawPoint(x as Integer, y as Integer, size as Float, rgba as Integer) as Void - -Draws a point at (x,y) with the given size and RGBA color. - -_This function is available in firmware 6.2 or later._ -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawLine', - insertText: new SnippetString('DrawLine(${1:xStart as Integer}, ${2:yStart as Integer}, ${3:xEnd as Integer}, ${4:yEnd as Integer}, ${5:rgba as Integer})'), - documentation: new MarkdownString( -` - DrawLine(xStart as Integer, yStart as Integer, xEnd as Integer, yEnd as Integer, rgba as Integer) as Void - -Draw a line from (xStart, yStart) to (xEnd, yEnd) with RGBA color. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawObject', - insertText: new SnippetString('DrawObject(${1:x as Integer}, ${2:y as Integer}, ${3:src as Object}, ${4:rgba = &hFFFFFFFF})'), - documentation: new MarkdownString( -` - DrawObject(x as Integer, y as Integer, src as Object, rgba = &hFFFFFFFF as Integer) as Boolean - -Draw the source object, where src is an roBitmap or an roRegion object, at position x,y. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawScaledObject', - insertText: new SnippetString( - 'DrawScaledObject(${1:x as Integer}, ${2:y as Integer}, ${3:scaleX as Float}, ${4:scaleY as Float}, ${5:src as Object}, ${6:rgba = &hFFFFFFFF as Integer})' - ), - documentation: new MarkdownString( -` - DrawScaledObject(x as Integer, y as Integer, scaleX as Float, scaleY as Float, src as Object, rgba = &hFFFFFFFF as Integer) as Boolean - -Draw the source object, where src is an roBitmap or an roRegion object, at position x,y, scaled in the x direction by scaleX and in the y direction by scaleY. - -scaleX and scaleY should each be greater than zero and less than one to reduce the object size, or greater than one to increase the object size. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawRotatedObject', - insertText: new SnippetString('DrawRotatedObject(${1:x as Integer}, ${2:y as Integer}, ${3:theta as Float}, ${4:src as Object}, ${6:rgba = &hFFFFFFFF as Integer})'), - documentation: new MarkdownString( -` - DrawRotatedObject(x as Integer, y as Integer, theta as Float, src as Object, rgba = &hFFFFFFFF as Integer) as Boolean - -Draw the source object, where src is an roBitmap or an roRegion object, at position x,y rotated by angle theta degrees. - -Theta is currently limited to 0, 90, 180, and 270 degrees. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DrawText', - insertText: new SnippetString('DrawText(${1:text as String}, ${2:x as Integer}, ${3:y as Integer}, ${4:rgba as Integer}, ${5:font as Object})'), - documentation: new MarkdownString( -` - DrawText(text as String, x as Integer, y as Integer, rgba as Integer, font as Object) as Boolean - -Draws the text at position (x,y) using the specified RGBA color and roFont font object. - -Text is drawn anti-aliased. - -The background image/color behind the text will show through the spaces and holes in the text. To have the text erase the background, make a call to DrawRect() before calling DrawText(). - -The size, bold, and italic attributes are specified when creating the roFont. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Finish', - insertText: new SnippetString('Finish()'), - documentation: new MarkdownString( -` - Finish() as Void - -Realize the bitmap by finishing all queued draw calls. Until Finish() is called, prior graphics operations may not be user visible. - -For example, they may be in the graphics display pipeline, or in a server queue. - -Note that Finish() is synchronous, i.e. it does not return until all graphic operations are complete. - -_Note: when working with an roScreen object, ifScreen.SwapBuffers() should be used instead of Finish()._ -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifEVPCipherCompletionItems.ts b/src/BrightScriptCompletionItems/ifEVPCipherCompletionItems.ts deleted file mode 100644 index 6e0f28cf..00000000 --- a/src/BrightScriptCompletionItems/ifEVPCipherCompletionItems.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifEVPCipherCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Setup', - insertText: new SnippetString('Setup(${1:encrypt as Boolean}, ${2:format as String}, ${3:key as String}, ${4:iv as String}, ${5:padding as Integer})'), - documentation: new MarkdownString( -` - Setup(encrypt as Boolean, format as String, key as String, iv as String, padding as Integer) as Integer - -Setup and initialize a new cipher context. The Setup function takes the following parameters: - -Parameter | Description ---- | --- -encrypt | true for encryption, false for decryption -format | cipher format string, from openssl, listed at roEVPCipher -key | hex-encoded key -iv | hex-encoded initialization vector (can be empty string) -padding | 1 to use standard padding, 0 for no padding - -Returns 0 on success or non-zero on failure. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Reinit', - insertText: new SnippetString('Reinit()'), - documentation: new MarkdownString( -` - Reinit() as Integer - -Reinitialize an existing cipher context. This can be called to reuse an existing roEVPCipher object to encrypt new data. Returns 0 on success or non-zero on failure. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Process', - insertText: new SnippetString('Process(${1:bytes as Object})'), - documentation: new MarkdownString( -` - Process(bytes as Object) as Object - -The parameter should be an roByteArray. The data in the array is encrypted or decrypted. Returns an roByteArray containing the result. - - x = evp.Process(bytes) - -is equivalent to - - evp.Reinit() - x = evp.Update(bytes) - x = x + evp.Final() -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Update', - insertText: new SnippetString('Update(${1:bytes as Object})'), - documentation: new MarkdownString( -` - Update(bytes as Object) as Object - -The parameter should be an roByteArray. The data in the array is encrypted or decrypted. -Returns an roByteArray containing a subset of the result. Some or all of the result may not be returned until the next call to Update(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Final', - insertText: new SnippetString('Final()'), - documentation: new MarkdownString( -` - Final() as Object - -Signals that all data has been submitted by previous calls to Update(). Returns the last remaining encrypted or decrypted bytes. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifEVPDigestCompletionItems.ts b/src/BrightScriptCompletionItems/ifEVPDigestCompletionItems.ts deleted file mode 100644 index b5cecbb5..00000000 --- a/src/BrightScriptCompletionItems/ifEVPDigestCompletionItems.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifEVPDigestCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Setup', - insertText: new SnippetString('Setup(${1:digestType as String})'), - documentation: new MarkdownString( -` - Setup(digestType as String) as Integer - -Initialize a new message digest context. digestType identifies one of the supported digest algorithms from openssl, - -List of Supported Digest Algorithms: - -Type | Detail ---- | --- -md5 | MD5 message digest algorithm (default) -sha1 | SHA-1 message digest algorithm -sha224 | SHA-2, 224 bit variant -sha256 | SHA-2, 256 bit variant -sha384 | SHA-2, 384 bit variant -sha512 | SHA-2, 512 bit variant -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Reint', - insertText: new SnippetString('Reint()'), - documentation: new MarkdownString( -` - Reint() as Integer - -Re-initialize an existing message digest context. This can be called to reuse an existing roEVPDigest object to digest new data. Returns 0 on success or non-zero on failure. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Process', - insertText: new SnippetString('Process(${1:bytes as Object})'), - documentation: new MarkdownString( -` - Process(bytes as Object) as Object - -The parameter should be an roByteArray. The data in the array is digested and the digest is returned as a hex string. - - x = evp.Process(bytes) - -is equivalent to - - evp.Reinit() - evp.Update(bytes) - x = evp.Final() -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Update', - insertText: new SnippetString('Update(${1:bytes as Object})'), - documentation: new MarkdownString( -` - Update(bytes as Object) as Object - -Add more data to be digested. The parameter should be an roByteArray. The data in the array is added to the current digest. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Final', - insertText: new SnippetString('Final()'), - documentation: new MarkdownString( -` - Final() as Object - -Returns the digest of data passed in by previous calls to Update() as a hex string. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifEnumCompletionItems.ts b/src/BrightScriptCompletionItems/ifEnumCompletionItems.ts deleted file mode 100644 index 0cf02629..00000000 --- a/src/BrightScriptCompletionItems/ifEnumCompletionItems.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifEnumCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Reset', - insertText: new SnippetString('Reset()'), - documentation: new MarkdownString( -` - Reset() as Void - -Resets the current position to the first element of the enumeration. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Next', - insertText: new SnippetString('Next()'), - documentation: new MarkdownString( -` - Next() as Dynamic - -Returns the value at the current position and increments the position. If the last element of the enumeration is returned, sets the current position to indicate that it is now past the end. -If the current position is already past the end (that is, the last element has already been returned by a previous call to Next()), return invalid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsNext', - insertText: new SnippetString('IsNext()'), - documentation: new MarkdownString( -` - IsNext() as Boolean - -Returns true if the current position is not past the end of the enumeration. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsEmpty', - insertText: new SnippetString('IsEmpty()'), - documentation: new MarkdownString( -` - IsEmpty() as Boolean - -Returns true if the enumeration contains no elements. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifFileSystemCompletionItems.ts b/src/BrightScriptCompletionItems/ifFileSystemCompletionItems.ts deleted file mode 100644 index 5a52ea41..00000000 --- a/src/BrightScriptCompletionItems/ifFileSystemCompletionItems.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifFileSystemCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetVolumeList', - insertText: new SnippetString('GetVolumeList()'), - documentation: new MarkdownString( -` - GetVolumeList() as Object - -Returns an roList containing Strings representing the available volumes. - -Volumes may be internal or external storage devices, such as "tmp:", "pkg:", "ext1:", etc. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDirectoryListing', - insertText: new SnippetString('GetDirectoryListing(${1:dirPath as String})'), - documentation: new MarkdownString( -` - GetDirectoryListing(dirPath as String) as Object - -Returns an roList of Strings representing the directory listing of names in dirPath. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Find', - insertText: new SnippetString('Find(${1:dirPath as String}, ${2:regEx as String})'), - documentation: new MarkdownString( -` - Find(dirPath as String, regEx as String) as Object - -Returns an roList of Strings representing the directory listing of names in dirPath which match the regEx regular expression. -The list is not recursive; it includes only files and directories that are directly in the directory dirPath. Each item in the list is the name of the file relative to dirPath. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'FindRecurse', - insertText: new SnippetString('FindRecurse(${1:dirPath as String}, ${2:regEx as String})'), - documentation: new MarkdownString( -` - FindRecurse(dirPath as String, regEx as String) as Object - -Returns an roList of Strings representing the recursive directory listing of names in dirPath which match the regEx regular expression. -Each item in the list is the name of the file relative to dirPath. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Match', - insertText: new SnippetString('Match(${1:path as String}, ${2:pattern as String})'), - documentation: new MarkdownString( -` - Match(path as String, pattern as String) as Object - -Returns an roList of Strings representing the directory listing of names in dirPath which match the shell-like pattern. -The pattern may contain wildcards like * and ?. This method is like Find() except that it uses shell-like pattern matching rather than regular expression matching. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Exists', - insertText: new SnippetString('Exists(${1:path as String})'), - documentation: new MarkdownString( -` - Exists(path as String) as Boolean - -Returns true if the path exists. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Stat', - insertText: new SnippetString('Stat(${1:path as String})'), - documentation: new MarkdownString( -` - Stat(path as String) as Object - -Returns an roAssociativeArray containing the following keys for the passed in path: - -* type: (String) Either the value "file" or "directory" -* size: (Integer) Number of bytes in the file. Only relevant for type "file". -* permissions: (String) the value "rw" for read/write or "r" for read only. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVolumeInfo', - insertText: new SnippetString('GetVolumeInfo(${1:path as String})'), - documentation: new MarkdownString( -` - GetVolumeInfo(path as String) as Object - -Returns an roAssociativeArray containing information about the volume specified in path. - -The path should be specified as the volume name plus a directory separator, e.g. "ext1:/". - -The following keys are returned in the roAssociativeArray: - -* blocksize : (Integer) The size of the filesystem blocks in bytes. -* blocks : (Integer) The number of blocks in the filesystem. -* freeblocks : (Integer) The number of unused blocks in the filesystem. -* usedblocks : (Integer) The number of used blocks in the filesystem. -* label : (String) The volume label, if any. - -Can only be called on external volumes. Internal volumes do not return meaningful information. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CreateDirectory', - insertText: new SnippetString('CreateDirectory(${1:path as String})'), - documentation: new MarkdownString( -` - CreateDirectory(path as String) as Boolean - -Creates the directory specified by the path parameter. All directories in path except the last one must already exist; that is, only one directory can be created. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Delete', - insertText: new SnippetString('Delete(${1:path as String})'), - documentation: new MarkdownString( -` - Delete(path as String) as Boolean - -Deletes the file or directory specified by the path parameter. If path is a directory, its contents are recursively removed. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CopyFile', - insertText: new SnippetString('CopyFile(${1:fromPath as String}, ${2:toPath as String})'), - documentation: new MarkdownString( -` - CopyFile(fromPath as String, toPath as String) as Boolean - -Copies the file fromPath to toPath. - -Returns true if successful. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Rename', - insertText: new SnippetString('Rename(${1:fromPath as String}, ${2:toPath as String})'), - documentation: new MarkdownString( -` - Rename(fromPath as String, toPath as String) as Boolean - -Renames or moves the file or directory fromPath to toPath. - -If toPath exists, it is not overwritten. Instead the operation fails and Rename returns false. - -Returns true if successful. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifFontCompletionItems.ts b/src/BrightScriptCompletionItems/ifFontCompletionItems.ts deleted file mode 100644 index 6a7e6d6b..00000000 --- a/src/BrightScriptCompletionItems/ifFontCompletionItems.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifFontCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetOneLineHeight', - insertText: new SnippetString('GetOneLineHeight()'), - documentation: new MarkdownString( -` - GetOneLineHeight() as Integer - -Returns the number of pixels from one line to the next when drawing with this font. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetOneLineWidth', - insertText: new SnippetString('GetOneLineWidth(${1:text as String}, ${2:MaxWidth as Integer})'), - documentation: new MarkdownString( -` - GetOneLineWidth(text as String, MaxWidth as Integer) as Integer - -Returns the width in pixels for this particular string, when rendered with this font. -Each glyph and the needed spacing between glyphs is measured.The returned number of pixels will be no larger than MaxWidth. -MaxWidth is generally the amount of pixels available for rendering on this line. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAscent', - insertText: new SnippetString('GetAscent()'), - documentation: new MarkdownString( -` - GetAscent() as Integer - -Returns the font ascent in pixels. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDescent', - insertText: new SnippetString('GetDescent()'), - documentation: new MarkdownString( -` - GetDescent() as Integer - -Returns the font descent in pixels. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMaxAdvance', - insertText: new SnippetString('GetMaxAdvance()'), - documentation: new MarkdownString( -` - GetMaxAdvance() as Integer - -Returns the font maximum advance width in pixels. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifFontRegistryCompletionItems.ts b/src/BrightScriptCompletionItems/ifFontRegistryCompletionItems.ts deleted file mode 100644 index c8e38f75..00000000 --- a/src/BrightScriptCompletionItems/ifFontRegistryCompletionItems.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifFontRegistryCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Register', - insertText: new SnippetString('Register(${1:path as String})'), - documentation: new MarkdownString( -` - Register(path as String) as Boolean - -Register a font file (.ttf or .otf format). Each font file defines one or more font families (usually one). - -Path should be a valid path name (see File System). - -Returns true if the font(s) in the file were successfully installed. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetFamilies', - insertText: new SnippetString('GetFamilies()'), - documentation: new MarkdownString( -` - GetFamilies() as Object - -Returns an roArray of strings that represent the names of the font families which have been registered via Register(). Each name can be passed as the first parameter to GetFont(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetFont', - insertText: new SnippetString('GetFont(${1:family as String}, ${2:size as Integer}, ${3:bold as Boolean}, ${4:italic as Boolean})'), - documentation: new MarkdownString( -` - GetFont(family as String, size as Integer, bold as Boolean, italic as Boolean) as Object - -Returns an roFont object representing a font from the specified family, selected from the fonts previously registered via Register(). -size is the requested font size, in pixels, not points. bold and italic specify font variants which may be (but are not always) supported by the font file. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDefaultFont', - insertText: new SnippetString('GetDefaultFont(${1:size as Integer}, ${2:bold as Boolean}, ${3:italic as Boolean})'), - documentation: new MarkdownString( -` - GetDefaultFont(size as Integer, bold as Boolean, italic as Boolean) as Object - -Returns an roFont object representing the system font. The system font is always available, even if Register() has not been called. Size, bold and italic are interpreted as in GetFont(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDefaultFontSize', - insertText: new SnippetString('GetDefaultFontSize()'), - documentation: new MarkdownString( -` - GetDefaultFontSize() as Integer - -Returns the default font size. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Get', - insertText: new SnippetString('Get(${1:family as String}, ${2:size as Integer}, ${3:bold as Boolean}, ${4:italic as Boolean})'), - documentation: new MarkdownString( -` - Get(family as String, size as Integer, bold as Boolean, italic as Boolean) as String - -Returns a valid font string that can be used as the value of the Font content meta-data parameter recognized by the roImageCanvas. - -family, size, bold, italic are interpreted as in GetFont(). -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifHMACCompletionItems.ts b/src/BrightScriptCompletionItems/ifHMACCompletionItems.ts deleted file mode 100644 index d019cfd5..00000000 --- a/src/BrightScriptCompletionItems/ifHMACCompletionItems.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifHMACCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Setup', - insertText: new SnippetString('Setup(${1:digestType as String})'), - documentation: new MarkdownString( -` - Setup(digestType as String) as Integer - -Initialize new HMAC context. The digestType parameter selects one of the supported digest algorithms, as documented in roEVPDigest. -The key parameter must be an roByteArray containing the key for the MAC. Returns 0 on success, -1 on failure. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Reint', - insertText: new SnippetString('Reint()'), - documentation: new MarkdownString( -` - Reint() as Integer - -Re-initialize an existing HMAC context. This can be called to reuse an existing roHMAC object to authenticate new data. Returns 0 on success or non-zero on failure -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Process', - insertText: new SnippetString('Process(${1:message as Object})'), - documentation: new MarkdownString( -` - Process(message as Object) as Object - -The parameter should be an roByteArray. The data in the array is digested and an MAC is generated. Returns an roByteArray containing the MAC. - - mac = hmac.Process(message) - -is equivalent to - - hmac.Reinit() - hmac.Update(message) - mac = hmac.Final() -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Update', - insertText: new SnippetString('Update(${1:partialMessage as Object})'), - documentation: new MarkdownString( -` - Update(partialMessage as Object) as Void - -Add more data to be digested. The parameter should be an roByteArray. The data in the array is added to the current digest. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Final', - insertText: new SnippetString('Final()'), - documentation: new MarkdownString( -` - Final() as Object - -Return an roByteArray containing the final MAC. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifHdmiStatusCompletionItems.ts b/src/BrightScriptCompletionItems/ifHdmiStatusCompletionItems.ts deleted file mode 100644 index 2c88ae24..00000000 --- a/src/BrightScriptCompletionItems/ifHdmiStatusCompletionItems.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifHdmiStatusCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'IsConnected', - insertText: new SnippetString('IsConnected()'), - documentation: new MarkdownString( -` - IsConnected() as Boolean - -Returns true if the HDMI or MHL output is connected to an HDMI device. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHdcpVersion', - insertText: new SnippetString('GetHdcpVersion()'), - documentation: new MarkdownString( -` - GetHdcpVersion() as String - -Returns the version number of the currently established HDCP link. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsHdcpActive', - insertText: new SnippetString('IsHdcpActive(${1:version as String})'), - documentation: new MarkdownString( -` - IsHdcpActive(version as String) as Boolean - -Returns true if the current established HDCP link is the specified version (such as "1.4" or "2.2") or higher, otherwise returns false. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifHttpAgentCompletionItems.ts b/src/BrightScriptCompletionItems/ifHttpAgentCompletionItems.ts deleted file mode 100644 index 05b8e140..00000000 --- a/src/BrightScriptCompletionItems/ifHttpAgentCompletionItems.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifHttpAgentCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'AddHeader', - insertText: new SnippetString('AddHeader(${1:name as String}, ${2:value as String})'), - documentation: new MarkdownString( -` - AddHeader(name as String, value as String) as Boolean - -Add the specified HTTP header to the list of headers that will be sent in the HTTP request. - -Certain well known headers such as User-Agent, Content-Length, etc. will automatically be sent. - -The application may override these well known values if needed (e.g. some servers may require a specific user agent string). - -If "x-roku-reserved-dev-id" is passed as a name, the value parameter is ignored and in its place, the devid of the currently running channel is used as the value. - -This allows the developer's server to know which client app is talking to it. Any other headers whose name begins with "x-roku-reserved-" are reserved and may not be set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetHeaders', - insertText: new SnippetString('SetHeaders(${1:nameValueMap as Object})'), - documentation: new MarkdownString( -` - SetHeaders(nameValueMap as Object) as Boolean - -nameValueMap should be an roAssociativeArray. Each name/value in the AA is added as an HTTP header. - -Header limitations specified in AddHeader() still apply. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'InitClientCertificates', - insertText: new SnippetString('InitClientCertificates()'), - documentation: new MarkdownString( -` - InitClientCertificates() as Boolean - -Initialize the object to send the Roku client certificate. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCertificatesFile', - insertText: new SnippetString('SetCertificatesFile(${1:path as String})'), - documentation: new MarkdownString( -` - SetCertificatesFile(path as String) as Boolean - -Set the certificates file used for SSL to the .pem file specified. - -The .pem file should include the CA (certificate authority) certificate that signed the certificate installed on your web server. - -Note: The developer can download the CA certificate here: https://sdkdocs.roku.com/download/attachments/1611329/ca-bundle.crt?version=1&modificationDate=1526505586986&api=v2 - -This enables authentication of your server. - -Instances of roUrlTransfer and ifHttpAgent components should call this function before performing https requests. - -The appropriate certificates file should be placed at the location specified in the SetCertificatesFile() function call. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCertificatesDepth', - insertText: new SnippetString('SetCertificatesDepth(${1:depth as Integer})'), - documentation: new MarkdownString( -` - SetCertificatesDepth(depth as Integer) as Void - -Set the maximum depth of the certificate chain that will be accepted. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableCookies', - insertText: new SnippetString('EnableCookies()'), - documentation: new MarkdownString( -` - EnableCookies() as Void - -Causes any Set-Cookie headers returned from the request to be interpreted and the resulting cookies to be added to the cookie cache. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCookies', - insertText: new SnippetString('GetCookies(${1:domain as String}, ${2:path as String})'), - documentation: new MarkdownString( -` - GetCookies(domain as String, path as String) as Object - -Returns any cookies from the cookie cache that match the specified domain and path. - -If domain is an empty string, all domains are matched. - -Any expired cookies are not returned. - -The returned object is an roArray of roAssociativeArrays. Each AA contains the keys: - -Key | Type | Detail ---- | --- | --- -Version | Integer | Cookie version number -Domain | String | Domain to which cookie applies -Path | String | Path to which cookie applies -Name | String | Name of the cookie -Value | String | Value of the cookie -Expires | roDateTime | Cookie expiration date, if any -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddCookies', - insertText: new SnippetString('AddCookies(${1:cookies as Object})'), - documentation: new MarkdownString( -` - AddCookies(cookies as Object) as Boolean - -cookies should be an roArray of roAssociativeArrays. - -Each AA should be in the same format as the AAs returned by GetCookie(). - -The specified cookies are added to the cookie cache. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ClearCookies', - insertText: new SnippetString('ClearCookies()'), - documentation: new MarkdownString( -` - ClearCookies() as Void - -Removes all cookies from the cookie cache. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifImageMetadataCompletionItems.ts b/src/BrightScriptCompletionItems/ifImageMetadataCompletionItems.ts deleted file mode 100644 index a1083707..00000000 --- a/src/BrightScriptCompletionItems/ifImageMetadataCompletionItems.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifImageMetadataCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetUrl', - insertText: new SnippetString('SetUrl(${1:url as String})'), - documentation: new MarkdownString( -` - SetUrl(url as String) as Void - -Set the URL to the image. Only file urls are supported. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMetaData', - insertText: new SnippetString('GetMetaData()'), - documentation: new MarkdownString( -` - GetMetaData() as Object - -Returns an associative array with set of simple and common image metadata. This associative array includes: - -Name | Type | Notes ---- | --- | --- -width | Integer | Width of the image in pixels. -height | Integer | Height of the image in pixels. -orientation | String | "portrait" or "landscape" -datetime | roDateTime | The creation time of the image such as the time a photo was taken. -comment | String | User specified comment string. This is often referred to as a caption. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetThumbnail', - insertText: new SnippetString('GetThumbnail()'), - documentation: new MarkdownString( -` - GetThumbnail() as Object - -Returns a thumbnail image if one is embedded in the image metadata. This will not generate a thumbnail if one doesn't already exist. -Returns an AssociateArray with two entries: "bytes" and "type". "bytes" is an roByteArray with the image data. -"type" specifies the type of image which is most likely "image/jpeg" but could be something else like "image/png". -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRawExif', - insertText: new SnippetString('GetRawExif()'), - documentation: new MarkdownString( -` - GetRawExif() as Object - -Returns an associative array with all of the raw EXIF metadata. See the EXIF section below for more details. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRawExifTag', - insertText: new SnippetString('GetRawExifTag(${1:ifd as Integer}, ${2:tag as Integer})'), - documentation: new MarkdownString( -` - GetRawExifTag(ifd as Integer, tag as Integer) as Dynamic - -Returns the raw data for one Exif tag. Returns invalid if that tag does not exist. This is useful for direct access to a raw EXIF tag if you know exactly what tag you want. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifListCompletionItems.ts b/src/BrightScriptCompletionItems/ifListCompletionItems.ts deleted file mode 100644 index b17e2989..00000000 --- a/src/BrightScriptCompletionItems/ifListCompletionItems.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifListCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'ResetIndex', - insertText: new SnippetString('ResetIndex()'), - documentation: new MarkdownString( -` - ResetIndex() as Boolean - -Reset current index or position in list to the head element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddTail', - insertText: new SnippetString('AddTail(${1:tval as Dynamic})'), - documentation: new MarkdownString( -` - AddTail(tval as Dynamic) as Void - -Add typed value to tail of list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddHead', - insertText: new SnippetString('AddHead(${1:tval as Dynamic})'), - documentation: new MarkdownString( -` - AddHead(tval as Dynamic) as Void - -Add typed value to head of list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RemoveIndex', - insertText: new SnippetString('RemoveIndex()'), - documentation: new MarkdownString( -` - RemoveIndex() as Dynamic - -Remove entry at current index or position from list and increment index or position in list. - -Return invalid when end of list reached -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetIndex', - insertText: new SnippetString('GetIndex()'), - documentation: new MarkdownString( -` - GetIndex() as Dynamic - -Get entry at current index or position from list and increment index or position in list. - -Return invalid when end of list reached -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RemoveTail', - insertText: new SnippetString('RemoveTail()'), - documentation: new MarkdownString( -` - RemoveTail() as Dynamic - -Remove entry at tail of list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RemoveHead', - insertText: new SnippetString('RemoveHead()'), - documentation: new MarkdownString( -` - RemoveHead() as Dynamic - -Remove entry at head of list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTail', - insertText: new SnippetString('GetTail()'), - documentation: new MarkdownString( -` - GetTail() as Dynamic - -Get Object at tail of List and keep Object in list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHead', - insertText: new SnippetString('GetHead()'), - documentation: new MarkdownString( -` - GetHead() as Dynamic - -Get entry at head of list and keep entry in list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Count', - insertText: new SnippetString('Count()'), - documentation: new MarkdownString( -` - Count() as Integer - -Return the number of elements in list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Clear', - insertText: new SnippetString('Clear()'), - documentation: new MarkdownString( -` - Clear() as Void - -Remove all elements from list. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifLocalizationCompletionItems.ts b/src/BrightScriptCompletionItems/ifLocalizationCompletionItems.ts deleted file mode 100644 index 9b17a286..00000000 --- a/src/BrightScriptCompletionItems/ifLocalizationCompletionItems.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifLocalizationCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetPluralString', - insertText: new SnippetString('GetPluralString(${1:count as Integer}, ${2:zeroString as String}, ${3:oneString as String}, ${4:pluralString as String})'), - documentation: new MarkdownString( -` - GetPluralString(count as Integer, zeroString as String, oneString as String, pluralString as String) as String - -If count is 0, this returns zeroString. If count is 1, it returns oneString. -Otherwise, it replaces "^n" in pluralString with count and returns the result. For example, you might call it as follows: - - GetPluralString(count, "0 books", "1 book", "^n books") -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetLocalizedAsset', - insertText: new SnippetString('GetLocalizedAsset(${1:dirName as String}, ${2:fileName as String})'), - documentation: new MarkdownString( -` - GetLocalizedAsset(dirName as String, fileName as String) as String - -Returns an appropriate asset path based on the user's currently selected language. -dirName is the name of a subdirectory in the directory pkg:/locale/XX_YY/ where XX_YY is the current language setting. fileName is the name of the file. Example usage: - - GetLocalizedAsset("images", "MyImage.png") - -If the user's current language setting is French (fr_CA), and the file exists, then this would return "pkg:/locale/fr_CA/images/MyImage.png". - -If the file does not exist in the current locale directory, then this will search the directory locale/default/. -If it exists there, it will return it; otherwise, it will check the directory locale/en_US/. If it still can't find the file, then it will return an empty string. - -We are adding new locales with each release. A list of currently supported locales can be found at ifDeviceInfo.GetCurrentLocale. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifMessagePortCompletionItems.ts b/src/BrightScriptCompletionItems/ifMessagePortCompletionItems.ts deleted file mode 100644 index a477ea4b..00000000 --- a/src/BrightScriptCompletionItems/ifMessagePortCompletionItems.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifMessagePortCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'WaitMessage', - insertText: new SnippetString('WaitMessage(${1:timeout as Integer})'), - documentation: new MarkdownString( -` - WaitMessage(timeout as Integer) as Dynamic - -Waits until an event object is available or timeout milliseconds have passed. If an event is available, it is returned. If the timeout expires, invalid is returned. -If timeout is zero, waits indefinitely for a message, with no timeout. - -The Brightscript wait() native function can also be used to get the event object which WaitMessage() would return. That is, these two statements have the same effect: - - msg = port.WaitMessage(timeout) - msg = wait(timeout, port) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMessage', - insertText: new SnippetString('GetMessage()'), - documentation: new MarkdownString( -` - GetMessage() as Dynamic - -If an event object is available, it is returned. Otherwise invalid is returned. The method returns immediately in either case and does not wait. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'PeekMessage', - insertText: new SnippetString('PeekMessage()'), - documentation: new MarkdownString( -` - PeekMessage() as Dynamic - -Similar to GetMessage() but the returned object (if not invalid) remains in the message queue. A later call to WaitMessage(), GetMessage() or PeekMessage() will return the same message. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifMicrophoneCompletionItems.ts b/src/BrightScriptCompletionItems/ifMicrophoneCompletionItems.ts deleted file mode 100644 index b2a33f0c..00000000 --- a/src/BrightScriptCompletionItems/ifMicrophoneCompletionItems.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifMicrophoneCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'CanRecord', - insertText: new SnippetString('CanRecord()'), - documentation: new MarkdownString( -` - CanRecord() as Boolean - -Returns true if the platform and paired remote control can be requested to open the microphone. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPrompt', - insertText: new SnippetString('SetPrompt(${1:prompt as String})'), - documentation: new MarkdownString( -` - SetPrompt(prompt as String) as Void - -Optionally set a short prompt string to be displayed to the user in the system microphone UI. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RecordToFile', - insertText: new SnippetString('RecordToFile(${1:wavFilePath as String})'), - documentation: new MarkdownString( -` - RecordToFile(wavFilePath as String) as Boolean - -Open the microphone and record to create a WAV file at the specified output file path. Only tmp:/ paths are supported. - -Returns true if the recording was performed and saved successfully. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'StartRecording', - insertText: new SnippetString('StartRecording()'), - documentation: new MarkdownString( -` - StartRecording() as Boolean - -Open the microphone and begin streaming microphone events to the app. The app must have called SetMessagePort previously. - -Returns true if the microphone was opened successfully. - -While the microphone is open, RecordingInfo events will be sent periodically with audio data. -When the microphone is closed, a RecordingDone event will be sent. See roMicrophoneEvent for detailed information. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'StopRecording', - insertText: new SnippetString('StopRecording()'), - documentation: new MarkdownString( -` - StopRecording() as Boolean - -If the microphone was previously opened via StartRecording() and the application decides to cancel the current recording prematurely, -(e.g. due to duration limit reached or an application error), this function can be called to stop recording and close the microphone. - -Returns true if the microphone was open and successfully closed by the call. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifPathCompletionItems.ts b/src/BrightScriptCompletionItems/ifPathCompletionItems.ts deleted file mode 100644 index 2ec63dc5..00000000 --- a/src/BrightScriptCompletionItems/ifPathCompletionItems.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifPathCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Change', - insertText: new SnippetString('Change(${1:path as String})'), - documentation: new MarkdownString( -` - Change(path as String) as Boolean - -Modify or change the current path via the relative or absolute path passed as a string - -Returns true if the resulting path is valid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsValid', - insertText: new SnippetString('IsValid()'), - documentation: new MarkdownString( -` - IsValid() as Boolean - -Returns true if the current path is valid; that is, if the path is correctly formed. This does not check whether the file actually exists. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Split', - insertText: new SnippetString('Split()'), - documentation: new MarkdownString( -` - Split() as Object - -Returns an roAssociativeArray containing the following keys: - -* basename: The filename, without parent directories or extension -* extension: The filename extension -* filename: The filename, with extension, without parent directories -* parent: The parent directory, or empty if in a root directory -* phy: The PHY volume -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifRSACompletionItems.ts b/src/BrightScriptCompletionItems/ifRSACompletionItems.ts deleted file mode 100644 index b817b4d2..00000000 --- a/src/BrightScriptCompletionItems/ifRSACompletionItems.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifRSACompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetPrivateKey', - insertText: new SnippetString('SetPrivateKey(${1:keyFileName as String})'), - documentation: new MarkdownString( -` - SetPrivateKey(keyFileName as String) as Integer - -Specify the private key to use for signing. The file name should specify a path, either in the package or a temp path. - -Returns 1 if the key is valid, or 0 if the file does not contain a valid key, or -1 if the file was not found. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPublicKey', - insertText: new SnippetString('SetPublicKey(${1:keyFileName as String})'), - documentation: new MarkdownString( -` - SetPublicKey(keyFileName as String) as Integer - -Specify the public key to use for verification. The file name should specify a path, either in the package or a temp path. - -Returns 1 if the key is valid, or 0 if the file does not contain a valid key, or -1 if the file was not found. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetDigestAlgorithm', - insertText: new SnippetString('SetDigestAlgorithm(${1:digestAlgorithm as String})'), - documentation: new MarkdownString( -` - SetDigestAlgorithm(digestAlgorithm as String) as Boolean - -Specify the digest algorithm to use for signing and verification. This should be an openssl string. Common digest algorithms are "sha1", "ripemd160", and "md5". - -Returns true if the algorithm was set, false if the string was not recognized. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Sign', - insertText: new SnippetString('Sign(${1:digest as Object})'), - documentation: new MarkdownString( -` - Sign(digest as Object) as Object - -digest should be a roByteArray to be signed. - -Returns a roByteArray containing the signature, or invalid if an error occurred. Errors will be printed in the BrightScript console. Some possible errors: - -* digest is empty -* SetPrivateKey() was not yet called -* out of memory -* the digest could not be signed - -If the digest algorithm is not set (using SetDigestAlgorithm) before calling Sign(), the digest is not encapsulated. -This would be equivalent to simply calling the openssl function RSA_private_encrypt(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Verify', - insertText: new SnippetString('Verify(${1:digest as Object}, ${2:signature as Object})'), - documentation: new MarkdownString( -` - Verify(digest as Object, signature as Object) as Integer - -Verifies the given digest and signature. Both digest and signature should be roByteArrays. - -Returns 1 if the signature matches. Errors: - -* Returns -1 if SetPublicKey() was not yet called -* Returns -2 if digest is empty -* Returns -3 if there is not enough memory -* Returns 0 if the signature does not match - -If the digest algorithm is not set (using SetDigestAlgorithm) before calling Verify(), the digest associated with the signature is not expected to be encapsulated. -This would be equivalent to simply calling the openssl function RSA_public_decrypt(signature) and then comparing the result with the digest. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifRegexCompletionItems.ts b/src/BrightScriptCompletionItems/ifRegexCompletionItems.ts deleted file mode 100644 index 73f410a0..00000000 --- a/src/BrightScriptCompletionItems/ifRegexCompletionItems.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifRegexCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'IsMatch', - insertText: new SnippetString('IsMatch(${1:str as String})'), - documentation: new MarkdownString( -` - IsMatch(str as String) as Boolean - -Returns true if str matches the matching pattern. - -Example from Brightscript Debugger Interactive Shell: - - > r = CreateObject("roRegex", "cad", "i") - > ? r.IsMatch("AbraCadabra") - > true -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Match', - insertText: new SnippetString('Match(${1:str as String})'), - documentation: new MarkdownString( -` - Match(str as String) as Object - -Returns an roArray of matched substrings from str. - -If no match was made, an empty array is returned. - -If a match was made, the entire match is returned in array[0]. If there are no parenthetical substrings this is the only entry in the array. - -If the matching pattern contains N parenthetical substrings, the relevant substrings are returned as an array of length N+1, where array[0] is again the entire match -and each additional entry in the array is the match for the corresponding parenthetical expression. - -Example from Brightscript Debugger Interactive Shell: - - > r = CreateObject("roRegex", "(a|(z))(bc)","") - > ? r.Match("abcd") - > abc - > a - > - > bc - -Note that entry 2 of the array is an empty string, corresponding to the parenthesized "z" in the regular expression. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Replace', - insertText: new SnippetString('Replace(${1:str as String}, ${2:replacement as String})'), - documentation: new MarkdownString( -` - Replace(str as String, replacement as String) as String - -Replaces the first occurrence of a matching pattern in str with replacement and returns the result. - -The replacement may contain numbered back-references to parenthetical substrings. - -Example from Brightscript Debugger Interactive Shell: - - > r = CreateObject("roRegex", "(\\d+)\\s+(\\w+)", "") - > ? r.Replace("123 abc", "word:\\2 number:\\1") - > word:abc number:123 -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ReplaceAll', - insertText: new SnippetString('ReplaceAll(${1:str as String}, ${2:replacement as String})'), - documentation: new MarkdownString( -` - ReplaceAll(str as String, replacement as String) as String - -Similar to Replace() but replaces all occurrences of the matching pattern, not just the first one. - -Examples from Brightscript Debugger Interactive Shell: - - > r = CreateObject("roRegex", "a", "i") - > ? r.ReplaceAll("Abracadabra", "x") - > xbrxcxdxbrx - - > r = CreateObject("roRegex", "a", "") - > ? r.ReplaceAll("Abracadabra", "x") - > Abrxcxdxbrx -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Split', - insertText: new SnippetString('Split(${1:str as String})'), - documentation: new MarkdownString( -` - Split(str as String) as Object - -Uses the matching pattern as a separator and splits the string on the separator boundaries. - -Returns an roList of substrings of str that were separated by strings which match the pattern in the CreateObject call. The separator strings are not returned. - -If no matches were found, the returned list contains a single item with the string unchanged. - -Examples from Brightscript Debugger Interactive Shell: - - > r = CreateObject("roRegex", ",", "") ' split on comma - > ? r.Split("first, second, third and fourth") - > first - > second - > third and fourth - - > r = CreateObject("roRegex", "/+", "") ' split on one or more slashes - > ? r.Split("example.com/images///2012/cat.jpg") - > example.com - > images - > 2012 - > cat.jpg - -Note that in the first example, the last two strings begin with a space, since each comma in the string was followed by a space. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'MatchAll', - insertText: new SnippetString('MatchAll(${1:str as String})'), - documentation: new MarkdownString( -` - MatchAll(str as String) as Object - -_Available since firmware version 8.1_ - -MatchAll() adds the ability to return all matches of the specific regular expression pattern in the target string as an array where the first element is -the full matched string and if there are any capture groups those are returned in subsequent array elements. - -Example: - - > r = CreateObject("roRegex", "\\d+", "") - > arr = r.MatchAll("123 456 789") - > print FormatJSON(arr) - > [["123"],["456"],["789"]] -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifRegionCompletionItems.ts b/src/BrightScriptCompletionItems/ifRegionCompletionItems.ts deleted file mode 100644 index 823026fa..00000000 --- a/src/BrightScriptCompletionItems/ifRegionCompletionItems.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifRegionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetBitmap', - insertText: new SnippetString('GetBitmap()'), - documentation: new MarkdownString( -` - GetBitmap() as Object - -Returns the roBitmap object of the bitmap this region refers to. A region is always a section of a bitmap. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetX', - insertText: new SnippetString('GetX()'), - documentation: new MarkdownString( -` - GetX() as Integer - -Returns the x coordinate of the region in its bitmap. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetY', - insertText: new SnippetString('GetY()'), - documentation: new MarkdownString( -` - GetY() as Integer - -Returns the y coordinate of the region in its bitmap. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetWidth', - insertText: new SnippetString('GetWidth()'), - documentation: new MarkdownString( -` - GetWidth() as Integer - -Returns the width of the region. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHeight', - insertText: new SnippetString('GetHeight()'), - documentation: new MarkdownString( -` - GetHeight() as Integer - -Returns the height of the region. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Offset', - insertText: new SnippetString('Offset(${1:x as Integer}, ${2:y as Integer}, ${3:w as Integer}, ${4:h as Integer})'), - documentation: new MarkdownString( -` - Offset(x as Integer, y as Integer, w as Integer, h as Integer) as Void - -Adds the passed parameters x,y, w, and h to the values of those roRegion fields - -Respects the wrap setting when adjusting the fields by the offsets. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Set', - insertText: new SnippetString('Set(${1:srcRegion as Object})'), - documentation: new MarkdownString( -` - Set(srcRegion as Object) as Void - -Takes an roRegion object as input - -Initializes the fields of this region to be the same as the values of the fields in the srcRegion. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Copy', - insertText: new SnippetString('Copy()'), - documentation: new MarkdownString( -` - Copy() as Object - -Returns a newly created copy of the region as a new roRegion object. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetWrap', - insertText: new SnippetString('SetWrap(${1:wrap as Boolean})'), - documentation: new MarkdownString( -` - SetWrap(wrap as Boolean) as Boolean - -If wrap is true, any part of a region that extends beyond the bounds of its bitmap "wraps" to the other side of the bitmap and is rendered there. -If wrap is false, the part of the region beyond the bounds of its bitmap is not rendered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetWrap', - insertText: new SnippetString('GetWrap()'), - documentation: new MarkdownString( -` - GetWrap() as Boolean - -Returns true if the region will wrap. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetTime', - insertText: new SnippetString('SetTime(${1:time as Integer})'), - documentation: new MarkdownString( -` - SetTime(time as Integer) as Void - -Set the "frame hold time" in milliseconds. This is the duration of each frame of any animated sprite which uses this region. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetTime', - insertText: new SnippetString('GetTime()'), - documentation: new MarkdownString( -` - GetTime() as Integer - -Returns the "frame hold time" in milliseconds. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPretranslation', - insertText: new SnippetString('SetPretranslation(${1:x as Integer}, ${2:y as Integer})'), - documentation: new MarkdownString( -` - SetPretranslation(x as Integer, y as Integer) as Void - -Set the pretranslation for DrawObject, DrawRotatedObject, and DrawScaledObject. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPretranslationX', - insertText: new SnippetString('GetPretranslationX()'), - documentation: new MarkdownString( -` - GetPretranslationX() as Integer - -Returns the pretranslation x value. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPretranslationY', - insertText: new SnippetString('GetPretranslationY()'), - documentation: new MarkdownString( -` - GetPretranslationY() as Integer - -Returns the pretranslation y value. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetScaleMode', - insertText: new SnippetString('SetScaleMode(${1:mode as Integer})'), - documentation: new MarkdownString( -` - SetScaleMode(mode as Integer) as Void - -Set the scaling mode used for DrawScaledObject - -* 0 = fast scaling operation (may have jaggies) -* 1 = smooth scaling operation (may be slow) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetScaleMode', - insertText: new SnippetString('GetScaleMode()'), - documentation: new MarkdownString( -` - GetScaleMode() as Integer - -Returns the scaling mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCollisionType', - insertText: new SnippetString('SetCollisionType(${1:collisionType as Integer})'), - documentation: new MarkdownString( -` - SetCollisionType(collisionType as Integer) as Void - -Sets the type of region to be used for collision tests with this sprite. - -* Type 0 – Use the entire defined region of the sprite. Type 0 is the default. -* Type 1 – Use the defined rectangular region specified by the SetCollisionRectangle() method. -* Type 2 – Use a circular region specified by the SetCollisionCircle() method. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCollisionType', - insertText: new SnippetString('GetCollisionType()'), - documentation: new MarkdownString( -` - GetCollisionType() as Integer - -Returns the collision type. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCollisionRectangle', - insertText: new SnippetString('SetCollisionRectangle(${1:xOffset as Integer}, ${2:yOffset as Integer}, ${3:width as Integer}, ${4:height as Integer})'), - documentation: new MarkdownString( -` - SetCollisionRectangle(xOffset as Integer, yOffset as Integer, width as Integer, height as Integer) as Void - -Sets the collision rectangle used for type 1 collision tests. -The upper left corner of the rectangle is the (x,y) position of the sprite plus the specified offsets. width and height specify the size of the rectangle. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCollisionCircle', - insertText: new SnippetString('SetCollisionCircle(${1:xOffset as Integer}, ${2:yOffset as Integer}, ${3:radius as Integer})'), - documentation: new MarkdownString( -` - SetCollisionCircle(xOffset as Integer, yOffset as Integer, Radius as Integer) as Void - -Sets the collision circle used for type 2 collision tests. The center of the circle is the (x,y) position of the sprite plus the specified offsets. radius specifies the size of the circle. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifRegistryCompletionItems.ts b/src/BrightScriptCompletionItems/ifRegistryCompletionItems.ts deleted file mode 100644 index 86751eb9..00000000 --- a/src/BrightScriptCompletionItems/ifRegistryCompletionItems.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifRegistryCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetSectionList', - insertText: new SnippetString('GetSectionList()'), - documentation: new MarkdownString( -` - GetSectionList() as Object - -Returns an roList with one entry for each registry section. Each element in the list is an roString containing the name of the section. -The section itself can be accessed by creating an roRegistrySection object using that name. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Delete', - insertText: new SnippetString('Delete(${1:section as String})'), - documentation: new MarkdownString( -` - Delete(section as String) as Boolean - -Deletes the specified section and returns an indication of success. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Flush', - insertText: new SnippetString('Flush()'), - documentation: new MarkdownString( -` - Flush() as Boolean - -Flushes the registry out to persistent storage. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifRegistrySectionCompletionItems.ts b/src/BrightScriptCompletionItems/ifRegistrySectionCompletionItems.ts deleted file mode 100644 index ffcdbea9..00000000 --- a/src/BrightScriptCompletionItems/ifRegistrySectionCompletionItems.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifRegistrySectionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Read', - insertText: new SnippetString('Read(${1:key as String})'), - documentation: new MarkdownString( -` - Read(key as String) as String - -Reads and returns the value of the specified key -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ReadMulti', - insertText: new SnippetString('ReadMulti(${1:keysArray as Object})'), - documentation: new MarkdownString( -` - ReadMulti(keysArray as Object) as Object - -_This function is available in firmware 8.0 and later._ - -Reads multiple values from the registry. Takes an array of strings, the key names to read. Returns an associative array with the keys and accompanying values read from the registry. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Write', - insertText: new SnippetString('Write(${1:key as String}, ${2:value as String})'), - documentation: new MarkdownString( -` - Write(key as String, value as String) as Boolean - -Replaces the value of the specified key. - -Does not guarantee a commit to non-volatile storage until an explicit Flush() is done. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'WriteMulti', - insertText: new SnippetString('WriteMulti(${1:roAA as Object})'), - documentation: new MarkdownString( -` - WriteMulti(roAA as Object) as Boolean - -_This function is available in firmware 8.0 and later._ - -Writes multiple values to the registry. Takes an associative array with key/value pairs to write. Returns boolean indicating success or failure of the write operation. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Delete', - insertText: new SnippetString('Delete(${1:key as String})'), - documentation: new MarkdownString( -` - Delete(key as String) as Boolean - -Deletes the specified key. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Exists', - insertText: new SnippetString('Exists(${1:key as String})'), - documentation: new MarkdownString( -` - Exists(key as String) as Boolean - -Returns true if the specified key exists. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Flush', - insertText: new SnippetString('Flush()'), - documentation: new MarkdownString( -` - Flush() as Boolean - -Flushes the contents of the registry out to persistent storage. Developers should explicitly Flush after performing a write or series of writes. -Flush is transactional and all writes between calls to Flush are atomic. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetKeyList', - insertText: new SnippetString('GetKeyList()'), - documentation: new MarkdownString( -` - GetKeyList() as Object - -Returns an roList containing one entry per registry key in this section. Each entry is an roString containing the name of the key. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifScreenCompletionItems.ts b/src/BrightScriptCompletionItems/ifScreenCompletionItems.ts deleted file mode 100644 index fcb6d691..00000000 --- a/src/BrightScriptCompletionItems/ifScreenCompletionItems.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifScreenCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SwapBuffers', - insertText: new SnippetString('SwapBuffers()'), - documentation: new MarkdownString( -` - SwapBuffers() as Void - -This function first operates the same as a call to ifDraw2D.Finish(), completing all queued drawing operations on the back buffer (draw surface). - -If the screen is single buffered, SwapBuffers() returns immediately after this operation. - -If the screen is double buffered, SwapBuffers swaps the back buffer with the front buffer, so the back buffer is now visible. -The new back buffer should be assumed to be in a garbage state after this call is complete, which means you will need to re-render the entire frame before a subsequent call to SwapBuffers. -This call will not return until the back buffer is ready to be drawn on to. Depending on the implementation, it may take up to a single video frame period for the new front buffer to become visible. - -This operation is extremely fast (that is, it never copies a bitmap from one location to another), and is guaranteed not to "tear" the visible image. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketAddressCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketAddressCompletionItems.ts deleted file mode 100644 index 7ab87d6d..00000000 --- a/src/BrightScriptCompletionItems/ifSocketAddressCompletionItems.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketAddressCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetAddress', - insertText: new SnippetString('SetAddress(${1:address as String})'), - documentation: new MarkdownString( -` - SetAddress(address as String) as Boolean - -Sets the IPV4 address to the string. The string consists of a hostname, optionally followed by a colon and a decimal port number. -The hostname may be either dotted quad (such as "192.168.1.120") or a DNS name (such as "roku.com"). -If a name is given, a DNS lookup is performed to convert it to dotted quad. Use IsAddressValid() to determine the result of the DNS lookup. - -Example: "192.168.1.120:8888" or "roku.com". - -Returns true on success. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAddress', - insertText: new SnippetString('GetAddress()'), - documentation: new MarkdownString( -` - GetAddress() as String - -Returns the IPV4 address in dotted quad form. - -Example: "192.168.1.120:8888" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetHostName', - insertText: new SnippetString('SetHostName(${1:hostname as String})'), - documentation: new MarkdownString( -` - SetHostName(hostname as String) as Boolean - -Sets the hostname. The port number is unchanged. - -Returns true on success. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetHostName', - insertText: new SnippetString('GetHostName()'), - documentation: new MarkdownString( -` - GetHostName() as String - -Returns the hostname. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPort', - insertText: new SnippetString('SetPort(${1:port as Integer})'), - documentation: new MarkdownString( -` - SetPort(port as Integer) as Boolean - -Sets the port number. The hostname is unchanged. - -Returns true on success. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPort', - insertText: new SnippetString('GetPort()'), - documentation: new MarkdownString( -` - GetPort() as Integer - -Returns the port number. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsAddressValid', - insertText: new SnippetString('IsAddressValid()'), - documentation: new MarkdownString( -` - IsAddressValid() as Boolean - -Returns true if the component contains a valid IP address. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketAsyncCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketAsyncCompletionItems.ts deleted file mode 100644 index 80352ed2..00000000 --- a/src/BrightScriptCompletionItems/ifSocketAsyncCompletionItems.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketAsyncCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'IsReadable', - insertText: new SnippetString('IsReadable()'), - documentation: new MarkdownString( -` - IsReadable() as Boolean - -Returns true if underlying select determines non-blocking read is possible. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsWritable', - insertText: new SnippetString('IsWritable()'), - documentation: new MarkdownString( -` - IsWritable() as Boolean - -Returns true if underlying select determines non-blocking write is possible. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsException', - insertText: new SnippetString('IsException()'), - documentation: new MarkdownString( -` - IsException() as Boolean - -Returns true if underlying select determines non-blocking read of OOB data is possible. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'NotifyReadable', - insertText: new SnippetString('NotifyReadable(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - NotifyReadable(enable as Boolean) as Void - -Enable roSocketEvent events to be sent via the message port when the underlying socket becomes readable. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'NotifyWritable', - insertText: new SnippetString('NotifyWritable(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - NotifyWritable(enable as Boolean) as Void - -Enable roSocketEvent events to be sent via the message port when the underlying socket becomes writable. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'NotifyException', - insertText: new SnippetString('NotifyException(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - NotifyException(enable as Boolean) as Void - -Enable roSocketEvent events to be sent via the message port when the underlying socket gets an exception or OOB data. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetID', - insertText: new SnippetString('GetID()'), - documentation: new MarkdownString( -` - GetID() as Integer - -Returns a unique identifier that can be compared to the value returned by roSocketEvent.getSocketID() to match the underlying socket that the event is for. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketCastOptionCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketCastOptionCompletionItems.ts deleted file mode 100644 index 32bf6d36..00000000 --- a/src/BrightScriptCompletionItems/ifSocketCastOptionCompletionItems.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketCastOptionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetBroadcast', - insertText: new SnippetString('GetBroadcast()'), - documentation: new MarkdownString( -` - GetBroadcast() as Boolean - -Return true if broadcast messages are enabled to be sent or received. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetBroadcast', - insertText: new SnippetString('SetBroadcast(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetBroadcast(enable as Boolean) as Boolean - -If enable is true, enable broadcast messages to be sent or received; otherwise do not send or receive broadcast messages. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'JoinGroup', - insertText: new SnippetString('JoinGroup(${1:ipAddress as Object})'), - documentation: new MarkdownString( -` - JoinGroup(ipAddress as Object) as Boolean - -Join the multicast group specified by the passed in multicast ipAddress. ipAddress must be an roSocketAddress. - -Ipv4 multicast addresses are in the range: 224.0.0.0 through 239.255.255.255 - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DropGroup', - insertText: new SnippetString('DropGroup(${1:ipAddress as Object})'), - documentation: new MarkdownString( -` - DropGroup(ipAddress as Object) as Boolean - -Drop out of the multicast group specified by the passed in multicast ipAddress. ipAddress must be an roSocketAddress. - -Ipv4 multicast addresses are in the range: 224.0.0.0 through 239.255.255.255 - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMulticastLoop', - insertText: new SnippetString('GetMulticastLoop()'), - documentation: new MarkdownString( -` - GetMulticastLoop() as Boolean - -Return true if multicast messages are enabled for local loopback. - -If enabled, multicast message sent locally are to be received locally. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMulticastLoop', - insertText: new SnippetString('SetMulticastLoop(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetMulticastLoop(enable as Boolean) as Boolean - -If enable is true, enable local loopback of multicast messages; otherwise do not send or receive broadcast messages. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMulticastTTL', - insertText: new SnippetString('GetMulticastTTL()'), - documentation: new MarkdownString( -` - GetMulticastTTL() as Integer - -Return the TTL integer value for multicast messages. - -TTL is the number of hops a packet is allowed before a router drops the packet. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMulticastTTL', - insertText: new SnippetString('SetMulticastTTL(${1:ttl as Integer})'), - documentation: new MarkdownString( -` - SetMulticastTTL(ttl as Integer) as Boolean - -Set the TTL integer value for multicast messages. - -TTL is the number of hops a packet is allowed before a router drops the packet. - -Returns true if successfully set. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketCompletionItems.ts deleted file mode 100644 index 3286a43b..00000000 --- a/src/BrightScriptCompletionItems/ifSocketCompletionItems.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Send', - insertText: new SnippetString('Send(${1:data as Object}, ${2:startIndex as Integer}, ${3:length as Integer})'), - documentation: new MarkdownString( -` - Send(data as Object, startIndex as Integer, length as Integer) as Integer - -Sends up to length bytes of data to the socket. The data parameter is a roByteArray containing the data to be sent, starting at the byte indexed by startIndex. - -Returns the number of bytes actually sent. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SendStr', - insertText: new SnippetString('SendStr(${1:data as String})'), - documentation: new MarkdownString( -` - SendStr(data as String) as Integer - -Sends the whole string to the socket if possible. - -Returns the number of bytes actually sent. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Receive', - insertText: new SnippetString('Receive(${1:data as Object}, ${2:startIndex as Integer}, ${3:length as Integer})'), - documentation: new MarkdownString( -` - Receive(data as Object, startIndex as Integer, length as Integer) as Integer - -Reads up to length bytes from the socket. The data parameter is a roByteArray into which data is stored, beginning at the byte indexed by startIndex. - -Returns the number of bytes actually read. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ReceiveStr', - insertText: new SnippetString('ReceiveStr(${1:length as String})'), - documentation: new MarkdownString( -` - ReceiveStr(length as Integer) as String - -Reads up to length bytes from the socket and stores the result in a string. - -Returns the received string. If no bytes were received, the string will be empty. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Close', - insertText: new SnippetString('Close()'), - documentation: new MarkdownString( -` - Close() as Void - -Performs an orderly close of socket. - -After a close, most operations on the socket will return invalid. - -On blocking sockets, this clears the receive buffer and blocks until the send buffer is emptied. Neither buffer may be read or written afterward. - -On non-blocking sockets, both the send and the receive buffer may be read but not written. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetAddress', - insertText: new SnippetString('SetAddress(${1:sockAddr as Object})'), - documentation: new MarkdownString( -` - SetAddress(sockAddr as Object) as Boolean - -sockAddr is an roSocketAddress. - -Returns true if successfully set address using a BSD bind() call. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAddress', - insertText: new SnippetString('GetAddress()'), - documentation: new MarkdownString( -` - GetAddress() as Object - -Returns the roSocketAddress object bound to this socket. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetSendToAddress', - insertText: new SnippetString('SetSendToAddress(${1:sockAddr as Object})'), - documentation: new MarkdownString( -` - SetSendToAddress(sockAddr as Object) as Boolean - -Set remote address for next message to be sent - -sockAddr is an roSocketAddress. - -Returns true if successfully stored address as first half of underlying BSD sendto() call -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSendToAddress', - insertText: new SnippetString('GetSendToAddress()'), - documentation: new MarkdownString( -` - GetSendToAddress() as Object - -Returns roSocketAddress for remote address of next message to be sent - -Can also be used to return the remote address on newly accepted sockets -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetReceivedFromAddress', - insertText: new SnippetString('GetReceivedFromAddress()'), - documentation: new MarkdownString( -` - GetReceivedFromAddress() as Object - -Returns roSocketAddress for remote address of last message received via receive() - -Can also be used to return the remote address on newly accepted sockets -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCountRcvBuf', - insertText: new SnippetString('GetCountRcvBuf()'), - documentation: new MarkdownString( -` - GetCountRcvBuf() as Integer - -Returns the number of bytes in the receive buffer -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCountSendBuf', - insertText: new SnippetString('GetCountSendBuf()'), - documentation: new MarkdownString( -` - GetCountSendBuf() as Integer - -Returns the number of bytes in the send buffer -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Status', - insertText: new SnippetString('Status()'), - documentation: new MarkdownString( -` - Status() as Integer - -Returns the errno of the last operation attempted or zero if the last operation was a success. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketConnectionCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketConnectionCompletionItems.ts deleted file mode 100644 index 0fb18409..00000000 --- a/src/BrightScriptCompletionItems/ifSocketConnectionCompletionItems.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketConnectionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Listen', - insertText: new SnippetString('Listen(${1:backlog as Integer})'), - documentation: new MarkdownString( -` - Listen(backlog as Integer) as Boolean - -Returns true if listen can be done (generally if bound address is valid) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsListening', - insertText: new SnippetString('IsListening()'), - documentation: new MarkdownString( -` - IsListening() as Boolean - -Returns true if listen has been successfully called on this socket -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Connect', - insertText: new SnippetString('Connect()'), - documentation: new MarkdownString( -` - Connect() as Boolean - -Returns returns true connect is successful. - -Still might not be complete if socket is non-blocking -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Accept', - insertText: new SnippetString('Accept()'), - documentation: new MarkdownString( -` - Accept() as Object - -Returns an roStreamSocket if connection is pending, invalid otherwise. - -Use status to distinguish among success (eSuccess() or isConnected()), not ready (eOK()), and error. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsConnected', - insertText: new SnippetString('IsConnected()'), - documentation: new MarkdownString( -` - IsConnected() as Boolean - -Returns true if a connect or accept has successfully completed on this socket -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketConnectionOptionCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketConnectionOptionCompletionItems.ts deleted file mode 100644 index 0745c01c..00000000 --- a/src/BrightScriptCompletionItems/ifSocketConnectionOptionCompletionItems.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketConnectionOptionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetKeepAlive', - insertText: new SnippetString('GetKeepAlive()'), - documentation: new MarkdownString( -` - GetKeepAlive() as Boolean - -Return true if keep alive is set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetKeepAlive', - insertText: new SnippetString('SetKeepAlive(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetKeepAlive(enable as Boolean) as Boolean - -Enable keep alive if enable is true, otherwise disable it. - -If keep alive set, occasional no-data packets will be sent to keep the connection alive. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetLinger', - insertText: new SnippetString('GetLinger()'), - documentation: new MarkdownString( -` - GetLinger() as Integer - -Return the max time in seconds that the socket close() blocks to allow send data to be flushed in synchronous mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetLinger', - insertText: new SnippetString('SetLinger(${1:time as Integer})'), - documentation: new MarkdownString( -` - SetLinger(time as Integer) as Boolean - -Set the max time in seconds that the socket close() blocks to allow send data to be flushed in synchronous mode. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMaxSeg', - insertText: new SnippetString('GetMaxSeg()'), - documentation: new MarkdownString( -` - GetMaxSeg() as Integer - -Return the max TCP segment size. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMaxSeg', - insertText: new SnippetString('SetMaxSeg(${1:time as Integer})'), - documentation: new MarkdownString( -` - SetMaxSeg(time as Integer) as Boolean - -Set the max TCP segment size. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetNoDelay', - insertText: new SnippetString('GetNoDelay()'), - documentation: new MarkdownString( -` - GetNoDelay() as Boolean - -Return true if no delay is on. - -With no delay on, data is sent as soon as it is available rather than waiting for enough data to fill a segment. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetNoDelay', - insertText: new SnippetString('SetNoDelay(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetNoDelay(enable as Boolean) as Boolean - -Enable the No Delay property on the socket. - -If No Delay is set, data is sent as soon as it is available rather than waiting for enough data to fill a segment. - -Returns true if successfully set. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketConnectionStatusCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketConnectionStatusCompletionItems.ts deleted file mode 100644 index 97ced1c2..00000000 --- a/src/BrightScriptCompletionItems/ifSocketConnectionStatusCompletionItems.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketConnectionStatusCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'eConnAborted', - insertText: new SnippetString('eConnAborted()'), - documentation: new MarkdownString( -` - eConnAborted() as Boolean - -Return true if errno is ECONNABORTED. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eConnRefused', - insertText: new SnippetString('eConnRefused()'), - documentation: new MarkdownString( -` - eConnRefused() as Boolean - -Return true if errno is ECONNREFUSED. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eConnReset', - insertText: new SnippetString('eConnReset()'), - documentation: new MarkdownString( -` - eConnReset() as Boolean - -Return true if errno is ECONNRESET. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eIsConn', - insertText: new SnippetString('eIsConn()'), - documentation: new MarkdownString( -` - eIsConn() as Boolean - -Return true if errno is EISCONN. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eNotConn', - insertText: new SnippetString('eNotConn()'), - documentation: new MarkdownString( -` - eNotConn() as Boolean - -Return true if errno is ENOTCONN. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketOptionCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketOptionCompletionItems.ts deleted file mode 100644 index f8e4e528..00000000 --- a/src/BrightScriptCompletionItems/ifSocketOptionCompletionItems.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketOptionCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetTTL', - insertText: new SnippetString('GetTTL()'), - documentation: new MarkdownString( -` - GetTTL() as Integer - -Return the integer TTL (Time To Live) value for all IP packets on the socket. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetTTL', - insertText: new SnippetString('SetTTL(${1:ttl as Integer})'), - documentation: new MarkdownString( -` - SetTTL(ttl as Integer) as Boolean - -Set the integer TTL (Time To Live) value for all IP packets on the socket. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetReuseAddr', - insertText: new SnippetString('GetReuseAddr()'), - documentation: new MarkdownString( -` - GetReuseAddr() as Boolean - -Return true if an address that has been previously assigned can be immediately reassigned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetReuseAddr', - insertText: new SnippetString('SetReuseAddr(${1:reuse as Boolean})'), - documentation: new MarkdownString( -` - SetReuseAddr(reuse as Boolean) - -Set the whether an address that has been previously assigned can be immediately reassigned. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetOOBInline', - insertText: new SnippetString('GetOOBInline()'), - documentation: new MarkdownString( -` - GetOOBInline() as Boolean - -Return true if Out Of Bounds data is read inline with regular data. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetOOBInline', - insertText: new SnippetString('SetOOBInline(${1:inline as Boolean})'), - documentation: new MarkdownString( -` - SetOOBInline(inline as Boolean) as Boolean - -Set whether OOB data is received in regular read. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSendBuf', - insertText: new SnippetString('GetSendBuf()'), - documentation: new MarkdownString( -` - GetSendBuf() as Integer - -Return the current send buffer size. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetSendBuf', - insertText: new SnippetString('SetSendBuf(${1:size as Integer})'), - documentation: new MarkdownString( -` - SetSendBuf(size as Integer) as Boolean - -Set the current send buffer size. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRcvBuf', - insertText: new SnippetString('GetRcvBuf()'), - documentation: new MarkdownString( -` - GetRcvBuf() as Integer - -Return the current receive buffer size. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetRcvBuf', - insertText: new SnippetString('SetRcvBuf(${1:size as Integer})'), - documentation: new MarkdownString( -` - SetRcvBuf(size as Integer) as Boolean - -Set the current receive buffer size. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSendTimeout', - insertText: new SnippetString('GetSendTimeout()'), - documentation: new MarkdownString( -` - GetSendTimeout() as Integer - -Return the current send timeout, in seconds. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetSendTimeout', - insertText: new SnippetString('SetSendTimeout(${1:timeout as Integer})'), - documentation: new MarkdownString( -` - SetSendTimeout(timeout as Integer) as Boolean - -Set the current send timeout, in seconds. - -Returns true if successfully set. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetReceiveTimeout', - insertText: new SnippetString('GetReceiveTimeout()'), - documentation: new MarkdownString( -` - GetReceiveTimeout() as Integer - -Return the current receive timeout, in seconds. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetReceiveTimeout', - insertText: new SnippetString('SetReceiveTimeout(${1:timeout as Integer})'), - documentation: new MarkdownString( -` - SetReceiveTimeout(timeout as Integer) as Boolean - -Set the current receive timeout, in seconds. - -Returns true if successfully set. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSocketStatusCompletionItems.ts b/src/BrightScriptCompletionItems/ifSocketStatusCompletionItems.ts deleted file mode 100644 index f83a751f..00000000 --- a/src/BrightScriptCompletionItems/ifSocketStatusCompletionItems.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSocketStatusCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'eAgain', - insertText: new SnippetString('eAgain()'), - documentation: new MarkdownString( -` - eAgain() as Boolean - -Return true if errno is EAGAIN. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eAlready', - insertText: new SnippetString('eAlready()'), - documentation: new MarkdownString( -` - eAlready() as Boolean - -Return true if errno is EALREADY. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eBadAddr', - insertText: new SnippetString('eBadAddr()'), - documentation: new MarkdownString( -` - eBadAddr() as Boolean - -Return true if errno is EBADADDR. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eDestAddrReq', - insertText: new SnippetString('eDestAddrReq()'), - documentation: new MarkdownString( -` - eDestAddrReq() as Boolean - -Return true if errno is EDESTADDRREQ. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eHostUnreach', - insertText: new SnippetString('eHostUnreach()'), - documentation: new MarkdownString( -` - eHostUnreach() as Boolean - -Return true if errno is EHOSTUNREACH. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eInvalid', - insertText: new SnippetString('eInvalid()'), - documentation: new MarkdownString( -` - eInvalid() as Boolean - -Return true if errno is EINVALID. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eInProgress', - insertText: new SnippetString('eInProgress()'), - documentation: new MarkdownString( -` - eInProgress() as Boolean - -Return true if errno is EINPROGRESS. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eWouldBlock', - insertText: new SnippetString('eWouldBlock()'), - documentation: new MarkdownString( -` - eWouldBlock() as Boolean - -Return true if errno is EWOULDBLOCK. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eSuccess', - insertText: new SnippetString('eSuccess()'), - documentation: new MarkdownString( -` - eSuccess() as Boolean - -Return true if errno is 0 (no errors). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'eOK', - insertText: new SnippetString('eOK()'), - documentation: new MarkdownString( -` - eOK() as Boolean - -Return true if errno is has no hard error, but there could be async conditions: EAGAIN, EALREADY, EINPROGRESS, EWOULDBLOCK -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSourceIdentityCompletionItems.ts b/src/BrightScriptCompletionItems/ifSourceIdentityCompletionItems.ts deleted file mode 100644 index f9e8450a..00000000 --- a/src/BrightScriptCompletionItems/ifSourceIdentityCompletionItems.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSourceIdentityCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetSourceIdentity', - insertText: new SnippetString('GetSourceIdentity()'), - documentation: new MarkdownString( -` - GetSourceIdentity() as Integer - -Return the id currently associated with this source (event generating) or event object. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSpriteCompletionItems.ts b/src/BrightScriptCompletionItems/ifSpriteCompletionItems.ts deleted file mode 100644 index 06474902..00000000 --- a/src/BrightScriptCompletionItems/ifSpriteCompletionItems.ts +++ /dev/null @@ -1,256 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSpriteCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'MoveTo', - insertText: new SnippetString('MoveTo(${1:x as Integer}, ${2:y as Integer})'), - documentation: new MarkdownString( -` - MoveTo(x as Integer, y as Integer) as Void - -Move the sprite to coordinate x,y. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'MoveOffset', - insertText: new SnippetString('MoveOffset(${1:xOffset as Integer}, ${2:yOffset as Integer})'), - documentation: new MarkdownString( -` - MoveOffset(xOffset as Integer, yOffset as Integer) as Void - -Move the sprite to the current position plus the xOffset and yOffset. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetX', - insertText: new SnippetString('GetX()'), - documentation: new MarkdownString( -` - GetX() as Integer - -Returns the x coordinate of the sprite. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetY', - insertText: new SnippetString('GetY()'), - documentation: new MarkdownString( -` - GetY() as Integer - -Returns the y coordinate of the sprite. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetZ', - insertText: new SnippetString('SetZ(${1:z as Integer})'), - documentation: new MarkdownString( -` - SetZ(z as Integer) as Void - -Sets the z value of the sprite. The z value defines the order in which sprites are drawn. -Sprites with higher z values are drawn after (in front of) sprites with lower z values. The default z value is 0. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetZ', - insertText: new SnippetString('GetZ()'), - documentation: new MarkdownString( -` - GetZ() as Integer - -Returns the z value of the sprite. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetDrawableFlag', - insertText: new SnippetString('SetDrawableFlag(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - SetDrawableFlag(enable as Boolean) as Void - -Sets whether this sprite is drawable or just used for collision tests. An undrawable sprite can be used to define a region in the background that needs collision testing. -It can also be used as an auxiliary collision region for a more complex sprite defined in another sprite. The default value of true is set when a sprite is created. The default value is true. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetDrawableFlag', - insertText: new SnippetString('GetDrawableFlag()'), - documentation: new MarkdownString( -` - GetDrawableFlag() as Boolean - -Returns the value of the Drawable Flag. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMemberFlags', - insertText: new SnippetString('SetMemberFlags(${1:flags as Integer})'), - documentation: new MarkdownString( -` - SetMemberFlags(flags as Integer) as Void - -Sets flags to define the sprite membership.These flags are used with CollidableFlags to define what sprites are allowed to collide. The default value is 1. - -Enables "levels" of collision detection, as only sprites with a member flag bit that matches a collidable flag bit will be checked for collisions. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetMemberFlags', - insertText: new SnippetString('GetMemberFlags()'), - documentation: new MarkdownString( -` - GetMemberFlags() as Integer - -Returns the value of member flags variable. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCollidableFlags', - insertText: new SnippetString('SetCollidableFlags(${1:flags as Integer})'), - documentation: new MarkdownString( -` - SetCollidableFlags(flags as Integer) as Void - -Sets bits to determine what sprites will be checked for collisions. The sprites that are checked must have the corresponding bits sets in their MemberFlags. The default value is 1. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCollidableFlags', - insertText: new SnippetString('GetCollidableFlags()'), - documentation: new MarkdownString( -` - GetCollidableFlags() as Integer - -Returns the value of collidable flags variable. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetRegion', - insertText: new SnippetString('SetRegion(${1:region as Object})'), - documentation: new MarkdownString( -` - SetRegion(region as Object) as Void - -Set the region of the sprite to the passed in region roRegion object. If one already is set, it is replaced. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRegion', - insertText: new SnippetString('GetRegion()'), - documentation: new MarkdownString( -` - GetRegion() as Object - -Returns an roRegion object that specifies the region of a bitmap that is the sprite's display graphic. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'OffsetRegion', - insertText: new SnippetString('OffsetRegion(${1:x as Integer}, ${2:y as Integer}, ${3:width as Integer}, ${4:height as Integer})'), - documentation: new MarkdownString( -` - OffsetRegion(x as Integer, y as Integer, width as Integer, height as Integer) as Void - -Calls Region.Offset() on this Sprite's region. Adjusts the part of an roRegion's bitmap that is being displayed as the sprite. Wrap is taken into consideration. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetData', - insertText: new SnippetString('SetData(${1:data as Dynamic})'), - documentation: new MarkdownString( -` - SetData(data as Dynamic) as Void - -Associate user defined data with the sprite. The data can be any type including intrinsic types or objects. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetData', - insertText: new SnippetString('GetData()'), - documentation: new MarkdownString( -` - GetData() as Dynamic - -Returns any user data associated with the sprite previously set via SetData(). - -Returns invalid if there is no user data associated with this sprite. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CheckCollision', - insertText: new SnippetString('CheckCollision()'), - documentation: new MarkdownString( -` - CheckCollision() as Object - -Returns the first roSprite that this sprite collides with. The collision area is the entire sprite's bounding box, and the sprites must actually be overlapped to detect a collision. -That is, if a fast moving sprite moves "through" another sprite without actually overlapping when this call is made, no collision is detected. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CheckMultipleCollisions', - insertText: new SnippetString('CheckMultipleCollisions()'), - documentation: new MarkdownString( -` - CheckMultipleCollisions() as Dynamic - -Like CheckCollision but returns an array of all colliding sprites. If there are no collisions return invalid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Remove', - insertText: new SnippetString('Remove()'), - documentation: new MarkdownString( -` - Remove() as Void - -Remove the sprite from the managing roComposite object and delete the sprite. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifStringOpsCompletionItems.ts b/src/BrightScriptCompletionItems/ifStringOpsCompletionItems.ts deleted file mode 100644 index 7299e040..00000000 --- a/src/BrightScriptCompletionItems/ifStringOpsCompletionItems.ts +++ /dev/null @@ -1,411 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifStringOpsCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetString', - insertText: new SnippetString('SetString(${1:s as String}, ${2:len as Integer})'), - documentation: new MarkdownString( -` - SetString(s as String, len as Integer) as Void - -Sets the string to the first len characters of s. Note that there is a similar function in the ifString interface, ifString.SetString(), which does not take a length parameter. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AppendString', - insertText: new SnippetString('AppendString(${1:s as String}, ${2:len as Integer})'), - documentation: new MarkdownString( -` - AppendString(s as String, len as Integer) as Void - -Appends the first len characters of s to the end of the string. - -Note: the function AppendString() modifies the object on which it is called, which can result in unexpected results if called on a literal string constant rather than a string object. For example: - - x = "one" - print type(x) ' prints "String" - x.AppendString("two", 3) - print x ' will print "one" not "onetwo" - - y = box("one") - print type(y) ' prints "roString" - y.AppendString("two", 3) - print y ' will print "onetwo" - -The third line does not appear to do an append, but it is working as designed since the append happens to the temporary boxed object. -x="string" sets x to the intrinsic type, vs. y=box("string"), which works as you might expect. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Len', - insertText: new SnippetString('Len()'), - documentation: new MarkdownString( -` - Len() as Integer - -Returns the number of characters in the string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Left', - insertText: new SnippetString('Left(${1:len as Integer})'), - documentation: new MarkdownString( -` - Left(len as Integer) as String - -Returns a string consisting of the first len characters of the string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Right', - insertText: new SnippetString('Right(${1:len as Integer})'), - documentation: new MarkdownString( -` - Right(len as Integer) as String - -Returns a string consisting of the last len characters of the string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Mid', - insertText: new SnippetString('Mid(${1:start_index as Integer})'), - documentation: new MarkdownString( -` - Mid(start_index as Integer) as String - -Returns a string consisting of the last characters of the string, starting at the zero-based start_index. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Mid', - insertText: new SnippetString('Mid(${1:start_index as Integer}, ${2:num_chars as Integer})'), - documentation: new MarkdownString( -` - Mid(start_index as Integer, num_chars as Integer) as String - -Returns a string consisting of num_chars characters of the string, starting at the zero-based start_index. -If there are fewer than num_chars in the string after start_index, returns the remaining characters in the string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Instr', - insertText: new SnippetString('Instr(${1:substring as String})'), - documentation: new MarkdownString( -` - Instr(substring as String) as Integer - -Returns the zero-based index of the first occurrence of substring in the string. If the substring does not occur in the string, returns -1. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Replace', - insertText: new SnippetString('Replace(${1:from as String}, ${2:to as String})'), - documentation: new MarkdownString( -` - Replace(from As String, to As String) As String - -Returns a copy of the string with all instances of fromStr replaced with toStr. If fromStr is empty the return value is the same as the source string. - -Example: - - print "a-b-c".Replace("-", "/") - ' result is "a/b/c" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Instr', - insertText: new SnippetString('Instr(${1:start_index as Integer}, ${2:substring as String})'), - documentation: new MarkdownString( -` - Instr(start_index as Integer, substring as String) as Integer - -Returns the zero-based index of the first occurrence of substring in the string, starting at the specified zero-based start_index. -If the substring does not occur in the string after start_index, returns -1. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Trim', - insertText: new SnippetString('Trim()'), - documentation: new MarkdownString( -` - Trim() as String - -Returns the string with any leading and trailing whitespace characters removed. - -Whitespace characters include space, TAB, LF, CR, VT, FF, NO-BREAK SPACE, et al. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToInt', - insertText: new SnippetString('ToInt()'), - documentation: new MarkdownString( -` - ToInt() as Integer - -Returns the value of the string interpreted as a decimal number. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ToFloat', - insertText: new SnippetString('ToFloat()'), - documentation: new MarkdownString( -` - ToFloat() as Float - -Returns the value of the string interpreted as a floating point number. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Tokenize', - insertText: new SnippetString('Tokenize(${1:delim as String})'), - documentation: new MarkdownString( -` - Tokenize(delim as String) as Object - -Splits the string into separate substrings separated by a single delimiter character. The delim parameter specifies a set of characters which are treated as delimiters. -A sequence of two or more contiguous delimiters in the string is treated as a single delimiter. Returns an roList containing each of the substrings. The delimiters are not returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Split', - insertText: new SnippetString('Split(${1:separator as String})'), - documentation: new MarkdownString( -` - Split(separator as String) as Object - -_This function is available in firmware 7.1 or later._ - -Splits the input string using the separator string as a delimiter, and returns an array of the split token strings (not including the delimiter(s)). -An empty separator string indicates to split the string by character. - -Examples: - - a = "".Split("") - ' creates the array equivalent to - a = [] - - a = "123".Split("") - ' creates the array equivalent to - a = ["1", "2", "3"] - - a = "123".Split("/") - ' creates the array equivalent to - a = ["123"] - - a = "/123/".Split("/") - ' creates the array equivalent to - a = ["", "123", ""] - - a = "one, two, three".Split(", ") - ' creates the array equivalent to - a = ["one", "two", "three"] -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetEntityEncode', - insertText: new SnippetString('GetEntityEncode()'), - documentation: new MarkdownString( -` - GetEntityEncode() as String - -Returns the string with certain characters replaced with the corresponding HTML entity encoding sequence: - -Character | Replaced With ---- | --- -" | &quot; -' | &apos; -< | &lt; -> | &gt; -& | &amp; -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Escape', - insertText: new SnippetString('Escape()'), - documentation: new MarkdownString( -` - Escape() as String - -_This function is available in firmware 7.5 or later._ - -URL encode the specified string per RFC 3986 and return the encoded string. - -Non-ASCII characters are encoded as UTF-8 escape sequences. - -The functionality is essentially the same as roUrlTransfer.Escape, but without the overhead of creating a roUrlTransfer object. - -Note: consider using EncodeUri or EncodeUriComponent instead. - -Examples: - - s = "@&=+/#!*" - t = s.Escape() - print """" + t + """" - ' "%40%26%3D%2B%2F%23%21%2A" - - ' escaped characters are encoded as UTF-8 sequences - s = Chr(&h2022) - t = s.Escape() - print """" + t + """" - ' "%E2%80%A2" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Unescape', - insertText: new SnippetString('Unescape()'), - documentation: new MarkdownString( -` - Unescape() as String - -_This function is available in firmware 7.5 or later._ - -URL decode the specified string per RFC 3986 and return the decoded string. - -The functionality is essentially the same as roUrlTransfer.Unescape, but without the overhead of creating a roUrlTransfer object. - -If the escaped string includes invalid escape sequences, the decode will fail and an empty string will be returned. - -Note: consider using DecodeUri or DecodeUriComponent instead. - -Examples: - - t = "%3B%3F%3A%24%2C%28%29" - s = t.Unescape() - print """" + s + """" - ' ";?:$,()" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EncodeUri', - insertText: new SnippetString('EncodeUri()'), - documentation: new MarkdownString( -` - EncodeUri() as String - -_This function is available in firmware 7.5 or later._ - -Encode the specified string with escape sequences for reserved Uniform Resource Identifier (URI) characters. - -Non-ASCII characters are encoded as UTF-8 escape sequences. - -Examples: - - s = "http://roku.com/my test.asp?first=jane&last=doe" - t = s.EncodeUri() - print """" + t + """" - ' "http://roku.com/my%20test.asp?first=jane&last=doe" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DecodeUri', - insertText: new SnippetString('DecodeUri()'), - documentation: new MarkdownString( -` - DecodeUri() as String - -_This function is available in firmware 7.5 or later._ - -Decode the specified string with escape sequences for reserved Uniform Resource Identifier (URI) characters. - -If the escaped string includes invalid escape sequences, the decode will fail and an empty string will be returned. - -Examples: - - t = "http://roku.com/my%20test.asp?first=jane&last=doe" - s = t.DecodeUri() - print """" + s + """" - ' "http://roku.com/my test.asp?first=jane&last=doe" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EncodeUriComponent', - insertText: new SnippetString('EncodeUriComponent()'), - documentation: new MarkdownString( -` - EncodeUriComponent() as String - -_This function is available in firmware 7.5 or later._ - -Encode the specified string with escape sequences for reserved Uniform Resource Identifier (URI) component characters. - -Non-ASCII characters are encoded as UTF-8 escape sequences. - -Examples: - - s = "http://roku.com/my test.asp?first=jane&last=doe" - t = s.EncodeUriComponent() - print """" + t + """" - ' "http%3A%2F%2Froku.com%2Fmy%20test.asp%3Ffirst%3Djane%26last%3Ddoe" -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'DecodeUriComponent', - insertText: new SnippetString('DecodeUriComponent()'), - documentation: new MarkdownString( -` - DecodeUriComponent() as String - -_This function is available in firmware 7.5 or later._ - -Decode the specified string with escape sequences for reserved Uniform Resource Identifier (URI) component characters. - -If the escaped string includes invalid escape sequences, the decode will fail and an empty string will be returned. - -Examples: - - t = "http%3A%2F%2Froku.com%2Fmy%20test.asp%3Ffirst%3Djane%26last%3Ddoe" - s = t.DecodeUriComponent() - print """" + s + """" - ' "http://roku.com/my test.asp?first=jane&last=doe" -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifSystemLogCompletionItems.ts b/src/BrightScriptCompletionItems/ifSystemLogCompletionItems.ts deleted file mode 100644 index 8f2bf9ed..00000000 --- a/src/BrightScriptCompletionItems/ifSystemLogCompletionItems.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifSystemLogCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'EnableType', - insertText: new SnippetString('EnableType(${1:logType as String})'), - documentation: new MarkdownString( -` - EnableType(logType as String) as Void - -Enables log message of type logType. When a log type is enabled, system log messages of that type are sent to the message port which was set using SetMessagePort(). -All system log events are disabled by default and must be explicitly enabled by the application. - -The current valid logTypes are: -* "http.connect" -* "http.error" -* "bandwidth.minute" -* “http.complete” - -See online documentation for more info on valid logtypes. -https://sdkdocs.roku.com/display/sdkdoc/ifSystemLog -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifTextToSpeechCompletionItems.ts b/src/BrightScriptCompletionItems/ifTextToSpeechCompletionItems.ts deleted file mode 100644 index 497bd42a..00000000 --- a/src/BrightScriptCompletionItems/ifTextToSpeechCompletionItems.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifTextToSpeechCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Say', - insertText: new SnippetString('Say(${1:text as String})'), - documentation: new MarkdownString( -` - Say(text as String) as Integer - -text is a UTF8 string - -Causes the string specified by text to be spoken. Returns an ID for the spoken string to notify observer callbacks about a specific spoken string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Silence', - insertText: new SnippetString('Silence(${1:duration as Integer})'), - documentation: new MarkdownString( -` - Silence(duration as Integer) as Integer - -duration is time in milliseconds - -Causes text to speech to continue to suppress any application background sound for the amount of time specified by duration. -This can be used to add clarity for longer spoken text that may have pauses that might otherwise allow application background sound to be heard. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Flush', - insertText: new SnippetString('Flush()'), - documentation: new MarkdownString( -` - Flush() as Void - -Interrupts and stops any current text to speech spoken string, to be used when the application does not want to the text to speech to continue. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsEnabled', - insertText: new SnippetString('IsEnabled()'), - documentation: new MarkdownString( -` - IsEnabled() as Boolean - -Returns the enabled setting of text to speech. -Text to speech may be enabled or disabled for various technical reasons (for example, on some platforms, text to speech may only be enabled once in connected mode). -This is not affected by the state of any of its clients. In particular, it does not depend on whether a CVAA compliant accessibility feature is enabled or not. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAvailableLanguages', - insertText: new SnippetString('GetAvailableLanguages()'), - documentation: new MarkdownString( -` - GetAvailableLanguages() as Object - -Returns an array containing the current list of languages available for text to speech. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetLanguage', - insertText: new SnippetString('SetLanguage(${1:name as String})'), - documentation: new MarkdownString( -` - SetLanguage(name as String) as Void - -name is the name of an available text to speech language - -Sets the language specified by name for text to speech, from one of the available languages returned by GetAvailableLanguages(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetLanguage', - insertText: new SnippetString('GetLanguage()'), - documentation: new MarkdownString( -` - GetLanguage() as String - -Returns the name of the currently-selected text to speech language. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAvailableVoices', - insertText: new SnippetString('GetAvailableVoices()'), - documentation: new MarkdownString( -` - GetAvailableVoices() as Object - -Returns an array containing the current list of voices available for text to speech. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetVoice', - insertText: new SnippetString('SetVoice(${1:name as String})'), - documentation: new MarkdownString( -` - SetVoice(name as String) as Void - -name is the name of an available text to speech voice - -Sets the voice specified by name for text to speech, from one of the available voices returned by GetAvailableVoices(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVoice', - insertText: new SnippetString('GetVoice()'), - documentation: new MarkdownString( -` - GetVoice() as String - -Returns the currently-selected voice. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetVolume', - insertText: new SnippetString('GetVolume()'), - documentation: new MarkdownString( -` - GetVolume() as Integer - -Returns the volume at which text is spoken. The value ranges from 0 for muted to 1000 for the highest volume. The default value is 1000. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetVolume', - insertText: new SnippetString('SetVolume(${1:volume as Integer})'), - documentation: new MarkdownString( -` - SetVolume(volume as Integer) as Void - -volume is the volume at which text is spoken. The value ranges from 0 for muted to 1000 for the highest volume. The default value is 1000. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRate', - insertText: new SnippetString('GetRate()'), - documentation: new MarkdownString( -` - GetRate() as Integer - -_Available since firmware version 7.5_ - -Returns the rate at which text is spoken. The value ranges from -40 to 200 with a default value of 0. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetRate', - insertText: new SnippetString('SetRate(${1:rate as Integer})'), - documentation: new MarkdownString( -` - SetRate(rate as Integer) as Void - -_Available since firmware version 7.5_ - -rate sets the rate at which text is spoken. The possible values range from -40 to 200. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPitch', - insertText: new SnippetString('GetPitch()'), - documentation: new MarkdownString( -` - GetPitch() as Integer - -_Available since firmware version 7.5_ - -Returns the pitch at which text is spoken. The possible values range from -60 to +60. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPitch', - insertText: new SnippetString('SetPitch(${1:pitch as Integer})'), - documentation: new MarkdownString( -` - SetPitch(pitch as Integer) as Void - -_Available since firmware version 7.5_ - -pitch sets the pitch at which text is spoken. The possible values range from -60 to +60. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifTextureManagerCompletionItems.ts b/src/BrightScriptCompletionItems/ifTextureManagerCompletionItems.ts deleted file mode 100644 index 5cecb9c9..00000000 --- a/src/BrightScriptCompletionItems/ifTextureManagerCompletionItems.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifTextureManagerCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'RequestTexture', - insertText: new SnippetString('RequestTexture(${1:req as Object})'), - documentation: new MarkdownString( -` - RequestTexture(req as Object) as Void - -req should be an roTextureRequest. Makes a request for an roBitmap with the attributes specified by the roTextureRequest. -The roTextureManager will pass an roTextureRequestEvent to the message port when completed. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'CancelRequest', - insertText: new SnippetString('CancelRequest(${1:req as Object})'), - documentation: new MarkdownString( -` - CancelRequest(req as Object) as Void - -Cancels the request specified by req, which should be an roTextureRequest previously passed to RequestTexture(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'UnloadBitmap', - insertText: new SnippetString('UnloadBitmap(${1:url as String})'), - documentation: new MarkdownString( -` - UnloadBitmap(url as String) as Void - -Removes a bitmap from the roTextureManager with the specified URL. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Cleanup', - insertText: new SnippetString('Cleanup()'), - documentation: new MarkdownString( -` - Cleanup() as Void - -Removes all bitmaps from the roTextureManager. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifTextureRequestCompletionItems.ts b/src/BrightScriptCompletionItems/ifTextureRequestCompletionItems.ts deleted file mode 100644 index 22c7f8a1..00000000 --- a/src/BrightScriptCompletionItems/ifTextureRequestCompletionItems.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifTextureRequestCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetId', - insertText: new SnippetString('GetId()'), - documentation: new MarkdownString( -` - GetId() as Integer - -Returns a unique id for the request. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetState', - insertText: new SnippetString('GetState()'), - documentation: new MarkdownString( -` - GetState() as Integer - -Returns the state of the request. - -Value | State ---- | --- -0 | Requested -1 | Downloading -2 | Downloaded -3 | Ready -4 | Failed -5 | Cancelled -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetAsync', - insertText: new SnippetString('SetAsync(${1:async as Boolean})'), - documentation: new MarkdownString( -` - SetAsync(async as Boolean) as Integer - -Sets the request to be either asynchronous (true) or synchronous (false). The default is asynchronous. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetSize', - insertText: new SnippetString('SetSize(${1:width as Integer}, ${2:height as Integer})'), - documentation: new MarkdownString( -` - SetSize(width as Integer, height as Integer) as Void - -Set the desired size of the roBitmap. The default is to return a bitmap in its native size. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetScaleMode', - insertText: new SnippetString('SetScaleMode(${1:mode as Integer})'), - documentation: new MarkdownString( -` - SetScaleMode(mode as Integer) - -Set the scaling mode to be used. The default is zero. - -Value | Mode ---- | --- -0 | Nearest neighbor (fast) -1 | Bilinear (smooth) -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifTimespanCompletionItems.ts b/src/BrightScriptCompletionItems/ifTimespanCompletionItems.ts deleted file mode 100644 index 91a41168..00000000 --- a/src/BrightScriptCompletionItems/ifTimespanCompletionItems.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifTimespanCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Mark', - insertText: new SnippetString('Mark()'), - documentation: new MarkdownString( -` - Mark() as Void - -Sets the "Mark" point to the current time. The Mark point is also automatically set to the current time when an roTimespan object is created. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'TotalMilliseconds', - insertText: new SnippetString('TotalMilliseconds()'), - documentation: new MarkdownString( -` - TotalMilliseconds() as Integer - -Returns the total number of milliseconds from the "Mark" point to the current time. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'TotalSeconds', - insertText: new SnippetString('TotalSeconds()'), - documentation: new MarkdownString( -` - TotalSeconds() as Integer - -Returns the total number of seconds from the "Mark" point to the current time. - - x = timespan.TotalSeconds() - -is equivalent to - - x = Int(timespan.TotalMilliseconds() / 1000) -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetSecondsToISO8601Date', - insertText: new SnippetString('GetSecondsToISO8601Date(${1:date as String})'), - documentation: new MarkdownString( -` - GetSecondsToISO8601Date(date as String) as Integer - -This function parses the ISO8601 date (e.g. 2008-11-29T14:54:02.171) and returns the number of seconds from now (not the "Mark" point) until the specified date/time. -The date provided and the current time calculations are all done assuming UTC. The "Z" timezone part of the ISO8601 string is ignored. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifUrlTransferCompletionItems.ts b/src/BrightScriptCompletionItems/ifUrlTransferCompletionItems.ts deleted file mode 100644 index abe86d9a..00000000 --- a/src/BrightScriptCompletionItems/ifUrlTransferCompletionItems.ts +++ /dev/null @@ -1,386 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifUrlTransferCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetIdentity', - insertText: new SnippetString('GetIdentity()'), - documentation: new MarkdownString( -` - GetIdentity() as Integer - -Returns a unique number for this object that can be used to identify whether events originated from this object. - -Note that the value can be any arbitrary value as assigned by the firmware, and should only be used for comparison purposes. -For example, the value should not be used as an array index. For use as a look-up key, one option would be to use GetIdentity().ToStr() as an associative array key. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetUrl', - insertText: new SnippetString('SetUrl(${1:url as String})'), - documentation: new MarkdownString( -` - SetUrl(url as String) as Void - -Sets the URL to use for the transfer request. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetUrl', - insertText: new SnippetString('GetUrl()'), - documentation: new MarkdownString( -` - GetUrl() as String - -Returns the current URL. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetRequest', - insertText: new SnippetString('SetRequest(${1:req as String})'), - documentation: new MarkdownString( -` - SetRequest(req as String) - -Changes the request method from the normal GET, HEAD or POST to the value passed as a string. This should be used with caution as it can generate invalid HTTP requests. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetRequest', - insertText: new SnippetString('GetRequest()'), - documentation: new MarkdownString( -` - GetRequest() as String - -Returns the current request method. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetToString', - insertText: new SnippetString('GetToString()'), - documentation: new MarkdownString( -` - GetToString() as String - -Connect to the remote service as specified in the URL and return the response body as a string. This function waits for the transfer to complete and it may block for a long time. - -This calls discards the headers and response codes. If that information is required, use AsyncGetToString instead. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetToFile', - insertText: new SnippetString('GetToFile(${1:filename as String})'), - documentation: new MarkdownString( -` - GetToFile(filename as String) as Integer - -Connect to the remote service as specified in the URL and write the response body to a file on the Roku device's filesystem. - -This function does not return until the exchange is complete and may block for a long time. - -The HTTP response code from the server is returned. It is not possible to access any of the response headers. If this information is required use AsyncGetToFile instead. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncGetToString', - insertText: new SnippetString('AsyncGetToString()'), - documentation: new MarkdownString( -` - AsyncGetToString() as Boolean - -Start a GET request to a server, but do not wait for the transfer to complete. When the GET completes, a roUrlEvent will be sent to the message port associated with the object. -The event will contain a roString with the body of the response. If false is returned then the request could not be issued and no events will be delivered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncGetToFile', - insertText: new SnippetString('AsyncGetToFile(${1:filename as String})'), - documentation: new MarkdownString( -` - AsyncGetToFile(filename as String) as Boolean - -Like AsyncGetToString, this starts a transfer without waiting for it to complete. -However, the response body will be written to a file on the device's filesystem instead of being returned in a String object. -When the GET completes, an roUrlEvent will be sent to the message port associated with the object. If false is returned then the request could not be issued and no events will be delivered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Head', - insertText: new SnippetString('Head()'), - documentation: new MarkdownString( -` - Head() as Dynamic - -Synchronously perform an HTTP HEAD request and return an roUrlEvent object. In the event of catastrophic failure (e.g. an asynchronous operation is already active) then invalid is returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncHead', - insertText: new SnippetString('AsyncHead()'), - documentation: new MarkdownString( -` - AsyncHead() as Boolean - -Begin an HTTP HEAD request without waiting for it to complete. -When the HEAD completes, an roUrlEvent will be sent to the message port associated with the object. -If false is returned then the request could not be issued and no events will be delivered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'PostFromString', - insertText: new SnippetString('PostFromString(${1:request as String})'), - documentation: new MarkdownString( -` - PostFromString(request as String) as Integer - -Use the HTTP POST method to send the supplied string to the current URL. The HTTP response code is returned. Any response body is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'PostFromFile', - insertText: new SnippetString('PostFromFile(${1:filename as String})'), - documentation: new MarkdownString( -` - PostFromFile(filename as String) as Integer - -Use the HTTP POST method to send the contents of the specified file to the current URL. The HTTP response code is returned. Any response body is discarded. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncPostFromString', - insertText: new SnippetString('AsyncPostFromString(${1:request as String})'), - documentation: new MarkdownString( -` - AsyncPostFromString(request as String) as Boolean - -Use the HTTP POST method to send the supplied string to the current URL. -When the POST completes, an roUrlEvent will be sent to the message port associated with the object. -If false is returned then the request could not be issued and no events will be delivered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncPostFromFile', - insertText: new SnippetString('AsyncPostFromFile(${1:filename as String})'), - documentation: new MarkdownString( -` - AsyncPostFromFile(filename as String) as Boolean - -Use the HTTP POST method to send the contents of the specified file to the current URL. -When the POST completes, an roUrlEvent will be sent to the message port associated with the object. -If false is returned then the request could not be issued and no events will be delivered. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncPostFromFileToFile', - insertText: new SnippetString('AsyncPostFromFileToFile(${1:fromFile as String}, ${2:toFile as String})'), - documentation: new MarkdownString( -` - AsyncPostFromFileToFile(fromFile as String, toFile as String) as Boolean - -Use the HTTP POST method to send the contents of the specified file (fromFile) to the current URL. -When the POST completes successfully, an roUrlEvent will be sent to the message port associated with the object. -If false is returned then the request could not be issued and no events will be delivered. -This function is the same as AsyncPostFromFile, except that the HTTP response is written to the file specified by the toFile parameter. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AsyncCancel', - insertText: new SnippetString('AsyncCancel()'), - documentation: new MarkdownString( -` - AsyncCancel() as Boolean - -Cancel any outstanding async requests on the roUrlTransfer object. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'RetainBodyOnError', - insertText: new SnippetString('RetainBodyOnError(${1:retain as Boolean})'), - documentation: new MarkdownString( -` - RetainBodyOnError(retain as Boolean) as Boolean - -If retain is true, return the body of the response even if the HTTP status code indicates that an error occurred. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetUserAndPassword', - insertText: new SnippetString('SetUserAndPassword(${1:user as String}, ${2:password as String})'), - documentation: new MarkdownString( -` - SetUserAndPassword(user as String, password as String) as Boolean - -Enables HTTP authentication using the specified user name and password. -Note that HTTP basic authentication is deliberately disabled due to it being inherently insecure. HTTP digest authentication is supported. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMinimumTransferRate', - insertText: new SnippetString('SetMinimumTransferRate(${1:bytes_per_second as Integer}, ${2:period_in_seconds as Integer})'), - documentation: new MarkdownString( -` - SetMinimumTransferRate(bytes_per_second as Integer, period_in_seconds as Integer) as Boolean - -Terminate the transfer automatically if the rate drops below bytes_per_second when averaged over period_in_seconds. -If the transfer is over the Internet you may not want to set period_in_seconds to a small number because network problems may cause temporary drops in performance. -For large file transfers and a small bytes_per_second, averaging over fifteen minutes or even longer might be appropriate. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetFailureReason', - insertText: new SnippetString('GetFailureReason()'), - documentation: new MarkdownString( -` - GetFailureReason() as String - -If any of the roUrlTransfer functions indicate failure then this function may provide more information regarding the failure. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableEncodings', - insertText: new SnippetString('EnableEncodings(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableEncodings(enable as Boolean) as Boolean - -Enable gzip encoding of transfers. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Escape', - insertText: new SnippetString('Escape(${1:text as String})'), - documentation: new MarkdownString( -` - Escape(text as String) as String - -URL encode the specified string per RFC 3986 and return the encoded string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Unescape', - insertText: new SnippetString('Unescape(${1:text as String})'), - documentation: new MarkdownString( -` - Unescape(text as String) as String - -Decode the specified string per RFC 3986 and return the unencoded string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableResume', - insertText: new SnippetString('EnableResume(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableResume(enable as Boolean) as Boolean - -Enable automatic resumption of AsyncGetToFile and GetToFile requests. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnablePeerVerification', - insertText: new SnippetString('EnablePeerVerification(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnablePeerVerification(enable as Boolean) as Boolean - -Verify the certificate has a chain of trust up to a valid root certificate using. CURLOPT_SSL_VERIFYPEER. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableHostVerification', - insertText: new SnippetString('EnableHostVerification(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableHostVerification(enable as Boolean) as Boolean - -Verify that the certificate belongs to the host we're talking to using CURLOPT_SSL_VERIFYHOST. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'EnableFreshConnection', - insertText: new SnippetString('EnableFreshConnection(${1:enable as Boolean})'), - documentation: new MarkdownString( -` - EnableFreshConnection(enable as Boolean) as Boolean - -Enable fresh connection using CURLOPT_FRESH_CONNECT. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetHttpVersion', - insertText: new SnippetString('SetHttpVersion(${1:version as String})'), - documentation: new MarkdownString( -` - SetHttpVersion(version as String) as Void - -_Available since firmware version 7.6_ - -This is an optional function to enable HTTP/2 support. If version is set to "http2", HTTP/2 will be used for all underlying transfers. -This must be set on a roUrlTransfer instance prior to any data transfer. This cannot be changed on an instance after it is used. - -Note: For the HTTP/2 connection sharing feature, all roUrlTransfers should be made from the same thread. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifVideoPlayerCompletionItems.ts b/src/BrightScriptCompletionItems/ifVideoPlayerCompletionItems.ts deleted file mode 100644 index 1836b8c3..00000000 --- a/src/BrightScriptCompletionItems/ifVideoPlayerCompletionItems.ts +++ /dev/null @@ -1,316 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifVideoPlayerCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'SetContentList', - insertText: new SnippetString('SetContentList(${1:contentList as Object})'), - documentation: new MarkdownString( -` - SetContentList(contentList as Object) as Void - -Set the content to be played by the roVideoPlayer. The caller passes an roArray of roAssociativeArrays (Content Meta-Data objects) representing the information for each stream to be played. - -If the player is currently playing the player will be stopped. Next, the current player position is reset so the next time Play() is called, -playback will start at the first item of the content list (unless Seek() is called prior to Play()). - -roVideoPlayer prefetches the next item in the content list while the current item is playing. -Given sufficient network throughput, there is no rebuffering when the player switches to the next item in the list. -To signal the content transition, the player sends an isRequestSucceeded notification with the old content index and isListItemSelected notification with the new content index. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddContent', - insertText: new SnippetString('AddContent(${1:contentItem as Object})'), - documentation: new MarkdownString( -` - AddContent(contentItem as Object) as Void - -Add a new Content Meta-Data item to the content list for the roVideoPlayer. New items are added to the end of the list. - -roVideoPlayer playback buffers on each Content item transition. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ClearContent', - insertText: new SnippetString('ClearContent()'), - documentation: new MarkdownString( -` - ClearContent() as Void - -Clear all content from the roVideoPlayer. If the player is currently playing the player will be stopped. -Next, the current player position is reset so the next time Play() is called, playback will start at the first item of the content list (unless Seek() is called prior to Play()). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'PreBuffer', - insertText: new SnippetString('PreBuffer()'), - documentation: new MarkdownString( -` - PreBuffer() as Boolean - -_Available since firmware version 7.2_ - -Begins downloading and buffering of a video that may be selected by a user. This can be used to reduce buffering delays after a user has selected a video for playback. -A typical use would be to call PreBuffer() when the user is in the roSpringboardScreen (or equivalent), anticipating that the user will select a video on the springboard screen for download. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Play', - insertText: new SnippetString('Play()'), - documentation: new MarkdownString( -` - Play() as Boolean - -Put the roVideoPlayer into play mode starting at the beginning of the content list. This will stop any currently playing Content List. - -If Seek() was called prior to Play(), the player will start playing at the seek position. -If Seek() was not called, the player advances its current position to the next item in the content list and starts playing that item. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Stop', - insertText: new SnippetString('Stop()'), - documentation: new MarkdownString( -` - Stop() as Boolean - -Stops playback and resets the seek position, keeps the player’s current position unchanged. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Pause', - insertText: new SnippetString('Pause()'), - documentation: new MarkdownString( -` - Pause() as Boolean - -Put roVideoPlayer into _pause_ mode. - -It is an error to Pause if player is not in _play_ mode. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Resume', - insertText: new SnippetString('Resume()'), - documentation: new MarkdownString( -` - Resume() as Boolean - -Put roVideoPlayer into play mode starting from the pause point. - -It is an error to Resume from any other mode than _pause_. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetLoop', - insertText: new SnippetString('SetLoop(${1:loop as Boolean})'), - documentation: new MarkdownString( -` - SetLoop(loop as Boolean) as Void - -Enable/Disable the automatic replaying of the content list. - -Buffers on every loop to the beginning of the content list. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetNext', - insertText: new SnippetString('SetNext(${1:item as Integer})'), - documentation: new MarkdownString( -` - SetNext(item as Integer) as Void - -Set what the next item to be played within the Content List should be. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Seek', - insertText: new SnippetString('Seek(${1:offsetMs as Integer})'), - documentation: new MarkdownString( -` - Seek(offsetMs as Integer) as Boolean - -Set the start point of playback for the current video to offsetMs milliseconds. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetPositionNotificationPeriod', - insertText: new SnippetString('SetPositionNotificationPeriod(${1:period as Integer})'), - documentation: new MarkdownString( -` - SetPositionNotificationPeriod(period as Integer) as Void - -Set interval to receive playback position events from the roVideoPlayer. The notification period is specified in seconds. -Notification events sent to the script specify the position in seconds relative to the beginning of the stream. If the value is zero, position notifications are never sent. The default value is zero. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetCGMS', - insertText: new SnippetString('SetCGMS(${1:level as Integer})'), - documentation: new MarkdownString( -` - SetCGMS(level as Integer) as Void - -Set CGMS (Copy Guard Management System) on analog outputs to the desired level. - -* 0 - No Copy Restriction -* 1 - Copy No More -* 2 - Copy Once Allowed -* 3 – No Copying Permitted -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetDestinationRect', - insertText: new SnippetString('SetDestinationRect(${1:rect as Object})'), - documentation: new MarkdownString( -` - SetDestinationRect(rect as Object) as Void - -Set the target display window for the video. - -rect has the params: {x:Integer, y:Integer, w:Integer, h:Integer} - -Default value is: {x:0, y:0, w:0, h:0}, which is full screen -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetDestinationRect', - insertText: new SnippetString('SetDestinationRect(${1:x as Integer}, ${2:y as Integer}, ${3:w as Integer}, ${4:h as Integer})'), - documentation: new MarkdownString( -` - SetDestinationRect(x as Integer, y as Integer, w as Integer, h as Integer) as Void - -Set the target display window for the video. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetMaxVideoDecodeResolution', - insertText: new SnippetString('SetMaxVideoDecodeResolution(${1:width as Integer}, ${2:height as Integer})'), - documentation: new MarkdownString( -` - SetMaxVideoDecodeResolution(width as Integer, height as Integer) as Void - -Set the max resolution required by your video. - -Video decode memory is a shared resource with OpenGL texture memory. The BrightScript 2D APIs are implemented using OpenGL texture memory on Roku models that support the OpenGL APIs -(please see Roku Models and Features for a list of these models). - -On models that do not support OpenGL APIs this method exists for API compatibility but has no effect on actual memory allocations. - -Video decode memory allocation is based on a resolution of 1920x1080 or 1280x720 as the maximum supported resolution -for a particular Roku model (please see Roku Models and Features for a list of these models). - -This API enables applications that want to use both the 2D APIs and video playback with a lower resolution than 1080p. -Without this call, these applications are likely to not have enough memory for either video playback or roScreen rendering. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetPlaybackDuration', - insertText: new SnippetString('GetPlaybackDuration()'), - documentation: new MarkdownString( -` - GetPlaybackDuration() as Integer - -Returns the duration of the video, in seconds. -This information may not be available until after the video starts playing. A value of zero is returned if the duration is unknown. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAudioTracks', - insertText: new SnippetString('GetAudioTracks()'), - documentation: new MarkdownString( -` - GetAudioTracks() as Object - -Function returns an array of audio tracks contained in the current stream. Each element of the array represents a single audio track which contains the following attributes: - -Attribute | Description ---- | --- -Language | Language code ("eng" for English, etc.) -Track | Audio track identifier -Name | Track name -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'ChangeAudioTrack', - insertText: new SnippetString('ChangeAudioTrack(${1:trackID as String})'), - documentation: new MarkdownString( -` - ChangeAudioTrack(trackID as String) as Void - -This function is called to change the currently playing audio track. For content with multiple audio tracks, the current track can be selected programmatically using this function. -The function is passed a track ID value, as found in the Track attribute of the audio track records returned by GetAudioTracks(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetTimedMetaDataForKeys', - insertText: new SnippetString('SetTimedMetaDataForKeys(${1:keys as Dynamic})'), - documentation: new MarkdownString( -` - SetTimedMetaDataForKeys(keys[] as Dynamic) as Void - -This method is called to specify the timedMetaData keys that the BrightScript channel is interested in receiving from the timedMetaData event. -If the keys array is empty, all the timed metadata associated with the current stream is sent with the isTimedMetaData event. -If the keys array is invalid, then do not return any keys to the BrightScript channel. -Any keys not specified with this method are deleted by the firmware and never returned to the BrightScript application. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetCaptionRenderer', - insertText: new SnippetString('GetCaptionRenderer()'), - documentation: new MarkdownString( -` - GetCaptionRenderer() as Object - -This method returns the roCaptionRenderer instance associated with this roVideoPlayer. -Channels that render their own captions need to call this method to get the caption renderer for their video player in order to do capture rendering. See roCaptionRenderer for details. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifXMLElementCompletionItems.ts b/src/BrightScriptCompletionItems/ifXMLElementCompletionItems.ts deleted file mode 100644 index c8fa3376..00000000 --- a/src/BrightScriptCompletionItems/ifXMLElementCompletionItems.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifXMLElementCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'Parse', - insertText: new SnippetString('Parse(${1:xml as String})'), - documentation: new MarkdownString( -` - Parse(xml as String) as Boolean - -Parse a string of XML. Returns true if successful. In that case, other methods below can then be used to extract information about the parsed element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetBody', - insertText: new SnippetString('GetBody()'), - documentation: new MarkdownString( -` - GetBody() as Object - -Returns the body of the element. If the element contains child elements, GetBody() returns an roXMLList representing those elements, like GetChildElements(). -If there are no children but the element contains text, GetBody() returns an roString like GetText(). If the element is empty, GetBody() returns invalid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAttributes', - insertText: new SnippetString('GetAttributes()'), - documentation: new MarkdownString( -` - GetAttributes() as Object - -Returns an Associative Array representing the XML attributes of the element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetName', - insertText: new SnippetString('GetName()'), - documentation: new MarkdownString( -` - GetName() as String - -Returns the name of the element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetText', - insertText: new SnippetString('GetText()'), - documentation: new MarkdownString( -` - GetText() as String - -Returns any text contained in the element. This returns immediate body text only, i.e. does not include text from child elements. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetChildElements', - insertText: new SnippetString('GetChildElements()'), - documentation: new MarkdownString( -` - GetChildElements() as Object - -If there are child elements contained in this one, returns an roXMLList representing those elements. -If there are no child elements, returns invalid. Note that this function won't handle cases of mixed XML content, i.e., content with both child elements and text such as: - -Child TextMore Text - -In this case GetChildElements() called with the top level as an argument would return an roXMLList containing only one item corresponding to the element. -The body text "More Text" would be lost. To handle mixed content cases, use GetChildNodes(). -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetChildNodes', - insertText: new SnippetString('GetChildNodes()'), - documentation: new MarkdownString( -` - GetChildNodes() as Object - -If there are child elements contained in this one, returns an roList representing those elements. -If there are no child elements, returns invalid. The difference between this function and GetChildElements() is that GetChildNodes() handles the case of mixed XML content, -i.e., content with both child elements and text such as: - -Child TextMore Text - -In this case GetChildNodes() called with the top level as an argument would return an roList with two elements. -The first element would be an roXMLElement containing the information about . The second would be an roString containing "More Text". -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetNamedElements', - insertText: new SnippetString('GetNamedElements(${1:name as String})'), - documentation: new MarkdownString( -` - GetNamedElements(name as String) as Object - -Returns an roXMLList representing all child elements of this element whose name is specified. -If only one element matches the name, an roXMLList containing one element is returned. If no elements match, an empty roXMLList is returned. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetNamedElementsCi', - insertText: new SnippetString('GetNamedElementsCi(${1:name as String})'), - documentation: new MarkdownString( -` - GetNamedElementsCi(name as String) as Object - -Same as GetNamedElements except the name matching is case-insensitive. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'IsName', - insertText: new SnippetString('IsName(${1:name as String})'), - documentation: new MarkdownString( -` - IsName(name as String) as Boolean - -Returns true if the element has the specified name. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'HasAttribute', - insertText: new SnippetString('HasAttribute(${1:attr as String})'), - documentation: new MarkdownString( -` - HasAttribute(attr as String) as Boolean - -Returns true if the element has the specified attribute. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetBody', - insertText: new SnippetString('SetBody(${1:body as Object})'), - documentation: new MarkdownString( -` - SetBody(body as Object) as Void - -Sets the element text from the specified string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddBodyElement', - insertText: new SnippetString('AddBodyElement()'), - documentation: new MarkdownString( -` - AddBodyElement() as Object - -Adds an new unnamed / empty child element and returns it. -This should generally be followed by a call to child.SetName(). -Alternatively AddElement() or AddElementWidthBody() can be used to combine this step with additional construction into one call. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddElement', - insertText: new SnippetString('AddElement(${1:name as String})'), - documentation: new MarkdownString( -` - AddElement(name as String) as Object - -Adds a new child element with the specified name and returns the new element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddElementWithBody', - insertText: new SnippetString('AddElementWithBody(${1:name as String}, ${2:body as Object})'), - documentation: new MarkdownString( -` - AddElementWithBody(name as String, body as Object) as Object - -Adds a new child element with the specified name and text from the specified body string, and returns the new element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddText', - insertText: new SnippetString('AddText(${1:text as String})'), - documentation: new MarkdownString( -` - AddText(text as String) as Void - -Adds text to the element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'AddAttribute', - insertText: new SnippetString('AddAttribute(${1:attr as String}, ${2:value as String})'), - documentation: new MarkdownString( -` - AddAttribute(attr as String, value as String) as Void - -Adds an attribute value to the element. If an attribute of the same name already exists it is replaced. Note that XML attribute order is not significant, i.e. not preserved. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'SetName', - insertText: new SnippetString('SetName(${1:name as String})'), - documentation: new MarkdownString( -` - SetName(name as String) as Void - -Sets the name of the element. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GenXML', - insertText: new SnippetString('GenXML(${1:gen_header as Boolean})'), - documentation: new MarkdownString( -` - GenXML(gen_header as Boolean) as String - -Serializes the element to XML document text. If gen_header is true then the output begins with a standard XML declaration specifying UTF-8 encoding. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GenXMLHdr', - insertText: new SnippetString('GenXMLHdr(${1:hdr as String})'), - documentation: new MarkdownString( -` - GenXMLHdr(hdr as String) - -Serializes the element to XML document text. The specified header is used to begin the output, for example as a custom XML declaration. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Clear', - insertText: new SnippetString('Clear()'), - documentation: new MarkdownString( -` - Clear() as Void - -Removes all attributes and children from the element, as well as setting the name to empty. -` - ) - } -]; diff --git a/src/BrightScriptCompletionItems/ifXMLListCompletionItems.ts b/src/BrightScriptCompletionItems/ifXMLListCompletionItems.ts deleted file mode 100644 index 3616d8e6..00000000 --- a/src/BrightScriptCompletionItems/ifXMLListCompletionItems.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - CompletionItem, - CompletionItemKind, - MarkdownString, - SnippetString -} from 'vscode'; - -export const ifXMLListCompletionItems: CompletionItem[] = [ - { - kind: CompletionItemKind.Method, - label: 'GetNamedElements', - insertText: new SnippetString('GetNamedElements(${1:name as String})'), - documentation: new MarkdownString( -` - GetNamedElements(name As String) As Object - -Returns a new XMLList that contains all roXMLElements that matched the passed in name. This is the same as using the dot operator on an roXMLList. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetNamedElementsCi', - insertText: new SnippetString('GetNamedElementsCi(${1:name as String})'), - documentation: new MarkdownString( -` - GetNamedElementsCi(name As String) As Object - -Similar to GetNamedElements(), but uses case-insensitive matching. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'Simplify', - insertText: new SnippetString('Simplify()'), - documentation: new MarkdownString( -` - Simplify() As Object - -If the list contains exactly one item, Simplify() returns that item. Otherwise, it returns itself -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetAttributes', - insertText: new SnippetString('GetAttributes()'), - documentation: new MarkdownString( -` - GetAttributes() As Object - -If the list contains exactly one item, GetAttributes() returns the attributes of that item. Otherwise it returns invalid. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetText', - insertText: new SnippetString('GetText()'), - documentation: new MarkdownString( -` - GetText() As String - -If the list contains exactly one item, GetText() returns the text of that item. Otherwise it returns an empty string. -` - ) - }, - { - kind: CompletionItemKind.Method, - label: 'GetChildElements', - insertText: new SnippetString('GetChildElements()'), - documentation: new MarkdownString( -` - GetChildElements() As Dynamic - -If the list contains exactly one item, GetChildElements() returns the child elements of that item. Otherwise it returns invalid. - -Note that GetChildElements does NOT return the items contained in the roXMLList. Use ifList functions to access those items. -` - ) - } -]; diff --git a/src/BrightScriptDeclaration.ts b/src/BrightScriptDeclaration.ts index 5308d27c..ade7c290 100644 --- a/src/BrightScriptDeclaration.ts +++ b/src/BrightScriptDeclaration.ts @@ -1,11 +1,13 @@ -import { - Location, +import type { Position, Range, - SymbolKind, - TextDocument, Uri } from 'vscode'; +import { + Location, + SymbolKind, + TextDocument +} from 'vscode'; import * as vscode from 'vscode'; export class BrightScriptDeclaration { @@ -24,14 +26,10 @@ export class BrightScriptDeclaration { return new BrightScriptDeclaration(documentName, vscode.SymbolKind.File, undefined, [], new vscode.Range(0, 0, 0, 0), new vscode.Range(0, 0, 0, 0), uri); } - get isGlobal(): boolean { - return true; - // TODO add scope - // return this.container === undefined; - } + readonly isGlobal = true; get containerName(): string | undefined { - return this.container && this.container.name; + return this.container?.name; } public visible(position: Position): boolean { diff --git a/src/BrightScriptDefinitionProvider.ts b/src/BrightScriptDefinitionProvider.ts index a0fb6104..6f6a46b2 100644 --- a/src/BrightScriptDefinitionProvider.ts +++ b/src/BrightScriptDefinitionProvider.ts @@ -1,4 +1,4 @@ -import { +import type { CancellationToken, Definition, DefinitionProvider, @@ -6,7 +6,7 @@ import { TextDocument } from 'vscode'; -import { DefinitionRepository } from './DefinitionRepository'; +import type { DefinitionRepository } from './DefinitionRepository'; export default class BrightScriptDefinitionProvider implements DefinitionProvider { diff --git a/src/BrightScriptDocumentSymbolProvider.ts b/src/BrightScriptDocumentSymbolProvider.ts index 5222c59f..759d7e62 100644 --- a/src/BrightScriptDocumentSymbolProvider.ts +++ b/src/BrightScriptDocumentSymbolProvider.ts @@ -1,11 +1,10 @@ -import { +import type { CancellationToken, DocumentSymbolProvider, SymbolInformation, TextDocument, Uri } from 'vscode'; - -import { DeclarationProvider } from './DeclarationProvider'; +import type { DeclarationProvider } from './DeclarationProvider'; export class BrightScriptDocumentSymbolProvider implements DocumentSymbolProvider { constructor(declarationProvider: DeclarationProvider) { @@ -19,5 +18,4 @@ export class BrightScriptDocumentSymbolProvider implements DocumentSymbolProvide public readSymbolInformations(uri: Uri, input: string): SymbolInformation[] { return this.declarationProvider.readDeclarations(uri, input).map((d) => this.declarationProvider.declToSymbolInformation(uri, d)); } - } diff --git a/src/BrightScriptFileUtils.ts b/src/BrightScriptFileUtils.ts index 9a29b841..379782f7 100644 --- a/src/BrightScriptFileUtils.ts +++ b/src/BrightScriptFileUtils.ts @@ -1,17 +1,17 @@ export default class BrightScriptFileUtils { public getAlternateFileName(fileName: string): string | undefined { - if (fileName !== undefined && (fileName.toLowerCase().endsWith('.brs'))) { + if (fileName?.toLowerCase().endsWith('.brs')) { return fileName.substring(0, fileName.length - 4) + '.xml'; - } else if (fileName !== undefined && (fileName.toLowerCase().endsWith('.bs'))) { + } else if (fileName?.toLowerCase().endsWith('.bs')) { return fileName.substring(0, fileName.length - 3) + '.xml'; - } else if (fileName !== undefined && fileName.toLowerCase().endsWith('.xml')) { + } else if (fileName?.toLowerCase().endsWith('.xml')) { return fileName.substring(0, fileName.length - 4) + '.brs'; } else { return undefined; } } public getAlternateBrsFileName(fileName: string): string | undefined { - if (fileName !== undefined && (fileName.toLowerCase().endsWith('.bs'))) { + if (fileName?.toLowerCase().endsWith('.bs')) { return fileName.substring(0, fileName.length - 2) + 'brs'; } else if (fileName.toLowerCase().endsWith('.brs')) { return fileName.substring(0, fileName.length - 3) + 'bs'; @@ -21,7 +21,7 @@ export default class BrightScriptFileUtils { } public getBrsFileName(fileName: string): string | undefined { - if (fileName !== undefined && (fileName.toLowerCase().endsWith('.bs'))) { + if (fileName?.toLowerCase().endsWith('.bs')) { return fileName.substring(0, fileName.length - 2) + 'brs'; } else if (fileName.toLowerCase().endsWith('.brs')) { return fileName; @@ -29,7 +29,7 @@ export default class BrightScriptFileUtils { } public getBsFileName(fileName: string): string | undefined { - if (fileName !== undefined && (fileName.toLowerCase().endsWith('.brs'))) { + if (fileName?.toLowerCase().endsWith('.brs')) { return fileName.substring(0, fileName.length - 3) + 'bs'; } else if (fileName.toLowerCase().endsWith('.bs')) { return fileName; diff --git a/src/BrightScriptReferenceProvider.ts b/src/BrightScriptReferenceProvider.ts index ad87bbc6..7adffa70 100644 --- a/src/BrightScriptReferenceProvider.ts +++ b/src/BrightScriptReferenceProvider.ts @@ -1,12 +1,14 @@ import * as fs from 'fs'; import * as iconv from 'iconv-lite'; import * as vscode from 'vscode'; -import { - Location, - Position, +import type { TextDocument, Uri } from 'vscode'; +import { + Location, + Position +} from 'vscode'; import { getExcludeGlob, iterlines, WorkspaceEncoding } from './DeclarationProvider'; @@ -19,7 +21,7 @@ export class BrightScriptReferenceProvider implements vscode.ReferenceProvider { options: { includeDeclaration: boolean }, token: vscode.CancellationToken ): Promise { - return await this.find(document, position); + return this.find(document, position); } private async find(document: TextDocument, position: Position): Promise { @@ -31,7 +33,7 @@ export class BrightScriptReferenceProvider implements vscode.ReferenceProvider { fs.readFile(uri.fsPath, (err, data) => { if (err) { if (typeof err === 'object' && err.code === 'ENOENT') { - resolve(); + resolve(undefined); } else { reject(err); } @@ -54,7 +56,7 @@ export class BrightScriptReferenceProvider implements vscode.ReferenceProvider { let wordLength = word.length; for (const [line, text] of iterlines(input)) { let result; - while (result = regex.exec(text)) { + while ((result = regex.exec(text))) { locations.push(new Location(uri, new Position(line, result.index))); } } diff --git a/src/BrightScriptSignatureHelpProvider.spec.ts b/src/BrightScriptSignatureHelpProvider.spec.ts index 8244cb87..e7c8db88 100644 --- a/src/BrightScriptSignatureHelpProvider.spec.ts +++ b/src/BrightScriptSignatureHelpProvider.spec.ts @@ -1,5 +1,3 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ import * as sinon from 'sinon'; let Module = require('module'); @@ -92,11 +90,10 @@ describe('BrightScriptSignatureHelpProvider ', () => { let def = { next: nextStub }; definitionRepoMock.expects('findDefinition').once().returns(def); let position: any = new vscode.Position(10, 10); - provider.provideSignatureHelp(document, position, undefined).then((res) => { - definitionRepoMock.verify(); - documentMock.verify(); - done(); - }); + provider.provideSignatureHelp(document, position, undefined); + definitionRepoMock.verify(); + documentMock.verify(); + done(); }); }); }); diff --git a/src/BrightScriptSignatureHelpProvider.ts b/src/BrightScriptSignatureHelpProvider.ts index 357844af..c921e06b 100644 --- a/src/BrightScriptSignatureHelpProvider.ts +++ b/src/BrightScriptSignatureHelpProvider.ts @@ -1,15 +1,17 @@ -import { +import type { CancellationToken, + SignatureHelpProvider, + TextDocument +} from 'vscode'; +import { ParameterInformation, Position, Range, SignatureHelp, - SignatureHelpProvider, - SignatureInformation, - TextDocument + SignatureInformation } from 'vscode'; -import { DefinitionRepository } from './DefinitionRepository'; +import type { DefinitionRepository } from './DefinitionRepository'; export default class BrightScriptSignatureHelpProvider implements SignatureHelpProvider { @@ -19,9 +21,8 @@ export default class BrightScriptSignatureHelpProvider implements SignatureHelpP public definitionRepo: DefinitionRepository; - public async provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): Promise { - //TODO - use AST/Parse tree e.g. bright https://github.com/RokuRoad/bright - //get the position of a symbol to our left + public provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): SignatureHelp { + //TODO - use AST/Parse tree to get the position of a symbol to our left //1. get first bracket to our left, - then get the symbol before that.. //really crude crappy parser.. //TODO this is whack - it's not even LTR ugh.. @@ -77,7 +78,7 @@ export default class BrightScriptSignatureHelpProvider implements SignatureHelpP let params: ParameterInformation[] = []; let paramNames: string[] = []; - definition.value.params.forEach((param) => { + for (const param of definition.value.params) { let paramName: string = param.trim(); let infoText = ''; let infoIndex = param.indexOf('='); @@ -94,7 +95,7 @@ export default class BrightScriptSignatureHelpProvider implements SignatureHelpP } paramNames.push(paramName); params.push(new ParameterInformation(paramName, infoText)); - }); + } let signatureInfo = new SignatureInformation(definition.value.name + '(' + paramNames.join(', ') + ')'); signatureInfo.parameters = params; diff --git a/src/BrightScriptXmlDefinitionProvider.spec.ts b/src/BrightScriptXmlDefinitionProvider.spec.ts index 8723241b..18c175d0 100644 --- a/src/BrightScriptXmlDefinitionProvider.spec.ts +++ b/src/BrightScriptXmlDefinitionProvider.spec.ts @@ -1,5 +1,3 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ import { assert } from 'chai'; import * as sinon from 'sinon'; diff --git a/src/BrightScriptXmlDefinitionProvider.ts b/src/BrightScriptXmlDefinitionProvider.ts index 125fe17d..db5dfcb0 100644 --- a/src/BrightScriptXmlDefinitionProvider.ts +++ b/src/BrightScriptXmlDefinitionProvider.ts @@ -1,16 +1,18 @@ import * as vscode from 'vscode'; -import { +import type { CancellationToken, Definition, - DefinitionProvider, Position, - Range, TextDocument + DefinitionProvider, Position, TextDocument +} from 'vscode'; +import { + Range } from 'vscode'; import { BrightScriptDeclaration } from './BrightScriptDeclaration'; import BrightScriptFileUtils from './BrightScriptFileUtils'; import { getExcludeGlob } from './DeclarationProvider'; -import { DefinitionRepository } from './DefinitionRepository'; +import type { DefinitionRepository } from './DefinitionRepository'; import { XmlUtils, XmlWordType } from './XmlUtils'; export default class BrightScriptXmlDefinitionProvider implements DefinitionProvider { @@ -42,8 +44,6 @@ export default class BrightScriptXmlDefinitionProvider implements DefinitionProv case XmlWordType.Tag: definitions = await this.getXmlFileMatchingWord(word); break; - case XmlWordType.Attribute: - break; case XmlWordType.AttributeValue: //TODO - ascertain if this value is from an import tag! if (word.endsWith('.brs')) { @@ -54,6 +54,8 @@ export default class BrightScriptXmlDefinitionProvider implements DefinitionProv definitions = await this.getBrsSymbolsMatchingWord(document, position, word); } break; + default: + break; } return definitions; @@ -66,7 +68,7 @@ export default class BrightScriptXmlDefinitionProvider implements DefinitionProv for (const uri of await vscode.workspace.findFiles('**/*.xml', excludes)) { let path = uri.path.toLowerCase(); - if (path.indexOf(word) !== -1 && path.endsWith('.xml')) { + if (path.includes(word) && path.endsWith('.xml')) { let definition = BrightScriptDeclaration.fromUri(uri); definitions.push(definition.getLocation()); if (path.endsWith(word + '.xml')) { @@ -86,7 +88,9 @@ export default class BrightScriptXmlDefinitionProvider implements DefinitionProv let uri = vscode.Uri.file(alternateFilename); let doc = await vscode.workspace.openTextDocument(uri); // calls back into the provider if (doc) { - Array.from(this.repo.findDefinitionInDocument(doc, word)).forEach((d) => definitions.push(d.getLocation())); + for (const d of this.repo.findDefinitionInDocument(doc, word)) { + definitions.push(d.getLocation()); + } } } return definitions; @@ -94,7 +98,9 @@ export default class BrightScriptXmlDefinitionProvider implements DefinitionProv private async getSymbolForBrsFile(word: string): Promise { let definitions = []; - Array.from(await this.repo.findDefinitionForBrsDocument(word)).forEach((d) => definitions.push(d.getLocation())); + for (const def of await this.repo.findDefinitionForBrsDocument(word)) { + definitions.push(def.getLocation()); + } return definitions; } } diff --git a/src/DebugConfigurationProvider.spec.ts b/src/DebugConfigurationProvider.spec.ts index 643969f8..8148b288 100644 --- a/src/DebugConfigurationProvider.spec.ts +++ b/src/DebugConfigurationProvider.spec.ts @@ -1,25 +1,21 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ +/* eslint-disable no-template-curly-in-string */ import * as brighterscript from 'brighterscript'; import { assert, expect } from 'chai'; import * as path from 'path'; import { createSandbox } from 'sinon'; -import { WorkspaceFolder } from 'vscode'; +import type { WorkspaceFolder } from 'vscode'; import Uri from 'vscode-uri'; - +import type { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; import { BrightScriptDebugConfigurationProvider } from './DebugConfigurationProvider'; import { vscode } from './mockVscode.spec'; import { standardizePath as s } from 'brighterscript'; import * as fsExtra from 'fs-extra'; -import { config } from 'process'; - -let sinon = createSandbox(); -let c: any; -let Module = require('module'); -let cwd = s`${path.dirname(__dirname)}`; -const rootDir = s`${cwd}/rootDir`; -let commandsMock; +const sinon = createSandbox(); +const Module = require('module'); +const cwd = s`${path.dirname(__dirname)}`; +const tempDir = s`${cwd}/.tmp`; +const rootDir = s`${tempDir}/rootDir`; //override the "require" call to mock certain items const { require: oldRequire } = Module.prototype; @@ -31,36 +27,42 @@ Module.prototype.require = function hijacked(file) { } }; -let configProvider: BrightScriptDebugConfigurationProvider; +describe('BrightScriptConfigurationProvider', () => { -beforeEach(() => { - let context = { - workspaceState: { - update: () => { return Promise.resolve(); } - } - }; + let configProvider: BrightScriptDebugConfigurationProvider; + let folder: WorkspaceFolder; - let activeDeviceManager = { - getActiveDevices: () => [] - }; - configProvider = new BrightScriptDebugConfigurationProvider(context, activeDeviceManager); - c = configProvider; -}); -afterEach(() => { - sinon.restore(); -}); + beforeEach(() => { + fsExtra.emptyDirSync(tempDir); + let context = { + workspaceState: { + update: () => { + return Promise.resolve(); + } + } + }; + + folder = { + uri: Uri.file(rootDir), + name: 'test-folder', + index: 0 + }; + + let activeDeviceManager = { + getActiveDevices: () => [] + }; + configProvider = new BrightScriptDebugConfigurationProvider(context, activeDeviceManager, null, vscode.window.createOutputChannel('Extension')); + }); + + afterEach(() => { + fsExtra.emptyDirSync(tempDir); + sinon.restore(); + }); -describe('BrightScriptConfigurationProvider', () => { describe('resolveDebugConfiguration', () => { - let folder: WorkspaceFolder; let existingConfigDefaults; beforeEach(() => { - folder = { - uri: Uri.parse('file:/some/project') - }; - sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(true)); - - const configDefaults = (configProvider as any).configDefaults; + const configDefaults = configProvider['configDefaults']; existingConfigDefaults = { ...configDefaults }; @@ -75,12 +77,10 @@ describe('BrightScriptConfigurationProvider', () => { }); it('handles loading declared values from .env files', async () => { - let stub = sinon.stub(configProvider.fsExtra, 'readFile').callsFake((filePath: string) => { - //should load env file from proper place - expect(s`${filePath}`).to.equal(s`/some/project/.env`); - return Promise.resolve(Buffer.from('ROKU_PASSWORD=pass1234')); - }); - sinon.stub(configProvider, 'getBrsConfig').returns(Promise.resolve({})); + fsExtra.outputFileSync(`${rootDir}/.env`, 'ROKU_PASSWORD=pass1234'); + + sinon.stub(configProvider, 'getBsConfig').returns({}); + let config = await configProvider.resolveDebugConfiguration(folder, { host: '127.0.0.1', type: 'brightscript', @@ -90,33 +90,29 @@ describe('BrightScriptConfigurationProvider', () => { stopDebuggerOnAppExit: true }); expect(config.password).to.equal('pass1234'); - expect(stub.called).to.be.true; }); it('handles missing values from .env files', async () => { - let stub = sinon.stub(configProvider.fsExtra, 'readFile').callsFake((filePath: string) => { - //should load env file from proper place - expect(filePath).to.equal('/some/project/.env'); - return Promise.resolve(Buffer.from('USERNAME=bob')); - }); - sinon.stub(configProvider, 'getBrsConfig').returns(Promise.resolve({})); - let config = await configProvider.resolveDebugConfiguration({ uri: { fsPath: '/some/project' } }, { + fsExtra.outputFileSync(`${rootDir}/.env`, 'USERNAME=bob'); + + sinon.stub(configProvider, 'getBsConfig').returns({}); + + let config = await configProvider.resolveDebugConfiguration(folder, { host: '127.0.0.1', type: 'brightscript', envFile: '${workspaceFolder}/.env', password: '${env:ROKU_PASSWORD}' }); expect(config.password).to.equal((configProvider as any).configDefaults.password); - expect(stub.called).to.be.true; }); it('throws on missing .env file', async () => { sinon.restore(); sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(false)); - sinon.stub(configProvider, 'getBrsConfig').returns(Promise.resolve({})); + sinon.stub(configProvider, 'getBsConfig').returns({}); try { - let config = await configProvider.resolveDebugConfiguration(folder, { + await configProvider.resolveDebugConfiguration(folder, { host: '127.0.0.1', type: 'brightscript', envFile: '${workspaceFolder}/.env', @@ -129,20 +125,17 @@ describe('BrightScriptConfigurationProvider', () => { }); it('handles non ${workspaceFolder} replacements', async () => { - sinon.stub(configProvider, 'getBrsConfig').returns(Promise.resolve({})); - let stub = sinon.stub(configProvider.fsExtra, 'readFile').callsFake((filePath: string) => { - //should load env file from proper place - expect(filePath).to.equal('/some/project/.env'); - return Promise.resolve(Buffer.from('ROKU_PASSWORD=pass1234')); - }); - let config = await configProvider.resolveDebugConfiguration(folder, { + sinon.stub(configProvider, 'getBsConfig').returns({}); + + fsExtra.outputFileSync(`${rootDir}/some/project/.env`, 'ROKU_PASSWORD=pass1234'); + + const config = await configProvider.resolveDebugConfiguration(folder, { host: '127.0.0.1', type: 'brightscript', - envFile: '/some/project/.env', + envFile: `${rootDir}/some/project/.env`, password: '${env:ROKU_PASSWORD}' }); expect(config.password).to.equal('pass1234'); - expect(stub.called).to.be.true; }); it('uses the default values if not provided', async () => { @@ -151,9 +144,9 @@ describe('BrightScriptConfigurationProvider', () => { for (const key in configDefaults) { if (key === 'outDir') { expect( - path.normalize(config[key]) + s`${config[key]}` ).to.equal( - path.normalize(`${folder.uri.path}/out/`) + s`${folder.uri.fsPath}/out/` ); } else { expect(config[key], `Expected "${key}" to match the default`).to.equal(configDefaults[key]); @@ -176,55 +169,60 @@ describe('BrightScriptConfigurationProvider', () => { describe('processLogfilePath', () => { let tmpPath = `${rootDir}/.tmp`; beforeEach(() => { - try { fsExtra.emptyDirSync(tmpPath); } catch (e) { } + try { + fsExtra.emptyDirSync(tmpPath); + } catch (e) { } }); afterEach(() => { - try { fsExtra.emptyDirSync(tmpPath); } catch (e) { } + try { + fsExtra.emptyDirSync(tmpPath); + } catch (e) { } }); let workspaceFolder = { uri: { fsPath: tmpPath } }; - it('does nothing when prop is falsey', () => { - expect(configProvider.processLogfilePath(undefined, undefined)).not.to.be.ok; - expect(configProvider.processLogfilePath(undefined, {}).logfilePath).not.to.be.ok; - expect(configProvider.processLogfilePath(undefined, { logfilePath: null }).logfilePath).not.to.be.ok; - expect(configProvider.processLogfilePath(undefined, { logfilePath: '' }).logfilePath).not.to.be.ok; + it('does nothing when prop is falsey', async () => { + expect(await configProvider.processLogfilePath(undefined, undefined)).not.to.be.ok; + expect((await configProvider.processLogfilePath(undefined, {})).logfilePath).not.to.be.ok; + expect((await configProvider.processLogfilePath(undefined, { logfilePath: null })).logfilePath).not.to.be.ok; + expect((await configProvider.processLogfilePath(undefined, { logfilePath: '' })).logfilePath).not.to.be.ok; //it trims all whitespace too - expect(configProvider.processLogfilePath(undefined, { logfilePath: ' \n\t' }).logfilePath.trim()).not.to.be.ok; + expect((await configProvider.processLogfilePath(undefined, { logfilePath: ' \n\t' })).logfilePath.trim()).not.to.be.ok; }); - it('replaces workspaceFolder', () => { - expect(configProvider.processLogfilePath(workspaceFolder, { + it('replaces workspaceFolder', async () => { + const value = await configProvider.processLogfilePath(workspaceFolder, { logfilePath: '${workspaceFolder}/logfile.log' - }).logfilePath).to.equal(s`${tmpPath}/logfile.log`); + }); + expect(value.logfilePath).to.equal(s`${tmpPath}/logfile.log`); }); - it('should create the directory path and file', () => { - configProvider.processLogfilePath(workspaceFolder, { + it('should create the directory path and file', async () => { + await configProvider.processLogfilePath(workspaceFolder, { logfilePath: s`${tmpPath}/a/b/c/brs.log` }); expect(fsExtra.pathExistsSync(s`${tmpPath}/a/b/c/brs.log`)).to.be.true; }); - it('should not delete the files in the log folder if it already exists', () => { + it('should not delete the files in the log folder if it already exists', async () => { fsExtra.writeFileSync(`${tmpPath}/test.txt`, ''); - configProvider.processLogfilePath(workspaceFolder, { + await configProvider.processLogfilePath(workspaceFolder, { logfilePath: s`${tmpPath}/brs.log` }); expect(fsExtra.pathExistsSync(s`${tmpPath}/test.txt`)).to.be.true; }); - it('should not re-create the logfile if it already exists', () => { + it('should not re-create the logfile if it already exists', async () => { fsExtra.writeFileSync(`${tmpPath}/brs.log`, 'test contents'); - configProvider.processLogfilePath(workspaceFolder, { + await configProvider.processLogfilePath(workspaceFolder, { logfilePath: s`${tmpPath}/brs.log` }); expect(fsExtra.readFileSync(`${tmpPath}/brs.log`).toString()).equals('test contents'); }); - it('throws when creating the directory path and file when invalid characters are encountered', () => { + it('throws when creating the directory path and file when invalid characters are encountered', async () => { try { - configProvider.processLogfilePath(workspaceFolder, { + await configProvider.processLogfilePath(workspaceFolder, { logfilePath: s`${tmpPath}/ZZZ/brs.log`.replace('ZZZ', '<>') }); expect(true, 'Should have thrown').to.be.false; @@ -235,23 +233,20 @@ describe('BrightScriptConfigurationProvider', () => { }); describe('processEnvFile', () => { - let folder = { - uri: { - fsPath: process.cwd() - } - }; + function processEnvFile(folder: WorkspaceFolder, config: Partial & Record) { + return configProvider['processEnvFile'](folder, config as any); + } it('does nothing if .envFile is not specified', async () => { - let config = await c.processEnvFile(folder, { + let config = await processEnvFile(folder, { rootDir: '${env:ROOT_DIR}' }); expect(config.rootDir).to.equal('${env:ROOT_DIR}'); }); it('throws exception when .env file does not exist', async () => { - let stub = sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(false)); let threw = false; try { - await c.processEnvFile(folder, { + await processEnvFile(folder, { envFile: '${workspaceFolder}/.env' }); } catch (e) { @@ -263,7 +258,7 @@ describe('BrightScriptConfigurationProvider', () => { it('replaces ${workspaceFolder} in .envFile path', async () => { let stub = sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(false)); try { - await c.processEnvFile(folder, { + await processEnvFile(folder, { envFile: '${workspaceFolder}/.env' }); } catch (e) { } @@ -272,11 +267,8 @@ describe('BrightScriptConfigurationProvider', () => { }); it('replaces same env value multiple times in a config', async () => { - sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(true)); - sinon.stub(c.fsExtra, 'readFile').returns(Promise.resolve(` - PASSWORD=password - `)); - let config = await c.processEnvFile(folder, { + fsExtra.outputFileSync(`${rootDir}/.env`, `PASSWORD=password`); + let config = await processEnvFile(folder, { envFile: '${workspaceFolder}/.env', rootDir: '${env:PASSWORD}', stagingFolderPath: '${env:PASSWORD}' @@ -287,11 +279,8 @@ describe('BrightScriptConfigurationProvider', () => { }); it('does not replace text outside of the ${} syntax', async () => { - sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(true)); - sinon.stub(c.fsExtra, 'readFile').returns(Promise.resolve(` - PASSWORD=password - `)); - let config = await c.processEnvFile(folder, { + fsExtra.outputFileSync(`${rootDir}/.env`, `PASSWORD=password`); + const config = await processEnvFile(folder, { 'envFile': '${workspaceFolder}/.env', //this key looks exactly like the text within the ${}, make sure it persists. (dunno why someone would do this...) 'env:PASSWORD': '${env:PASSWORD}' @@ -301,11 +290,8 @@ describe('BrightScriptConfigurationProvider', () => { }); it('ignores ${env:} items that are not found in the env file', async () => { - sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(true)); - sinon.stub(c.fsExtra, 'readFile').returns(Promise.resolve(` - PASSWORD=password - `)); - let config = await c.processEnvFile(folder, { + fsExtra.outputFileSync(`${rootDir}/.env`, `PASSWORD=password`); + const config = await processEnvFile(folder, { envFile: '${workspaceFolder}/.env', rootDir: '${env:NOT_PASSWORD}' }); @@ -314,13 +300,12 @@ describe('BrightScriptConfigurationProvider', () => { }); it('loads env file when not using ${workspaceFolder} var', async () => { - sinon.stub(configProvider.util, 'fileExists').returns(Promise.resolve(true)); - let stub = sinon.stub(c.fsExtra, 'readFile').returns(Promise.resolve(` - `)); - let config = await c.processEnvFile(folder, { - envFile: '.env' + fsExtra.outputFileSync(`${tempDir}/.env`, `TEST_ENV_VAR=./somePath`); + const config = await processEnvFile(folder, { + envFile: `${tempDir}/.env`, + rootDir: '${env:TEST_ENV_VAR}/123' }); - expect(stub.getCalls()[0]?.args[0]).to.equal('.env'); + expect(config.rootDir).to.eql('./somePath/123'); }); }); }); diff --git a/src/DebugConfigurationProvider.ts b/src/DebugConfigurationProvider.ts index 53f48655..951af8e3 100644 --- a/src/DebugConfigurationProvider.ts +++ b/src/DebugConfigurationProvider.ts @@ -2,22 +2,28 @@ import { util as bslangUtil } from 'brighterscript'; import * as dotenv from 'dotenv'; import * as path from 'path'; import * as fsExtra from 'fs-extra'; -import { FileEntry, DefaultFiles } from 'roku-deploy'; +import { DefaultFiles } from 'roku-deploy'; import * as rta from 'roku-test-automation'; -import { +import type { CancellationToken, DebugConfigurationProvider, ExtensionContext, - WorkspaceFolder, + WorkspaceFolder } from 'vscode'; import * as vscode from 'vscode'; - -import { LaunchConfiguration, fileUtils } from 'roku-debug'; +import type { LaunchConfiguration } from 'roku-debug'; +import { fileUtils } from 'roku-debug'; import { util } from './util'; +import type { TelemetryManager } from './managers/TelemetryManager'; export class BrightScriptDebugConfigurationProvider implements DebugConfigurationProvider { - public constructor(context: ExtensionContext, activeDeviceManager: any) { + public constructor( + private context: ExtensionContext, + private activeDeviceManager: any, + private telemetryManager: TelemetryManager, + private extensionOutputChannel: vscode.OutputChannel + ) { this.context = context; this.activeDeviceManager = activeDeviceManager; @@ -33,8 +39,10 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio retainDeploymentArchive: true, injectRaleTrackerTask: false, injectRdbOnDeviceComponent: false, + disableScreenSaver: true, retainStagingFolder: false, enableVariablesPanel: true, + showHiddenVariables: false, enableDebuggerAutoRecovery: false, stopDebuggerOnAppExit: false, autoRunSgDebugCommands: [], @@ -46,17 +54,14 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio }; let config: any = vscode.workspace.getConfiguration('brightscript') || {}; - this.showDeviceInfoMessages = (config.deviceDiscovery || {}).showInfoMessages; + this.showDeviceInfoMessages = config.deviceDiscovery?.showInfoMessages; vscode.workspace.onDidChangeConfiguration((e) => { let config: any = vscode.workspace.getConfiguration('brightscript') || {}; - this.showDeviceInfoMessages = (config.deviceDiscovery || {}).showInfoMessages; + this.showDeviceInfoMessages = config.deviceDiscovery?.showInfoMessages; }); } - public context: ExtensionContext; - public activeDeviceManager: any; - //make unit testing easier by adding these imports properties public fsExtra = fsExtra; public util = util; @@ -69,40 +74,64 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio * e.g. add all missing attributes to the debug configuration. */ public async resolveDebugConfiguration(folder: WorkspaceFolder | undefined, config: any, token?: CancellationToken): Promise { - //force a specific staging folder path because sometimes this conflicts with bsconfig.json - config.stagingFolderPath = path.join('${outDir}/.roku-deploy-staging'); + try { + // merge user and workspace settings into the config + config = this.processUserWorkspaceSettings(config); - // Process the different parts of the config - config = this.processUserWorkspaceSettings(config); + //send telemetry about this debug session (don't worry, it gets sanitized...we're just checking if certain features are being used) + this.telemetryManager?.sendStartDebugSessionEvent(config); - config = await this.sanitizeConfiguration(config, folder); - config = await this.processEnvFile(folder, config); - config = await this.processHostParameter(config); - config = await this.processPasswordParameter(config); - config = await this.processDeepLinkUrlParameter(config); - config = this.processLogfilePath(folder, config); + //force a specific staging folder path because sometimes this conflicts with bsconfig.json + config.stagingFolderPath = path.join('${outDir}/.roku-deploy-staging'); - await this.context.workspaceState.update('enableDebuggerAutoRecovery', config.enableDebuggerAutoRecovery); + config = await this.sanitizeConfiguration(config, folder); + config = await this.processEnvFile(folder, config); + config = await this.processHostParameter(config); + config = await this.processPasswordParameter(config); + config = await this.processDeepLinkUrlParameter(config); + config = await this.processLogfilePath(folder, config); - return config; + await this.context.workspaceState.update('enableDebuggerAutoRecovery', config.enableDebuggerAutoRecovery); + + return config; + } catch (e) { + //log any exceptions to the extension panel + this.extensionOutputChannel.append((e as Error).stack); + throw e; + } } /** * There are several debug-level config values that can be stored in user settings, so get those */ private processUserWorkspaceSettings(config: BrightScriptLaunchConfiguration) { - //get baseline brightscript.debug user/project settings - var userWorkspaceDebugSettings = Object.assign( - { - enableSourceMaps: true, - enableDebugProtocol: false, - }, - //merge in all of the brightscript.debug properties - vscode.workspace.getConfiguration('brightscript.debug') ?? {}, - ); + const workspaceConfig = vscode.workspace.getConfiguration('brightscript.debug'); + + let userWorkspaceSettings = {} as BrightScriptLaunchConfiguration; + + //only keep the config values that were explicitly defined in a config file (i.e. exclude default values) + for (const key of Object.keys(workspaceConfig)) { + const inspection = workspaceConfig.inspect(key); + //if the value was explicitly defined by the user in one of the various locations, then keep this value + if ( + inspection.globalValue !== undefined || + inspection.workspaceValue !== undefined || + inspection.globalLanguageValue !== undefined || + inspection.defaultLanguageValue !== undefined || + inspection.workspaceFolderValue !== undefined || + inspection.workspaceLanguageValue !== undefined || + inspection.workspaceFolderLanguageValue !== undefined + ) { + userWorkspaceSettings[key] = workspaceConfig[key]; + } + } + //merge the user/workspace settings in with the config (the config wins on conflict) - config = Object.assign(userWorkspaceDebugSettings, config ?? {}); - return config; + const result = { + ...userWorkspaceSettings ?? {}, + ...config ?? {} + }; + return result; } /** @@ -110,22 +139,16 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio * @param config current config object */ private async sanitizeConfiguration(config: BrightScriptLaunchConfiguration, folder: WorkspaceFolder): Promise { - let defaultFilesArray: FileEntry[] = [ - 'manifest', - 'source/**/*.*', - 'components/**/*.*', - 'images/**/*.*' - ]; let userWorkspaceSettings: any = vscode.workspace.getConfiguration('brightscript') || {}; //make sure we have an object - config = Object.assign( - {}, + config = { + //the workspace settings are the baseline - userWorkspaceSettings, + ...userWorkspaceSettings, //override with any debug-specific settings - config - ); + ...config + }; let folderUri: vscode.Uri; //use the workspace folder provided @@ -148,10 +171,10 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio throw new Error('Cannot determine which workspace to use for brightscript debugging'); } - //load the brsconfig settings (if available) - let brsconfig = await this.getBrsConfig(folderUri); - if (brsconfig) { - config = Object.assign({}, brsconfig, config); + //load the bsconfig settings (if available) + let bsconfig = this.getBsConfig(folderUri); + if (bsconfig) { + config = { ...bsconfig, ...config }; } config.rootDir = this.util.ensureTrailingSlash(config.rootDir ? config.rootDir : '${workspaceFolder}'); @@ -198,37 +221,49 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio config.consoleOutput = config.consoleOutput ? config.consoleOutput : this.configDefaults.consoleOutput; config.autoRunSgDebugCommands = config.autoRunSgDebugCommands ? config.autoRunSgDebugCommands : this.configDefaults.autoRunSgDebugCommands; config.request = config.request ? config.request : this.configDefaults.request; - config.stopOnEntry = config.stopOnEntry ? config.stopOnEntry : this.configDefaults.stopOnEntry; + config.stopOnEntry ??= this.configDefaults.stopOnEntry; config.outDir = this.util.ensureTrailingSlash(config.outDir ? config.outDir : this.configDefaults.outDir); config.retainDeploymentArchive = config.retainDeploymentArchive === false ? false : this.configDefaults.retainDeploymentArchive; config.injectRaleTrackerTask = config.injectRaleTrackerTask === true ? true : this.configDefaults.injectRaleTrackerTask; config.injectRdbOnDeviceComponent = config.injectRdbOnDeviceComponent === true ? true : this.configDefaults.injectRdbOnDeviceComponent; - config.retainStagingFolder = config.retainStagingFolder === true ? true : this.configDefaults.retainStagingFolder; + config.disableScreenSaver = config.disableScreenSaver === false ? false : this.configDefaults.disableScreenSaver; + config.retainStagingFolder ??= this.configDefaults.retainStagingFolder; config.enableVariablesPanel = 'enableVariablesPanel' in config ? config.enableVariablesPanel : this.configDefaults.enableVariablesPanel; + config.showHiddenVariables = config.showHiddenVariables === true ? true : this.configDefaults.showHiddenVariables; config.enableDebuggerAutoRecovery = config.enableDebuggerAutoRecovery === true ? true : this.configDefaults.enableDebuggerAutoRecovery; config.stopDebuggerOnAppExit = config.stopDebuggerOnAppExit === true ? true : this.configDefaults.stopDebuggerOnAppExit; config.files = config.files ? config.files : this.configDefaults.files; config.enableSourceMaps = config.enableSourceMaps === false ? false : this.configDefaults.enableSourceMaps; config.packagePort = config.packagePort ? config.packagePort : this.configDefaults.packagePort; config.remotePort = config.remotePort ? config.remotePort : this.configDefaults.remotePort; - config.logfilePath = config.logfilePath ?? null; + config.logfilePath ??= null; + config.enableDebugProtocol = config.enableDebugProtocol ? true : false; + config.cwd = folderUri.fsPath; if (config.request !== 'launch') { - vscode.window.showErrorMessage(`roku-debug only supports the 'launch' request type`); + await vscode.window.showErrorMessage(`roku-debug only supports the 'launch' request type`); + } + + if (config.raleTrackerTaskFileLocation?.includes('${workspaceFolder}')) { + config.raleTrackerTaskFileLocation = path.normalize(config.raleTrackerTaskFileLocation.replace('${workspaceFolder}', folderUri.fsPath)); } // Check for the existence of the tracker task file in auto injection is enabled - if (config.injectRaleTrackerTask && await this.util.fileExists(config.raleTrackerTaskFileLocation) === false) { - vscode.window.showErrorMessage(`injectRaleTrackerTask was set to true but could not find TrackerTask.xml at:\n${config.raleTrackerTaskFileLocation}`); + if (config.injectRaleTrackerTask) { + if (!config.raleTrackerTaskFileLocation) { + await vscode.window.showErrorMessage(`"raleTrackerTaskFileLocation" must be defined when "injectRaleTrackerTask" is enabled`); + } else if (await this.util.fileExists(config.raleTrackerTaskFileLocation) === false) { + await vscode.window.showErrorMessage(`injectRaleTrackerTask was set to true but could not find TrackerTask.xml at:\n${config.raleTrackerTaskFileLocation}`); + } } //for rootDir, replace workspaceFolder now to avoid issues in vscode itself - if (config.rootDir.indexOf('${workspaceFolder}') > -1) { + if (config.rootDir.includes('${workspaceFolder}')) { config.rootDir = path.normalize(config.rootDir.replace('${workspaceFolder}', folderUri.fsPath)); } //for outDir, replace workspaceFolder now - if (config.outDir.indexOf('${workspaceFolder}') > -1) { + if (config.outDir.includes('${workspaceFolder}')) { config.outDir = path.normalize(config.outDir.replace('${workspaceFolder}', folderUri.fsPath)); } @@ -253,10 +288,10 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio return config; } - public processLogfilePath(folder: WorkspaceFolder | undefined, config: BrightScriptLaunchConfiguration) { + public async processLogfilePath(folder: WorkspaceFolder | undefined, config: BrightScriptLaunchConfiguration) { if (config?.logfilePath?.trim()) { config.logfilePath = config.logfilePath.trim(); - if (config.logfilePath.indexOf('${workspaceFolder}') > -1) { + if (config.logfilePath.includes('${workspaceFolder}')) { config.logfilePath = config.logfilePath.replace('${workspaceFolder}', folder.uri.fsPath); } @@ -269,7 +304,7 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio if (!fsExtra.pathExistsSync(config.logfilePath)) { fsExtra.createFileSync(config.logfilePath); } - this.context.workspaceState.update('logfilePath', config.logfilePath); + await this.context.workspaceState.update('logfilePath', config.logfilePath); } catch (e) { throw new Error(`Could not create logfile at "${config.logfilePath}"`); } @@ -287,7 +322,7 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio if (config.envFile) { let envFilePath = config.envFile; //resolve ${workspaceFolder} so we can actually load the .env file now - if (config.envFile.indexOf('${workspaceFolder}') > -1) { + if (config.envFile.includes('${workspaceFolder}')) { envFilePath = config.envFile.replace('${workspaceFolder}', folder.uri.fsPath); } if (await this.util.fileExists(envFilePath) === false) { @@ -303,7 +338,7 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio let updatedConfigString = configString; // apply any defined values to env placeholders - while (match = regexp.exec(configString)) { + while ((match = regexp.exec(configString))) { let environmentVariableName = match[1]; let environmentVariableValue = envConfig[environmentVariableName]; @@ -324,7 +359,7 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio let configValue = config[key]; let match: RegExpMatchArray; //replace all environment variable placeholders with their values - while (match = regexp.exec(configValue)) { + while ((match = regexp.exec(configValue))) { let environmentVariableName = match[1]; let environmentVariableValue = envConfig[environmentVariableName]; configValue = configDefaults[key]; @@ -343,50 +378,54 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio private async processHostParameter(config: BrightScriptLaunchConfiguration): Promise { let showInputBox = false; - if (config.host.trim() === '${promptForHost}' || (config.deepLinkUrl && config.deepLinkUrl.indexOf('${promptForHost}') > -1)) { - if (this.activeDeviceManager.firstRequestForDevices && !this.activeDeviceManager.getCacheStats().keys) { - let deviceWaitTime = 5000; - if (this.showDeviceInfoMessages) { - vscode.window.showInformationMessage(`Device Info: Allowing time for device discovery (${deviceWaitTime} ms)`); - } + if (config.host.trim() === '${promptForHost}' || (config?.deepLinkUrl?.includes('${promptForHost}'))) { + if (this.activeDeviceManager.enabled) { + if (this.activeDeviceManager.firstRequestForDevices && !this.activeDeviceManager.getCacheStats().keys) { + let deviceWaitTime = 5000; + if (this.showDeviceInfoMessages) { + await vscode.window.showInformationMessage(`Device Info: Allowing time for device discovery (${deviceWaitTime} ms)`); + } - await util.delay(deviceWaitTime); - } + await util.delay(deviceWaitTime); + } - let activeDevices = this.activeDeviceManager.getActiveDevices(); + let activeDevices = this.activeDeviceManager.getActiveDevices(); - if (activeDevices && Object.keys(activeDevices).length) { - let items = []; + if (activeDevices && Object.keys(activeDevices).length) { + let items = []; - // Create the Quick Picker option items - Object.keys(activeDevices).map((key) => { - let device = activeDevices[key]; - let itemText = `${device.ip} | ${device.deviceInfo['default-device-name']} - ${device.deviceInfo['model-number']}`; + // Create the Quick Picker option items + for (const key of Object.keys(activeDevices)) { + let device = activeDevices[key]; + let itemText = `${device.ip} | ${device.deviceInfo['default-device-name']} - ${device.deviceInfo['model-number']}`; - if (this.activeDeviceManager.lastUsedDevice && device.deviceInfo['default-device-name'] === this.activeDeviceManager.lastUsedDevice) { - items.unshift(itemText); - } else { - items.push(itemText); + if (this.activeDeviceManager.lastUsedDevice && device.deviceInfo['default-device-name'] === this.activeDeviceManager.lastUsedDevice) { + items.unshift(itemText); + } else { + items.push(itemText); + } } - }); - - // Give the user the option to type their own IP incase the device they want has not yet been detected on the network - let manualIpOption = 'Other'; - items.push(manualIpOption); - let host = await vscode.window.showQuickPick(items, { placeHolder: `Please Select a Roku or use the "${manualIpOption}" option to enter a IP` }); - - if (host === manualIpOption) { - showInputBox = true; - } else if (host) { - let defaultDeviceName = host.substring(host.toLowerCase().indexOf(' | ') + 3, host.toLowerCase().lastIndexOf(' - ')); - let deviceIP = host.substring(0, host.toLowerCase().indexOf(' | ')); - if (defaultDeviceName) { - this.activeDeviceManager.lastUsedDevice = defaultDeviceName; + // Give the user the option to type their own IP incase the device they want has not yet been detected on the network + let manualIpOption = 'Other'; + items.push(manualIpOption); + + let host = await vscode.window.showQuickPick(items, { placeHolder: `Please Select a Roku or use the "${manualIpOption}" option to enter a IP` }); + + if (host === manualIpOption) { + showInputBox = true; + } else if (host) { + let defaultDeviceName = host.substring(host.toLowerCase().indexOf(' | ') + 3, host.toLowerCase().lastIndexOf(' - ')); + let deviceIP = host.substring(0, host.toLowerCase().indexOf(' | ')); + if (defaultDeviceName) { + this.activeDeviceManager.lastUsedDevice = defaultDeviceName; + } + config.host = deviceIP; + } else { + // User canceled. Give them one more change to enter an ip + showInputBox = true; } - config.host = deviceIP; } else { - // User canceled. Give them one more change to enter an ip showInputBox = true; } } else { @@ -433,7 +472,7 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio if (config.deepLinkUrl) { config.deepLinkUrl = config.deepLinkUrl.replace('${host}', config.host); config.deepLinkUrl = config.deepLinkUrl.replace('${promptForHost}', config.host); - if (config.deepLinkUrl.indexOf('${promptForQueryParams}') > -1) { + if (config.deepLinkUrl.includes('${promptForQueryParams}')) { let queryParams = await this.openInputBox('Querystring params for deep link'); config.deepLinkUrl = config.deepLinkUrl.replace('${promptForQueryParams}', queryParams); } @@ -449,21 +488,23 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio * @param placeHolder placeHolder text * @param value default value */ - private async openInputBox(placeHolder: string, value: string = '') { - return await vscode.window.showInputBox({ + private async openInputBox(placeHolder: string, value = '') { + return vscode.window.showInputBox({ placeHolder: placeHolder, value: value }); } /** - * Get the brsConfig file, if available + * Get the bsconfig file, if available */ - public async getBrsConfig(workspaceFolder: vscode.Uri) { - //try to load brsconfig settings - let settings = await vscode.workspace.getConfiguration('brightscript', workspaceFolder); + public getBsConfig(workspaceFolder: vscode.Uri) { + //try to load bsconfig settings + let settings = vscode.workspace.getConfiguration('brightscript', workspaceFolder); let configFilePath = settings.get('configFile'); + let isDefaultPath = false; if (!configFilePath) { + isDefaultPath = true; configFilePath = 'bsconfig.json'; } @@ -471,10 +512,13 @@ export class BrightScriptDebugConfigurationProvider implements DebugConfiguratio let workspaceFolderPath = bslangUtil.uriToPath(workspaceFolder.toString()); configFilePath = path.resolve(workspaceFolderPath, configFilePath); try { - let brsconfig = await bslangUtil.loadConfigFile(configFilePath); - return brsconfig; + let bsconfig = bslangUtil.loadConfigFile(configFilePath); + return bsconfig; } catch (e) { - console.error(`Could not load brsconfig file at "${configFilePath}`); + //only log the error if the user explicitly defined a config path + if (!isDefaultPath) { + console.error(`Could not load bsconfig file at "${configFilePath}`); + } return undefined; } } @@ -508,4 +552,9 @@ export interface BrightScriptLaunchConfiguration extends LaunchConfiguration { * A path to an environment variables file which will be used to augment the launch config */ envFile?: string; + + /** + * If injectRdbOnDeviceComponent is true and this is true the screen saver will be be disabled while the deployed application is running. + */ + disableScreenSaver?: boolean; } diff --git a/src/DeclarationProvider.ts b/src/DeclarationProvider.ts index aab90f1e..fcb16c92 100644 --- a/src/DeclarationProvider.ts +++ b/src/DeclarationProvider.ts @@ -1,18 +1,22 @@ import * as fs from 'fs-extra'; import * as iconv from 'iconv-lite'; import * as vscode from 'vscode'; +import * as path from 'path'; +import type { + Event, + Uri +} from 'vscode'; import { Disposable, - Event, EventEmitter, Location, Position, Range, SymbolInformation, - SymbolKind, - Uri + SymbolKind } from 'vscode'; import { BrightScriptDeclaration } from './BrightScriptDeclaration'; +import { util } from './util'; /////////////////////////////////////////////////////////////////////////////////////////////////////////// // CREDIT WHERE CREDIT IS DUE @@ -53,7 +57,7 @@ export class WorkspaceEncoding { private getConfiguration(uri: Uri): string { const encoding: string = vscode.workspace.getConfiguration('files', uri).get('encoding', 'utf8'); if (encoding === 'utf8bom') { - return 'utf8'; // iconv-lite removes bom by default when decoding, so this is fine + return 'utf8'; // iconv-lite removes bom by default when decoding, so this is fine } return encoding; } @@ -83,25 +87,29 @@ export class DeclarationProvider implements Disposable { vscode.workspace.onDidChangeWorkspaceFolders(this.onDidChangeWorkspace, this, subscriptions); this.disposable = Disposable.from(...subscriptions); - this.flush(); + void this.flush(); } - public cache: Map = new Map(); - private fullscan: boolean = true; + public cache = new Map(); + private fullscan = true; - private dirty: Map = new Map(); + private dirty = new Map(); private fileNamespaces = new Map>(); + private fileInterfaces = new Map>(); + private fileEnums = new Map>(); private fileClasses = new Map>(); private allNamespaces = new Map(); private allClasses = new Map(); + private allEnums = new Map(); + private allInterfaces = new Map(); private syncing: Promise; private encoding: WorkspaceEncoding = new WorkspaceEncoding(); private disposable: Disposable; - private onDidChangeEmitter: EventEmitter = new EventEmitter(); - private onDidDeleteEmitter: EventEmitter = new EventEmitter(); - private onDidResetEmitter: EventEmitter = new EventEmitter(); + private onDidChangeEmitter = new EventEmitter(); + private onDidDeleteEmitter = new EventEmitter(); + private onDidResetEmitter = new EventEmitter(); get onDidChange(): Event { return this.onDidChangeEmitter.event; @@ -115,7 +123,7 @@ export class DeclarationProvider implements Disposable { return this.onDidResetEmitter.event; } - public sync(): Promise { + public async sync(): Promise { if (this.syncing === undefined) { this.syncing = this.flush().then(() => { this.syncing = undefined; @@ -129,7 +137,6 @@ export class DeclarationProvider implements Disposable { } private onDidChangeFile(uri: Uri) { - console.log('onDidChangeFile ' + uri.path); const excludes = getExcludeGlob(); this.dirty.set(uri.fsPath, uri); } @@ -140,7 +147,6 @@ export class DeclarationProvider implements Disposable { } private onDidChangeWorkspace() { - console.log('onDidChangeWorkspace 33'); this.fullscan = true; this.dirty.clear(); this.encoding.reset(); @@ -165,7 +171,7 @@ export class DeclarationProvider implements Disposable { fs.readFile(path, (err, data) => { if (err) { if (typeof err === 'object' && err.code === 'ENOENT') { - resolve(); + resolve(null); } else { reject(err); } @@ -186,6 +192,14 @@ export class DeclarationProvider implements Disposable { } public readDeclarations(uri: Uri, input: string): BrightScriptDeclaration[] { + const uriPath = util.normalizeFileScheme(uri.toString()); + const outDir = util.normalizeFileScheme(path.join(vscode.workspace.getWorkspaceFolder(uri).uri.toString(), 'out')); + + // Prevents results in the out directory from being returned + if (uriPath.startsWith(outDir)) { + return; + } + const container = BrightScriptDeclaration.fromUri(uri); const symbols: BrightScriptDeclaration[] = []; let currentFunction: BrightScriptDeclaration; @@ -204,6 +218,28 @@ export class DeclarationProvider implements Disposable { } this.fileNamespaces.delete(uri); + let oldEnums = this.fileEnums.get(uri); + if (oldEnums) { + for (let key of oldEnums.keys()) { + let ns = this.allEnums.get(key); + if (ns && ns.uri === uri) { + this.allEnums.delete(key); + } + } + } + this.fileEnums.delete(uri); + + let oldInterfaces = this.fileInterfaces.get(uri); + if (oldInterfaces) { + for (let key of oldInterfaces.keys()) { + let ns = this.allInterfaces.get(key); + if (ns && ns.uri === uri) { + this.allInterfaces.delete(key); + } + } + } + this.fileInterfaces.delete(uri); + let oldClasses = this.fileClasses.get(uri); if (oldClasses) { @@ -220,6 +256,10 @@ export class DeclarationProvider implements Disposable { let classes = new Set(); let namespaceSymbol: BrightScriptDeclaration | null; let classSymbol: BrightScriptDeclaration | null; + let enums = new Set(); + let interfaces = new Set(); + let interfaceSymbol: BrightScriptDeclaration | null; + let enumSymbol: BrightScriptDeclaration | null; for (const [line, text] of iterlines(input)) { // console.log("" + line + ": " + text); @@ -240,7 +280,7 @@ export class DeclarationProvider implements Disposable { container, match[2].split(','), new Range(line, match[0].length - match[1].length - match[2].length - 2, line, match[0].length - 1), - new Range(line, 0, line, text.length), + new Range(line, 0, line, text.length) ); symbols.push(currentFunction); @@ -275,7 +315,7 @@ export class DeclarationProvider implements Disposable { container, undefined, new Range(line, match[0].length - match[1].length, line, match[0].length), - new Range(line, 0, line, text.length), + new Range(line, 0, line, text.length) ); console.log('FOUND VAR ' + varSymbol.name); symbols.push(varSymbol); @@ -300,7 +340,7 @@ export class DeclarationProvider implements Disposable { container, undefined, new Range(line, match[0].length - match[1].length, line, match[0].length), - new Range(line, 0, line, text.length), + new Range(line, 0, line, text.length) ); // console.log('FOUND NAMESPACES ' + namespaceSymbol.name); symbols.push(namespaceSymbol); @@ -313,6 +353,30 @@ export class DeclarationProvider implements Disposable { namespaceSymbol = null; } + //start enum declaration + match = /^(?: |\t)*enum(?: |\t)*([a-z|\.|_]*).*$/i.exec(text); + if (match !== null) { + const name = match[1].trim(); + if (name) { + enumSymbol = new BrightScriptDeclaration( + name, + SymbolKind.Enum, + container, + undefined, + new Range(line, match[0].length - match[1].length, line, match[0].length), + new Range(line, 0, line, text.length) + ); + // console.log('FOUND enumS ' + enumSymbol.name); + symbols.push(enumSymbol); + enums.add(name.toLowerCase()); + } + } + //end enum declaration + match = /^(?: |\t)*end enum.*$/i.exec(text); + if (match !== null && enumSymbol) { + enumSymbol = null; + } + //start class declaration match = /(?:(class)\s+([a-z_][a-z0-9_]*))\s*(?:extends\s*([a-z_][a-z0-9_]+))*$/i.exec(text); if (match !== null) { @@ -324,13 +388,31 @@ export class DeclarationProvider implements Disposable { container, undefined, new Range(line, match[0].length - match[2].length, line, match[0].length), - new Range(line, 0, line, text.length), + new Range(line, 0, line, text.length) ); // console.log('FOUND CLASS ' + classSymbol.name); symbols.push(classSymbol); classes.add(name.toLowerCase()); } } + //start interface declaration + match = /(?:(interface)\s+([a-z_][a-z0-9_]*))\s*(?:extends\s*([a-z_][a-z0-9_]+))*$/i.exec(text); + if (match !== null) { + const name = match[2].trim(); + if (name) { + interfaceSymbol = new BrightScriptDeclaration( + name, + SymbolKind.Interface, + container, + undefined, + new Range(line, match[0].length - match[2].length, line, match[0].length), + new Range(line, 0, line, text.length) + ); + // console.log('FOUND interface ' + interfaceSymbol.name); + symbols.push(interfaceSymbol); + interfaces.add(name.toLowerCase()); + } + } } this.fileNamespaces.set(uri, namespaces); @@ -344,7 +426,7 @@ export class DeclarationProvider implements Disposable { decl.name, decl.kind, decl.containerName ? decl.containerName : decl.name, - new Location(uri, decl.bodyRange), + new Location(uri, decl.bodyRange) ); } diff --git a/src/DefinitionRepository.ts b/src/DefinitionRepository.ts index 82f3cf96..5f6a78e9 100644 --- a/src/DefinitionRepository.ts +++ b/src/DefinitionRepository.ts @@ -1,9 +1,13 @@ import * as vscode from 'vscode'; - -import { Location, Position, TextDocument, Uri } from 'vscode'; - +import type { + Location, + Position, + TextDocument +} from 'vscode'; +import { Uri } from 'vscode'; import { BrightScriptDeclaration } from './BrightScriptDeclaration'; -import { DeclarationProvider, getExcludeGlob } from './DeclarationProvider'; +import type { DeclarationProvider } from './DeclarationProvider'; +import { getExcludeGlob } from './DeclarationProvider'; export class DefinitionRepository { @@ -23,7 +27,7 @@ export class DefinitionRepository { } private declarationProvider: DeclarationProvider; - private cache: Map = new Map(); + private cache = new Map(); public sync(): Promise { return this.provider.sync(); @@ -32,7 +36,7 @@ export class DefinitionRepository { public * find(document: TextDocument, position: Position): IterableIterator { const word = this.getWord(document, position).toLowerCase(); //brightscript is not case sensitive! - this.sync(); + void this.sync(); if (word === undefined) { return; } @@ -41,7 +45,7 @@ export class DefinitionRepository { if (ws === undefined) { return; } - const fresh: Set = new Set([document.uri.fsPath]); + const fresh = new Set([document.uri.fsPath]); for (const doc of vscode.workspace.textDocuments) { if (!doc.isDirty) { continue; @@ -104,15 +108,15 @@ export class DefinitionRepository { .map((d) => d.getLocation()); } - public * findDefinition(document: TextDocument, position: Position): IterableIterator { + public *findDefinition(document: TextDocument, position: Position): IterableIterator { const word = this.getWord(document, position).toLowerCase(); //brightscript is not case sensitive! let result = yield* this.findDefinitionForWord(document, position, word); return result; } // duplicating some of thisactivate.olympicchanel.com to reduce the risk of introducing nasty performance issues/unwanted behaviour by extending Location - public * findDefinitionForWord(document: TextDocument, position: Position, word: string): IterableIterator { + public *findDefinitionForWord(document: TextDocument, position: Position, word: string): IterableIterator { - this.sync(); + void this.sync(); if (word === undefined) { return; } @@ -121,7 +125,7 @@ export class DefinitionRepository { if (ws === undefined) { return; } - const fresh: Set = new Set([document.uri.fsPath]); + const fresh = new Set([document.uri.fsPath]); for (const doc of vscode.workspace.textDocuments) { console.log('>>>>>doc ' + doc.uri.path); @@ -163,12 +167,12 @@ export class DefinitionRepository { public async findDefinitionForBrsDocument(name: string): Promise { let declarations = []; - this.sync(); + await this.sync(); const excludes = getExcludeGlob(); //get usable bit of name let fileName = name.replace(/^.*[\\\/]/, '').toLowerCase(); for (const uri of await vscode.workspace.findFiles('**/*.{brs,bs}', excludes)) { - if (uri.path.toLowerCase().indexOf(fileName) !== -1) { + if (uri.path.toLowerCase().includes(fileName)) { declarations.push(BrightScriptDeclaration.fromUri(uri)); } } diff --git a/src/GlobalStateManager.ts b/src/GlobalStateManager.ts index 6c4bb603..66c6ab78 100644 --- a/src/GlobalStateManager.ts +++ b/src/GlobalStateManager.ts @@ -1,26 +1,69 @@ import * as vscode from 'vscode'; + export class GlobalStateManager { constructor( private context: vscode.ExtensionContext - ) { } + ) { + this.updateFromVsCodeConfiguration(); + vscode.workspace.onDidChangeConfiguration(() => this.updateFromVsCodeConfiguration()); + } private keys = { lastRunExtensionVersion: 'lastRunExtensionVersion', - lastSeenReleaseNotesVersion: 'lastSeenReleaseNotesVersion' + lastSeenReleaseNotesVersion: 'lastSeenReleaseNotesVersion', + sendRemoteTextHistory: 'sendRemoteTextHistory' }; + private remoteTextHistoryLimit: number; + private remoteTextHistoryEnabled: boolean; + + private updateFromVsCodeConfiguration() { + let config: any = vscode.workspace.getConfiguration('brightscript') || {}; + this.remoteTextHistoryLimit = (config.sendRemoteTextHistory || { limit: 30 }).limit; + this.remoteTextHistoryEnabled = config.sendRemoteTextHistory?.enabled; + } public get lastRunExtensionVersion() { return this.context.globalState.get(this.keys.lastRunExtensionVersion); } public set lastRunExtensionVersion(value: string) { - this.context.globalState.update(this.keys.lastRunExtensionVersion, value); + void this.context.globalState.update(this.keys.lastRunExtensionVersion, value); } public get lastSeenReleaseNotesVersion() { return this.context.globalState.get(this.keys.lastSeenReleaseNotesVersion); } public set lastSeenReleaseNotesVersion(value: string) { - this.context.globalState.update(this.keys.lastSeenReleaseNotesVersion, value); + void this.context.globalState.update(this.keys.lastSeenReleaseNotesVersion, value); + } + + public get sendRemoteTextHistory(): string[] { + return this.context.globalState.get(this.keys.sendRemoteTextHistory) ?? []; + } + + public set sendRemoteTextHistory(history: string[]) { + history ??= []; + // only update the results if the user has the the history enabled + if (this.remoteTextHistoryEnabled) { + // limit the number of entries saved to history + history.length = Math.min(history.length, this.remoteTextHistoryLimit); + void this.context.globalState.update(this.keys.sendRemoteTextHistory, history); + } + } + + public addTextHistory(value: string) { + if (value !== '' && this.remoteTextHistoryEnabled) { + let history = this.sendRemoteTextHistory; + const index = history.indexOf(value); + if (index > -1) { + // Remove this entry to prevent duplicates in the saved history + history.splice(index, 1); + } + + // Add the the start of the array so that the history is most resent to oldest + history.unshift(value); + + this.sendRemoteTextHistory = history; + } } /** @@ -28,7 +71,7 @@ export class GlobalStateManager { */ public clear() { for (let i in this.keys) { - var key = this.keys[i]; + const key = this.keys[i]; this[key] = undefined; } } diff --git a/src/LanguageServerManager.spec.ts b/src/LanguageServerManager.spec.ts index 80e25766..eec0d799 100644 --- a/src/LanguageServerManager.spec.ts +++ b/src/LanguageServerManager.spec.ts @@ -1,14 +1,10 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ -/* tslint:disable:no-string-literal */ import { createSandbox } from 'sinon'; import { vscode, vscodeLanguageClient } from './mockVscode.spec'; import { LanguageServerManager } from './LanguageServerManager'; import { expect } from 'chai'; import { DefinitionRepository } from './DefinitionRepository'; import { DeclarationProvider } from './DeclarationProvider'; -import { ExtensionContext } from 'vscode'; -import Uri from 'vscode-uri'; +import type { ExtensionContext } from 'vscode'; import * as path from 'path'; import { standardizePath as s } from 'brighterscript'; import * as fsExtra from 'fs-extra'; @@ -60,28 +56,28 @@ describe('extension', () => { fsExtra.removeSync(tempDir); }); - it('registers referenceProvider', async () => { + it('registers referenceProvider', () => { let spy = sinon.spy(vscode.languages, 'registerReferenceProvider'); expect(spy.calledOnce).to.be.false; languageServerManager['enableSimpleProviders'](); expect(spy.calledOnce).to.be.true; }); - it('registers signatureHelpProvider', async () => { + it('registers signatureHelpProvider', () => { let spy = sinon.spy(vscode.languages, 'registerSignatureHelpProvider'); expect(spy.calledOnce).to.be.false; languageServerManager['enableSimpleProviders'](); expect(spy.calledOnce).to.be.true; }); - it('registers workspace symbol provider', async () => { + it('registers workspace symbol provider', () => { let spy = sinon.spy(vscode.languages, 'registerWorkspaceSymbolProvider'); expect(spy.calledOnce).to.be.false; languageServerManager['enableSimpleProviders'](); expect(spy.calledOnce).to.be.true; }); - it('registers document symbol provider', async () => { + it('registers document symbol provider', () => { let spy = sinon.spy(vscode.languages, 'registerDocumentSymbolProvider'); expect(spy.calledOnce).to.be.false; languageServerManager['enableSimpleProviders'](); @@ -91,7 +87,7 @@ describe('extension', () => { describe('enableLanguageServer', () => { it('properly handles runtime exception', async () => { languageServerManager['client'] = {} as any; - sinon.stub(languageServerManager as any, 'ready').callsFake(async () => { + sinon.stub(languageServerManager as any, 'ready').callsFake(() => { throw new Error('failed for test'); }); let error: Error; @@ -133,7 +129,7 @@ describe('extension', () => { }); it('returns embedded version when in a workspace and no settings exist', async () => { - vscode.workspace.workspaceFile = Uri.file(s`${tempDir}/workspace.code-workspace`); + vscode.workspace.workspaceFile = URI.file(s`${tempDir}/workspace.code-workspace`); fsExtra.outputFileSync(vscode.workspace.workspaceFile.fsPath, ''); expect( @@ -154,7 +150,7 @@ describe('extension', () => { }); it('returns embedded version when in a workspace and "embedded" value exists', async () => { - vscode.workspace.workspaceFile = Uri.file(s`${tempDir}/workspace.code-workspace`); + vscode.workspace.workspaceFile = URI.file(s`${tempDir}/workspace.code-workspace`); setConfig(vscode.workspace.workspaceFile.fsPath, { 'brightscript.bsdk': 'embedded' }); @@ -179,8 +175,8 @@ describe('extension', () => { ).to.eql(embeddedPath); }); - it('returns value from worksapce when specified', async () => { - vscode.workspace.workspaceFile = Uri.file(s`${tempDir}/workspace.code-workspace`); + it('returns value from workspace when specified', async () => { + vscode.workspace.workspaceFile = URI.file(s`${tempDir}/workspace.code-workspace`); setConfig(vscode.workspace.workspaceFile.fsPath, { 'brightscript.bsdk': 'relative/path' @@ -215,7 +211,7 @@ describe('extension', () => { }); it('returns folder version when in a workspace but no workspace version exists', async () => { - vscode.workspace.workspaceFile = Uri.file(s`${tempDir}/workspace.code-workspace`); + vscode.workspace.workspaceFile = URI.file(s`${tempDir}/workspace.code-workspace`); vscode.workspace.workspaceFolders.push({ index: 0, @@ -246,7 +242,8 @@ describe('extension', () => { value = null; } return { - get: x => value + get: x => value, + inspect: () => ({}) as any }; }); vscode.workspace.workspaceFolders.push({ diff --git a/src/LanguageServerManager.ts b/src/LanguageServerManager.ts index 2d6c2d99..a7a1eb9a 100644 --- a/src/LanguageServerManager.ts +++ b/src/LanguageServerManager.ts @@ -1,26 +1,27 @@ -import { - LanguageClient, +import type { LanguageClientOptions, ServerOptions, - TransportKind, ExecuteCommandParams } from 'vscode-languageclient/node'; +import { + LanguageClient, + TransportKind +} from 'vscode-languageclient/node'; import * as vscode from 'vscode'; import * as path from 'path'; +import type { Disposable } from 'vscode'; import { - Disposable, window, - workspace, + workspace } from 'vscode'; -import { CustomCommands } from 'brighterscript'; -import { CodeWithSourceMap } from 'source-map'; -import { Deferred } from 'brighterscript'; +import { CustomCommands, Deferred } from 'brighterscript'; +import type { CodeWithSourceMap } from 'source-map'; import BrightScriptDefinitionProvider from './BrightScriptDefinitionProvider'; import { BrightScriptWorkspaceSymbolProvider, SymbolInformationRepository } from './SymbolInformationRepository'; import { BrightScriptDocumentSymbolProvider } from './BrightScriptDocumentSymbolProvider'; import { BrightScriptReferenceProvider } from './BrightScriptReferenceProvider'; import BrightScriptSignatureHelpProvider from './BrightScriptSignatureHelpProvider'; -import { DefinitionRepository } from './DefinitionRepository'; +import type { DefinitionRepository } from './DefinitionRepository'; import { util } from './util'; import { LanguageServerInfoCommand, languageServerInfoCommand } from './commands/LanguageServerInfoCommand'; import * as fsExtra from 'fs-extra'; @@ -30,6 +31,7 @@ export class LanguageServerManager { this.deferred = new Deferred(); this.embeddedBscInfo = { path: require.resolve('brighterscript').replace(/[\\\/]dist[\\\/]index.js/i, ''), + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires version: require('brighterscript/package.json').version }; //default to the embedded bsc version @@ -54,8 +56,8 @@ export class LanguageServerManager { this.definitionRepository = definitionRepository; //dynamically enable or disable the language server based on user settings - vscode.workspace.onDidChangeConfiguration((configuration) => { - this.syncVersionAndTryRun(); + vscode.workspace.onDidChangeConfiguration(async (configuration) => { + await this.syncVersionAndTryRun(); }); await this.syncVersionAndTryRun(); } @@ -92,7 +94,7 @@ export class LanguageServerManager { //if we already have a language server, nothing more needs to be done if (this.client) { - return this.ready(); + return await this.ready(); } this.refreshDeferred(); @@ -112,7 +114,8 @@ export class LanguageServerManager { //give the runner the specific version of bsc to run const args = [ - this.selectedBscInfo.path + this.selectedBscInfo.path, + (this.context.extensionMode === vscode.ExtensionMode.Development).toString() ]; // If the extension is launched in debug mode then the debug server options are used // Otherwise the run options are used @@ -157,7 +160,7 @@ export class LanguageServerManager { await this.client.onReady(); this.client.onNotification('critical-failure', (message) => { - window.showErrorMessage(message); + void window.showErrorMessage(message); }); //update the statusbar with build statuses @@ -175,13 +178,14 @@ export class LanguageServerManager { this.deferred.resolve(true); } catch (e) { console.error(e); - this.client?.stop?.(); + void this.client?.stop?.(); delete this.client; this.refreshDeferred(); this.deferred.reject(e); } + return this.ready(); } private updateStatusbar(tooltip: string, color?: string) { @@ -234,7 +238,7 @@ export class LanguageServerManager { vscode.languages.registerDocumentSymbolProvider(selector, new BrightScriptDocumentSymbolProvider(this.declarationProvider)), vscode.languages.registerWorkspaceSymbolProvider(new BrightScriptWorkspaceSymbolProvider(this.declarationProvider, symbolInformationRepository)), vscode.languages.registerReferenceProvider(selector, new BrightScriptReferenceProvider()), - vscode.languages.registerSignatureHelpProvider(selector, new BrightScriptSignatureHelpProvider(this.definitionRepository), '(', ','), + vscode.languages.registerSignatureHelpProvider(selector, new BrightScriptSignatureHelpProvider(this.definitionRepository), '(', ',') ); this.context.subscriptions.push(...this.simpleSubscriptions); @@ -258,8 +262,8 @@ export class LanguageServerManager { } public isLanguageServerEnabledInSettings() { - var settings = vscode.workspace.getConfiguration('brightscript'); - var value = settings.enableLanguageServer === false ? false : true; + let settings = vscode.workspace.getConfiguration('brightscript'); + let value = settings.enableLanguageServer === false ? false : true; return value; } @@ -289,12 +293,13 @@ export class LanguageServerManager { try { this.selectedBscInfo = { path: bsdkPath, + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires version: require(`${bsdkPath}/package.json`).version }; } catch (e) { console.error(e); //fall back to the embedded version, and show a popup - vscode.window.showErrorMessage(`Can't find language sever at "${bsdkPath}". Using embedded version v${this.embeddedBscInfo.version} instead.`); + await vscode.window.showErrorMessage(`Can't find language sever at "${bsdkPath}". Using embedded version v${this.embeddedBscInfo.version} instead.`); this.selectedBscInfo = this.embeddedBscInfo; } @@ -339,7 +344,7 @@ export class LanguageServerManager { return values[0]; } else { //there were multiple versions. make the user pick which to use - return await languageServerInfoCommand.selectBrighterScriptVersion(); + return languageServerInfoCommand.selectBrighterScriptVersion(); } } diff --git a/src/LanguageServerRunner.ts b/src/LanguageServerRunner.ts index c7432b00..f4972e09 100644 --- a/src/LanguageServerRunner.ts +++ b/src/LanguageServerRunner.ts @@ -1,6 +1,17 @@ //this runs in a separate process without the vscode module support const pathToBrighterScript = process.argv[2]; -// tslint:disable-next-line +const isDevMode = process.argv[3] === 'true'; + +//when running in dev mode, the language server sometimes runs faster than the debugger can pick up. So run a loop for a bit to let us catch up +if (isDevMode) { + const delay = 1500; + const start = Date.now(); + while (Date.now() < start + delay) { + //do nothing + } +} + +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires const LanguageServer = require(pathToBrighterScript).LanguageServer; const server = new LanguageServer(); server.run(); diff --git a/src/LogDocumentLinkProvider.spec.ts b/src/LogDocumentLinkProvider.spec.ts index 293ea873..feb9a4e2 100644 --- a/src/LogDocumentLinkProvider.spec.ts +++ b/src/LogDocumentLinkProvider.spec.ts @@ -1,5 +1,3 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ import { assert, expect } from 'chai'; import * as path from 'path'; import * as sinonImport from 'sinon'; diff --git a/src/LogDocumentLinkProvider.ts b/src/LogDocumentLinkProvider.ts index ee91b96f..57aa8b85 100644 --- a/src/LogDocumentLinkProvider.ts +++ b/src/LogDocumentLinkProvider.ts @@ -2,10 +2,9 @@ import * as path from 'path'; import * as rokuDeploy from 'roku-deploy'; import { DocumentLink, Position, Range } from 'vscode'; import * as vscode from 'vscode'; - import { util } from './util'; import BrightscriptFileUtils from './BrightScriptFileUtils'; -import { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; +import type { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; export class CustomDocumentLink { constructor(outputLine: number, startChar: number, length: number, pkgPath: string, lineNumber: number, filename: string) { @@ -68,12 +67,12 @@ export class LogDocumentLinkProvider implements vscode.DocumentLinkProvider { } } - public fileMaps: { [pkgPath: string]: { src: string; dest: string; pkgPath: string; } }; + public fileMaps: Record; public customLinks: DocumentLink[]; private launchConfig: BrightScriptLaunchConfiguration; - public async provideDocumentLinks(doc: vscode.TextDocument, token: vscode.CancellationToken) { + public provideDocumentLinks(doc: vscode.TextDocument, token: vscode.CancellationToken) { return this.customLinks; } diff --git a/src/LogOutputManager.spec.ts b/src/LogOutputManager.spec.ts index 421a9bd7..dc3dcea4 100644 --- a/src/LogOutputManager.spec.ts +++ b/src/LogOutputManager.spec.ts @@ -1,7 +1,7 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ -import { assert } from 'chai'; -import * as sinon from 'sinon'; +import { assert, expect } from 'chai'; +import type Sinon from 'sinon'; +import { createSandbox } from 'sinon'; +const sinon = createSandbox(); let Module = require('module'); import { vscode } from './mockVscode.spec'; @@ -20,20 +20,21 @@ Module.prototype.require = function hijacked(file) { import { DeclarationProvider } from './DeclarationProvider'; import { LogDocumentLinkProvider } from './LogDocumentLinkProvider'; import { LogLine, LogOutputManager } from './LogOutputManager'; -import { SymbolInformationRepository } from './SymbolInformationRepository'; -const itParam = require('mocha-param'); +import type { BSDebugDiagnostic } from 'roku-debug'; +import { DiagnosticsEvent, LaunchStartEvent, LogOutputEvent } from 'roku-debug'; +import { util } from 'brighterscript'; describe('LogOutputManager ', () => { - let logOutputManagerMock; + let logOutputManagerMock: Sinon.SinonMock; let logOutputManager: LogOutputManager; - let languagesMock; - let outputChannelMock; - let logDocumentLinkProviderMock; - let collectionMock; - let declarationProvider; - let declarationProviderMock; + let languagesMock: Sinon.SinonMock; + let outputChannelMock: Sinon.SinonMock; + let logDocumentLinkProviderMock: Sinon.SinonMock; + let collectionMock: Sinon.SinonMock; + let declarationProviderMock: Sinon.SinonMock; beforeEach(() => { + sinon.restore(); const outputChannel = new vscode.OutputChannel(); const debugCollection = new vscode.DebugCollection(); const logDocumentLinkProvider = new LogDocumentLinkProvider(); @@ -50,10 +51,7 @@ describe('LogOutputManager ', () => { }); afterEach(() => { - outputChannelMock.restore(); - languagesMock.restore(); - collectionMock.restore(); - logOutputManagerMock.restore(); + sinon.restore(); }); it('tests onDidStartDebugSession clear flag', () => { @@ -74,50 +72,54 @@ describe('LogOutputManager ', () => { logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - BSLaunchStartEvent - clear flag', () => { + it('tests onDidReceiveDebugSessionCustomEvent - LaunchStartEvent - clear flag', async () => { collectionMock.expects('clear').once(); logOutputManager.isClearingOutputOnLaunch = true; - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: 'BSLaunchStartEvent' }); + await logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: 'LaunchStartEvent' }); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - BSLaunchStartEvent - no clear flag', () => { + it('tests onDidReceiveDebugSessionCustomEvent - LaunchStartEvent - no clear flag', async () => { collectionMock.expects('clear').never(); logOutputManager.isClearingOutputOnLaunch = false; - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: 'BSLaunchStartEvent' }); + await logOutputManager.onDidReceiveDebugSessionCustomEvent(new LaunchStartEvent({} as any)); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - BSLogOutputEvent', () => { + it('tests onDidReceiveDebugSessionCustomEvent - LogOutputEvent', async () => { outputChannelMock.expects('appendLine').once(); - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: 'BSLogOutputEvent', body: 'test1' }); + await logOutputManager.onDidReceiveDebugSessionCustomEvent(new LogOutputEvent('test 1')); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - error - empty', () => { - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: '', body: [] }); + it('tests onDidReceiveDebugSessionCustomEvent - error - empty', async () => { + await logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: '', body: {} }); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - error - undefined', () => { - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: '' }); + it('tests onDidReceiveDebugSessionCustomEvent - error - undefined', async () => { + await logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: '' }); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); }); - it('tests onDidReceiveDebugSessionCustomEvent - errors', () => { + it('tests onDidReceiveDebugSessionCustomEvent - errors', async () => { logOutputManagerMock.expects('addDiagnosticForError').once(); - let compileErrors = [{ path: 'path1', message: 'message1' }]; - logOutputManager.onDidReceiveDebugSessionCustomEvent({ event: '', body: compileErrors }); + let compileErrors: BSDebugDiagnostic[] = [{ + path: 'path1', + message: 'message1', + range: util.createRange(1, 2, 3, 4) + }]; + await logOutputManager.onDidReceiveDebugSessionCustomEvent(new DiagnosticsEvent(compileErrors)); outputChannelMock.verify(); collectionMock.verify(); logOutputManagerMock.verify(); @@ -230,23 +232,18 @@ describe('LogOutputManager ', () => { }); }); - describe('tests getFilename', () => { - describe('mustInclude items', () => { - let params = [ - { text: 'pkg:/file.xml', expected: 'file' }, - { text: 'pkg:/path/file.xml', expected: 'file' }, - { text: 'pkg:/path/path2/file.xml', expected: 'file' }, - { text: 'pkg:/file.brs', expected: 'file' }, - { text: 'pkg:/path/file.brs', expected: 'file' }, - { text: 'pkg:/path/path2/file.brs', expected: 'file' }, - { text: 'path/file.brs', expected: 'file' }, - { text: 'path/path2/file.brs', expected: 'file' }, - { text: 'file.brs', expected: 'file' }, - { text: 'pkg:/file.other', expected: 'file.other' }, - ]; - itParam('lf ${value.text} if {$value.expected}', params, (param) => { - assert.equal(logOutputManager.getFilename(param.text), param.expected); - }); + describe('getFilename', () => { + it('works', () => { + expect(logOutputManager.getFilename('pkg:/file.xml')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/path/file.xml')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/path/path2/file.xml')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/path/file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/path/path2/file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('path/file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('path/path2/file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('file.brs')).to.eql('file'); + expect(logOutputManager.getFilename('pkg:/file.other')).to.eql('file.other'); }); }); @@ -272,81 +269,87 @@ describe('LogOutputManager ', () => { assert.equal(logText, ' '); }); - describe('tests Filename', () => { - let params = [ - { configSetting: 'Filename', text: 'pkg:/file.brs(20)' }, - { configSetting: 'Filename', text: 'pkg:/path/file.brs(20)' }, - { configSetting: 'Filename', text: 'pkg:/path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { + it('Filename', () => { + test({ configSetting: 'Filename', text: 'pkg:/file.brs(20)' }); + test({ configSetting: 'Filename', text: 'pkg:/path/file.brs(20)' }); + test({ configSetting: 'Filename', text: 'pkg:/path/path2/file.brs(20)' }); + + function test(param) { logOutputManager.hyperlinkFormat = param.configSetting; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); - let logText = logOutputManager.getCustomLogText(param.text, 'file', - '.brs', 20, 2, false); - assert.equal(logText, 'file.brs(20)'); - }); + assert.equal( + logOutputManager.getCustomLogText(param.text, 'file', '.brs', 20, 2, false), + 'file.brs(20)' + ); + } }); - describe('tests Filename with addline to log', () => { - let params = [ - { configSetting: 'Filename', text: 'pkg:/file.brs(20)' }, - { configSetting: 'Filename', text: 'pkg:/path/file.brs(20)' }, - { configSetting: 'Filename', text: 'pkg:/path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { + it('tests Filename with addline to log', () => { + test({ configSetting: 'Filename', text: 'pkg:/file.brs(20)' }); + test({ configSetting: 'Filename', text: 'pkg:/path/file.brs(20)' }); + test({ configSetting: 'Filename', text: 'pkg:/path/path2/file.brs(20)' }); + + function test(param) { logOutputManager.hyperlinkFormat = param.configSetting; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('addCustomPkgLink'); const logLine = new LogLine(param.text + ' sometext', true); + + const stub = sinon.stub(logOutputManager['outputChannel'], 'appendLine'); + logOutputManager.addLogLineToOutput(logLine); - // assert.equal(logText, 'file.methodName(20)'); - }); + + expect(stub.getCall(0).args[0]).to.eql('file.brs(20) sometext'); + stub.restore(); + } }); - describe('tests FilenameAndFunction', () => { - let params = [ - { configSetting: null, text: 'pkg:/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: '', text: 'pkg:/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { - logOutputManager.hyperlinkFormat = param.configSetting; + + it('FilenameAndFunction', () => { + test(null, 'pkg:/file.brs(20)'); + test(null, 'pkg:/path/file.brs(20)'); + test(null, 'pkg:/path/path2/file.brs(20)'); + test('', 'pkg:/file.brs(20)'); + test('', 'pkg:/path/file.brs(20)'); + test('', 'pkg:/path/path2/file.brs(20)'); + test('FilenameAndFunction', 'pkg:/file.brs(20)'); + test('FilenameAndFunction', 'pkg:/path/file.brs(20)'); + test('FilenameAndFunction', 'pkg:/path/path2/file.brs(20)'); + + function test(hyperlinkFormat: string, text) { + logOutputManager.hyperlinkFormat = hyperlinkFormat; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); - let logText = logOutputManager.getCustomLogText(param.text, 'file', - '.brs', 20, 2, false); - assert.equal(logText, 'file.methodName(20)'); - }); + expect( + logOutputManager.getCustomLogText(text, 'file', '.brs', 20, 2, false) + ).to.eql('file.methodName(20)'); + } }); - describe('tests FilenameAndFunction with addline to log', () => { - let params = [ - { configSetting: null, text: 'pkg:/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: '', text: 'pkg:/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { - logOutputManager.hyperlinkFormat = param.configSetting; + it('tests FilenameAndFunction with addline to log', () => { + test(null, 'pkg:/file.brs(20)', 'file.methodName(20)'); + test(null, 'pkg:/path/file.brs(20)', 'file.methodName(20)'); + test(null, 'pkg:/path/path2/file.brs(20)', 'file.methodName(20)'); + test('', 'pkg:/file.brs(20)', 'file.methodName(20)'); + test('', 'pkg:/path/file.brs(20)', 'file.methodName(20)'); + test('', 'pkg:/path/path2/file.brs(20)', 'file.methodName(20)'); + test('FilenameAndFunction', 'pkg:/file.brs(20)', 'file.methodName(20)'); + test('FilenameAndFunction', 'pkg:/path/file.brs(20)', 'file.methodName(20)'); + test('FilenameAndFunction', 'pkg:/path/path2/file.brs(20)', 'file.methodName(20)'); + function test(hyperlinkFormat: string, text: string, expected: string) { + logOutputManager.hyperlinkFormat = hyperlinkFormat; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); + declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); + logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('addCustomPkgLink'); - const logLine = new LogLine(param.text + ' sometext', true); + const logLine = new LogLine(text + ' sometext', true); logOutputManager.addLogLineToOutput(logLine); - // assert.equal(logText, 'file.methodName(20)'); - }); + expect( + logOutputManager.getCustomLogText(text, 'file', '.brs', 20, 2, false) + ).to.eql(expected); + } }); }); @@ -372,155 +375,152 @@ describe('LogOutputManager ', () => { assert.equal(logText, ' '); }); - describe('tests Filename', () => { - let params = [ - { configSetting: 'Filename', text: 'file:///file.brs(20)' }, - { configSetting: 'Filename', text: 'file:///path/file.brs(20)' }, - { configSetting: 'Filename', text: 'file:///path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { - logOutputManager.hyperlinkFormat = param.configSetting; + it('tests Filename', () => { + function test(hyperlinkFormat: string, text: string) { + logOutputManager.hyperlinkFormat = hyperlinkFormat; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); - let logText = logOutputManager.getCustomLogText(param.text, 'file', - '.brs', 20, 2, true); - assert.equal(logText, 'file.brs(20)'); - }); + expect( + logOutputManager.getCustomLogText(text, 'file', '.brs', 20, 2, true) + ).to.eql('file.brs(20)'); + } + + test('Filename', 'file:///file.brs(20)'); + test('Filename', 'file:///path/file.brs(20)'); + test('Filename', 'file:///path/path2/file.brs(20)'); }); - describe('tests Filename with addline to log', () => { - let params = [ - { configSetting: 'Filename', text: 'file:///file.brs(20)' }, - { configSetting: 'Filename', text: 'file:///path/file.brs(20)' }, - { configSetting: 'Filename', text: 'file:///path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { + it('tests Filename with addline to log', () => { + test({ configSetting: 'Filename', text: 'file:///file.brs(20)' }); + test({ configSetting: 'Filename', text: 'file:///path/file.brs(20)' }); + test({ configSetting: 'Filename', text: 'file:///path/path2/file.brs(20)' }); + function test(param) { logOutputManager.hyperlinkFormat = param.configSetting; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('addCustomFileLink'); const logLine = new LogLine(param.text + ' sometext', true); + const stub = sinon.stub(logOutputManager['outputChannel'], 'appendLine'); + logOutputManager.addLogLineToOutput(logLine); - // assert.equal(logText, 'file.methodName(20)'); - }); + + expect(stub.getCall(0).args[0]).to.eql('file.brs(20) sometext'); + stub.restore(); + } }); - describe('tests FilenameAndFunction', () => { - let params = [ - { configSetting: null, text: 'file:///file.brs(20)' }, - { configSetting: null, text: 'file:///path/file.brs(20)' }, - { configSetting: null, text: 'file:///path/path2/file.brs(20)' }, - { configSetting: '', text: 'file:///file.brs(20)' }, - { configSetting: '', text: 'file:///path/file.brs(20)' }, - { configSetting: '', text: 'file:///path/path2/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'file:///file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'file:///path/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'file:///path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { + it('FilenameAndFunction', () => { + test({ configSetting: null, text: 'file:///file.brs(20)' }); + test({ configSetting: null, text: 'file:///path/file.brs(20)' }); + test({ configSetting: null, text: 'file:///path/path2/file.brs(20)' }); + test({ configSetting: '', text: 'file:///file.brs(20)' }); + test({ configSetting: '', text: 'file:///path/file.brs(20)' }); + test({ configSetting: '', text: 'file:///path/path2/file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'file:///file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'file:///path/file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'file:///path/path2/file.brs(20)' }); + + function test(param) { logOutputManager.hyperlinkFormat = param.configSetting; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); - let logText = logOutputManager.getCustomLogText(param.text, 'file', - '.brs', 20, 2, true); - assert.equal(logText, 'file.methodName(20)'); - }); + expect( + logOutputManager.getCustomLogText(param.text, 'file', '.brs', 20, 2, true) + ).to.eql('file.methodName(20)'); + } }); - describe('tests FilenameAndFunction with addline to log', () => { - let params = [ - { configSetting: null, text: 'pkg:/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/file.brs(20)' }, - { configSetting: null, text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: '', text: 'pkg:/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/file.brs(20)' }, - { configSetting: '', text: 'pkg:/path/path2/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/file.brs(20)' }, - { configSetting: 'FilenameAndFunction', text: 'pkg:/path/path2/file.brs(20)' }, - ]; - itParam('lf ${value.configSetting} if {$value.text} ', params, (param) => { + it('FilenameAndFunction with addline to log', () => { + test({ configSetting: null, text: 'pkg:/file.brs(20)' }); + test({ configSetting: null, text: 'pkg:/path/file.brs(20)' }); + test({ configSetting: null, text: 'pkg:/path/path2/file.brs(20)' }); + test({ configSetting: '', text: 'pkg:/file.brs(20)' }); + test({ configSetting: '', text: 'pkg:/path/file.brs(20)' }); + test({ configSetting: '', text: 'pkg:/path/path2/file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'pkg:/file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'pkg:/path/file.brs(20)' }); + test({ configSetting: 'FilenameAndFunction', text: 'pkg:/path/path2/file.brs(20)' }); + function test(param) { logOutputManager.hyperlinkFormat = param.configSetting; declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); + declarationProviderMock.expects('getFunctionBeforeLine').returns({ name: 'methodName' }); + logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('convertPkgPathToFsPath').returns({ name: 'filesystem/file.brs' }); logDocumentLinkProviderMock.expects('addCustomPkgLink'); const logLine = new LogLine(param.text + ' sometext', true); logOutputManager.addLogLineToOutput(logLine); - // assert.equal(logText, 'file.methodName(20)'); - }); + expect( + logOutputManager.getCustomLogText(param.text, 'file', '.brs', 20, 2, true) + ).to.eql('file.methodName(20)'); + } }); }); - describe('tests matchesFilter', () => { - describe('mustInclude items', () => { - let mustIncludeParams = [ - { text: 'test1', levelFilter: null, includeFilter: null, excludeFilter: null, expected: true }, - { text: 'test1', levelFilter: 'INFO', includeFilter: null, excludeFilter: null, expected: true }, - { text: 'test1', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: true }, - { text: 'test1', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }, - { text: 'test1', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: true }, - { text: 'test1', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }, - { text: 'test1', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }, - { text: 'test1', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }, - ]; - itParam('lf ${value.levelFilter} if {$value.levelFilter} ' + - 'ef ${value.excludeFilter}', mustIncludeParams, (params) => { - const logLine = new LogLine(params.text, true); - logOutputManager.setIncludeFilter(params.includeFilter); - logOutputManager.setExcludeFilter(params.excludeFilter); - logOutputManager.setLevelFilter(params.levelFilter); - assert.equal(logOutputManager.matchesFilter(logLine), params.expected); - }); + describe('matchesFilter', () => { + it('mustInclude items', () => { + test({ text: 'test1', levelFilter: null, includeFilter: null, excludeFilter: null, expected: true }); + test({ text: 'test1', levelFilter: 'INFO', includeFilter: null, excludeFilter: null, expected: true }); + test({ text: 'test1', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: true }); + test({ text: 'test1', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'test1', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: true }); + test({ text: 'test1', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'test1', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'test1', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }); + + function test(params) { + const logLine = new LogLine(params.text, true); + logOutputManager.setIncludeFilter(params.includeFilter); + logOutputManager.setExcludeFilter(params.excludeFilter); + logOutputManager.setLevelFilter(params.levelFilter); + assert.equal(logOutputManager['shouldLineBeShown'](logLine), params.expected); + } }); - describe('non-mustinclude items true scenarios', () => { - let mustIncludeParams = [ - { text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: null, excludeFilter: null, expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: null, expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }, - { text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }, - ]; - itParam('lf ${value.levelFilter} if {$value.levelFilter} ' + - 'ef ${value.excludeFilter}', mustIncludeParams, (params) => { - const logLine = new LogLine(params.text, false); - logOutputManager.setIncludeFilter(params.includeFilter); - logOutputManager.setExcludeFilter(params.excludeFilter); - logOutputManager.setLevelFilter(params.levelFilter); - assert.equal(logOutputManager.matchesFilter(logLine), params.expected); - }); + + it('non-mustInclude items true scenarios', () => { + test({ text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: null, excludeFilter: null, expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: null, expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: true }); + + function test(params) { + const logLine = new LogLine(params.text, false); + logOutputManager.setIncludeFilter(params.includeFilter); + logOutputManager.setExcludeFilter(params.excludeFilter); + logOutputManager.setLevelFilter(params.levelFilter); + assert.equal(logOutputManager['shouldLineBeShown'](logLine), params.expected); + } }); - describe('non-must include items false scenarios', () => { - let mustIncludeParams = [ - { text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: null, excludeFilter: null, expected: false }, - { text: 'INFO test1 NOTTHERE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: false }, - { text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }, - { text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }, - { text: 'INFO test1 NOTTHERE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }, - { text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - { text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }, - ]; - itParam('lf ${value.levelFilter} if {$value.levelFilter} ' + - 'ef ${value.excludeFilter}', mustIncludeParams, (params) => { - const logLine = new LogLine(params.text, false); - logOutputManager.setIncludeFilter(params.includeFilter); - logOutputManager.setExcludeFilter(params.excludeFilter); - logOutputManager.setLevelFilter(params.levelFilter); - assert.equal(logOutputManager.matchesFilter(logLine), params.expected); - }); + + it('non-must include items false scenarios', () => { + test({ text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: null, excludeFilter: null, expected: false }); + test({ text: 'INFO test1 NOTTHERE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: null, expected: false }); + test({ text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: null, includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }); + test({ text: 'INFO test1 NOTTHERE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: null, expected: false }); + test({ text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: 'INFO', includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: null, excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 INCLUDE EXCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: null, includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE', levelFilter: 'INFO', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 INCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + test({ text: 'INFO test1 NOTHERE EXCLUDE', levelFilter: 'DEBUG', includeFilter: 'INCLUDE', excludeFilter: 'EXCLUDE', expected: false }); + + function test(params) { + const logLine = new LogLine(params.text, false); + logOutputManager.setIncludeFilter(params.includeFilter); + logOutputManager.setExcludeFilter(params.excludeFilter); + logOutputManager.setLevelFilter(params.levelFilter); + assert.equal(logOutputManager['shouldLineBeShown'](logLine), params.expected); + } }); }); - }); diff --git a/src/LogOutputManager.ts b/src/LogOutputManager.ts index b4b8b068..5c526b87 100644 --- a/src/LogOutputManager.ts +++ b/src/LogOutputManager.ts @@ -1,13 +1,12 @@ import * as vscode from 'vscode'; - -import { DiagnosticCollection } from 'vscode'; - -import { BrightScriptDebugCompileError } from 'roku-debug'; -import { DeclarationProvider } from './DeclarationProvider'; -import { LogDocumentLinkProvider } from './LogDocumentLinkProvider'; +import type { DiagnosticCollection } from 'vscode'; +import type { BSDebugDiagnostic } from 'roku-debug'; +import { isChanperfEvent, isDiagnosticsEvent, isLaunchStartEvent, isLogOutputEvent, isPopupMessageEvent, isRendezvousEvent } from 'roku-debug'; +import type { DeclarationProvider } from './DeclarationProvider'; +import type { LogDocumentLinkProvider } from './LogDocumentLinkProvider'; import { CustomDocumentLink } from './LogDocumentLinkProvider'; import * as fsExtra from 'fs-extra'; -import { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; +import type { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; export class LogLine { constructor( @@ -46,8 +45,8 @@ export class LogOutputManager { * - at line LINE of file pkg:/path/file.brs - this case can arise when the device reports various scenegraph errors such as fields not present, or texture size issues, etc */ this.pkgRegex = /(?:\s*at line (\d*) of file )*(?:(pkg:\/|file:\/\/)(.*\.(bs|brs|xml)))[ \t]*(?:(?:(?:\()(\d+)(?:\:(\d+))?\)?)|(?:\:(\d+)?))*/; - this.debugStartRegex = new RegExp('BrightScript Micro Debugger\.', 'ig'); - this.debugEndRegex = new RegExp('Brightscript Debugger>', 'ig'); + this.debugStartRegex = /BrightScript Micro Debugger\./ig; + this.debugEndRegex = /Brightscript Debugger>/ig; subscriptions.push(vscode.commands.registerCommand('extension.brightscript.markLogOutput', () => { this.markOutput(); @@ -96,7 +95,7 @@ export class LogOutputManager { private logLevelRegex?: RegExp; private excludeRegex?: RegExp; private pkgRegex: RegExp; - private isNextBreakpointSkipped: boolean = false; + private isNextBreakpointSkipped = false; private includeStackTraces: boolean; private isInMicroDebugger: boolean; public launchConfig: BrightScriptLaunchConfiguration; @@ -120,57 +119,187 @@ export class LogOutputManager { private loadConfigSettings() { let config: any = vscode.workspace.getConfiguration('brightscript') || {}; - this.includeStackTraces = (config.output || {}).includeStackTraces; + this.includeStackTraces = config.output?.includeStackTraces; this.isFocusingOutputOnLaunch = config?.output?.focusOnLaunch === false ? false : true; this.isClearingOutputOnLaunch = config?.output?.clearOnLaunch === false ? false : true; this.isClearingConsoleOnChannelStart = config?.output?.clearConsoleOnChannelStart === false ? false : true; - this.hyperlinkFormat = (config.output || {}).hyperlinkFormat; + this.hyperlinkFormat = config.output?.hyperlinkFormat; } public setLaunchConfig(launchConfig: BrightScriptLaunchConfiguration) { this.launchConfig = launchConfig; } - public onDidReceiveDebugSessionCustomEvent(e: { event: string, body?: any }) { - if (e.event === 'BSRendezvousEvent' || e.event === 'BSChanperfEvent') { + public async onDidReceiveDebugSessionCustomEvent(e: { event: string; body?: any }) { + if (isRendezvousEvent(e) || isChanperfEvent(e)) { // No need to handle rendezvous type events return; } - console.log('received event ' + e.event); - if (e.event === 'BSLogOutputEvent') { - this.appendLine(e.body); - } else if (e.event === 'BSLaunchStartEvent') { + if (isLogOutputEvent(e)) { + + const errorCodes = new Map([ + ['&h00', '(ERR_NF: next without for)'], + ['&h02', '(ERR_SYNTAX): syntax error'], + ['&h04', '(ERR_RG: return without gosub)'], + ['&h06', '(ERR_OD: out of data (READ))'], + ['&h08', '(ERR_FC: invalid parameter passed to function/array (e.g neg matrix dim or square root))'], + ['&h0C', '(ERR_OUTOFMEM: out of memory)'], + ['&h0E', '(ERR_MISSING_LN: missing line)'], + ['&h10', '(ERR_BS: array subscript out of bounds)'], + ['&h12', '(ERR_DD: attempted to redimension an array)'], + ['&h14', '(ERR_DIV_ZERO: divide by zero error)'], + ['&h18', '(ERR_TM: type mismatch (string / numeric operation mismatch))'], + ['&h1A', '(ERR_OS: out of string space)'], + ['&h1C', '(ERR_STRINGTOLONG: error parsing string to long)'], + ['&h20', '(ERR_CN: continue not allowed)'], + ['&h9F', '(ERR_INVALID_CONST_NAME: invalid constant name)'], + ['&hA0', '(ERR_VAR_CANNOT_BE_SUBNAME: invalid subroutine name)'], + ['&hA1', '(ERR_TOO_MANY_LABELS)'], + ['&hA2', '(ERR_RO_NOT_FOUND:)'], + ['&hA3', '(ERR_IF_TOO_LARGE:)'], + ['&hA4', '(ERR_MISSING_INITILIZER:)'], + ['&hA5', '(ERR_EXIT_FOR_NOT_IN_FOR: exit for statement found when not in for loop)'], + ['&hA6', '(ERR_NOLONGER: no longer supported)'], + ['&hA7', '(ERR_INVALID_TYPE: invalid typhe)'], + ['&hA8', '(ERR_FUN_MUST_HAVE_RET_TYPE: function must have a return type)'], + ['&hA9', '(ERR_RET_MUST_HAVE_VALUE: return statement must have a value)'], + ['&hAA', '(ERR_RET_CANNOT_HAVE_VALUE: return statement cannot have a value)'], + ['&hAB', '(ERR_FOREACH_INDEX_TM)'], + ['&hAC', '(ERR_NOMAIN: no main function present)'], + ['&hAD', '(ERR_SUB_DEFINED_TWICE: sub defined twice)'], + ['&hAE', '(ERR_INTERNAL_LIMIT_EXCEDED: internal limit exceeded)'], + ['&hAF', '(ERR_EXIT_WHILE_NOT_IN_WHILE: exit while statement found when not in while loop)'], + ['&hB0', '(ERR_TOO_MANY_VAR: too many variables)'], + ['&hB1', '(ERR_TOO_MANY_CONST: too many constants)'], + ['&hB2', '(ERR_FUN_NOT_EXPECTED: function not expected)'], + ['&hB3', '(ERR_UNTERMED_STRING: literal string does not have ending quote)'], + ['&hB4', '(ERR_LABELTWICE: label defined more than once)'], + ['&hB5', '(ERR_NO_BLOCK_END: no end to block)'], + ['&hB6', '(ERR_FOR_NEXT_MISMATCH: variable on a NEXT does not match that for the FOR)'], + ['&hB7', '(ERR_UNEXPECTED_EOF: end of string being compiled encountered when not expected (missing end of block usually))'], + ['&hB8', '(ERR_NOMATCH: "match" statement did not match)'], + ['&hB9', '(ERR_LOADFILE: error loading a file)'], + ['&hBA', '(ERR_LNSEQ: line number sequence error)'], + ['&hBB', '(ERR_NOLN: no line number found)'], + ['&hBC', '(ERR_MISSING_ENDIF: end of code reached without finding ENDIF)'], + ['&hBE', '(ERR_MISSING_ENDWHILE: while statement is missing a matching endwhile)'], + ['&hBF', '(ERR_NW: endwhile with no while)'], + ['&hDF', '(ERR_STACK_OVERFLOW): stack overflow error'], + ['&hE0', '(ERR_NOTFUNOPABLE)'], + ['&hE1', '(ERR_UNICODE_NOT_SUPPORTED: unicode character not supported)'], + ['&hE2', '(ERR_VALUE_RETURN: return executed, and a value returned on the stack)'], + ['&hE3', '(ERR_INVALID_NUM_ARRAY_IDX: invalid number of array indexes)'], + ['&hE4', '(ERR_INVALID_LVALUE: invalid left side of expression)'], + ['&hE5', '(ERR_MUST_HAVE_RETURN: function must have return value)'], + ['&hE6', '(ERR_USE_OF_UNINIT_BRSUBREF: used a reference to SUB that is not initialized)'], + ['&hE7', '(ERR_ARRAYNOTDIMMED: array has not been dimensioned)'], + ['&hE8', '(ERR_TM2: non-numeric index to array)'], + ['&hE9', '(ERR_USE_OF_UNINIT_VAR: illegal use of uninitialized var)'], + ['&hEB', '(ERR_NOTYPEOP: operation on two typeless operands attempted)'], + ['&hEC', '(ERR_RO4: . (dot) operator used on a variable that does not contain a legal object or interface reference)'], + ['&hED', '(ERR_MUST_BE_STATIC: interface calls from type rotINTERFACE must be static)'], + ['&hEE', '(ERR_NOTWAITABLE: tried to wait on a function that does not have MessagePort interface)'], + ['&hEF', '(ERR_NOTPRINTABLE: non-printable value)'], + ['&hF0', '(ERR_RVIG: function returns a value, but is ignored)'], + ['&hF1', '(ERR_WRONG_NUM_PARAM: incorect number of function parameters)'], + ['&hF2', '(ERR_TOO_MANY_PARAM: too many function parameters to handle)'], + ['&hF3', '(ERR_RO3: interface not a member of object)'], + ['&hF4', '(ERR_RO2: member function not found in object or interface)'], + ['&hF5', '(ERR_RO1: function call does not have the right number of parameters)'], + ['&hF6', '(ERR_RO0: bscNewComponent failed because object class not found)'], + ['&hF7', '(ERR_STOP: stop statement executed)'], + ['&hF8', '(ERR_BREAK: scriptBreak() called)'], + ['&hF9', '(ERR_STACK_UNDER: nothing on stack to pop)'], + ['&hFA', '(ERR_MISSING_PARN)'], + ['&hFB', '(ERR_UNDEFINED_OP: an expression operator that we do not handle)'], + ['&hFC', '(ERR_NORMAL_END: normal, but terminate execution. END, shell "exit", window closed, etc'], + ['&hFD', '(ERR_UNDEFINED_OPCD: an opcode that we do not handle )'], + ['&hFE', '(ERR_INTERNAL: a condition that should not occur did)'], + ['&hFF', '(ERR_OKAY)'] + ]); + + // need to upgrade this includes statement to include a full hex regex + if (e.body.line.includes('&h')) { + const regexGlobal = /&h[0-9A-F][0-9A-F]/g; + let regexMatches: RegExpExecArray; + while ((regexMatches = regexGlobal.exec(e.body.line)) !== null) { + const regexMatch: string = regexMatches[0]; + if (errorCodes.has(regexMatch)) { + const errorDescription = errorCodes.get(regexMatch); + e.body.line = e.body.line.replace(regexMatch, regexMatch + ' ' + errorDescription + ' '); + } + } + } + this.appendLine(e.body.line); + + } else if (isPopupMessageEvent(e)) { + this.showMessage(e.body.message, e.body.severity); + + } else if (isLaunchStartEvent(e)) { this.isInMicroDebugger = false; this.isNextBreakpointSkipped = false; if (this.isFocusingOutputOnLaunch) { - vscode.commands.executeCommand('workbench.action.focusPanel'); + await vscode.commands.executeCommand('workbench.action.focusPanel'); this.outputChannel.show(); } if (this.isClearingOutputOnLaunch) { this.clearOutput(); } - } else if (e.body && Array.isArray(e.body)) { + + } else if (isDiagnosticsEvent(e)) { let errorsByPath = {}; - e.body.forEach((compileError: { path?: string }) => { - if (compileError.path) { - if (!errorsByPath[compileError.path]) { - errorsByPath[compileError.path] = []; + for (const diagnostic of e.body.diagnostics) { + if (diagnostic.path) { + if (!errorsByPath[diagnostic.path]) { + errorsByPath[diagnostic.path] = []; } - errorsByPath[compileError.path].push(compileError); + errorsByPath[diagnostic.path].push(diagnostic); } - }); + } for (const path in errorsByPath) { if (errorsByPath.hasOwnProperty(path)) { const errors = errorsByPath[path]; - this.addDiagnosticForError(path, errors); + await this.addDiagnosticForError(path, errors); } } } } - public async addDiagnosticForError(path: string, compileErrors: BrightScriptDebugCompileError[]) { + private getMatches(str, regex) { + const matches = []; + let match; + + if (regex.global) { + regex.lastIndex = 0; + } else { + regex = new RegExp(regex.source, 'g' + + (regex.ignoreCase ? 'i' : '') + + (regex.multiline ? 'm' : '') + + (regex.sticky ? 'y' : '')); + } + while (match === regex.exec(str)) { + matches.push(match); + + if (regex.lastIndex === match.index) { + regex.lastIndex++; + } + } + + return matches; + } + + private showMessage(message: string, severity: string) { + const methods = { + error: vscode.window.showErrorMessage, + info: vscode.window.showInformationMessage, + warn: vscode.window.showWarningMessage + }; + methods[severity](message); + } + + public async addDiagnosticForError(path: string, diagnostics: BSDebugDiagnostic[]) { //TODO get the actual folder let documentUri: vscode.Uri; let uri = vscode.Uri.file(path); @@ -185,45 +314,39 @@ export class LogOutputManager { // const currentDocumentUri = document.uri; // console.log("currentDocumentUri " + currentDocumentUri); if (documentUri !== undefined) { - { - let diagnostics: vscode.Diagnostic[] = []; - compileErrors.forEach((compileError) => { - - const path: string = compileError.path; - const message: string = compileError.message; - const source: string = compileError.errorText; - const lineNumber: number = compileError.lineNumber; - const charStart: number = compileError.charStart; - const charEnd: number = compileError.charEnd; - - diagnostics.push({ - code: '', - message: message, - range: new vscode.Range(new vscode.Position(lineNumber, charStart), new vscode.Position(lineNumber, charEnd)), - severity: vscode.DiagnosticSeverity.Error, - source: source - }); + let result: vscode.Diagnostic[] = []; + for (const diagnostic of diagnostics) { + result.push({ + code: diagnostic.code, + message: diagnostic.message, + source: diagnostic.source, + severity: diagnostic.severity, + tags: diagnostic.tags, + range: new vscode.Range( + new vscode.Position(diagnostic.range.start.line, diagnostic.range.start.character), + new vscode.Position(diagnostic.range.end.line, diagnostic.range.end.character) + ) }); - this.collection.set(documentUri, diagnostics); } + this.collection.set(documentUri, result); } } /** * Log output methods */ - public appendLine(lineText: string, mustInclude: boolean = false): void { - let lines = lineText.split('\n'); - lines.forEach((line) => { + public appendLine(lineText: string, mustInclude = false): void { + let lines = lineText.split(/\r?\n/g); + for (let line of lines) { if (line !== '') { if (!this.includeStackTraces) { // filter out debugger noise - if (line.match(this.debugStartRegex)) { + if (this.debugStartRegex.exec(line)) { console.log('start MicroDebugger block'); this.isInMicroDebugger = true; this.isNextBreakpointSkipped = false; line = 'Pausing for a breakpoint...'; - } else if (this.isInMicroDebugger && line.match(this.debugEndRegex)) { + } else if (this.isInMicroDebugger && (this.debugEndRegex.exec(line))) { console.log('ended MicroDebugger block'); this.isInMicroDebugger = false; if (this.isNextBreakpointSkipped) { @@ -243,13 +366,13 @@ export class LogOutputManager { if (line) { const logLine = new LogLine(line, mustInclude); this.allLogLines.push(logLine); - if (this.matchesFilter(logLine)) { + if (this.shouldLineBeShown(logLine)) { this.allLogLines.push(logLine); this.addLogLineToOutput(logLine); this.writeLogLineToLogfile(logLine.text); } } - }); + } } public writeLogLineToLogfile(text: string) { @@ -260,7 +383,7 @@ export class LogOutputManager { public addLogLineToOutput(logLine: LogLine) { const logLineNumber = this.displayedLogLines.length; - if (this.matchesFilter(logLine)) { + if (this.shouldLineBeShown(logLine)) { this.displayedLogLines.push(logLine); let match = this.pkgRegex.exec(logLine.text); if (match) { @@ -268,7 +391,14 @@ export class LogOutputManager { const path = isFilePath ? match[3] : 'pkg:/' + match[3]; let lineNumber = match[1] ? Number(match[1]) : undefined; if (!lineNumber) { - lineNumber = isFilePath ? Number(match[7]) : Number(match[5]); + if (isFilePath) { + lineNumber = Number(match[7]); + if (isNaN(lineNumber)) { + lineNumber = Number(match[5]); + } + } else { + lineNumber = Number(match[5]); + } } const filename = this.getFilename(path); @@ -331,12 +461,25 @@ export class LogOutputManager { return method ? method.name : null; } - public matchesFilter(logLine: LogLine): boolean { - return (logLine.isMustInclude || ( - (!this.logLevelRegex || this.logLevelRegex.test(logLine.text))) - && (!this.includeRegex || this.includeRegex.test(logLine.text))) - && (!this.excludeRegex || !this.excludeRegex.test(logLine.text) - ); + private shouldLineBeShown(logLine: LogLine): boolean { + //filter excluded lines + if (this.excludeRegex?.test(logLine.text)) { + return false; + } + //once past the exclude filter, always keep "mustInclude" lines + if (logLine.isMustInclude) { + return true; + } + //throw out lines that don't match the logLevelRegex (if we have one) + if (this.logLevelRegex && !this.logLevelRegex.test(logLine.text)) { + return false; + } + //throw out lines that don't match the includeRegex (if we have one) + if (this.includeRegex && !this.includeRegex.test(logLine.text)) { + return false; + } + //all other log entries should be kept + return true; } public clearOutput(): any { @@ -369,7 +512,7 @@ export class LogOutputManager { for (let i = 0; i < this.allLogLines.length - 1; i++) { let logLine = this.allLogLines[i]; - if (this.matchesFilter(logLine)) { + if (this.shouldLineBeShown(logLine)) { this.addLogLineToOutput(logLine); } } diff --git a/src/RDBViewProviders.spec.ts b/src/RDBViewProviders.spec.ts deleted file mode 100644 index b6beeb72..00000000 --- a/src/RDBViewProviders.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ - -import { expect } from 'chai'; -import * as sinonImport from 'sinon'; - -let Module = require('module'); - -import { vscode } from './mockVscode.spec'; - -const { require: oldRequire } = Module.prototype; - -Module.prototype.require = function hijacked(file) { - if (file === 'vscode') { - return vscode; - } else { - return oldRequire.apply(this, arguments); - } -}; - -import { CustomDocumentLink, LogDocumentLinkProvider } from './LogDocumentLinkProvider'; -import { RDBCommandsViewProvider, RDBRegistryViewProvider } from './RDBViewProviders'; - -let sinon: sinonImport.SinonSandbox; -let view; -let callback; -beforeEach(() => { - sinon = sinonImport.createSandbox(); - view = { - webview: { - onDidReceiveMessage: (cb) => { - callback = cb; - }, - postMessage: (message) => {} - }, - show: () => {} - }; -}); -afterEach(() => { - sinon.restore(); -}); - -describe('RDBRegistryViewProvider', () => { - describe('handleViewMessage', () => { - const provider = new RDBRegistryViewProvider(vscode.context); - - it('Shows the save prompt for exportRegistry command', async () => { - const spy = sinon.spy(vscode.window, 'showSaveDialog'); - (provider as any).handleViewMessage({ - command: 'exportRegistry', - content: '{}' - }); - expect(spy.calledOnce).to.be.true; - }); - - it('Shows the open dialog for importRegistry command', async () => { - const spy = sinon.spy(vscode.window, 'showOpenDialog'); - (provider as any).handleViewMessage({ - command: 'importRegistry', - context: {} - }); - expect(spy.calledOnce).to.be.true; - }); - }); -}); - -describe('RDBCommandsViewProvider', () => { - describe('getHtmlForWebview', () => { - const provider = new RDBCommandsViewProvider(vscode.context) as any; - - it('includes the contents of additionalScriptContents', async () => { - const html = provider.getHtmlForWebview(); - expect(html).to.contain(provider.additionalScriptContents()); - }); - }); - - describe('resolveWebviewView', () => { - it('sets up observer to handle messages from the ui', async () => { - const provider = new RDBCommandsViewProvider(vscode.context) as any; - provider.resolveWebviewView(view, {}, {}); - - expect(typeof callback).to.equal('function'); - const spy = sinon.spy(provider, 'handleViewMessage'); - callback({ - command: 'importRegistry', - context: {} - }); - expect(spy.calledOnce).to.be.true; - }); - }); -}); diff --git a/src/RDBViewProviders.ts b/src/RDBViewProviders.ts deleted file mode 100644 index be0356c5..00000000 --- a/src/RDBViewProviders.ts +++ /dev/null @@ -1,169 +0,0 @@ -import * as vscode from 'vscode'; -import * as path from 'path'; -import * as rta from 'roku-test-automation'; -import * as chokidar from 'chokidar'; -import * as fs from 'fs'; - -import { util } from './util'; - -export abstract class RDBBaseViewProvider implements vscode.WebviewViewProvider, vscode.Disposable { - constructor(context: vscode.ExtensionContext) { - this.rdbBasePath = context.extensionPath + '/dist/ui/rdb'; - context.subscriptions.push(this); - } - - protected abstract viewName: string; - - protected view?: vscode.WebviewView; - protected odc?: rta.OnDeviceComponent; - protected rdbBasePath: string; - private rdbWatcher: chokidar.FSWatcher; - - private odcCommands = [ - 'callFunc', - 'deleteEntireRegistry', - 'deleteRegistrySections', - 'getFocusedNode', - 'getValueAtKeyPath', - 'hasFocus', - 'isInFocusChain', - 'observeField', - 'readRegistry', - 'setValueAtKeyPath', - 'writeRegistry', - 'storeNodeReferences', - 'getNodeReferences', - 'deleteNodeReferences', - ]; - - public dispose() { - this.rdbWatcher?.close(); - } - - public setOnDeviceComponent(odc: rta.OnDeviceComponent) { - this.odc = odc; - this.onOnDeviceComponentReady(); - } - - protected onOnDeviceComponentReady() {} - - protected handleViewMessage(message) {} - - /** Adds ability to add additional script contents to the main webview html */ - protected additionalScriptContents() { - return ''; - } - - protected getHtmlForWebview() { - if (util.isExtensionHostRunning()) { - // If we're developing we want to add a watcher to allow hot reload :) - // Index.js always gets updated so don't have to worry about observing the css file - this.rdbWatcher = chokidar.watch(`${this.rdbBasePath}/index.js`); - this.rdbWatcher.on('change', () => { - // We have to change this to get it to update so we store it first and set it back after - const html = this.view.webview.html; - this.view.webview.html = ''; - this.view.webview.html = html; - }); - } - const scriptUri = vscode.Uri.file(path.join(this.rdbBasePath, 'index.js')).with({ scheme: 'vscode-resource' }); - const styleUri = vscode.Uri.file(path.join(this.rdbBasePath, 'bundle.css')).with({ scheme: 'vscode-resource' }); - - return ` - - - - - - - - - - `; - } - - public resolveWebviewView( - view: vscode.WebviewView, - context: vscode.WebviewViewResolveContext, - _token: vscode.CancellationToken, - ) { - this.view = view; - const webview = view.webview; - - webview.onDidReceiveMessage(async (message) => { - try { - const context = message.context; - if (this.odcCommands.includes(message.command)) { - const response = await this.odc[message.command](context.args, context.options); - webview.postMessage({ - ...message, - response: response - }); - } else { - this.handleViewMessage(message); - } - } catch (e) { - webview.postMessage({ - ...message, - error: e.message - }); - } - }); - - view.show(true); - - webview.options = { - // Allow scripts in the webview - enableScripts: true, - - localResourceRoots: [ - vscode.Uri.file(this.rdbBasePath) - ] - }; - webview.html = this.getHtmlForWebview(); - } -} - -export class RDBRegistryViewProvider extends RDBBaseViewProvider { - protected viewName = 'RegistryView'; - - protected handleViewMessage(message) { - switch (message.command) { - case 'exportRegistry': - vscode.window.showSaveDialog({ saveLabel: 'Save' }).then(uri => { - vscode.workspace.fs.writeFile(uri, Buffer.from(JSON.stringify(message.content), 'utf8')); - }); - return; - case 'importRegistry': - const options: vscode.OpenDialogOptions = { - canSelectMany: false, - openLabel: 'Select', - canSelectFiles: true, - canSelectFolders: false - }; - vscode.window.showOpenDialog(options).then(this.importContentsToRegistry.bind(this)); - return; - } - } - - protected async importContentsToRegistry(uri) { - if (uri && uri[0]) { - const input = await vscode.workspace.fs.readFile(uri[0]); - const data = Buffer.from(input).toString('utf8'); - this.view?.webview.postMessage({ type: 'readRegistry', values: JSON.parse(data) }); - } - } -} - -export class RDBCommandsViewProvider extends RDBBaseViewProvider { - protected viewName = 'CommandsView'; - - protected additionalScriptContents() { - const requestArgsPath = path.join(rta.utils.getServerFilesPath(), 'requestArgs.schema.json'); - return `const requestArgsSchema = ${fs.readFileSync(requestArgsPath, 'utf8')}`; - } -} diff --git a/src/SceneGraphDebugCommands.ts b/src/SceneGraphDebugCommands.ts index 4b38e41d..81b69be1 100644 --- a/src/SceneGraphDebugCommands.ts +++ b/src/SceneGraphDebugCommands.ts @@ -1,11 +1,8 @@ import * as vscode from 'vscode'; -import { SceneGraphCommandResponse, SceneGraphDebugCommandController } from 'roku-debug'; +import type { SceneGraphCommandResponse } from 'roku-debug'; +import { SceneGraphDebugCommandController } from 'roku-debug'; export class SceneGraphDebugCommands { - - constructor() { - } - private outputChannel: vscode.OutputChannel; private context: vscode.ExtensionContext; private host: string; @@ -75,7 +72,7 @@ export class SceneGraphDebugCommands { // TODO: press? likely needs to go in the old area. subscriptions.push(vscode.commands.registerCommand('extension.brightscript.press', async () => { - let keys = await (await vscode.window.showInputBox({ placeHolder: 'comma separated list of keys' })).split(','); + let keys = (await vscode.window.showInputBox({ placeHolder: 'comma separated list of keys' })).split(','); if (keys.length > 1) { await this.logCommandOutput(async (commandController) => commandController.press(keys)); } @@ -128,6 +125,18 @@ export class SceneGraphDebugCommands { await this.logCommandOutput(async (commandController) => commandController.showkey()); })); + subscriptions.push(vscode.commands.registerCommand('extension.brightscript.brightscriptWarnings', async () => { + let limit = parseInt(await vscode.window.showInputBox({ placeHolder: '100', validateInput: (value: string) => { + if (isNaN(parseInt(value))) { + return 'Input must be a numeric value'; + } + } })); + + if (!isNaN(limit)) { + await this.logCommandOutput((commandController) => commandController.brightscriptWarnings(limit)); + } + })); + subscriptions.push(vscode.commands.registerCommand('extension.brightscript.custom8080Command', async () => { let command = await vscode.window.showInputBox({ placeHolder: 'custom command' }); if (command) { @@ -145,7 +154,7 @@ export class SceneGraphDebugCommands { // The output channel seems to have a limit to the amount of output that can be displayed in a single log. // For this reason we split the output into groups of 20 lines and send each group. If we don't do this a lot of // the middle of the string gets cut out. - let lines = (response?.error ? response?.error.message : response.result.rawResponse).split('\n'); + let lines = (response?.error?.message ?? response.result.rawResponse).split('\n'); let lineGroups = this.chunkArray(lines); // Log the command statement @@ -174,7 +183,7 @@ export class SceneGraphDebugCommands { public async getRemoteHost() { this.host = await this.context.workspaceState.get('remoteHost'); if (!this.host) { - let config = await vscode.workspace.getConfiguration('brightscript.remoteControl', null); + let config = vscode.workspace.getConfiguration('brightscript.remoteControl', null); this.host = config.get('host'); if (this.host === '${promptForHost}') { this.host = await vscode.window.showInputBox({ diff --git a/src/SymbolInformationRepository.ts b/src/SymbolInformationRepository.ts index b02676b7..4d16e032 100644 --- a/src/SymbolInformationRepository.ts +++ b/src/SymbolInformationRepository.ts @@ -1,15 +1,12 @@ import * as vscode from 'vscode'; - -import { - CancellationToken, - Location, - SymbolInformation, SymbolKind, - TextDocument, - Uri, - WorkspaceSymbolProvider +import type { + CancellationToken, + SymbolInformation, + TextDocument, + WorkspaceSymbolProvider } from 'vscode'; -import { DeclarationProvider } from './DeclarationProvider'; +import type { DeclarationProvider } from './DeclarationProvider'; export class BrightScriptWorkspaceSymbolProvider implements WorkspaceSymbolProvider { @@ -43,18 +40,18 @@ export class SymbolInformationRepository { } private declarationProvider: DeclarationProvider; - private cache: Map = new Map(); + private cache = new Map(); public sync(): Promise { return this.provider.sync(); } - public * find(query: string): IterableIterator { + public *find(query: string): IterableIterator { const pattern = this.compileQuery(query); if (pattern === undefined) { return; } - const fresh: Set = new Set(); + const fresh = new Set(); for (const doc of vscode.workspace.textDocuments) { if (!doc.isDirty) { continue; diff --git a/src/XmlUtils.ts b/src/XmlUtils.ts index c78c6e75..1b661713 100644 --- a/src/XmlUtils.ts +++ b/src/XmlUtils.ts @@ -1,15 +1,17 @@ -import { +import type { CancellationToken, - Position, - Range, TextDocument } from 'vscode'; +import { + Position, + Range +} from 'vscode'; export enum XmlWordType { Illegal = -1, Tag = 0, AttributeValue = 1, - Attribute = 2, + Attribute = 2 } export class XmlUtils { public getXmlWordType(document: TextDocument, position: Position, token: CancellationToken): XmlWordType { @@ -39,6 +41,8 @@ export class XmlUtils { case XmlWordType.AttributeValue: return this.getTextWithOffsets(document, position, /[^\s\"]+/); break; + default: + break; } } @@ -60,7 +64,7 @@ export class XmlUtils { } // TODO: This detection is very limited, only if the char before the word is ' or " let rangeBefore = new Range(wordStart.line, wordStart.character - 1, wordStart.line, wordStart.character); - if (document.getText(rangeBefore).match(/'|"/)) { + if (/'|"/.exec(document.getText(rangeBefore))) { return true; } return false; diff --git a/src/autoIndent.spec.ts b/src/autoIndent.spec.ts index 9bc6e47d..9317b392 100644 --- a/src/autoIndent.spec.ts +++ b/src/autoIndent.spec.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'fs-extra'; import * as glob from 'glob'; import { expect } from 'chai'; - +import undent from 'undent'; interface IndentationRulesJSON { increaseIndentPattern: string; decreaseIndentPattern: string; @@ -11,49 +11,142 @@ interface LanguageConfigurationJSON { } describe('Language auto-indent rules', () => { - const config: LanguageConfigurationJSON = JSON.parse(readFileSync('./language-configuration.json').toString()); + const config: LanguageConfigurationJSON = JSON.parse(readFileSync(`${__dirname}/../language-configuration.json`).toString()); + + it('indents function with body', () => { + expectIndentToEqual(undent` + function autoIndent1(arg as Object) as void + if true then + print "true" + end if + end function + `); + }); + + it('indents for loop', () => { + expectIndentToEqual(undent` + for i=0 to 10 + print "i="; i + end for + + for i=0 to 10 + print "i="; i + endfor + `); + }); + + it('indents anon functions', () => { + expectIndentToEqual(undent` + fn = sub() + print "is fn" + end sub - it('should keep input indentation', () => { - const files = glob('./test/autoIndent/**/*.brs', (err, matches) => { - if (err) { - throw new Error('No cases found'); + fn = sub() + print true + endsub + + fn = function() + print "is fn" + end function + + fn = function() + print true + endfunction + `); + }); + + it('indents AA literals', () => { + expectIndentToEqual(undent` + p = { + x: 100 + y: 100, + fn: sub(arg as object) + print "is p.fn" + end sub + fn2: sub(arg) + print "is p.fn" + endsub } - matches.forEach(match => { - const expected = readFileSync(match).toString().trimRight().replace(/\r\n/g, '\n'); - const actual = reIndent(match, expected, config.indentationRules); - expect(actual).to.equal(expected); - }); - }); + `); }); -}); -function reIndent(fileName: string, text: string, rules: IndentationRulesJSON) { - const reIncrease = new RegExp(rules.increaseIndentPattern); - const reDecrease = new RegExp(rules.decreaseIndentPattern); - const lines = text.split('\n'); - const indent = ' '; // expecting test cases to use 4 spaces for indent - let depth = 0; - let src = ''; - lines.forEach((line, index) => { - const trimmed = line.trimLeft(); - if (trimmed === '') { + it('indents if statement', () => { + expectIndentToEqual(undent` + if cond then + print "has cond"; cond + if cond2 then print "has cond2"; cond2 + else if cond2 then + print "cond2"; cond2 + else if cond3 + print "cond2"; cond3 + else + print "not cond"; cond + end if + `); + }); + + it('indents if without `then`', () => { + expectIndentToEqual(undent` + if(cond) + print "has cond"; cond + if(cond2)then print "has cond2"; cond2 + elseif (cond2) then + print "cond2"; cond2 + elseif(cond3)then + print "cond3"; cond3 + else + print "not cond"; cond + endif + `); + }); + + it('should indent component body', () => { + expectIndentToEqual(undent` + component SomeComponent + public ifaceField as string + end component + `); + }); + + function expectIndentToEqual(text: string, expected = text) { + text = text.toString().trimRight().replace(/\r\n/g, '\n'); + expected = expected.toString().trimRight().replace(/\r\n/g, '\n'); + const actual = reIndent(text, config.indentationRules); + expect( + actual.split(/\r?\n/) + ).to.eql( + expected.split(/\r?\n/) + ); + } + + function reIndent(text: string, rules: IndentationRulesJSON) { + const reIncrease = new RegExp(rules.increaseIndentPattern); + const reDecrease = new RegExp(rules.decreaseIndentPattern); + const lines = text.split('\n'); + const indent = ' '; // expecting test cases to use 4 spaces for indent + let depth = 0; + let src = ''; + lines.forEach((line, index) => { + const trimmed = line.trimLeft(); + if (trimmed === '') { + src += '\n'; + return; + } + if (reDecrease.test(trimmed)) { + depth--; + if (depth < 0) { + throw new Error(`Negative indentation obtained at ${index}`); + } + } + for (let i = 0; i < depth; i++) { + src += indent; + } + src += trimmed; src += '\n'; - return; - } - if (reDecrease.test(trimmed)) { - depth--; - if (depth < 0) { - throw new Error(`Negative indentation obtained at ${fileName}:${index}`); + if (reIncrease.test(trimmed)) { + depth++; } - } - for (let i = 0; i < depth; i++) { - src += indent; - } - src += trimmed; - src += '\n'; - if (reIncrease.test(trimmed)) { - depth++; - } - }); - return src.trimRight(); -} + }); + return src.trimRight(); + } +}); diff --git a/src/commands/BrighterScriptPreviewCommand.ts b/src/commands/BrighterScriptPreviewCommand.ts index 2e0bf8fc..33257814 100644 --- a/src/commands/BrighterScriptPreviewCommand.ts +++ b/src/commands/BrighterScriptPreviewCommand.ts @@ -15,12 +15,12 @@ export class BrighterScriptPreviewCommand { public register(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerCommand('brighterscript.showPreview', async (uri: vscode.Uri) => { - uri = uri ?? vscode.window.activeTextEditor.document.uri; + uri ??= vscode.window.activeTextEditor.document.uri; await this.openPreview(uri, vscode.window.activeTextEditor, false); })); context.subscriptions.push(vscode.commands.registerCommand('brighterscript.showPreviewToSide', async (uri: vscode.Uri) => { - uri = uri ?? vscode.window.activeTextEditor.document.uri; + uri ??= vscode.window.activeTextEditor.document.uri; await this.openPreview(uri, vscode.window.activeTextEditor, true); })); @@ -44,7 +44,7 @@ export class BrighterScriptPreviewCommand { if (this.activePreviews[uri.fsPath]) { util.keyedDebounce(`sync-preview:${uri.fsPath}`, async () => { - this.syncPreviewLocation(uri); + await this.syncPreviewLocation(uri); }, BrighterScriptPreviewCommand.SELECTION_SYNC_DELAY); //this is the preview file @@ -134,7 +134,7 @@ export class BrighterScriptPreviewCommand { let activePreview = this.activePreviews[sourceFsPath]; let previewSelection = activePreview?.previewEditor?.selection; - if (activePreview && activePreview.sourceMap && previewSelection) { + if (activePreview?.sourceMap && previewSelection) { try { let mappedRange = await SourceMapConsumer.with(activePreview.sourceMap, null, (consumer) => { let start = consumer.originalPositionFor({ @@ -190,22 +190,20 @@ export class BrighterScriptPreviewCommand { } } - private activePreviews = {} as { - [fsPath: string]: { - /** + private activePreviews = {} as Record; /** * The handler for the command. Creates a custom URI so we can open it @@ -215,7 +213,7 @@ export class BrighterScriptPreviewCommand { let activePreview: BrighterScriptPreviewCommand['activePreviews'][0]; let previewDoc: vscode.TextDocument; if (!this.activePreviews[uri.fsPath]) { - activePreview = this.activePreviews[uri.fsPath] = {} as any; + activePreview = (this.activePreviews[uri.fsPath] = {} as any); let customUri = this.getBsPreviewUri(uri); previewDoc = await vscode.workspace.openTextDocument(customUri); } else { @@ -245,7 +243,9 @@ export class BrighterScriptPreviewCommand { * Get the fsPath from the uri. this handles both `file` and `bs-preview` schemes */ private getSourcePathFromPreviewUri(uri: vscode.Uri) { - if (uri.scheme === FILE_SCHEME) { + if (uri.scheme === 'file') { + return uri.fsPath; + } else if (uri.scheme === FILE_SCHEME) { let parts = querystring.parse(uri.query); return parts.fsPath as string; } else { diff --git a/src/commands/LanguageServerInfoCommand.ts b/src/commands/LanguageServerInfoCommand.ts index 5bf1b141..1cef7961 100644 --- a/src/commands/LanguageServerInfoCommand.ts +++ b/src/commands/LanguageServerInfoCommand.ts @@ -11,15 +11,23 @@ export class LanguageServerInfoCommand { context.subscriptions.push(vscode.commands.registerCommand(LanguageServerInfoCommand.commandName, async () => { const commands = [{ - label: `Select BrighterScript Version`, + label: `Change Selected BrighterScript Version`, description: `(current v${languageServerManager.selectedBscInfo.version})`, command: this.selectBrighterScriptVersion.bind(this) + }, { + label: `Restart BrighterScript Language Server`, + description: ``, + command: this.restartLanguageServer.bind(this) }]; let selection = await vscode.window.showQuickPick(commands, { placeHolder: `BrighterScript Project Info` }); await selection?.command(); })); } + private async restartLanguageServer() { + await vscode.commands.executeCommand('extension.brightscript.languageServer.restart'); + } + /** * If this changes the user/folder/workspace settings, that will trigger a reload of the language server so there's no need to * call the reload manually @@ -32,7 +40,7 @@ export class LanguageServerInfoCommand { }]; //look for brighterscript in all workspace folders - vscode.workspace.workspaceFolders.forEach(workspaceFolder => { + for (const workspaceFolder of vscode.workspace.workspaceFolders) { const workspaceOrFolderPath = this.getWorkspaceOrFolderPath(workspaceFolder.uri.fsPath); try { let bscPath = require.resolve('brighterscript', { @@ -41,6 +49,7 @@ export class LanguageServerInfoCommand { //require.resolve returns a bsc script path, so remove that to get the root of brighterscript folder if (bscPath) { bscPath = bscPath.replace(/[\\\/]dist[\\\/]index.js/i, ''); + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires const version = require(`${bscPath}/package.json`).version; //make the path relative to the workspace folder bscPath = path.relative(workspaceOrFolderPath, bscPath); @@ -52,18 +61,18 @@ export class LanguageServerInfoCommand { }); } } finally { } - }); + } let selection = await vscode.window.showQuickPick(versions, { placeHolder: `Select the BrighterScript version used for BrightScript and BrighterScript language features` }); if (selection) { const config = vscode.workspace.getConfiguration('brightscript'); //if the user picked "use embedded version", then remove the setting if (versions.indexOf(selection) === 0) { //setting to undefined means "remove" - config.update('bsdk', 'embedded'); + await config.update('bsdk', 'embedded'); return 'embedded'; } else { //save this to workspace/folder settings (vscode automatically decides if it goes into the code-workspace settings or the folder settings - config.update('bsdk', selection.detail); + await config.update('bsdk', selection.detail); return selection.detail; } } diff --git a/src/commands/VscodeCommand.ts b/src/commands/VscodeCommand.ts new file mode 100644 index 00000000..a9371392 --- /dev/null +++ b/src/commands/VscodeCommand.ts @@ -0,0 +1,11 @@ +export enum VscodeCommand { + rokuDeviceViewRefreshScreenshot = 'extension.brightscript.rokuDeviceView.refreshScreenshot', + rokuDeviceViewResumeScreenshotCapture = 'extension.brightscript.rokuDeviceView.resumeScreenshotCapture', + rokuDeviceViewPauseScreenshotCapture = 'extension.brightscript.rokuDeviceView.pauseScreenshotCapture', + rokuDeviceViewEnableNodeInspector = 'extension.brightscript.rokuDeviceView.enableNodeInspector', + rokuDeviceViewDisableNodeInspector = 'extension.brightscript.rokuDeviceView.disableNodeInspector', + rokuRegistryExportRegistry = 'extension.brightscript.rokuRegistry.exportRegistry', + rokuRegistryImportRegistry = 'extension.brightscript.rokuRegistry.importRegistry', + rokuRegistryClearRegistry = 'extension.brightscript.rokuRegistry.clearRegistry', + rokuRegistryRefreshRegistry = 'extension.brightscript.rokuRegistry.refreshRegistry' +} diff --git a/src/extension-web.ts b/src/extension-web.ts new file mode 100644 index 00000000..ea973e0f --- /dev/null +++ b/src/extension-web.ts @@ -0,0 +1,15 @@ +import type * as vscode from 'vscode'; + +//TODO move this to a common file since it's duplicated in extension.ts +const EXTENSION_ID = 'RokuCommunity.brightscript'; + +export class Extension { + + public async activate(context: vscode.ExtensionContext) { + } +} + +export const extension = new Extension(); +export async function activate(context: vscode.ExtensionContext) { + await extension.activate(context); +} diff --git a/src/extension.spec.ts b/src/extension.spec.ts index a805c374..830323e7 100644 --- a/src/extension.spec.ts +++ b/src/extension.spec.ts @@ -1,13 +1,10 @@ -/* tslint:disable:no-unused-expression */ -/* tslint:disable:no-var-requires */ import { expect } from 'chai'; import { createSandbox } from 'sinon'; let Module = require('module'); import * as extension from './extension'; import { vscode, vscodeLanguageClient } from './mockVscode.spec'; -import { brightScriptCommands } from './BrightScriptCommands'; -import { LanguageServerManager, languageServerManager } from './LanguageServerManager'; -import * as rta from 'roku-test-automation'; +import { BrightScriptCommands } from './BrightScriptCommands'; +import { languageServerManager } from './LanguageServerManager'; const sinon = createSandbox(); @@ -25,10 +22,14 @@ Module.prototype.require = function hijacked(file) { describe('extension', () => { let context: any; + let originalWebviews; + const extensionInstance = extension.extension; + beforeEach(() => { sinon.stub(languageServerManager, 'init').returns(Promise.resolve()); context = { + extensionPath: '', subscriptions: [], asAbsolutePath: () => { }, globalState: { @@ -40,9 +41,13 @@ describe('extension', () => { } } }; + + originalWebviews = extensionInstance['webviews']; + extensionInstance['webviews'] = []; }); afterEach(() => { + extensionInstance['webviews'] = originalWebviews; sinon.restore(); }); @@ -68,7 +73,7 @@ describe('extension', () => { }); it('registers all commands', async () => { - let stub = sinon.stub(brightScriptCommands, 'registerCommands').callsFake(() => { }); + let stub = sinon.stub(BrightScriptCommands.prototype, 'registerCommands').callsFake(() => { }); await extension.activate(context); expect(stub.callCount).to.equal(1); }); @@ -93,66 +98,4 @@ describe('extension', () => { await extension.activate(context); expect(spy.getCalls().length).to.be.greaterThan(0); }); - - describe('RDB', () => { - const extensionInstance = extension.extension as any; - let config; - let context; - let originalRdbViews; - beforeEach(() => { - context = { - subscriptions: [] - }; - config = { - host: '86.75.30.9', - password: 'jenny' - }; - originalRdbViews = extensionInstance.rdbViews; - extensionInstance.rdbViews = {}; - }); - - afterEach(() => { - extensionInstance.odc = undefined; - extensionInstance.rdbViews = originalRdbViews; - }); - - describe('setupODC', () => { - it('sets up the underlying RokuDevice instance', async () => { - const odc = extensionInstance.setupODC(config); - expect(odc.device).to.be.instanceOf(rta.RokuDevice); - }); - - it('has the correct config values passed from the extension', async () => { - const odc = extensionInstance.setupODC(config); - const deviceConfig = odc.device.getCurrentDeviceConfig(); - expect(deviceConfig.host).to.equal(config.host); - expect(deviceConfig.password).to.equal(config.password); - }); - }); - - describe('setupRDB', () => { - it('calls setupODC to create the odc instance if enabled', async () => { - config.injectRdbOnDeviceComponent = true; - const spy = sinon.stub(extensionInstance, 'setupODC').returns({}); - extensionInstance.setupRDB(context, config); - expect(spy.calledOnce).to.be.true; - }); - - it('does not call setupODC if not enabled', async () => { - config.injectRdbOnDeviceComponent = false; - const spy = sinon.stub(extensionInstance, 'setupODC').returns({}); - extensionInstance.setupRDB(context, config); - expect(spy.calledOnce).to.be.false; - }); - - it('initializes RDB views and calls registerWebviewViewProvider for each', async () => { - config.injectRdbOnDeviceComponent = true; - extensionInstance.rdbViews = originalRdbViews; - sinon.stub(extensionInstance, 'setupODC').returns({}); - const spy = sinon.spy(vscode.window, 'registerWebviewViewProvider'); - extensionInstance.setupRDB(context, config); - expect(spy.callCount).to.equal(Object.keys(originalRdbViews).length); - }); - }); - }); }); diff --git a/src/extension.ts b/src/extension.ts index dc40ffac..a9becd9d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,66 +1,92 @@ import * as vscode from 'vscode'; import * as prettyBytes from 'pretty-bytes'; -import { window } from 'vscode'; -import { gte as semverGte } from 'semver'; -import { env, extensions } from 'vscode'; -import * as rta from 'roku-test-automation'; - +import { extensions } from 'vscode'; +import * as path from 'path'; +import * as fsExtra from 'fs-extra'; +import { util } from './util'; import { ActiveDeviceManager } from './ActiveDeviceManager'; -import { brightScriptCommands } from './BrightScriptCommands'; +import { BrightScriptCommands } from './BrightScriptCommands'; import BrightScriptXmlDefinitionProvider from './BrightScriptXmlDefinitionProvider'; -import { BrightScriptDebugConfigurationProvider, BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; +import type { BrightScriptLaunchConfiguration } from './DebugConfigurationProvider'; +import { BrightScriptDebugConfigurationProvider } from './DebugConfigurationProvider'; import { DeclarationProvider } from './DeclarationProvider'; import { DefinitionRepository } from './DefinitionRepository'; import { Formatter } from './formatter'; import { LogDocumentLinkProvider } from './LogDocumentLinkProvider'; import { LogOutputManager } from './LogOutputManager'; -import { RendezvousViewProvider } from './RendezvousViewProvider'; -import { RDBCommandsViewProvider, RDBRegistryViewProvider } from './RDBViewProviders'; +import { RendezvousViewProvider } from './viewProviders/RendezvousViewProvider'; +import { OnlineDevicesViewProvider } from './viewProviders/OnlineDevicesViewProvider'; import { sceneGraphDebugCommands } from './SceneGraphDebugCommands'; import { GlobalStateManager } from './GlobalStateManager'; import { languageServerManager } from './LanguageServerManager'; +import { TelemetryManager } from './managers/TelemetryManager'; +import { RemoteControlManager } from './managers/RemoteControlManager'; +import { WhatsNewManager } from './managers/WhatsNewManager'; +import { isChannelPublishedEvent, isChanperfEvent, isDiagnosticsEvent, isDebugServerLogOutputEvent, isLaunchStartEvent, isRendezvousEvent } from 'roku-debug'; +import { RtaManager } from './managers/RtaManager'; +import { WebviewViewProviderManager } from './managers/WebviewViewProviderManager'; +import { ViewProviderId } from './viewProviders/ViewProviderId'; const EXTENSION_ID = 'RokuCommunity.brightscript'; export class Extension { public outputChannel: vscode.OutputChannel; public sceneGraphDebugChannel: vscode.OutputChannel; - public debugServerOutputChannel: vscode.OutputChannel; + /** + * Output channel where all the extension logs should be written (includes roku-debug, vscode-brightscript-language, etc...) + */ + public extensionOutputChannel: vscode.OutputChannel; public globalStateManager: GlobalStateManager; + public whatsNewManager: WhatsNewManager; private chanperfStatusBar: vscode.StatusBarItem; - - public odc?: rta.OnDeviceComponent; - - // register our RDB views - private rdbViews = { - RDBRegistryView: { - class: RDBRegistryViewProvider - }, - RDBCommandsView: { - class: RDBCommandsViewProvider - } - }; + private telemetryManager: TelemetryManager; + private remoteControlManager: RemoteControlManager; + private brightScriptCommands: BrightScriptCommands; + private rtaManager: RtaManager; + private webviewViewProviderManager: WebviewViewProviderManager; public async activate(context: vscode.ExtensionContext) { + const currentExtensionVersion = extensions.getExtension(EXTENSION_ID)?.packageJSON.version as string; + this.globalStateManager = new GlobalStateManager(context); + this.whatsNewManager = new WhatsNewManager(this.globalStateManager, currentExtensionVersion); this.chanperfStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right); - var previousExtensionVersion = this.globalStateManager.lastRunExtensionVersion; + //initialize the analytics manager + context.subscriptions.push( + this.telemetryManager = new TelemetryManager({ + extensionId: EXTENSION_ID, + extensionVersion: currentExtensionVersion + }) + ); + + this.telemetryManager.sendStartupEvent(); + let activeDeviceManager = new ActiveDeviceManager(); + + this.remoteControlManager = new RemoteControlManager(this.telemetryManager); + this.brightScriptCommands = new BrightScriptCommands( + this.remoteControlManager, + this.whatsNewManager, + context, + activeDeviceManager + ); + + this.rtaManager = new RtaManager(); + this.webviewViewProviderManager = new WebviewViewProviderManager(context, this.rtaManager); + this.rtaManager.setWebviewViewProviderManager(this.webviewViewProviderManager); - var currentExtensionVersion = extensions.getExtension(EXTENSION_ID)?.packageJSON.version; //update the tracked version of the extension this.globalStateManager.lastRunExtensionVersion = currentExtensionVersion; - let activeDeviceManager = new ActiveDeviceManager(); const declarationProvider = new DeclarationProvider(); context.subscriptions.push(declarationProvider); //create channels this.outputChannel = vscode.window.createOutputChannel('BrightScript Log'); - this.sceneGraphDebugChannel = vscode.window.createOutputChannel('SceneGraph Debug Commands Log'); - this.debugServerOutputChannel = vscode.window.createOutputChannel('BrightScript Debug Server'); - this.debugServerOutputChannel.appendLine('Extension startup'); + this.sceneGraphDebugChannel = vscode.window.createOutputChannel('SceneGraph Debug Commands'); + this.extensionOutputChannel = util.createOutputChannel('BrightScript Extension', this.writeExtensionLog.bind(this)); + this.extensionOutputChannel.appendLine('Extension startup'); let docLinkProvider = new LogDocumentLinkProvider(); @@ -70,12 +96,21 @@ export class Extension { let languageServerPromise = languageServerManager.init(context, definitionRepo); - //register a tree data provider for this extension's "RENDEZVOUS" panel in the debug area + //register a tree data provider for this extension's "RENDEZVOUS" view in the debug area let rendezvousViewProvider = new RendezvousViewProvider(context); - vscode.window.registerTreeDataProvider('rendezvousView', rendezvousViewProvider); + vscode.window.registerTreeDataProvider(ViewProviderId.rendezvousView, rendezvousViewProvider); + + //register a tree data provider for this extension's "Online Devices" view + let onlineDevicesViewProvider = new OnlineDevicesViewProvider(context, activeDeviceManager); + vscode.window.registerTreeDataProvider(ViewProviderId.onlineDevicesView, onlineDevicesViewProvider); - context.subscriptions.push(vscode.commands.registerCommand('extension.brightscript.rendezvous.clearHistory', () => { - vscode.debug.activeDebugSession.customRequest('rendezvous.clearHistory'); + context.subscriptions.push(vscode.commands.registerCommand('extension.brightscript.rendezvous.clearHistory', async () => { + try { + await vscode.debug.activeDebugSession.customRequest('rendezvous.clearHistory'); + } catch { } + + //also clear the local rendezvous list + rendezvousViewProvider.clear(); })); context.subscriptions.push(vscode.commands.registerCommand('extension.brightscript.languageServer.restart', async () => { @@ -95,7 +130,7 @@ export class Extension { ); //register the debug configuration provider - let configProvider = new BrightScriptDebugConfigurationProvider(context, activeDeviceManager); + let configProvider = new BrightScriptDebugConfigurationProvider(context, activeDeviceManager, this.telemetryManager, this.extensionOutputChannel); context.subscriptions.push( vscode.debug.registerDebugConfigurationProvider('brightscript', configProvider) ); @@ -106,7 +141,7 @@ export class Extension { ); vscode.window.registerUriHandler({ - handleUri: async function(uri: vscode.Uri) { + handleUri: async (uri: vscode.Uri) => { if (uri.path.startsWith('/openFile/')) { let docUri = vscode.Uri.file(uri.path.substr(10)); let doc = await vscode.workspace.openTextDocument(docUri); @@ -114,7 +149,7 @@ export class Extension { let editor = vscode.window.activeTextEditor; let lineNumber = Number(uri.fragment) ? Number(uri.fragment) - 1 : 0; editor.selection = new vscode.Selection(lineNumber, 0, lineNumber, 0); - vscode.commands.executeCommand('revealLine', { + await vscode.commands.executeCommand('revealLine', { lineNumber: lineNumber, at: 'center' }); @@ -123,42 +158,12 @@ export class Extension { }); //give the launch config to the link provider any time we launch the app - vscode.debug.onDidReceiveDebugSessionCustomEvent(async (e) => { - if (e.event === 'BSLaunchStartEvent') { - const config: BrightScriptLaunchConfiguration = e.body; - docLinkProvider.setLaunchConfig(config); - logOutputManager.setLaunchConfig(config); - this.setupRDB(context, config); - //write debug server log statements to the DebugServer output channel - } else if (e.event === 'BSDebugServerLogOutputEvent') { - this.debugServerOutputChannel.appendLine(e.body); - - } else if (e.event === 'BSRendezvousEvent') { - rendezvousViewProvider.onDidReceiveDebugSessionCustomEvent(e); - - } else if (e.event === 'BSChanperfEvent') { - if (!e.body.error) { - this.chanperfStatusBar.text = `$(dashboard)cpu: ${e.body.cpu.total}%, mem: ${prettyBytes(e.body.memory.total).replace(/ /g, '')}`; - } else { - this.chanperfStatusBar.text = e.body.error.message; - } - - this.chanperfStatusBar.show(); - - } else if (!e.event) { - if (e.body[0]) { - // open the first file with a compile error - let uri = vscode.Uri.file(e.body[0].path); - let doc = await vscode.workspace.openTextDocument(uri); - let line = (e.body[0].lineNumber - 1 > -1) ? e.body[0].lineNumber - 1 : 0; - let range = new vscode.Range(new vscode.Position(line, 0), new vscode.Position(line, 0)); - await vscode.window.showTextDocument(doc, { preview: false, selection: range }); - } - } + vscode.debug.onDidReceiveDebugSessionCustomEvent((e) => { + return this.debugSessionCustomEventHandler(e, context, docLinkProvider, logOutputManager, rendezvousViewProvider); }); //register all commands for this extension - brightScriptCommands.registerCommands(context); + this.brightScriptCommands.registerCommands(); sceneGraphDebugCommands.registerCommands(context, this.sceneGraphDebugChannel); vscode.debug.onDidStartDebugSession((e) => { @@ -175,8 +180,8 @@ export class Extension { } }); - vscode.debug.onDidReceiveDebugSessionCustomEvent((e) => { - logOutputManager.onDidReceiveDebugSessionCustomEvent(e); + vscode.debug.onDidReceiveDebugSessionCustomEvent(async (e) => { + await logOutputManager.onDidReceiveDebugSessionCustomEvent(e); }); let brightscriptConfig = vscode.workspace.getConfiguration('brightscript'); @@ -198,98 +203,64 @@ export class Extension { const xmlSelector = { scheme: 'file', pattern: '**/*.{xml}' }; context.subscriptions.push(vscode.languages.registerDefinitionProvider(xmlSelector, new BrightScriptXmlDefinitionProvider(definitionRepo))); - this.showWelcomeOrWhatsNew(previousExtensionVersion, currentExtensionVersion); + await this.whatsNewManager.showWelcomeOrWhatsNewIfRequired(); await languageServerPromise; } - public async showWelcomeOrWhatsNew(lastRunExtensionVersion: string, currentExtensionVersion: string) { - let config = vscode.workspace.getConfiguration('brightscript'); - let isReleaseNotificationsEnabled = config.get('enableReleaseNotifications') === false ? false : true; - //this is the first launch of the extension - if (lastRunExtensionVersion === undefined) { - - //if release notifications are enabled - //TODO once we have the welcome page content prepared, remove the `&& false` from the condition below - if (isReleaseNotificationsEnabled && false) { - let viewText = 'View the get started guide'; - let response = await window.showInformationMessage( - 'Thank you for installing the BrightScript VSCode extension. Click the button below to read some tips on how to get the most out of this extension.', - viewText - ); - if (response === viewText) { - env.openExternal(vscode.Uri.parse('https://github.com/rokucommunity/vscode-brightscript-language/blob/master/Welcome.md')); - } + private async debugSessionCustomEventHandler(e: any, context: vscode.ExtensionContext, docLinkProvider: LogDocumentLinkProvider, logOutputManager: LogOutputManager, rendezvousViewProvider: RendezvousViewProvider) { + if (isLaunchStartEvent(e)) { + const config = e.body as BrightScriptLaunchConfiguration; + await docLinkProvider.setLaunchConfig(config); + logOutputManager.setLaunchConfig(config); + } else if (isChannelPublishedEvent(e)) { + this.webviewViewProviderManager.onChannelPublishedEvent(e); + //write debug server log statements to the DebugServer output channel + } else if (isDebugServerLogOutputEvent(e)) { + this.extensionOutputChannel.appendLine(e.body.line); + + } else if (isRendezvousEvent(e)) { + rendezvousViewProvider.onDidReceiveDebugSessionCustomEvent(e); + + } else if (isChanperfEvent(e)) { + if (!e.body.error) { + this.chanperfStatusBar.text = `$(dashboard)cpu: ${e.body.cpu.total}%, mem: ${prettyBytes(e.body.memory.total).replace(/ /g, '')}`; + } else { + this.chanperfStatusBar.text = e.body.error.message; } - this.globalStateManager.lastSeenReleaseNotesVersion = currentExtensionVersion; - return; - } - //List of version numbers that should prompt the ReleaseNotes page. - //these should be in highest-to-lowest order, because we will launch the highest version - let versionWhitelist = [ - '2.0.0' - ]; - for (let whitelistVersion of versionWhitelist) { - if ( - //if the current version is larger than the whitelist version - semverGte(whitelistVersion, lastRunExtensionVersion) && - //if the user hasn't seen this popup before - this.globalStateManager.lastSeenReleaseNotesVersion !== whitelistVersion && - //if ReleaseNote popups are enabled - isReleaseNotificationsEnabled - ) { - //mark this version as viewed - this.globalStateManager.lastSeenReleaseNotesVersion = whitelistVersion; - let viewText = 'View Release Notes'; - let response = await window.showInformationMessage( - `BrightScript Language v${whitelistVersion} includes significant changes from previous versions. Please take a moment to review the release notes.`, - viewText - ); - if (response === viewText) { - env.openExternal(vscode.Uri.parse(`https://github.com/rokucommunity/vscode-brightscript-language/blob/master/ReleaseNotes.md#${whitelistVersion}`)); - } - this.globalStateManager.lastSeenReleaseNotesVersion = currentExtensionVersion; + + this.chanperfStatusBar.show(); + + } else if (isDiagnosticsEvent(e)) { + const diagnostics = e.body?.diagnostics ?? []; + const firstDiagnostic = diagnostics[0]; + if (firstDiagnostic) { + // open the first file with a compile error + let uri = vscode.Uri.file(firstDiagnostic.path); + let doc = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(doc, { + preview: false, + selection: util.toRange(firstDiagnostic.range) + }); } } } - private setupODC(config: BrightScriptLaunchConfiguration) { - const rtaConfig: rta.ConfigOptions = { - RokuDevice: { - devices: [{ - host: config.host, - password: config.password - }] - }, - // uncomment for debugging - // OnDeviceComponent: { - // logLevel: 'verbose', - // serverDebugLogging: true - // } - }; - const device = new rta.RokuDevice(rtaConfig); - return new rta.OnDeviceComponent(device, rtaConfig); - } - - private setupRDB(context: vscode.ExtensionContext, config: BrightScriptLaunchConfiguration) { - // TODO handle case where user changes their Roku Device - if (!config.injectRdbOnDeviceComponent || this.odc) { - return; - } - this.odc = this.setupODC(config); - - for (const viewId in this.rdbViews) { - const view = this.rdbViews[viewId]; - view.provider = new view.class(context); - vscode.window.registerWebviewViewProvider(viewId, view.provider); - } - - for (const viewId in this.rdbViews) { - this.rdbViews[viewId].provider.setOnDeviceComponent(this.odc); + /** + * Writes text to a logfile if enabled + */ + private writeExtensionLog(text: string) { + let extensionLogfilePath = vscode.workspace.getConfiguration('brightscript').get('extensionLogfilePath'); + if (extensionLogfilePath) { + //replace the ${workspaceFolder} variable with the path to the first workspace + extensionLogfilePath = extensionLogfilePath.replace('${workspaceFolder}', vscode.workspace.workspaceFolders?.[0]?.uri.fsPath); + fsExtra.ensureDirSync( + path.dirname(extensionLogfilePath) + ); + fsExtra.appendFileSync(extensionLogfilePath, text); } } - } export const extension = new Extension(); -export function activate(context: vscode.ExtensionContext) { - extension.activate(context); +export async function activate(context: vscode.ExtensionContext) { + await extension.activate(context); } diff --git a/src/formatter.ts b/src/formatter.ts index bbd46d17..e5d32520 100644 --- a/src/formatter.ts +++ b/src/formatter.ts @@ -1,21 +1,22 @@ -import { Runner, Formatter as BrighterScriptFormatter, FormattingOptions } from 'brighterscript-formatter'; - -import { +import type { FormattingOptions } from 'brighterscript-formatter'; +import { Runner, Formatter as BrighterScriptFormatter } from 'brighterscript-formatter'; +import type { DocumentRangeFormattingEditProvider, + ProviderResult, + TextDocument +} from 'vscode'; +import { EndOfLine, Position, - ProviderResult, Range, - TextDocument, TextEdit, - window, workspace, + window, workspace } from 'vscode'; -import * as eol from 'eol'; -import * as vscode from 'vscode'; +import type * as vscode from 'vscode'; export class Formatter implements DocumentRangeFormattingEditProvider { - public provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: vscode.FormattingOptions): ProviderResult { + public async provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: vscode.FormattingOptions): Promise { //TODO is there anything we can to do to better detect when the same file is used in multiple workspaces? //vscode seems to pick the lowest workspace (or perhaps the last workspace?) @@ -43,11 +44,11 @@ export class Formatter implements DocumentRangeFormattingEditProvider { return edits; } catch (e) { - window.showErrorMessage(e.message, e.stack.split('\n')[0]); + await window.showErrorMessage(e.message, e.stack.split('\n')[0]); } } private getEditChunks(document: TextDocument, formattedText: string, range: Range) { - let lines = eol.split(formattedText); + let lines = formattedText?.split(/\r?\n/g); //make an edit per line of the doc let edits: TextEdit[] = []; for (let lineNumber = range.start.line; lineNumber <= range.end.line; lineNumber++) { diff --git a/src/grammar/brightscript.tmLanguage.spec.ts b/src/grammar/brightscript.tmLanguage.spec.ts new file mode 100644 index 00000000..c8325949 --- /dev/null +++ b/src/grammar/brightscript.tmLanguage.spec.ts @@ -0,0 +1,264 @@ +import { Cache } from 'brighterscript/dist/Cache'; +import { createRegistry, parseGrammarTestCase, runGrammarTestCase } from 'vscode-tmgrammar-test/dist/src/unit/index.js'; +import { getErrorResultText } from './grammerTestHelpers.spec'; +import { standardizePath as s } from 'brighterscript'; + +const brightscriptTmlanguagePath = s`${__dirname}/../../syntaxes/brightscript.tmLanguage.json`; + +describe('brightscript.tmlanguage.json', () => { + it('colors `continue for`', async () => { + await testGrammar(` + for i = 0 to 10 + continue for + '^^^ keyword.control.loop.brs + '^^^^^^^^ keyword.control.loop.brs + end for + `); + }); + + it('colors `continue while`', async () => { + await testGrammar(` + while true + continue while + '^^^^^ keyword.control.loop.brs + '^^^^^^^^ keyword.control.loop.brs + end for + `); + }); + + it('colors strings correctly', async () => { + await testGrammar(` + print "hello world", true + '^^^^ constant.language.boolean.true.brs + '^^^^^^^^^^^^^ string.quoted.double.brs + '^^^^^ keyword.control.brs + `); + }); + + it('colors strings with escape-looking slash correctly', async () => { + //FYI, the escaped backslash char makes the positions weird in this test. + await testGrammar(` + print "hello world\\", true + '^^^^ constant.language.boolean.true.brs + '^^^^^^^^^^^^^^ string.quoted.double.brs + '^^^^^ keyword.control.brs + `); + }); + + it('uses proper color for variable named `component`', async () => { + await testGrammar(` + sub main() + for each component in [] + '^^ keyword.control.brs + '^^^^^^^^^ entity.name.variable.local.brs + '^^^^ keyword.control.brs + '^^^ keyword.control.brs + end for + end sub + `); + }); + + it('allows 0+ space after import keyword', async () => { + await testGrammar(` + import"something.brs" + ' ^^^^^^^^^^^^^^^ string.quoted.double.brs + '^^^^^^ keyword.control.import.brs + import "something.brs" + ' ^^^^^^^^^^^^^^^ string.quoted.double.brs + '^^^^^^ keyword.control.import.brs + import "something.brs" + ' ^^^^^^^^^^^^^^^ string.quoted.double.brs + '^^^^^^ keyword.control.import.brs + `); + }); + + it('matches functions and properties in a chain', async () => { + await testGrammar(` + m.a().beta().c.delta = true + ' ^^^^^ variable.other.object.property.brs + ' ^ variable.other.object.property.brs + ' ^^^^ entity.name.function.brs + ' ^ entity.name.function.brs + '^ keyword.other.this.brs + `); + }); + + it('colors the const keyword', async () => { + await testGrammar(` + const API_KEY = true + ' ^^^^ constant.language.boolean.true.brs + ' ^ keyword.operator.brs + ' ^^^^^^^ entity.name.variable.local.brs + '^^^^^ storage.type.brs + namespace Name.Space + const API_URL = "u/r/l" + ' ^^^^^^^ string.quoted.double.brs + ' ^ keyword.operator.brs + ' ^^^^^^^ entity.name.variable.local.brs + '^^^^^ storage.type.brs + end namespace + `); + }); + + it('bool assignment', async () => { + await testGrammar(` + thing = true + ' ^^^^ constant.language.boolean.true.brs + ' ^ keyword.operator.brs + '^^^^^ entity.name.variable.local.brs + `); + }); + + it('component statements', async () => { + await testGrammar(` + component MyButton + ' ^^^^^^^^ entity.name.type.component.brs + '^^^^^^^^^ storage.type.component.brs + end component + '^^^^^^^^^^^^^ storage.type.component.brs + + component MyButton extends Button + ' ^^^^^^ entity.name.type.component.brs + ' ^^^^^^^ storage.modifier.extends.brs + ' ^^^^^^^^ entity.name.type.component.brs + '^^^^^^^^^ storage.type.component.brs + end component + + component "MyButton" extends "Button" + ' ^^^^^^^^ string.quoted.double.brs + ' ^^^^^^^ storage.modifier.extends.brs + ' ^^^^^^^^^^ string.quoted.double.brs + '^^^^^^^^^ storage.type.component.brs + end component + `); + }); + + it('highlights regex literals', async () => { + await testGrammar(` + /test(?>something)(?|asdf)/gmixsuXUAJ + ' ^^^^^^^^^^ string.regexp.brs keyword.other.brs + ' ^ string.regexp.brs punctuation.definition.string.end.brs + ' ^ meta.group.assertion.regexp + ' ^^^^ meta.group.assertion.regexp + ' ^^ meta.assertion.look-behind.regexp + ' ^ meta.group.assertion.regexp + ' ^ meta.group.regexp + ' ^^^^^^^^^ string.regexp.brs meta.group.regexp + ' ^^ punctuation.definition.group.no-capture.regexp + ' ^ meta.group.regexp + '^^^^^ string.regexp.brs + `); + }); + + it('handles comments following interface fields', async () => { + await testGrammar(` + interface Person + name as string 'this is a comment + ' ^^^^^^^^^^^^^^^^^^ punctuation.definition.comment.brs + ' ^^^^^^ storage.type.brs + ' ^^ keyword.control.as.brs + '^^ variable.object.property.brs + + name as string + ' ^^^^^^ storage.type.brs + ' ^^ keyword.control.as.brs + '^^ variable.object.property.brs + `); + }); + + it('handles interface function with return type', async () => { + await testGrammar(` + interface Person + sub test() as string 'this is a comment + ' ^^^^^^^^^^^^^^^^^ punctuation.definition.comment.brs + ' ^^^^^^ storage.type.brs + ' ^^ keyword.control.as.brs + ' ^ punctuation.definition.parameters.end.brs + ' ^ punctuation.definition.parameters.begin.brs + ' ^^^^ entity.name.function.member.brs + '^^^ storage.type.function.brs + `); + }); + + it.skip('handles `as Function` parameters properly', async () => { + await testGrammar(` + function getStyle(builderFunc as Function, processorFunc as Function) as object + ' ^ punctuation.definition.parameters.end.brs + ' ^^^^^^^^ entity.name.type.brs + ' ^^^^^^^^^^^^^ variable.parameter.brs + ' ^^^^^^^^ entity.name.type.brs + ' ^^ keyword.control.as.brs + ' ^^^^^^^^^^^ variable.parameter.brs + ' ^ punctuation.definition.parameters.begin.brs + ' ^^^^^^^ entity.name.function.brs + '^^^^^^^^ storage.type.function.brs + + end function + '^^^^^^^^^^^^ storage.type.function.brs + `); + }); + + it.skip('handles `anonymous functions` parameters properly', async () => { + await testGrammar(` + sub main() + callback = function(builderFunc as Function) + ' ^^^^^^^^ entity.name.type.brs + ' ^^ keyword.control.as.brs + ' ^^^^^^^^^^^ variable.parameter.brs + ' ^^^^^^^^ storage.type.function.brs + '^^^^^^^^ entity.name.variable.local.brs + + end function + '^^^^^^^^^^^^ storage.type.function.brs + end sub + `); + }); + + it.skip('handles various function declarations', async () => { + await testGrammar(` + sub write() + ' ^ punctuation.definition.parameters.end.brs + ' ^ punctuation.definition.parameters.begin.brs + ' ^^^^^ entity.name.function.brs + '^^^ storage.type.function.brs + + end sub + '^^^^^^^ storage.type.function.brs + `); + }); + + it.skip('colorizes class fields properly', async () => { + //TODO the properties have the wrong scope...this should get fixed when we improve the class textmate scope flow + await testGrammar(` + class Person + firstName + '^^^^^^^^^ entity.name.variable.local.brs + + lastName as string + ' ^^^^^^ support.type.primitive.brs + ' ^^ keyword.control.as.brs + '^^^^^^^^ entity.name.variable.local.brs + + age as integer + ' ^^ keyword.control.as.brs + '^^^ entity.name.variable.local.brs + end class + `); + }); +}); + +const registries = new Cache(); +async function testGrammar(testCaseText: string) { + testCaseText = `' SYNTAX TEST "source.brs" +AllowMiddleLineAssertions` + testCaseText; + const registry = registries.getOrAdd(brightscriptTmlanguagePath, () => { + const registry = createRegistry([brightscriptTmlanguagePath]); + return registry; + }); + const testCase = parseGrammarTestCase(testCaseText); + + const result = await runGrammarTestCase(registry, testCase); + if (result.length > 0) { + const text = getErrorResultText('test.brs', testCase, result); + throw new Error(`\nFound ${result.length} issues with grammar:\n${text}`); + } +} diff --git a/src/grammar/grammerTestHelpers.spec.ts b/src/grammar/grammerTestHelpers.spec.ts new file mode 100644 index 00000000..4ba48f9f --- /dev/null +++ b/src/grammar/grammerTestHelpers.spec.ts @@ -0,0 +1,76 @@ +/** + * Adapted from https://github.com/PanAeon/vscode-tmgrammar-test/blob/master/src/unit.ts to simplify grammar testing + */ +import * as chalk from 'chalk'; +import { EOL } from 'os'; +import type { GrammarTestCase, TestFailure } from 'vscode-tmgrammar-test/dist/src/unit/index'; + +let terminalWidth = 75; +const Padding = ' '; + +function getSourceLine(testCase: GrammarTestCase, failure: TestFailure) { + const line = testCase.source[failure.srcLine]; + const pos = failure.line + 1 + ': '; + const accents = ' '.repeat(failure.start) + '^'.repeat(failure.end - failure.start); + + const termWidth = terminalWidth - pos.length - Padding.length - 5; + + const trimLeft = failure.end > termWidth ? Math.max(0, failure.start - 8) : 0; + + const line1 = line.substr(trimLeft); + const accents1 = accents.substr(trimLeft); + + return [ + Padding + chalk.gray(pos) + line1.substr(0, termWidth), + Padding + ' '.repeat(pos.length) + accents1.substr(0, termWidth) + ].join(EOL); +} + +function getReason(testCase: GrammarTestCase, failure: TestFailure) { + const result = []; + if (failure.missing && failure.missing.length > 0) { + result.push([ + chalk.red(Padding + 'missing required scopes: ') + + chalk.gray(failure.missing.join(' ')) + ].join('')); + } + if (failure.unexpected && failure.unexpected.length > 0) { + result.push([ + chalk.red(Padding + 'prohibited scopes: ') + + chalk.gray(failure.unexpected.join(' ')) + ].join('')); + } + if (failure.actual !== undefined) { + result.push( + chalk.red(Padding + 'actual: ') + chalk.gray(failure.actual.join(' ')) + ); + } + return result.join(EOL); +} + +function getCorrectedOffsets( + failure: TestFailure +): { l: number; s: number; e: number } { + return { + l: failure.line + 1, + s: failure.start + 1, + e: failure.end + 1 + }; +} + +export function getErrorResultText( + filename: string, + testCase: GrammarTestCase, + failures: TestFailure[] +): string { + if (failures.length > 0) { + return failures.map((failure) => { + const { l, s, e } = getCorrectedOffsets(failure); + return [ + `${Padding}at [${chalk.whiteBright(`${filename}:${l}:${s}:${e}`)}]:`, + getSourceLine(testCase, failure), + getReason(testCase, failure) + ].join(EOL); + }).join(EOL + EOL); + } +} diff --git a/src/icons.ts b/src/icons.ts new file mode 100644 index 00000000..68cb7137 --- /dev/null +++ b/src/icons.ts @@ -0,0 +1,15 @@ +import * as vscode from 'vscode'; +export const icons = { + streamingStick: { + light: vscode.Uri.file(`${__dirname}/../images/icons/streaming-stick-light.svg`), + dark: vscode.Uri.file(`${__dirname}/../images/icons/streaming-stick-dark.svg`) + }, + tv: { + light: vscode.Uri.file(`${__dirname}/../images/icons/tv-light.svg`), + dark: vscode.Uri.file(`${__dirname}/../images/icons/tv-dark.svg`) + }, + setTopBox: { + light: vscode.Uri.file(`${__dirname}/../images/icons/set-top-box-light.svg`), + dark: vscode.Uri.file(`${__dirname}/../images/icons/set-top-box-dark.svg`) + } +}; diff --git a/src/managers/RemoteControlManager.ts b/src/managers/RemoteControlManager.ts new file mode 100644 index 00000000..04c764e3 --- /dev/null +++ b/src/managers/RemoteControlManager.ts @@ -0,0 +1,125 @@ +import * as vscode from 'vscode'; +import { vscodeContextManager } from './VscodeContextManager'; +import type { TelemetryManager } from './TelemetryManager'; + +export class RemoteControlManager { + constructor( + private telemetryManager: TelemetryManager + ) { + this.remoteControlStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right); + void this.setRemoteControlMode(this.isEnabled, undefined); + + //keep the user's button flashing preference in sync + vscode.workspace.onDidChangeConfiguration(() => { + this.loadIsFlasherAllowedByUser(); + }); + this.loadIsFlasherAllowedByUser(); + } + + private loadIsFlasherAllowedByUser() { + this.isFlasherAllowedByUser = vscode.workspace.getConfiguration('brightscript')?.get('remoteControlMode.enableActiveAnimation') ?? true; + } + + private isEnabled = false; + + private isFlasherAllowedByUser: boolean; + + private colors = { + default: { + color: undefined, + backgroundColor: undefined + }, + primary: { + color: new vscode.ThemeColor( + 'statusBarItem.errorForeground' + ), + backgroundColor: new vscode.ThemeColor( + 'statusBarItem.errorBackground' + ) + }, + secondary: { + color: new vscode.ThemeColor( + 'statusBarItem.warningForeground' + ), + backgroundColor: new vscode.ThemeColor( + 'statusBarItem.warningBackground' + ) + } + }; + + private remoteControlStatusBarItem: vscode.StatusBarItem; + + public async toggleRemoteControlMode(initiator: RemoteControlModeInitiator) { + const currentMode = vscodeContextManager.get('brightscript.isRemoteControlMode', false); + await this.setRemoteControlMode(!currentMode, initiator); + + //remove focus from statusbar item after clicking + if (initiator === 'statusbar') { + //focus the active text editor (if there is one) + if (vscode.window.activeTextEditor?.document) { + await vscode.window.showTextDocument(vscode.window.activeTextEditor.document); + + //there's no active text editor. Move focus away from the statusbar item (somehow) + } else { + //focus the next editor group, then the previous editor group. + //This is safe to call when there are no editor groups, so it's a good way to remove focus from the statusbar item + await vscode.commands.executeCommand('workbench.action.focusNextGroup'); + await vscode.commands.executeCommand('workbench.action.focusPreviousGroup'); + } + } + } + + public async setRemoteControlMode(isEnabled: boolean, initiator: RemoteControlModeInitiator) { + //only send a telemetry event if we know who initiated the mode. `undefined` usually means our internal system set the value...so don't track that + if (initiator) { + this.telemetryManager.sendSetRemoteControlModeEvent(isEnabled, initiator); + } + await vscodeContextManager.set('brightscript.isRemoteControlMode', isEnabled); + const currentState = isEnabled ? 'enabled' : 'disabled'; + this.remoteControlStatusBarItem.text = `$(radio-tower) Remote: ${currentState} `; + //set the initial statusbar colors + Object.assign(this.remoteControlStatusBarItem, this.colors.default); + this.remoteControlStatusBarItem.command = { + title: 'Toggle Remote Control Mode', + command: 'extension.brightscript.toggleRemoteControlMode', + arguments: ['statusbar'] + }; + this.remoteControlStatusBarItem.tooltip = `Roku remote control mode is: ${currentState}`; + this.remoteControlStatusBarItem.show(); + this.isEnabled = isEnabled; + if (this.isEnabled) { + this.enableFlasher(); + } else { + this.disableFlasher?.(); + } + } + + private disableFlasher: () => void; + public enableFlasher() { + if (!this.disableFlasher) { + let colorKey = 'primary'; + + const toggleStatusbarColors = () => { + colorKey = colorKey === 'primary' ? 'secondary' : 'primary'; + Object.assign(this.remoteControlStatusBarItem, this.colors[colorKey]); + }; + + toggleStatusbarColors(); + + const handle = setInterval(() => { + if (this.isFlasherAllowedByUser) { + toggleStatusbarColors(); + } + }, 500); + + this.disableFlasher = () => { + clearInterval(handle); + Object.assign(this.remoteControlStatusBarItem, this.colors.default); + // this.remoteControlStatusBarItem.hide(); + delete this.disableFlasher; + }; + } + } +} + +export type RemoteControlModeInitiator = 'statusbar' | 'command'; diff --git a/src/managers/RtaManager.ts b/src/managers/RtaManager.ts new file mode 100644 index 00000000..49c37fe9 --- /dev/null +++ b/src/managers/RtaManager.ts @@ -0,0 +1,98 @@ +import * as rta from 'roku-test-automation'; +import { ViewProviderEvent } from '../viewProviders/ViewProviderEvent'; +import { ViewProviderId } from '../viewProviders/ViewProviderId'; +import { vscodeContextManager } from './VscodeContextManager'; +import type { WebviewViewProviderManager } from './WebviewViewProviderManager'; + +export class RtaManager { + public onDeviceComponent?: rta.OnDeviceComponent; + public device?: rta.RokuDevice; + + private webviewViewProviderManager?: WebviewViewProviderManager; + private lastStoreNodesResponse: Awaited>; + + public setupRtaWithConfig(config: { host: string; password: string; logLevel?: string; disableScreenSaver?: boolean; injectRdbOnDeviceComponent?: boolean }) { + const enableDebugging = ['info', 'debug', 'trace'].includes(config.logLevel); + rta.odc.setConfig({ + RokuDevice: { + devices: [{ + host: config.host, + password: config.password + }] + }, + OnDeviceComponent: { + logLevel: enableDebugging ? 'verbose' : undefined, + clientDebugLogging: enableDebugging, + disableTelnet: true, + disableCallOriginationLine: true + } + }); + + this.device = rta.device; + + if (config.injectRdbOnDeviceComponent) { + this.onDeviceComponent = rta.odc; + } else { + void this.onDeviceComponent?.shutdown(); + this.onDeviceComponent = undefined; + } + void vscodeContextManager.set('brightscript.isOnDeviceComponentAvailable', !!this.onDeviceComponent); + + for (const webviewProvider of this.webviewViewProviderManager.getWebviewViewProviders()) { + if (typeof webviewProvider.updateDeviceAvailability === 'function') { + webviewProvider.updateDeviceAvailability(); + } + } + + if (config.disableScreenSaver) { + void this.onDeviceComponent?.disableScreenSaver({ disableScreensaver: true }); + } + } + + public async sendOdcRequest(requestorId: string, command: string, context: { args: any; options: any }) { + const { args, options } = context; + + if (command === rta.RequestType.findNodesAtLocation) { + if (!this.lastStoreNodesResponse) { + args.includeBoundingRectInfo = true; + await this.sendOdcRequest(requestorId, rta.RequestType.storeNodeReferences, args); + } + context.args.nodeTreeResponse = this.lastStoreNodesResponse; + let { matches } = await rta.odc.findNodesAtLocation(args, options); + if (requestorId === ViewProviderId.rokuDeviceView) { + if (matches.length) { + const match = { ...matches[0] }; + // Remove children as this is where most of the payload is and we don't need this info + match.children = []; + matches = [match]; + } + } + return { + matches: matches + }; + } else if (command === rta.RequestType.storeNodeReferences) { + this.lastStoreNodesResponse = await rta.odc.storeNodeReferences(args, options); + + const viewIds = []; + if (requestorId === ViewProviderId.rokuDeviceView) { + viewIds.push(ViewProviderId.sceneGraphInspectorView); + } else if (requestorId === ViewProviderId.sceneGraphInspectorView) { + viewIds.push(ViewProviderId.rokuDeviceView); + } + this.webviewViewProviderManager.sendMessageToWebviews(viewIds, { + event: ViewProviderEvent.onStoredNodeReferencesUpdated + }); + return this.lastStoreNodesResponse; + } else { + return this.onDeviceComponent[command](args, options); + } + } + + public setWebviewViewProviderManager(manager: WebviewViewProviderManager) { + this.webviewViewProviderManager = manager; + } + + public getStoredNodeReferences() { + return this.lastStoreNodesResponse; + } +} diff --git a/src/managers/TelemetryManager.ts b/src/managers/TelemetryManager.ts new file mode 100644 index 00000000..64fa20eb --- /dev/null +++ b/src/managers/TelemetryManager.ts @@ -0,0 +1,74 @@ +import TelemetryReporter from '@vscode/extension-telemetry'; +import type { Disposable } from 'vscode'; +import type { BrightScriptLaunchConfiguration } from '../DebugConfigurationProvider'; +import type { RemoteControlModeInitiator } from './RemoteControlManager'; +import * as vscode from 'vscode'; + +const APP_INSIGHTS_KEY = '8618f206-4732-4729-88ed-d07dcf17f199'; + +export class TelemetryManager implements Disposable { + public constructor( + public options: { + extensionId: string; + extensionVersion: string; + applicationInsightsKey?: string; + } + ) { + this.reporter = new TelemetryReporter(this.options.extensionId, this.options.extensionVersion, this.options.applicationInsightsKey ?? APP_INSIGHTS_KEY); + } + + public dispose() { + return this.reporter.dispose(); + } + + /** + * The extension has first started up + */ + public sendStartupEvent() { + this.reporter.sendTelemetryEvent('startup'); + } + + /** + * Track when a debug session has been started + */ + public sendStartDebugSessionEvent(event: BrightScriptLaunchConfiguration & { preLaunchTask: string }) { + this.reporter.sendTelemetryEvent('startDebugSession', { + enableDebugProtocol: boolToString(event.enableDebugProtocol), + retainDeploymentArchive: boolToString(event.retainDeploymentArchive), + retainStagingFolder: boolToString(event.retainStagingFolder), + injectRaleTrackerTask: boolToString(event.injectRaleTrackerTask), + isFilesDefined: isDefined(event.files), + isPreLaunchTaskDefined: isDefined(event.preLaunchTask), + isComponentLibrariesDefined: isDefined(event.componentLibraries), + isDeepLinkUrlDefined: isDefined(event.deepLinkUrl), + isStagingFolderPathDefined: isDefined(event.stagingFolderPath), + isLogfilePathDefined: isDefined(event.logfilePath), + isExtensionLogfilePathDefined: isDefined( + vscode.workspace.getConfiguration('brightscript').get('extensionLogfilePath') + ) + }); + } + + /** + * Track when remoteControlMode has been enabled or disabled (we don't track WHAT users send, only that they're enabling/disabling the feature) + * @param enabled is the remoteControlMode being enabled or disabled + * @param initiator who triggered this event. 'statusbar' is when the user clicks the "toggle remote mode" in the statusbar. + * "command" is when it's triggered directly from a vscode command + */ + public sendSetRemoteControlModeEvent(isEnabled: boolean, initiator: RemoteControlModeInitiator) { + this.reporter.sendTelemetryEvent('setRemoteControlMode', { + isEnabled: boolToString(isEnabled), + initiator: initiator + }); + } + + private reporter: TelemetryReporter; +} + +function boolToString(value: boolean | undefined) { + return value?.toString() ?? 'undefined'; +} + +function isDefined(value: any) { + return value ? 'true' : 'false'; +} diff --git a/src/managers/VscodeContextManager.ts b/src/managers/VscodeContextManager.ts new file mode 100644 index 00000000..37bf42e3 --- /dev/null +++ b/src/managers/VscodeContextManager.ts @@ -0,0 +1,27 @@ +import * as vscode from 'vscode'; + +type ContextValue = boolean | string; + +/** + * Wrapper around VS Code's `setContext`. + * The API call can take up to several seconds to complete, + * so let's cache the values and only call the API when necessary. + */ +class VSCodeContextManager { + private readonly cache = new Map(); + + public async set(key: string, value: ContextValue): Promise { + const prev = this.get(key); + if (prev !== value) { + // Logger.get('vscode-context').debug(`Setting key='${key}' to value='${value}'`); + this.cache.set(key, value); + await vscode.commands.executeCommand('setContext', key, value); + } + } + + public get(key: string, defaultValue?: T): T | undefined { + return this.cache.get(key) as T ?? defaultValue; + } +} + +export const vscodeContextManager = new VSCodeContextManager(); diff --git a/src/managers/WebviewViewProviderManager.spec.ts b/src/managers/WebviewViewProviderManager.spec.ts new file mode 100644 index 00000000..907bc143 --- /dev/null +++ b/src/managers/WebviewViewProviderManager.spec.ts @@ -0,0 +1,94 @@ +import { expect } from 'chai'; +import { createSandbox } from 'sinon'; +import { vscode } from '../mockVscode.spec'; +import type { BrightScriptLaunchConfiguration } from '../DebugConfigurationProvider'; +import { WebviewViewProviderManager } from './WebviewViewProviderManager'; +import { RtaManager } from './RtaManager'; + + +const sinon = createSandbox(); + +describe('WebviewViewProviderManager', () => { + let context: any; + + const config = {} as BrightScriptLaunchConfiguration; + let webviewViewProviderManager: WebviewViewProviderManager; + let rtaManager: RtaManager; + + before(() => { + context = { + ...vscode.context, + extensionPath: '', + subscriptions: [], + asAbsolutePath: () => { }, + globalState: { + get: () => { + + }, + update: () => { + + } + } + }; + + config.host = '86.75.30.9'; + config.password = 'jenny'; + + }); + + afterEach(() => { + sinon.restore(); + }); + + + describe('constructor', () => { + let spy; + before(() => { + spy = sinon.spy(vscode.window, 'registerWebviewViewProvider'); + rtaManager = new RtaManager(); + webviewViewProviderManager = new WebviewViewProviderManager(context, rtaManager); + }); + + it('initializes webview providers and calls registerWebviewViewProvider for each', () => { + expect(spy.callCount).to.equal(webviewViewProviderManager.getWebviewViewProviders().length); + }); + + it('assigns RtaManager to each webviewViewProvider', () => { + for (const webviewViewProvider of webviewViewProviderManager.getWebviewViewProviders()) { + expect(webviewViewProvider['rtaManager']).to.equal(rtaManager); + } + expect(spy.callCount).to.equal(webviewViewProviderManager.getWebviewViewProviders().length); + }); + }); + + + describe('onChannelPublishedEvent', () => { + let event: any; + + before(() => { + event = { + event: 'ChannelPublishedEvent', + body: { + launchConfiguration: config + } + }; + + rtaManager = new RtaManager(); + webviewViewProviderManager = new WebviewViewProviderManager(context, rtaManager); + rtaManager.setWebviewViewProviderManager(webviewViewProviderManager); + }); + + it('calls setupRtaWithConfig', () => { + const spy = sinon.stub(rtaManager, 'setupRtaWithConfig').returns(undefined); + webviewViewProviderManager.onChannelPublishedEvent(event); + expect(spy.calledOnce).to.be.true; + }); + + it('has the correct config values passed from the extension', () => { + webviewViewProviderManager.onChannelPublishedEvent(event); + const deviceConfig = rtaManager.device.getCurrentDeviceConfig(); + expect(deviceConfig.host).to.equal(config.host); + expect(deviceConfig.password).to.equal(config.password); + }); + }); +}); diff --git a/src/managers/WebviewViewProviderManager.ts b/src/managers/WebviewViewProviderManager.ts new file mode 100644 index 00000000..5bec92b4 --- /dev/null +++ b/src/managers/WebviewViewProviderManager.ts @@ -0,0 +1,71 @@ +import type { ChannelPublishedEvent } from 'roku-debug'; +import type { BrightScriptLaunchConfiguration } from '../DebugConfigurationProvider'; +import type { RtaManager } from './RtaManager'; +import * as vscode from 'vscode'; +import { RokuCommandsViewProvider } from '../viewProviders/RokuCommandsViewProvider'; +import { RokuDeviceViewViewProvider } from '../viewProviders/RokuDeviceViewViewProvider'; +import { RokuRegistryViewProvider } from '../viewProviders/RokuRegistryViewProvider'; +import { SceneGraphInspectorViewProvider } from '../viewProviders/SceneGraphInspectorViewProvider'; + + +export class WebviewViewProviderManager { + constructor(context: vscode.ExtensionContext, rtaManager: RtaManager) { + this.rtaManager = rtaManager; + + for (const webview of this.webviewViews) { + if (!webview.provider) { + webview.provider = new webview.constructor(context); + vscode.window.registerWebviewViewProvider(webview.provider.id, webview.provider); + + webview.provider.setWebviewViewProviderManager(this); + + if (typeof webview.provider.setRtaManager === 'function') { + webview.provider.setRtaManager(this.rtaManager); + } + } + } + } + + private rtaManager?: RtaManager; + + private webviewViews = [{ + constructor: SceneGraphInspectorViewProvider, + provider: undefined as SceneGraphInspectorViewProvider + }, { + constructor: RokuRegistryViewProvider, + provider: undefined as RokuRegistryViewProvider + }, { + constructor: RokuCommandsViewProvider, + provider: undefined as RokuCommandsViewProvider + }, { + constructor: RokuDeviceViewViewProvider, + provider: undefined as RokuDeviceViewViewProvider + }]; + + public getWebviewViewProviders() { + const providers = []; + for (const webview of this.webviewViews) { + providers.push(webview.provider); + } + return providers; + } + + // Notification from extension + public onChannelPublishedEvent(e: ChannelPublishedEvent) { + const config = e.body.launchConfiguration as BrightScriptLaunchConfiguration; + this.rtaManager.setupRtaWithConfig(config); + } + + // Mainly for communicating between webviews + public sendMessageToWebviews(viewIds: string | string[], message) { + if (typeof viewIds === 'string') { + viewIds = [viewIds]; + } + + for (const webviewView of this.webviewViews) { + if (viewIds.includes(webviewView.provider.id)) { + webviewView.provider.postOrQueueMessage(message); + } + } + } +} diff --git a/src/managers/WhatsNewManager.spec.ts b/src/managers/WhatsNewManager.spec.ts new file mode 100644 index 00000000..41626775 --- /dev/null +++ b/src/managers/WhatsNewManager.spec.ts @@ -0,0 +1,25 @@ +import { expect } from 'chai'; +import * as semver from 'semver'; +import { createSandbox } from 'sinon'; +import { GlobalStateManager } from '../GlobalStateManager'; +import { vscode } from '../mockVscode.spec'; +import { WhatsNewManager } from './WhatsNewManager'; + +const sinon = createSandbox(); + +describe('WhatsNewManager', () => { + let whatsNewManager: WhatsNewManager; + let globalStateManager: GlobalStateManager; + + beforeEach(() => { + globalStateManager = new GlobalStateManager(vscode.context); + whatsNewManager = new WhatsNewManager(globalStateManager, '0.0.0'); + }); + + it('notableReleaseVersions is always in highest-to-lowest order', () => { + let versions = [...whatsNewManager['notableReleaseVersions']].sort((a, b) => { + return semver.lt(a, b) ? 1 : -1; + }); + expect(whatsNewManager['notableReleaseVersions']).to.eql([...new Set(versions)]); + }); +}); diff --git a/src/managers/WhatsNewManager.ts b/src/managers/WhatsNewManager.ts new file mode 100644 index 00000000..8c63e7d6 --- /dev/null +++ b/src/managers/WhatsNewManager.ts @@ -0,0 +1,102 @@ +import { env, window } from 'vscode'; +import { gte as semverGte } from 'semver'; +import * as vscode from 'vscode'; +import type { GlobalStateManager } from '../GlobalStateManager'; + +const FILE_SCHEME = 'bs-whatsNew'; + +export class WhatsNewManager { + constructor( + private globalStateManager: GlobalStateManager, + private currentVersion: string + ) { + this.previousExtensionVersion = this.globalStateManager.lastRunExtensionVersion; + + vscode.workspace.registerTextDocumentContentProvider(FILE_SCHEME, { + provideTextDocumentContent: async (uri: vscode.Uri): Promise => { + let doc = await vscode.workspace.openTextDocument(uri.with({ scheme: 'file' })); + + let contents = doc.getText(); + contents += [ + `\n\n## Past notable releases`, + `For past releases please see our [Release Notes](https://rokucommunity.github.io/vscode-brightscript-language/release-notes/index.html) page on our documentation website. For a comprehensive list`, + `of all changes for each version see [CHANGELOG.md](https://github.com/rokucommunity/vscode-brightscript-language/blob/master/CHANGELOG.md).\n` + ].join('\n'); + return contents; + } + }); + } + + private previousExtensionVersion: string; + + /** + * List of version numbers that should prompt the ReleaseNotes page. + * these should be in highest-to-lowest order, because we will launch the highest version + */ + private notableReleaseVersions = [ + '2.31.0', + '2.0.0' + ]; + + public async showWelcomeOrWhatsNewIfRequired() { + let config = vscode.workspace.getConfiguration('brightscript'); + let isReleaseNotificationsEnabled = config.get('enableReleaseNotifications') === false ? false : true; + //this is the first launch of the extension + if (this.previousExtensionVersion === undefined) { + + //if release notifications are enabled + //TODO once we have the welcome page content prepared, remove the `&& false` from the condition below + if (isReleaseNotificationsEnabled && false) { + let viewText = 'View the get started guide'; + let response = await window.showInformationMessage( + 'Thank you for installing the BrightScript VSCode extension. Click the button below to read some tips on how to get the most out of this extension.', + viewText + ); + if (response === viewText) { + void env.openExternal(vscode.Uri.parse('https://github.com/rokucommunity/vscode-brightscript-language/blob/master/Welcome.md')); + } + } + this.globalStateManager.lastSeenReleaseNotesVersion = this.currentVersion; + return; + } + + //uncomment the following line to test the WhatsNew popup + // this.globalStateManager.lastSeenReleaseNotesVersion = '0.0.0'; + for (let releaseVersion of this.notableReleaseVersions) { + if ( + //if the current version is larger than the whitelist version + semverGte(releaseVersion, this.previousExtensionVersion) && + //if the user hasn't seen this popup before + this.globalStateManager.lastSeenReleaseNotesVersion !== releaseVersion && + //if ReleaseNote popups are enabled + isReleaseNotificationsEnabled + ) { + //mark this version as viewed + this.globalStateManager.lastSeenReleaseNotesVersion = releaseVersion; + let viewText = 'Release Notes'; + let viewOnWebText = 'View On Github'; + let response = await window.showInformationMessage( + `BrightScript Language v${releaseVersion} includes significant changes from previous versions. Please take a moment to review the release notes.`, + viewText, + viewOnWebText + ); + if (response === viewText) { + this.showReleaseNotes(releaseVersion); + } else if (response === viewOnWebText) { + void env.openExternal(vscode.Uri.parse(`https://github.com/rokucommunity/vscode-brightscript-language/blob/master/release-notes/v${releaseVersion}.md`)); + } + this.globalStateManager.lastSeenReleaseNotesVersion = this.currentVersion; + } + } + } + + public showReleaseNotes(version: string = this.notableReleaseVersions[0]) { + if (this.notableReleaseVersions.includes(version)) { + let uri = vscode.Uri.file(`${__dirname}/../../docs/release-notes/v${version}.md`); + uri = uri.with({ scheme: FILE_SCHEME }); + void vscode.commands.executeCommand('markdown.showPreview', uri, { sideBySide: false }); + } else { + console.error(`WhatsNewManager.showReleaseNotes: Unknown version: ${version}`); + } + } +} diff --git a/src/mockVscode.spec.ts b/src/mockVscode.spec.ts index 00e346cf..27115bdf 100644 --- a/src/mockVscode.spec.ts +++ b/src/mockVscode.spec.ts @@ -1,25 +1,35 @@ -import type { Command, Range, TreeDataProvider, TreeItemCollapsibleState, Uri, WorkspaceFolder, ConfigurationScope, ExtensionContext } from 'vscode'; +import type { Command, Range, TreeDataProvider, TreeItemCollapsibleState, Uri, WorkspaceFolder, ConfigurationScope, ExtensionContext, WorkspaceConfiguration, OutputChannel } from 'vscode'; afterEach(() => { delete vscode.workspace.workspaceFile; delete vscode.workspace._configuration; + vscode.context.globalState['_data'] = {}; }); export let vscode = { + env: { + //disable all telemetry reporting during unit tests + telemetryConfiguration: { + isUsageEnabled: false, + isErrorsEnabled: false, + isCrashEnabled: false + } + }, CompletionItem: class { }, CodeLens: class { }, CodeAction: class { }, Diagnostic: class { }, - CallHierarchyItem: class {}, + CallHierarchyItem: class { }, StatusBarAlignment: { Left: 1, Right: 2 }, extensions: { getExtension: () => { + let packageContents = require('../package.json'); return { packageJSON: { - version: undefined + ...packageContents } }; } @@ -28,7 +38,7 @@ export let vscode = { registerDebugConfigurationProvider: () => { }, onDidStartDebugSession: () => { }, onDidTerminateDebugSession: () => { }, - onDidReceiveDebugSessionCustomEvent: () => { }, + onDidReceiveDebugSessionCustomEvent: () => { } }, languages: { registerDefinitionProvider: () => { }, @@ -56,20 +66,30 @@ export let vscode = { }, context: { subscriptions: [], - asAbsolutePath: () => { return ''; }, + asAbsolutePath: () => { + return ''; + }, extensionUri: undefined as Uri, extensionPath: '', storageUri: undefined as Uri, storagePath: '', globalStoragePath: '', - globalState: {} as any, + globalState: { + _data: {}, + update: function(key: string, value: any) { + this._data[key] = value; + }, + get: function(key: string) { + return this._data[key]; + } + } as any, globalStorageUri: undefined as Uri, workspaceState: {} as any, environmentVariableCollection: {} as any, logUri: undefined as Uri, logPath: '', extensionMode: 2 - } as ExtensionContext, + } as unknown as ExtensionContext, workspace: { workspaceFolders: [] as WorkspaceFolder[], workspaceFile: undefined as Uri, @@ -91,6 +111,12 @@ export let vscode = { return { get: (name: string) => { return this._configuration?.[`${configurationName}.${name}`]; + }, + inspect: (name: string) => { + return { + key: name, + globalValue: this._configuration?.[`${configurationName}.${name}`] + } as ReturnType; } }; }, @@ -99,6 +125,12 @@ export let vscode = { findFiles: (include, exclude) => { return []; }, + fs: { + writeFile: (uri, buffer) => { }, + readFile: (uri) => { + return Buffer.alloc(0); + } + }, registerTextDocumentContentProvider: () => { }, onDidChangeTextDocument: () => { }, onDidCloseTextDocument: () => { } @@ -111,12 +143,17 @@ export let vscode = { show: () => { } }; }, - createOutputChannel: function() { + createOutputChannel: function(name?: string) { return { + name: name, + append: () => { }, + dispose: () => { }, + hide: () => { }, + replace: () => { }, show: () => { }, clear: () => { }, appendLine: () => { } - }; + } as OutputChannel; }, registerTreeDataProvider: function(viewId: string, treeDataProvider: TreeDataProvider) { }, showErrorMessage: function(message: string) { @@ -127,7 +164,11 @@ export let vscode = { }, onDidChangeTextEditorSelection: () => { }, registerUriHandler: () => { }, - registerWebviewViewProvider: () => { }, + registerWebviewViewProvider: () => { + return { + asWebViewUri: () => { } + }; + }, showSaveDialog: () => { return Promise.resolve(''); }, @@ -151,18 +192,10 @@ export let vscode = { } }, DeclarationProvider: class { - public onDidChange = () => { - - } - public onDidDelete = () => { - - } - public onDidReset = () => { - - } - public sync = () => { - - } + public onDidChange = () => { }; + public onDidDelete = () => { }; + public onDidReset = () => { }; + public sync = () => { }; }, OutputChannel: class { public clear() { } @@ -182,12 +215,12 @@ export let vscode = { private character: number; }, ParameterInformation: class { - constructor(label: string, documentation?: string | any) { + constructor(label: string, documentation?: any) { this.label = label; this.documentation = documentation; } private label: string; - private documentation: string | any | undefined; + private documentation: any; }, SignatureHelp: class { constructor() { @@ -198,12 +231,12 @@ export let vscode = { private activeSignature: number; }, SignatureInformation: class { - constructor(label: string, documentation?: string | any) { + constructor(label: string, documentation?: any) { this.label = label; this.documentation = documentation; } private label: string; - private documentation: string | any | undefined; + private documentation: any; }, Range: class { constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number) { @@ -253,7 +286,9 @@ export let vscode = { private text: any; private fileName: string; - public getText() { return this.text; } + public getText() { + return this.text; + } public getWordRangeAtPosition() { //returns a dummy range (because honestly we should be mocking this in a real test...) return undefined; @@ -292,10 +327,11 @@ export let vscode = { } private value: string; }, + ThemeColor: class { }, Uri: { file: (src: string) => { return { - with: ({ }) => { + with: () => { return {}; } }; @@ -313,7 +349,9 @@ export let vscode = { export let vscodeLanguageClient = { LanguageClient: class { public start() { } - public onReady() { return Promise.resolve(null); } + public onReady() { + return Promise.resolve(null); + } public onNotification() { } }, TransportKind: { diff --git a/src/util.spec.ts b/src/util.spec.ts index 4ed5ae19..67b07cf7 100644 --- a/src/util.spec.ts +++ b/src/util.spec.ts @@ -1,4 +1,3 @@ -/* tslint:disable:no-unused-expression */ import * as assert from 'assert'; import { expect } from 'chai'; import * as fsExtra from 'fs-extra'; @@ -65,25 +64,25 @@ describe('Util', () => { }); describe('removeFileScheme', () => { - it('should return remove the leading scheme', async () => { + it('should return remove the leading scheme', () => { assert.equal(util.removeFileScheme('g:/images/channel-poster_hd.png'), '/images/channel-poster_hd.png'); assert.equal(util.removeFileScheme('pkg:/images/channel-poster_hd.png'), '/images/channel-poster_hd.png'); assert.equal(util.removeFileScheme('RandomComponentLibraryName:/images/channel-poster_hd.png'), '/images/channel-poster_hd.png'); }); - it('should should not modify the path when there is no scheme', async () => { + it('should should not modify the path when there is no scheme', () => { assert.equal(util.removeFileScheme('/images/channel-poster_hd.png'), '/images/channel-poster_hd.png'); assert.equal(util.removeFileScheme('ages/channel-poster_hd.png'), 'ages/channel-poster_hd.png'); }); }); describe('getFileScheme', () => { - it('should return the leading scheme', async () => { + it('should return the leading scheme', () => { assert.equal(util.getFileScheme('pkg:/images/channel-poster_hd.png'), 'pkg:'); assert.equal(util.getFileScheme('RandomComponentLibraryName:/images/channel-poster_hd.png'), 'randomcomponentlibraryname:'); }); - it('should should return null when there is no scheme', async () => { + it('should should return null when there is no scheme', () => { assert.equal(util.getFileScheme('/images/channel-poster_hd.png'), null); assert.equal(util.getFileScheme('ages/channel-poster_hd.png'), null); }); @@ -91,7 +90,7 @@ describe('Util', () => { describe('convertManifestToObject', () => { let fileContents: string; - let expectedManifestObject: { [key: string]: string }; + let expectedManifestObject: Record; let folder: string; let filePath: string; @@ -118,24 +117,24 @@ describe('Util', () => { confirm_partner_button=1 bs_const=const=false;const2=true;const3=false - `.replace(/ /g, ''); + `.replace(/ {4}/g, ''); expectedManifestObject = { title: 'HeroGridChannel', subtitle: 'Roku Sample Channel App', - major_version: '1', - minor_version: '1', - build_version: '00001', - mm_icon_focus_hd: 'pkg:/images/channel-poster_hd.png', - mm_icon_focus_sd: 'pkg:/images/channel-poster_sd.png', - splash_screen_sd: 'pkg:/images/splash-screen_sd.jpg', - splash_screen_hd: 'pkg:/images/splash-screen_hd.jpg', - splash_screen_fhd: 'pkg:/images/splash-screen_fhd.jpg', - splash_color: '#808080', - splash_min_time: '0', - ui_resolutions: 'fhd', - confirm_partner_button: '1', - bs_const: 'const=false;const2=true;const3=false' + 'major_version': '1', + 'minor_version': '1', + 'build_version': '00001', + 'mm_icon_focus_hd': 'pkg:/images/channel-poster_hd.png', + 'mm_icon_focus_sd': 'pkg:/images/channel-poster_sd.png', + 'splash_screen_sd': 'pkg:/images/splash-screen_sd.jpg', + 'splash_screen_hd': 'pkg:/images/splash-screen_hd.jpg', + 'splash_screen_fhd': 'pkg:/images/splash-screen_fhd.jpg', + 'splash_color': '#808080', + 'splash_min_time': '0', + 'ui_resolutions': 'fhd', + 'confirm_partner_button': '1', + 'bs_const': 'const=false;const2=true;const3=false' }; fsExtra.emptyDirSync('./.tmp'); @@ -183,8 +182,8 @@ describe('Util', () => { assert.equal(false, await util.isPortInUse(port + 1)); }); - afterEach(async () => { - await otherServer.close(); + afterEach(() => { + otherServer.close(); }); }); @@ -277,4 +276,56 @@ describe('Util', () => { }); }); }); + + describe('concealObject', () => { + it('does not conceal anything when no secret keys are provided', () => { + expect( + [...util.concealObject({ alpha: 'a', beta: 'b' }, [])] + ).to.eql([ + ['alpha', { value: 'a', originalValue: 'a' }], + ['beta', { value: 'b', originalValue: 'b' }] + ]); + }); + + it('does not crash for unrecognized secret keys', () => { + expect( + [...util.concealObject({ alpha: 'a', beta: 'b' }, [undefined, '', false as unknown as string])] + ).to.eql([ + ['alpha', { value: 'a', originalValue: 'a' }], + ['beta', { value: 'b', originalValue: 'b' }] + ]); + }); + + it('does not crash for undefined secret values', () => { + expect( + [...util.concealObject({ alpha: 'a', beta: undefined }, ['beta'])] + ).to.eql([ + ['alpha', { value: 'a', originalValue: 'a' }], + ['beta', { value: undefined, originalValue: undefined }] + ]); + }); + + it('ignores blank and empty strings', () => { + expect( + [...util.concealObject({ alpha: 'alpha', beta: '' }, ['beta'])] + ).to.eql([ + ['alpha', { value: 'alpha', originalValue: 'alpha' }], + ['beta', { value: '', originalValue: '' }] + ]); + }); + + it('conceals various value types', () => { + //prefill the cache so we always know what it'll contain for this key + util['concealCache'].set('123', 'abc'); + util['concealCache'].set('456', 'def'); + expect( + [...util.concealObject({ alpha: '123', beta: 'beta 123 456', charlie: '456', delta: 123 }, ['alpha', 'charlie'])] + ).to.eql([ + ['alpha', { value: 'abc', originalValue: '123' }], + ['beta', { value: 'beta abc def', originalValue: 'beta 123 456' }], + ['charlie', { value: 'def', originalValue: '456' }], + ['delta', { value: 123, originalValue: 123 }] + ]); + }); + }); }); diff --git a/src/util.ts b/src/util.ts index 01de2f27..447b8333 100644 --- a/src/util.ts +++ b/src/util.ts @@ -4,12 +4,15 @@ import * as net from 'net'; import * as url from 'url'; import { debounce } from 'debounce'; import * as vscode from 'vscode'; +import { Cache } from 'brighterscript/dist/Cache'; class Util { public async readDir(dirPath: string) { - return await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { fs.readdir(dirPath, (err, result) => { - if (err) { reject(err); } + if (err) { + reject(err); + } resolve(result); }); }); @@ -24,7 +27,7 @@ class Util { } public async stat(filePath: string) { - return await new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { fs.stat(filePath, (err, result) => { if (err) { reject(err); @@ -57,6 +60,14 @@ class Util { } } + /** + * Normalizes the file path to only have one forward slash + * @param filePath + */ + public normalizeFileScheme(filePath: string): string { + return filePath.replace(/^file:[\/\\]*/, 'file:/'); + } + /** * Gets any leading scheme in the file path * @param filePath @@ -70,7 +81,9 @@ class Util { * @param ms time to delay in milliseconds */ public delay(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } /** @@ -84,7 +97,7 @@ class Util { * Reads the the manifest file and converts to a javascript object skipping empty lines and comments * @param path location of the manifest file */ - public async convertManifestToObject(path: string): Promise<{ [key: string]: string } | undefined> { + public async convertManifestToObject(path: string): Promise | undefined> { if (await this.fileExists(path) === false) { return undefined; } else { @@ -92,12 +105,13 @@ class Util { let manifestLines = fileContents.split('\n'); let manifestValues = {}; - manifestLines.map((line) => { + for (const line of manifestLines) { let match; + // eslint-disable-next-line no-cond-assign if (match = /(\w+)=(.+)/.exec(line)) { manifestValues[match[1]] = match[2]; } - }); + } return manifestValues; } @@ -125,16 +139,22 @@ class Util { public objectDiff(obj1: object, obj2: object, exclude?: string[]) { let r = {}; - if (!exclude) { exclude = []; } + if (!exclude) { + exclude = []; + } for (let prop in obj1) { if (obj1.hasOwnProperty(prop) && prop !== '__proto__') { - if (exclude.indexOf(obj1[prop]) === -1) { + if (!exclude.includes(obj1[prop])) { // check if obj2 has prop - if (!obj2.hasOwnProperty(prop)) { r[prop] = obj1[prop]; } else if (obj1[prop] === Object(obj1[prop])) { + if (!obj2.hasOwnProperty(prop)) { + r[prop] = obj1[prop]; + } else if (obj1[prop] === Object(obj1[prop])) { let difference = this.objectDiff(obj1[prop], obj2[prop]); - if (Object.keys(difference).length > 0) { r[prop] = difference; } + if (Object.keys(difference).length > 0) { + r[prop] = difference; + } } else if (obj1[prop] !== obj2[prop]) { if (obj1[prop] === undefined) { r[prop] = 'undefined'; @@ -156,20 +176,210 @@ class Util { return r; } - private debounceByKey = {} as { [key: string]: any }; + private debounceByKey = {} as Record; /** * Get a debounce function that runs a separate debounce for every unique key provided */ - public keyedDebounce(key: string, fn: () => void, waitMilliseconds: number) { + public keyedDebounce(key: string, fn: () => T, waitMilliseconds: number) { if (!this.debounceByKey[key]) { this.debounceByKey[key] = debounce(fn, waitMilliseconds); } this.debounceByKey[key](); } - public isExtensionHostRunning() { - return process.argv.includes('--type=extensionHost'); + /** + * Wraps a function and calls a callback before calling the original function + */ + public wrap(subject: T, name: K, callback) { + const fn = subject[name] as any; + (subject as any)[name] = (...args) => { + callback(...args); + fn.call(subject, ...args); + }; + } + + /** + * Decode HTML entities like   ' to its original character + */ + public decodeHtmlEntities(encodedString: string) { + let translateRegex = /&(nbsp|amp|quot|lt|gt);/g; + let translate = { + 'nbsp': ' ', + 'amp': '&', + 'quot': '"', + 'lt': '<', + 'gt': '>' + }; + + return encodedString.replace(translateRegex, (match, entity) => { + return translate[entity]; + }).replace(/&#(\d+);/gi, (match, numStr) => { + let num = parseInt(numStr, 10); + return String.fromCharCode(num); + }); + } + + /** + * Creates an output channel but wraps the `append` and `appendLine` + * functions so a function can be called with their values + */ + public createOutputChannel(name: string, interceptor: (value: string) => void) { + const channel = vscode.window.createOutputChannel(name); + this.wrap(channel, 'append', interceptor); + this.wrap(channel, 'appendLine', (line: string) => { + if (line) { + interceptor(line + '\n'); + } + }); + return channel; + } + + /** + * Shows ether a QuickPick or InputBox to the user and allows them to enter + * items not in the QuickPick list of items + */ + public async showQuickPickInputBox(configuration: { placeholder?: string; items?: vscode.QuickPickItem[]; matchOnDescription?: boolean; matchOnDetail?: boolean } = {}): Promise { + if (configuration?.items?.length) { + // We have items so use QuickPick + const quickPick = vscode.window.createQuickPick(); + Object.assign(quickPick, { ...configuration }); + const deffer = new Promise(resolve => { + quickPick.onDidChangeValue(() => { + // Clear the active item as the user started typing and we want + // to handle this as a new option not in the supplied list. + + // VsCode does not have a strict match items to typed value option + // so this is a workaround to that limitation. + quickPick.activeItems = []; + }); + + quickPick.onDidAccept(() => { + quickPick.hide(); + + // Since we clear the active item when the user types (onDidChangeValue) + // there will only be an active item if the user clicked on an item with + // the mouse or used the arrows keys and then hit enter with one selected. + resolve(quickPick.activeItems?.[0]?.label ?? quickPick.value); + }); + + quickPick.onDidHide(() => { + // Make sure to dispose this view + quickPick.dispose(); + resolve(null); + }); + }); + quickPick.show(); + return deffer; + } else { + // There are no items to suggest to the user. Just use a normal InputBox + return vscode.window.showInputBox({ + placeHolder: configuration.placeholder ?? '', + value: '' + }); + } + } + + /** + * Get a promise that resolves after the given number of milliseconds. + */ + public sleep(milliseconds: number) { + return new Promise((resolve) => { + setTimeout(resolve, milliseconds); + }); + } + + /** + * Convert an arbitrary range-like object into a proper vscode.Range instance + */ + public toRange(range: { start: { line: number; character: number }; end: { line: number; character: number } }) { + return new vscode.Range( + new vscode.Position(range.start.line, range.start.character), + new vscode.Position(range.end.line, range.end.character) + ); + } + + /** + * Is the value null or undefined + */ + public isNullish(value?: any) { + return value === undefined || value === null; + } + + /** + * Conceals (scrambles/obfuscates) any of the specified keys across all string properties in the object + */ + public concealObject(object: Record, secretKeys: string[]) { + const result = new Map(); + const secretValues = Object.entries(object) + //only keep the non-blank string keys + .filter(([key, value]) => secretKeys.includes(key) && typeof value === 'string' && value?.toString() !== '') + .map(([, value]) => value) as string[]; + + //build the initial result + for (const [key, value] of Object.entries(object)) { + result.set(key, { + value: value, + originalValue: value + }); + } + + //do value transforms + for (let [key, entry] of result) { + let { value } = entry; + for (const secretValue of secretValues) { + if (typeof value === 'string') { + const regexp = new RegExp( + //escape the regex, or use an unmatchable regex if unable to escape it + util.escapeRegex(secretValue) ?? /(?!)/, + 'g' + ); + entry.value = entry.value.replace(regexp, this.concealString(secretValue)); + } + } + } + + return result; + } + + private concealCache = new Cache(); + + /** + * Given a string, replace the alphanumeric characters with random values. + * This is useful for things like scrambling a uuid + */ + public concealString(text: string) { + return this.concealCache.getOrAdd(text, () => { + if (this.isNullish(text)) { + return text; + } else { + return text.replace(/[a-z0-9]/ig, (match) => { + // is a number + if (parseInt(match)) { + return this.getRandomChar('0123456789'); + + //is an uppercase letter + } else if (match.toUpperCase() === match) { + return this.getRandomChar('ABCDEFGHIJKLMNOPQRSTUVWXYZ'); + + //is a lower case number + } else { + return this.getRandomChar('abcdefghijklmnopqrstuvwxyz'); + } + }); + } + }); + } + + private getRandomChar(dictionary: string) { + return dictionary.charAt(Math.floor(Math.random() * dictionary.length)); + } + + /** + * Escapes a string so that it can be used as a regex pattern + */ + public escapeRegex(text: string) { + return text?.toString().replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } } diff --git a/src/viewProviders/BaseRdbViewProvider.ts b/src/viewProviders/BaseRdbViewProvider.ts new file mode 100644 index 00000000..c2146c2b --- /dev/null +++ b/src/viewProviders/BaseRdbViewProvider.ts @@ -0,0 +1,88 @@ +import * as rta from 'roku-test-automation'; +import type * as vscode from 'vscode'; +import type { RequestType } from 'roku-test-automation'; +import * as fsExtra from 'fs-extra'; +import * as path from 'path'; + +import { BaseWebviewViewProvider } from './BaseWebviewViewProvider'; +import type { RtaManager } from '../managers/RtaManager'; +import { ViewProviderEvent } from './ViewProviderEvent'; +import { ViewProviderCommand } from './ViewProviderCommand'; + + +export abstract class BaseRdbViewProvider extends BaseWebviewViewProvider { + protected rtaManager?: RtaManager; + + protected odcCommands: Array; + + constructor(context: vscode.ExtensionContext) { + super(context); + const requestTypesPath = path.join(rta.utils.getClientFilesPath(), 'requestTypes.schema.json'); + const json = JSON.parse(fsExtra.readFileSync(requestTypesPath, 'utf8')); + this.odcCommands = Object.values(json.enum); + } + + public setRtaManager(rtaManager?: RtaManager) { + this.rtaManager = rtaManager; + } + + public updateDeviceAvailability() { + this.postOrQueueMessage({ + event: ViewProviderEvent.onDeviceAvailabilityChange, + odcAvailable: !!this.rtaManager.onDeviceComponent, + deviceAvailable: !!this.rtaManager.device + }); + } + + protected onViewReady() { + // Always post back the device status so we make sure the client doesn't miss it if it got refreshed + this.updateDeviceAvailability(); + } + + protected async handleViewMessage(message) { + const { command, context } = message; + if (this.odcCommands.includes(command)) { + const response = await this.rtaManager.sendOdcRequest(this.id, command, context); + this.postOrQueueMessage({ + ...message, + response: response + }); + return true; + } else if (command === ViewProviderCommand.getStoredNodeReferences) { + const response = this.rtaManager.getStoredNodeReferences(); + this.postOrQueueMessage({ + ...message, + response: response + }); + + return true; + } else if (command === ViewProviderCommand.setManualIpAddress) { + this.rtaManager.setupRtaWithConfig({ + ...message.context, + injectRdbOnDeviceComponent: true + }); + return true; + } else if (command === ViewProviderCommand.getScreenshot) { + try { + const result = await this.rtaManager.device.getScreenshot(); + this.postOrQueueMessage({ + ...message, + response: { + success: true, + arrayBuffer: result.buffer.buffer + } + }); + } catch (e) { + this.postOrQueueMessage({ + ...message, + response: { + success: false + } + }); + } + return true; + } + + return false; + } +} diff --git a/src/viewProviders/BaseWebviewViewProvider.ts b/src/viewProviders/BaseWebviewViewProvider.ts new file mode 100644 index 00000000..e7d47dd6 --- /dev/null +++ b/src/viewProviders/BaseWebviewViewProvider.ts @@ -0,0 +1,199 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fsExtra from 'fs-extra'; +import type { AsyncSubscription, Event } from '@parcel/watcher'; +import { vscodeContextManager } from '../managers/VscodeContextManager'; +import { util } from '../util'; +import type { WebviewViewProviderManager } from '../managers/WebviewViewProviderManager'; +import { ViewProviderEvent } from './ViewProviderEvent'; +import { ViewProviderCommand } from './ViewProviderCommand'; + +export abstract class BaseWebviewViewProvider implements vscode.WebviewViewProvider, vscode.Disposable { + constructor(context: vscode.ExtensionContext) { + this.webviewBasePath = path.join(context.extensionPath, 'dist', 'webviews'); + context.subscriptions.push(this); + } + + /** + * The ID of the view. This should be the same as the id in the `views` contribution in package.json, and the same name + * as the view in the webviews client-side code + */ + public readonly abstract id: string; + + protected view?: vscode.WebviewView; + protected webviewBasePath: string; + private outDirWatcher: AsyncSubscription; + private viewReady = false; + private queuedMessages = []; + private webviewViewProviderManager: WebviewViewProviderManager; + + public dispose() { + void this.outDirWatcher?.unsubscribe(); + } + + public setWebviewViewProviderManager(manager: WebviewViewProviderManager) { + this.webviewViewProviderManager = manager; + } + + public postOrQueueMessage(message) { + if (this.viewReady) { + this.postMessage(message); + } else { + this.queuedMessages.push(message); + } + } + + protected postMessage(message) { + this.view?.webview.postMessage(message).then(null, (reason) => { + console.log('postMessage failed: ', reason); + }); + } + + private postQueuedMessages() { + for (const queuedMessage of this.queuedMessages) { + this.postMessage(queuedMessage); + } + } + + private setupViewMessageObserver(webview: vscode.Webview) { + webview.onDidReceiveMessage(async (message) => { + try { + const command = message.command; + + if (command === ViewProviderCommand.viewReady) { + this.viewReady = true; + this.onViewReady(); + this.postQueuedMessages(); + } else if (command === ViewProviderCommand.setVscodeContext) { + const context = message.context; + await vscodeContextManager.set(context.key, context.value); + } else if (command === ViewProviderCommand.sendMessageToWebviews) { + const context = message.context; + this.webviewViewProviderManager.sendMessageToWebviews(context.viewIds, context.message); + } else { + if (!await this.handleViewMessage(message)) { + console.warn('Did not handle message', message); + } + } + } catch (e) { + this.postMessage({ + ...message, + error: { + message: e.message, + stack: e.stack + } + }); + } + }); + } + + protected handleViewMessage(message): Promise | boolean { + return false; + } + + protected registerCommandWithWebViewNotifier(context: vscode.ExtensionContext, command: string) { + context.subscriptions.push(vscode.commands.registerCommand(command, () => { + this.postOrQueueMessage({ + event: ViewProviderEvent.onVscodeCommandReceived, + commandName: command + }); + })); + } + + protected onViewReady() { } + + /** Adds ability to add additional script contents to the main webview html */ + protected additionalScriptContents(): string[] { + return []; + } + + protected async getHtmlForWebview() { + try { + let watcher; + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + watcher = require('@parcel/watcher'); + } catch (e) { + // Doing nothing if watcher does not exist + } + + if (watcher && !this.outDirWatcher) { + // When in dev mode, spin up a watcher to auto-reload the webview whenever the files have changed. + this.outDirWatcher = await watcher.subscribe(this.webviewBasePath, (err, events: Event[]) => { + //only refresh when the index.html page is changed. Since vite rewrites the file on every build, this is enough to know to reload the page + if ( + events.find(x => (x.type === 'create' || x.type === 'update') && x.path?.toLowerCase()?.endsWith('index.html')) + ) { + this.view.webview.html = ''; + this.view.webview.html = this.getIndexHtml(); + } + }); + } + } catch (e) { + console.error(e); + } + return this.getIndexHtml(); + } + + /** + * Get a webview-supported URI for the given path + */ + private asWebviewUri(...parts: string[]) { + return this.view?.webview?.asWebviewUri?.( + vscode.Uri.file( + path.join(...parts) + ) + ); + } + + private getIndexHtml() { + let html: string; + try { + html = fsExtra.readFileSync(this.webviewBasePath + '/index.html').toString(); + } catch (e) { + console.error(e); + html = '

Error loading webview

'; + } + //the data that will be replaced in the index.html + const data = { + viewName: this.id, + baseHref: `${this.asWebviewUri(this.webviewBasePath)}/`, + additionalScriptContents: this.additionalScriptContents().join('\n ') + }; + /** + * replace placeholders in the html, in one of these formats: + * + * //{{thing2}} + * {{thing3}} + */ + html = html.replace(/(\/\/{{(\w+)}})|({{(\w+)}})|( - - - {#each commandArgs as args} -
- - {#if args.enum} - - {:else} - - {/if} -
- {/each} -
-
-
-        {commandResponse}
-    
- diff --git a/ui/rdb/views/RegistryView.svelte b/ui/rdb/views/RegistryView.svelte deleted file mode 100644 index 0ebd7716..00000000 --- a/ui/rdb/views/RegistryView.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - -{#if Object.keys(registryValues).length > 0} -
- - -
- -{/if} diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index 4ee17734..00000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - - "include": ["rdb/**/*"], - "exclude": ["node_modules/*", "__sapper__/*", "public/*"] -} diff --git a/webviews/.gitignore b/webviews/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/webviews/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/webviews/.vscode/extensions.json b/webviews/.vscode/extensions.json new file mode 100644 index 00000000..bdef8201 --- /dev/null +++ b/webviews/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/webviews/index.html b/webviews/index.html new file mode 100644 index 00000000..e7858035 --- /dev/null +++ b/webviews/index.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/webviews/package-lock.json b/webviews/package-lock.json new file mode 100644 index 00000000..749527c0 --- /dev/null +++ b/webviews/package-lock.json @@ -0,0 +1,3791 @@ +{ + "name": "webviews", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "webviews", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.0", + "@tsconfig/svelte": "^3.0.0", + "@vscode/webview-ui-toolkit": "^1.0.0", + "svelte": "^3.54.0", + "svelte-check": "^2.10.0", + "svelte-codicons": "^0.10.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "vite": "^4.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/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, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/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, + "optional": true, + "peer": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "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, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/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, + "optional": true, + "peer": true + }, + "node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@microsoft/fast-element": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.11.1.tgz", + "integrity": "sha512-qBGQ94V4ktMMXmxNdgF78TPNImv2ctXUi3Vzj3j2X71gpUcr+Fkat7mLcTNC3y/Jc4W63fAhK2vP3MkwYRS5kQ==", + "dev": true + }, + "node_modules/@microsoft/fast-foundation": { + "version": "2.48.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.48.1.tgz", + "integrity": "sha512-gJR/26hhJipsZ4JD5DSOODb3GFYf7vgCnxS2ag4dj+Mi8ytkAwMPglTOv7v0zsJC2CHqOjY8Ixs66dhepgNkeQ==", + "dev": true, + "dependencies": { + "@microsoft/fast-element": "^1.11.1", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + } + }, + "node_modules/@microsoft/fast-foundation/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@microsoft/fast-react-wrapper": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", + "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "dev": true, + "dependencies": { + "@microsoft/fast-element": "^1.9.0", + "@microsoft/fast-foundation": "^2.41.1" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", + "dev": true, + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, + "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/@sveltejs/vite-plugin-svelte": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.1.1.tgz", + "integrity": "sha512-7YeBDt4us0FiIMNsVXxyaP4Hwyn2/v9x3oqStkHU3ZdIc5O22pGwUwH33wUqYo+7Itdmo8zxJ45Qvfm3H7UUjQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte/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/@sveltejs/vite-plugin-svelte/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/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", + "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "deprecated": "This is a stub types definition. sass provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "sass": "*" + } + }, + "node_modules/@vscode/webview-ui-toolkit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz", + "integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==", + "dev": true, + "dependencies": { + "@microsoft/fast-element": "^1.6.2", + "@microsoft/fast-foundation": "^2.38.0", + "@microsoft/fast-react-wrapper": "^0.1.18" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "optional": true, + "peer": true + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "optional": true, + "peer": 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-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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/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, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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, + "peer": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "optional": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true, + "optional": true, + "peer": 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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.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/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/rollup": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", + "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", + "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.24.0" + } + }, + "node_modules/svelte-codicons": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/svelte-codicons/-/svelte-codicons-0.10.1.tgz", + "integrity": "sha512-fLl11afKccTQ4HZi4S8OdTEPbJtvy3SRNzoGs19cxgommkhqdnAzZMpRESkMQwT7KW1rEhcJnAIozf8zbUTrow==", + "dev": true + }, + "node_modules/svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "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": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "2.1.2" + } + }, + "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, + "optional": true, + "peer": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "optional": true, + "peer": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "optional": true, + "peer": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "optional": true, + "peer": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "optional": true, + "peer": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "2.1.2" + } + }, + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + } + } + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "dev": true, + "optional": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "optional": true, + "peer": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@microsoft/fast-element": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.11.1.tgz", + "integrity": "sha512-qBGQ94V4ktMMXmxNdgF78TPNImv2ctXUi3Vzj3j2X71gpUcr+Fkat7mLcTNC3y/Jc4W63fAhK2vP3MkwYRS5kQ==", + "dev": true + }, + "@microsoft/fast-foundation": { + "version": "2.48.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.48.1.tgz", + "integrity": "sha512-gJR/26hhJipsZ4JD5DSOODb3GFYf7vgCnxS2ag4dj+Mi8ytkAwMPglTOv7v0zsJC2CHqOjY8Ixs66dhepgNkeQ==", + "dev": true, + "requires": { + "@microsoft/fast-element": "^1.11.1", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@microsoft/fast-react-wrapper": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", + "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "dev": true, + "requires": { + "@microsoft/fast-element": "^1.9.0", + "@microsoft/fast-foundation": "^2.41.1" + } + }, + "@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", + "dev": true, + "requires": { + "exenv-es6": "^1.1.1" + } + }, + "@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" + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.1.1.tgz", + "integrity": "sha512-7YeBDt4us0FiIMNsVXxyaP4Hwyn2/v9x3oqStkHU3ZdIc5O22pGwUwH33wUqYo+7Itdmo8zxJ45Qvfm3H7UUjQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "@types/node": { + "version": "18.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", + "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "dev": true, + "requires": { + "sass": "*" + } + }, + "@vscode/webview-ui-toolkit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz", + "integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==", + "dev": true, + "requires": { + "@microsoft/fast-element": "^1.6.2", + "@microsoft/fast-foundation": "^2.38.0", + "@microsoft/fast-react-wrapper": "^0.1.18" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "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 + }, + "caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true, + "optional": true, + "peer": 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" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "optional": true, + "peer": 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-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true, + "optional": true, + "peer": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "esbuild": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "optional": true, + "peer": true + }, + "exenv-es6": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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 + }, + "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, + "optional": true, + "peer": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "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" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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 + }, + "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, + "peer": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "optional": true, + "peer": 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, + "optional": true, + "peer": true + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "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" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true, + "optional": true, + "peer": 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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, + "peer": true, + "requires": { + "loose-envify": "^1.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" + } + }, + "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 + }, + "rollup": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "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" + } + }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "svelte": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", + "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "dev": true + }, + "svelte-check": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", + "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + } + }, + "svelte-codicons": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/svelte-codicons/-/svelte-codicons-0.10.1.tgz", + "integrity": "sha512-fLl11afKccTQ4HZi4S8OdTEPbJtvy3SRNzoGs19cxgommkhqdnAzZMpRESkMQwT7KW1rEhcJnAIozf8zbUTrow==", + "dev": true + }, + "svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "dev": true, + "requires": {} + }, + "svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "optional": true, + "peer": 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": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==", + "dev": true, + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + } + }, + "vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "requires": {} + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/webviews/package.json b/webviews/package.json new file mode 100644 index 00000000..1ddf5522 --- /dev/null +++ b/webviews/package.json @@ -0,0 +1,22 @@ +{ + "name": "webviews", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "watch": "vite build --watch", + "build": "vite build", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.0", + "@tsconfig/svelte": "^3.0.0", + "@vscode/webview-ui-toolkit": "^1.0.0", + "svelte": "^3.54.0", + "svelte-check": "^2.10.0", + "svelte-codicons": "^0.10.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "vite": "^4.0.0" + } +} diff --git a/webviews/public/.gitkeep b/webviews/public/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/webviews/src/ChangedFieldEntry.ts b/webviews/src/ChangedFieldEntry.ts new file mode 100644 index 00000000..6a70a764 --- /dev/null +++ b/webviews/src/ChangedFieldEntry.ts @@ -0,0 +1,14 @@ +import type { BaseType } from 'roku-test-automation'; + +interface ChangedFieldEntry { + ts: number; // Unix timestamp + subtype: string; + id: string; + base?: BaseType; + keyPath: string; + value: any; +} + +export type { + ChangedFieldEntry +}; diff --git a/webviews/src/ExtensionIntermediary.ts b/webviews/src/ExtensionIntermediary.ts new file mode 100644 index 00000000..a97caab0 --- /dev/null +++ b/webviews/src/ExtensionIntermediary.ts @@ -0,0 +1,213 @@ +/** Acts as a middle man that takes request from our views and sends them through vscode message protocol and waits for replies to simplify usage in code */ +import type * as rta from 'roku-test-automation'; +import type { VscodeCommand } from '../../src/commands/VscodeCommand'; +import type { ViewProviderEvent } from '../../src/viewProviders/ViewProviderEvent'; +import { ViewProviderCommand } from '../../src/viewProviders/ViewProviderCommand'; +import { RequestType } from 'roku-test-automation/client/dist/types/OnDeviceComponent'; +import type { DeleteEntireRegistrySectionsArgs, DeleteNodeReferencesArgs, DeleteRegistrySectionsArgs, FindNodesAtLocationArgs, GetFocusedNodeArgs, GetNodesInfoArgs, GetNodesWithPropertiesArgs, GetValueArgs, GetValuesArgs, HasFocusArgs, IsInFocusChainArgs, OnFieldChangeOnceArgs, ReadRegistryArgs, RequestOptions, SetValueArgs, StoreNodeReferencesArgs, WriteRegistryArgs } from 'roku-test-automation'; + +class ExtensionIntermediary { + private inflightRequests = {}; + private observedEvents = new Map(); + private observed = false; + + private setupExtensionMessageObserver() { + if (this.observed) { + return; + } + this.observed = true; + + window.addEventListener('message', (event) => { + const message = event.data; + const request = this.inflightRequests[message.id]; + if (request) { + delete this.inflightRequests[message.id]; + request.callback(message); + } else if (message.event) { + const listeners = this.observedEvents.get(message.event); + if (listeners) { + for (const listener of listeners) { + listener(message); + } + } + } + }); + } + + public async sendObservableMessage(message: Record) { + this.setupExtensionMessageObserver(); + + const requestId = this.generateRandomString(); + message.id = requestId; + + return new Promise((resolve, reject) => { + const callback = (message) => { + if (message.error) { + reject(message.error); + } else { + resolve(message.response); + } + }; + + this.inflightRequests[requestId] = { + message: message, + callback: callback + }; + this.postMessage(message); + }); + } + + public createCommandMessage(command: VscodeCommand | ViewProviderCommand, context = {}) { + const message = { + command: command, + context: context + }; + return message; + } + + public sendCommand(command: VscodeCommand | ViewProviderCommand, context = {}) { + return this.sendObservableMessage(this.createCommandMessage(command, context)); + } + + public createEventMessage(event: ViewProviderEvent, context = {}) { + const message = { + event: event, + context: context + }; + return message; + } + + public sendEvent(event: ViewProviderEvent, context = {}) { + this.postMessage(this.createEventMessage(event, context)); + } + + public sendViewReady() { + this.setupExtensionMessageObserver(); + + this.postMessage({ + command: ViewProviderCommand.viewReady, + context: {} + }); + } + + public setVscodeContext(key: string, value: boolean | number | string) { + this.postMessage(this.createCommandMessage(ViewProviderCommand.setVscodeContext, { + key: key, + value: value + })); + } + + public async getStoredNodeReferences() { + return this.sendCommand>(ViewProviderCommand.getStoredNodeReferences); + } + + public observeEvent(eventName: string, callback: ObserverCallback) { + let observedEvent = this.observedEvents.get(eventName); + if (!observedEvent) { + observedEvent = []; + } + + observedEvent.push(callback); + this.observedEvents.set(eventName, observedEvent); + } + + public sendMessageToWebviews(viewIds: string | string[], message) { + this.postMessage(this.createCommandMessage(ViewProviderCommand.sendMessageToWebviews, { + viewIds: viewIds, + message: message + })); + } + + private postMessage(message) { + window.vscode.postMessage(message); + } + + private generateRandomString(length = 7) { + const p = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + // eslint-disable-next-line no-bitwise + return [...Array(length)].reduce((a) => a + p[~~(Math.random() * p.length)], ''); + } +} + +const intermediary = new ExtensionIntermediary(); + +class ODCIntermediary { + public sendOdcMessage(command: RequestType, args?, options?: RequestOptions) { + return intermediary.sendCommand(command as any, { + args: args, + options: options + }); + } + + public async readRegistry(args?: ReadRegistryArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.readRegistry, args, options); + } + + public async writeRegistry(args: WriteRegistryArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.writeRegistry, args, options); + } + + public async getFocusedNode(args?: GetFocusedNodeArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.getFocusedNode, args, options); + } + + public async getValue(args: GetValueArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.getValue, args, options); + } + + public async getValues(args: GetValuesArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.getValues, args, options); + } + + public async getNodesInfo(args: GetNodesInfoArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.getNodesInfo, args, options); + } + + public async hasFocus(args: HasFocusArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.hasFocus, args, options); + } + + public async isInFocusChain(args: IsInFocusChainArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.isInFocusChain, args, options); + } + + public async onFieldChangeOnce(args: OnFieldChangeOnceArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.onFieldChangeOnce, args, options); + } + + public async setValue(args: SetValueArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.setValue, args, options); + } + + public async deleteRegistrySections(args: DeleteRegistrySectionsArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.deleteRegistrySections, args, options); + } + + public async deleteEntireRegistry(args?: DeleteEntireRegistrySectionsArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.deleteEntireRegistry, args, options); + } + + public async storeNodeReferences(args?: StoreNodeReferencesArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.storeNodeReferences, args, options); + } + + public async deleteNodeReferences(args: DeleteNodeReferencesArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.deleteNodeReferences, args, options); + } + + public async getNodesWithProperties(args: GetNodesWithPropertiesArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.getNodesWithProperties, args, options); + } + + public async findNodesAtLocation(args: FindNodesAtLocationArgs, options?: RequestOptions) { + return this.sendOdcMessage>(RequestType.findNodesAtLocation, args, options); + } +} + +type ObserverCallback = (message) => void; + +const odc = new ODCIntermediary(); +export { + odc, + intermediary +}; diff --git a/webviews/src/main.ts b/webviews/src/main.ts new file mode 100644 index 00000000..9e35a81f --- /dev/null +++ b/webviews/src/main.ts @@ -0,0 +1,26 @@ +/* eslint-disable object-shorthand */ +import rokuRegistryView from './views/RokuRegistryView/RokuRegistryView.svelte'; +import rokuCommandsView from './views/RokuCommandsView/RokuCommandsView.svelte'; +import rokuDeviceView from './views/RokuDeviceView/RokuDeviceView.svelte'; +import sceneGraphInspectorView from './views/SceneGraphInspectorView/SceneGraphInspectorView.svelte'; +import './style.css'; + +//write toolkit to window this to prevent svelte from tree-shaking it +import * as toolkit from '@vscode/webview-ui-toolkit/dist/toolkit'; +(window as any).___toolkit = toolkit; + +// Provided by ViewProviders +declare const viewName; + +//these need to exactly match the names from the "views" contributions in package.json +const views = { + rokuRegistryView, + rokuCommandsView, + rokuDeviceView, + sceneGraphInspectorView +}; + +const app = new views[viewName]({ + target: document.body +}); +export default app; diff --git a/webviews/src/shared/Chevron.svelte b/webviews/src/shared/Chevron.svelte new file mode 100644 index 00000000..a9b5bfe8 --- /dev/null +++ b/webviews/src/shared/Chevron.svelte @@ -0,0 +1,13 @@ + + + + {#if expanded} + + {:else} + + {/if} + diff --git a/webviews/src/shared/Loader.svelte b/webviews/src/shared/Loader.svelte new file mode 100644 index 00000000..e298d91f --- /dev/null +++ b/webviews/src/shared/Loader.svelte @@ -0,0 +1,28 @@ + + +
+
+
diff --git a/webviews/src/shared/OdcSetManualIpAddress.svelte b/webviews/src/shared/OdcSetManualIpAddress.svelte new file mode 100644 index 00000000..58f302b3 --- /dev/null +++ b/webviews/src/shared/OdcSetManualIpAddress.svelte @@ -0,0 +1,50 @@ + + + + +
+ Use the form below to connect to an active session (the on-device component needs to already be installed and running)
+ + + + + + + + + + +
+ + + + + +
+ +
+
diff --git a/webviews/src/shared/OdcSetupSteps.svelte b/webviews/src/shared/OdcSetupSteps.svelte new file mode 100644 index 00000000..8409a256 --- /dev/null +++ b/webviews/src/shared/OdcSetupSteps.svelte @@ -0,0 +1,36 @@ + + + + +
+ Could not connect to the on-device component. Install steps: + +
    +
  1. + Enable the following property in launch.json: +
    "injectRdbOnDeviceComponent": true
    +
  2. +
  3. + Add this comment to function main() after the call to screen.show() +
    ' vscode_rdb_on_device_component_entry
    +
  4. +
+ The on-device component is properly installed if you see this log output during channel launch: +
[RTA][INFO] OnDeviceComponent init
+ +
+ Connect manually: + +
diff --git a/webviews/src/shared/vscode-ui-toolkit/VscodeCheckbox.svelte b/webviews/src/shared/vscode-ui-toolkit/VscodeCheckbox.svelte new file mode 100644 index 00000000..02caf01c --- /dev/null +++ b/webviews/src/shared/vscode-ui-toolkit/VscodeCheckbox.svelte @@ -0,0 +1,24 @@ + + + + + diff --git a/webviews/src/style.css b/webviews/src/style.css new file mode 100644 index 00000000..0ab8adf0 --- /dev/null +++ b/webviews/src/style.css @@ -0,0 +1,35 @@ +html, +body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; +} + +button { + cursor: pointer; + display: inline-flex; + justify-content: space-between; +} + +.hide { + display: none; +} + +.icon-button { + cursor: pointer; + padding: 3px; + display: inline-block; + width: 16px; + height: 16px; +} + +.icon-button:hover { + background-color: var(--vscode-toolbar-hoverBackground); + border-radius: 5px; +} + +.icon-button svg { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/webviews/src/types.d.ts b/webviews/src/types.d.ts new file mode 100644 index 00000000..3df96846 --- /dev/null +++ b/webviews/src/types.d.ts @@ -0,0 +1,20 @@ +import type { Definition } from 'typescript-json-schema'; + +declare global { + declare const acquireVsCodeApi: () => { + getState: () => T; + setState: (data: T) => void; + postMessage: (msg: unknown) => void; + }; + + interface Window { + vscode: { + getState: () => T; + setState: (data: T) => void; + postMessage: (msg: unknown) => void; + }; + } + + declare const requestArgsSchema: Definition; + declare const odcCommands: string[]; +} diff --git a/webviews/src/utils.spec.ts b/webviews/src/utils.spec.ts new file mode 100644 index 00000000..d59d0f4d --- /dev/null +++ b/webviews/src/utils.spec.ts @@ -0,0 +1,99 @@ +import { expect } from 'chai'; +import { utils } from './utils'; +import * as sinonImport from 'sinon'; + +describe('Rdb utils', () => { + describe('isObjectWithProperty', () => { + it('should return true if the property exist', () => { + const result = utils.isObjectWithProperty({ + itExists: 'yup' + }, 'itExists'); + expect(result).to.be.true; + }); + + it('should return false if the property does not exist', () => { + const result = utils.isObjectWithProperty({}, 'itDoesNotExist'); + expect(result).to.be.false; + }); + + it('should return false if null', () => { + const result = utils.isObjectWithProperty(null, 'itDoesNotExist'); + expect(result).to.be.false; + }); + }); + + describe('storage', () => { + const sinon = sinonImport.createSandbox(); + const utilsAccess = utils as any; + let getStateReturn = ''; + beforeEach(() => { + getStateReturn = ''; + utilsAccess.storage = undefined; + sinon.stub(utilsAccess, 'getVscodeApi').callsFake(() => { + return { + getState: () => getStateReturn, + setState: (message) => {} + }; + }); + }); + afterEach(() => { + sinon.restore(); + }); + + describe('getStorageValue', () => { + it('should return the stored value if it exists', () => { + const storage = { + myValue: 42 + }; + getStateReturn = JSON.stringify(storage); + const result = utils.getStorageValue('myValue'); + expect(result).to.equal(storage.myValue); + }); + + it('should return default value if the value was not found', () => { + const defaultValue = 'defaultValue'; + const result = utils.getStorageValue('doesNotExist', defaultValue); + expect(result).to.equal(defaultValue); + }); + }); + + describe('getStorageBooleanValue', () => { + it('should return the stored value if it is a boolean', () => { + const storage = { + myValue: true + }; + getStateReturn = JSON.stringify(storage); + const result = utils.getStorageBooleanValue('myValue'); + expect(result).to.equal(storage.myValue); + }); + + it('should return default value if the value was not a boolean', () => { + const storage = { + myValue: 'notABoolean' + }; + getStateReturn = JSON.stringify(storage); + const result = utils.getStorageBooleanValue('myValue', true); + expect(result).to.equal(true); + }); + }); + + describe('setStorageValue', () => { + it('should store the value in storage', () => { + expect(utils.getStorageValue('myValue')).to.be.null; + const value = 'everybody wants to rule the world'; + utils.setStorageValue('myValue', value); + expect(utils.getStorageValue('myValue')).to.equal(value); + }); + }); + + describe('deleteStorageValue', () => { + it('should delete the requested storage value', () => { + const value = 'destroyMe'; + utils.setStorageValue('myValue', value); + expect(utils.getStorageValue('myValue')).to.equal(value); + utils.deleteStorageValue('myValue'); + expect(utils.getStorageValue('myValue')).to.be.null; + }); + }); + }); +}); diff --git a/webviews/src/utils.ts b/webviews/src/utils.ts new file mode 100644 index 00000000..92bfeebc --- /dev/null +++ b/webviews/src/utils.ts @@ -0,0 +1,70 @@ +type AllowedStorageTypes = string | number | boolean | Record; + +class Utils { + private storage: Record; + + public debugLog(...args) { + if (this.getStorageBooleanValue('enableDebugLogging')) { + console.log(...args); + } + } + + public isObjectWithProperty + (obj: any, prop: Y): obj is Record { + if (obj === null || typeof obj !== 'object') { + return false; + } + return obj.hasOwnProperty(prop); + } + + private getVscodeApi() { + return window.vscode; + } + + private setupStorage() { + if (this.storage) { + return; + } + + this.storage = {}; + const state = this.getVscodeApi().getState(); + if (state) { + this.storage = JSON.parse(state); + } + } + + public getStorageValue(key: string, defaultValue = null) { + this.setupStorage(); + if (this.storage.hasOwnProperty(key)) { + return this.storage[key]; + } else { + return defaultValue; + } + } + + public getStorageBooleanValue(key: string, defaultValue = false) { + const value = this.getStorageValue(key); + if (typeof value === 'boolean') { + return value; + } else { + return defaultValue; + } + } + + public setStorageValue(key: string, value: AllowedStorageTypes) { + this.setupStorage(); + this.storage[key] = value; + this.getVscodeApi().setState(JSON.stringify(this.storage)); + } + + public deleteStorageValue(key: string) { + this.setupStorage(); + delete this.storage[key]; + this.getVscodeApi().setState(JSON.stringify(this.storage)); + } +} + +const utils = new Utils(); +export { + utils +}; diff --git a/webviews/src/views/RokuCommandsView/RokuCommandsView.spec.ts b/webviews/src/views/RokuCommandsView/RokuCommandsView.spec.ts new file mode 100644 index 00000000..048b1309 --- /dev/null +++ b/webviews/src/views/RokuCommandsView/RokuCommandsView.spec.ts @@ -0,0 +1,123 @@ +import { expect } from 'chai'; +import { commandsView } from './RokuCommandsView'; + +describe('commandsView', () => { + const requestArgsSchema = { + 'definitions': { + 'MatchObject': { + 'properties': { + 'base': { + '$ref': '#/definitions/ODC.BaseTypes', + 'description': 'Specifies what the entry point is for this key path. Defaults to \'global\' if not specified' + }, + 'convertResponseToJsonCompatible': { + 'description': 'We have to convert nodes before converting to json. If this isn\'t needed then it causes a fairly significant overhead', + 'type': 'boolean' + }, + 'key': { + 'description': 'If base is \'nodeRef\' this is the key that we used to store the node references on. If one isn\'t provided we use the automatically generated one', + 'type': 'string' + }, + 'keyPath': { + 'description': 'Holds the hierarchy value with each level separated by dot for ex: videoNode.title to what you are interested in getting the value from or written to.', + 'type': 'string' + }, + 'responseMaxChildDepth': { + 'description': 'Controls how deep we\'ll recurse into node\'s tree structure. Defaults to 0', + 'type': 'number' + }, + 'value': { + 'description': 'If the match value is passed in then the observer will be fired when the field value equals to the value in match', + 'type': [ + 'string', + 'number', + 'boolean' + ] + } + }, + 'propertyOrder': [ + 'value', + 'keyPath', + 'convertResponseToJsonCompatible', + 'base', + 'key', + 'responseMaxChildDepth' + ], + 'type': 'object' + }, + 'ODC.BaseTypes': { + 'enum': [ + 'global', + 'nodeRef', + 'scene' + ], + 'type': 'string' + } + } + }; + + describe('convertArgs', () => { + it('should return as an array with the correct count', () => { + const result = commandsView.convertArgs(requestArgsSchema.definitions.MatchObject, requestArgsSchema); + expect(result.length).to.equal(6); + }); + + it('should work correctly with direct entries', () => { + const result = commandsView.convertArgs(requestArgsSchema.definitions.MatchObject, requestArgsSchema); + const refResult = result[1]; + expect(refResult.id).to.equal('keyPath'); + expect(refResult.type).to.equal('string'); + }); + + it('should work correctly with ref entries', () => { + const result = commandsView.convertArgs(requestArgsSchema.definitions.MatchObject, requestArgsSchema); + const refResult = result[3]; + expect(refResult.id).to.equal('base'); + expect(refResult.type).to.equal('string'); + }); + + it('should return an empty array if it is missing propertyOrder or properties', () => { + let input; + input = { + propertyOrder: requestArgsSchema.definitions.MatchObject.propertyOrder + }; + let result = commandsView.convertArgs(input, requestArgsSchema); + expect(result).to.be.an.instanceOf(Array); + + input = { + properties: requestArgsSchema.definitions.MatchObject.properties + }; + result = commandsView.convertArgs(input, requestArgsSchema); + expect(result).to.be.an.instanceOf(Array); + }); + }); + + describe('processArgToSendToExtension', () => { + it('should handle boolean values correctly', () => { + expect(commandsView.processArgToSendToExtension('boolean', 'true')).to.equal(true); + expect(commandsView.processArgToSendToExtension('boolean', 'false')).to.equal(false); + }); + + it('should handle object values correctly', () => { + const result = commandsView.processArgToSendToExtension('object', '{"a": 1}'); + expect(result.a).to.equal(1); + }); + + it('should handle array values correctly', () => { + const result = commandsView.processArgToSendToExtension('array', '["a", "b"]'); + expect(result[0]).to.equal('a'); + expect(result[1]).to.equal('b'); + }); + + it('should handle number values correctly', () => { + expect(commandsView.processArgToSendToExtension('number', '1')).to.equal(1); + expect(commandsView.processArgToSendToExtension('number', '1.5')).to.equal(1.5); + }); + + it('string values should be passed through directly', () => { + const value = 'foo'; + expect(commandsView.processArgToSendToExtension('string', value)).to.equal(value); + }); + }); + +}); diff --git a/webviews/src/views/RokuCommandsView/RokuCommandsView.svelte b/webviews/src/views/RokuCommandsView/RokuCommandsView.svelte new file mode 100644 index 00000000..2bcdbd37 --- /dev/null +++ b/webviews/src/views/RokuCommandsView/RokuCommandsView.svelte @@ -0,0 +1,169 @@ + + + + +{#if !odcAvailable} + +{:else} +
+ + + + + {#each commandArgs as args} +
+ + {#if args.enum} + + {:else} + + {/if} +
+ {/each} +
+
+
+            {commandResponse}
+        
+
+{/if} diff --git a/ui/rdb/views/CommandsView.ts b/webviews/src/views/RokuCommandsView/RokuCommandsView.ts similarity index 54% rename from ui/rdb/views/CommandsView.ts rename to webviews/src/views/RokuCommandsView/RokuCommandsView.ts index 65f1f49c..4ba5e881 100644 --- a/ui/rdb/views/CommandsView.ts +++ b/webviews/src/views/RokuCommandsView/RokuCommandsView.ts @@ -1,16 +1,24 @@ +import type { Definition } from 'typescript-json-schema'; +import { utils } from '../../utils'; + class CommandsView { - public convertArgs(inputArgs, requestArgsSchema) { + public convertArgs(inputArgs, requestArgsSchema: Definition) { const args = []; - for (const key of inputArgs.propertyOrder) { + if (!utils.isObjectWithProperty(inputArgs, 'propertyOrder') || !utils.isObjectWithProperty(inputArgs, 'properties')) { + return args; + } + for (const key of inputArgs.propertyOrder as any) { let rawArg = inputArgs.properties[key]; // Handles references to other definitions in schema - if (rawArg['$ref']) { - const refParts = rawArg['$ref'].split("/"); + if (rawArg.$ref) { + const refParts = rawArg.$ref.split('/'); let rawArgRef = requestArgsSchema; for (const key of refParts) { // Skip first entry - if (key === '#') continue; + if (key === '#') { + continue; + } rawArgRef = rawArgRef[key]; } for (const key in rawArgRef) { @@ -26,11 +34,11 @@ class CommandsView { } public processArgToSendToExtension(argType: string, argValue: string) { - if (argType == 'boolean') { - return argValue === 'true' - } else if (argType == 'array' || argType == 'object') { + if (argType === 'boolean') { + return argValue === 'true'; + } else if (argType === 'array' || argType === 'object') { return JSON.parse(argValue); - } else if (argType == 'number') { + } else if (argType === 'number') { return Number(argValue); } else { return argValue; @@ -42,4 +50,4 @@ const commandsView = new CommandsView(); export { commandsView -} +}; diff --git a/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte b/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte new file mode 100644 index 00000000..ca7ceecd --- /dev/null +++ b/webviews/src/views/RokuDeviceView/RokuDeviceView.svelte @@ -0,0 +1,368 @@ + + + + + + +
+ {#if deviceAvailable} +
+ {#if focusedTreeNode} +
+
+ +
+ subtype: {focusedTreeNode.subtype}, + id: {focusedTreeNode.id}
+ x: {focusedTreeNode.sceneRect.x}, + y: {focusedTreeNode.sceneRect.y}, + width: {focusedTreeNode.sceneRect.width}, + height: {focusedTreeNode.sceneRect.height} +
+ {/if} + + +
+ {:else} +
+ +
+ {/if} +
diff --git a/ui/rdb/components/JSONTreeView/JSONArrow.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONArrow.svelte similarity index 100% rename from ui/rdb/components/JSONTreeView/JSONArrow.svelte rename to webviews/src/views/RokuRegistryView/JSONTreePage/JSONArrow.svelte diff --git a/ui/rdb/components/JSONTreeView/JSONKey.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONKey.svelte similarity index 100% rename from ui/rdb/components/JSONTreeView/JSONKey.svelte rename to webviews/src/views/RokuRegistryView/JSONTreePage/JSONKey.svelte diff --git a/ui/rdb/components/JSONTreeView/JSONNested.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONNested.svelte similarity index 100% rename from ui/rdb/components/JSONTreeView/JSONNested.svelte rename to webviews/src/views/RokuRegistryView/JSONTreePage/JSONNested.svelte diff --git a/webviews/src/views/RokuRegistryView/JSONTreePage/JSONNode.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONNode.svelte new file mode 100644 index 00000000..07a4835d --- /dev/null +++ b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONNode.svelte @@ -0,0 +1,54 @@ + + + + +{#if typeof nodeValue !== 'object'} +
  • + +
  • +{:else} +
  • + + + {#if expanded} +
      + {#each Object.keys(nodeValue) as key} + + {/each} +
    + {/if} +
  • +{/if} diff --git a/ui/rdb/components/JSONTreeView/JSONObjectNode.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONObjectNode.svelte similarity index 100% rename from ui/rdb/components/JSONTreeView/JSONObjectNode.svelte rename to webviews/src/views/RokuRegistryView/JSONTreePage/JSONObjectNode.svelte diff --git a/ui/rdb/components/JSONTreeView/JSONTreeView.svelte b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONTreePage.svelte similarity index 88% rename from ui/rdb/components/JSONTreeView/JSONTreeView.svelte rename to webviews/src/views/RokuRegistryView/JSONTreePage/JSONTreePage.svelte index 6496f87a..6aaf87c3 100644 --- a/ui/rdb/components/JSONTreeView/JSONTreeView.svelte +++ b/webviews/src/views/RokuRegistryView/JSONTreePage/JSONTreePage.svelte @@ -1,6 +1,6 @@ + +{#if !odcAvailable} + +{:else if loading} + +{:else if Object.keys(registryValues).length > 0} + +{/if} diff --git a/ui/rdb/views/RegistryView.ts b/webviews/src/views/RokuRegistryView/RokuRegistryView.ts similarity index 72% rename from ui/rdb/views/RegistryView.ts rename to webviews/src/views/RokuRegistryView/RokuRegistryView.ts index 5f2d3f77..f32a619a 100644 --- a/ui/rdb/views/RegistryView.ts +++ b/webviews/src/views/RokuRegistryView/RokuRegistryView.ts @@ -1,14 +1,15 @@ class RegistryView { public formatValues(values) { let input = values; + // eslint-disable-next-line array-callback-return Object.keys(values).map((key) => { - if (typeof values[key] == 'object') { + if (typeof values[key] === 'object') { input[key] = this.formatValues(values[key]); - } else if (typeof values[key] == 'string') { + } else if (typeof values[key] === 'string') { try { // Try and parse it to see if it's json values[key] = JSON.parse(values[key]); - } catch(e) { + } catch (e) { // If we fail we leave it unchanged } } @@ -22,4 +23,4 @@ const registryView = new RegistryView(); export { registryView -} +}; diff --git a/webviews/src/views/SceneGraphInspectorView/Branch.svelte b/webviews/src/views/SceneGraphInspectorView/Branch.svelte new file mode 100644 index 00000000..03483d2b --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/Branch.svelte @@ -0,0 +1,268 @@ + + + + +
    + {#each { length: depth ?? 0 } as _, i} +   + {/each} +
    + + {#if hasChildren} + + {:else} + + {/if} + + + {treeNode.subtype}{#if treeNode.id.length > 0} id: {treeNode.id}{/if} + +
    +
    + {#if treeNode.translation !== undefined} + + + + {/if} + {#if treeNode.visible !== undefined} + + {#if treeNode.visible}{:else}{/if} + + {/if} + + + +
    +
    +
    + {#each treeNode.children as treeNodeChild} + + {/each} +
    diff --git a/webviews/src/views/SceneGraphInspectorView/ColorField.spec.ts b/webviews/src/views/SceneGraphInspectorView/ColorField.spec.ts new file mode 100644 index 00000000..24ae2b3e --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/ColorField.spec.ts @@ -0,0 +1,183 @@ +import { expect } from 'chai'; +import { colorField } from './ColorField'; + +describe('ColorField', () => { + describe('convertIntegerColorToRgb', () => { + it('should convert integer known values from Roku to the proper colors', () => { + const testCases = [{ + // #FFFFFFFF + input: -1, + expectedOutput: { + red: 255, + green: 255, + blue: 255, + alpha: 255 + } + }, { + // #000000FF + input: 255, + expectedOutput: { + red: 0, + green: 0, + blue: 0, + alpha: 255 + } + }, { + // #00000000 + input: 0, + expectedOutput: { + red: 0, + green: 0, + blue: 0, + alpha: 0 + } + }, { + // #FFFFFF00 + input: -256, + expectedOutput: { + red: 255, + green: 255, + blue: 255, + alpha: 0 + } + }, { + // #FF0000FF + input: -16776961, + expectedOutput: { + red: 255, + green: 0, + blue: 0, + alpha: 255 + } + }, { + // #00FF00FF + input: 16711935, + expectedOutput: { + red: 0, + green: 255, + blue: 0, + alpha: 255 + } + }, { + // #0000FFFF + input: 65535, + expectedOutput: { + red: 0, + green: 0, + blue: 255, + alpha: 255 + } + }, { + // #0000FF00 + input: 65280, + expectedOutput: { + red: 0, + green: 0, + blue: 255, + alpha: 0 + } + }]; + for (const { input, expectedOutput } of testCases) { + const result = colorField.convertIntegerColorToRgb(input); + expect(result.red).to.equal(expectedOutput.red); + expect(result.green).to.equal(expectedOutput.green); + expect(result.blue).to.equal(expectedOutput.blue); + expect(result.alpha).to.equal(expectedOutput.alpha); + } + }); + }); + + describe('convertHexPart', () => { + it('should convert byte to the correct hexadecimal with correct casing', () => { + const testCases = [{ + input: 255, + expectedOutput: 'FF' + }, { + input: 0, + expectedOutput: '00' + }, { + input: 150, + expectedOutput: '96' + }]; + for (const { input, expectedOutput } of testCases) { + const result = colorField.convertHexPart(input); + expect(result).to.equal(expectedOutput); + } + }); + }); + + describe('convertRgbToHex', () => { + it('should convert rgb representation to correct hexadecimal version', () => { + const testCases = [{ + input: { + red: 255, + green: 255, + blue: 255, + alpha: 255 + }, + expectedOutput: '#FFFFFFFF' + }, { + input: { + red: 0, + green: 0, + blue: 0, + alpha: 255 + }, + expectedOutput: '#000000FF' + }, { + input: { + red: 0, + green: 0, + blue: 0, + alpha: 0 + }, + expectedOutput: '#00000000' + }, { + input: { + red: 255, + green: 255, + blue: 255, + alpha: 0 + }, + expectedOutput: '#FFFFFF00' + }, { + input: { + red: 255, + green: 0, + blue: 0, + alpha: 255 + }, + expectedOutput: '#FF0000FF' + }, { + input: { + red: 0, + green: 255, + blue: 0, + alpha: 255 + }, + expectedOutput: '#00FF00FF' + }, { + input: { + red: 0, + green: 0, + blue: 255, + alpha: 255 + }, + expectedOutput: '#0000FFFF' + }, { + input: { + red: 0, + green: 0, + blue: 255, + alpha: 0 + }, + expectedOutput: '#0000FF00' + }]; + + for (const { input, expectedOutput } of testCases) { + const result = colorField.convertRgbToHex(input); + expect(result).to.equal(expectedOutput); + } + }); + }); +}); diff --git a/webviews/src/views/SceneGraphInspectorView/ColorField.svelte b/webviews/src/views/SceneGraphInspectorView/ColorField.svelte new file mode 100644 index 00000000..d4a64ddc --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/ColorField.svelte @@ -0,0 +1,50 @@ + + + + + + +
    diff --git a/webviews/src/views/SceneGraphInspectorView/ColorField.ts b/webviews/src/views/SceneGraphInspectorView/ColorField.ts new file mode 100644 index 00000000..5b6efdbe --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/ColorField.ts @@ -0,0 +1,30 @@ +class ColorField { + convertIntegerColorToRgb(integerColor: number) { + // Have to convert from signed to unsigned and then convert to binary representation + const unsignedInteger = integerColor >>> 0; // eslint-disable-line no-bitwise + const binary = unsignedInteger.toString(2).padStart(32, '0'); + + // Slice out each 8 bits for each rgba part value + const rgb = { + red: parseInt(binary.slice(0, 8), 2), + green: parseInt(binary.slice(8, 16), 2), + blue: parseInt(binary.slice(16, 24), 2), + alpha: parseInt(binary.slice(24, 32), 2) + }; + return rgb; + } + + convertHexPart(byte: number) { + return byte.toString(16).padStart(2, '0').toUpperCase(); + } + + convertRgbToHex(rgb: ReturnType) { + return `#${this.convertHexPart(rgb.red)}${this.convertHexPart(rgb.green)}${this.convertHexPart(rgb.blue)}${this.convertHexPart(rgb.alpha)}`; + } +} + +const colorField = new ColorField(); + +export { + colorField +}; diff --git a/webviews/src/views/SceneGraphInspectorView/NodeCountByTypePage.svelte b/webviews/src/views/SceneGraphInspectorView/NodeCountByTypePage.svelte new file mode 100644 index 00000000..4caf7874 --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/NodeCountByTypePage.svelte @@ -0,0 +1,86 @@ + + + + + +
    +
    + + +
      + {#each Object.entries(nodeCountByType) as [key, value]} +
    • + {key}: + {value} +
    • + {/each} +
    +
    diff --git a/webviews/src/views/SceneGraphInspectorView/NodeDetailPage.svelte b/webviews/src/views/SceneGraphInspectorView/NodeDetailPage.svelte new file mode 100644 index 00000000..9630d824 --- /dev/null +++ b/webviews/src/views/SceneGraphInspectorView/NodeDetailPage.svelte @@ -0,0 +1,614 @@ + + + + + +
    +
    + +{#if showKeyPathInfo && inspectNodeTreeNode} +
    + "base": "scene",
    + "keyPath": "{inspectNodeTreeNode.keyPath}" +
    +{/if} + + + {#if children.length > 0} +
    + + + +
    children ({children.length})
    +
    +
    + {#each children as child, i} +
    {i}: +
    + {/each} +
    +
    + {/if} + +
      + {#each Object.entries(fields) as [id, field]} +
    • + + + {#if field.value === null} + Invalid + {:else if field.fieldType === 'vector2d'} + + + + {#if id !== 'scale'} + + + + {/if} + + + + + {:else if field.fieldType === 'color'} + + {:else if field.type === 'roBoolean'} + + {:else if field.type === 'roFloat' || field.type === 'roInt'} + + {:else if field.type === 'roAssociativeArray'} + { +
      + {#each Object.entries(field.value) as [collectionItemId, item]} +
      + {collectionItemId}: + {#if utils.isObjectWithProperty(item, 'subtype')} + {:else if typeof item === 'boolean'} + {:else if typeof item === 'object'} + {JSON.stringify( + item + )}{:else if typeof item === 'number'} + {:else} + {/if}{#if Object.entries(field.value).pop()[0] !== collectionItemId},{/if} + + + +
      + {/each} +
      + } + {:else if field.type === 'roArray'} + [ + {#each field.value as item, collectionItemId} +
      + {collectionItemId}: + {#if utils.isObjectWithProperty(item, 'subtype')} + {:else if typeof item === 'object'} + {JSON.stringify( + item + )}{:else if typeof item === 'number'} + {:else if typeof item === 'boolean'} + {:else} + {/if}{#if collectionItemId + 1 < field.value.length},{/if} + + + +
      + {/each} + ] + {:else if field.type === 'roSGNode' || field.fieldType === 'node'} + + {:else if field.type === 'roString' || field.fieldType == 'string'} + + {:else} +