diff --git a/.babelrc-deno.json b/.babelrc-deno.json deleted file mode 100644 index 0e173bfb4e..0000000000 --- a/.babelrc-deno.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "plugins": [ - "@babel/plugin-syntax-typescript", - ["./resources/add-extension-to-import-paths", { "extension": "ts" }], - "./resources/inline-invariant" - ] -} diff --git a/.babelrc-npm.json b/.babelrc-npm.json deleted file mode 100644 index 8963ac9526..0000000000 --- a/.babelrc-npm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { "modules": false, "targets": { "node": "14" } }] - ], - "plugins": [ - ["./resources/add-extension-to-import-paths.js", { "extension": "js" }], - "@babel/plugin-transform-typescript", - "./resources/inline-invariant.js" - ] -} diff --git a/.babelrc.json b/.babelrc.json deleted file mode 100644 index caa5300ad7..0000000000 --- a/.babelrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "plugins": ["@babel/plugin-transform-typescript"], - "presets": [ - [ - "@babel/preset-env", - { "bugfixes": true, "targets": { "node": "current" } } - ] - ] -} diff --git a/.eslintignore b/.eslintignore index 8700905993..082a0a423a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,6 +5,7 @@ /node_modules /reports /npmDist +/npmEsmDist /denoDist /websiteDist diff --git a/.eslintrc.yml b/.eslintrc.yml index 4d9e32d077..6efcceb8f9 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -38,7 +38,7 @@ rules: node/no-exports-assign: error node/no-extraneous-import: error node/no-extraneous-require: error - node/no-missing-import: [error, { allowModules: ['graphql'] }] + node/no-missing-import: off # Blocked by https://github.com/mysticatea/eslint-plugin-node/issues/248 node/no-missing-require: error node/no-new-require: error node/no-path-concat: error @@ -84,7 +84,7 @@ rules: # Static analysis # https://github.com/benmosher/eslint-plugin-import#static-analysis - import/no-unresolved: [error, { ignore: ['graphql'] }] + import/no-unresolved: off # blocked by https://github.com/import-js/eslint-plugin-import/issues/2170 import/named: error import/default: error import/namespace: error @@ -130,7 +130,6 @@ rules: import/extensions: - error - ignorePackages - - ts: never # TODO: remove once TS supports extensions import/order: [error, { newlines-between: always-and-inside-groups }] import/newline-after-import: error import/prefer-default-export: off @@ -144,7 +143,7 @@ rules: import/dynamic-import-chunkname: off ############################################################################## - # `eslint-plugin-simple-import-sort` rule list based on `v2.25.x` + # `eslint-plugin-simple-import-sort` rule list based on `v8.0.x` # https://github.com/lydell/eslint-plugin-simple-import-sort ############################################################################## simple-import-sort/imports: @@ -179,7 +178,7 @@ rules: simple-import-sort/exports: off # TODO ############################################################################## - # ESLint builtin rules list based on `v8.21.x` + # ESLint builtin rules list based on `v8.23.x` ############################################################################## # Possible Errors @@ -474,6 +473,10 @@ rules: yield-star-spacing: off overrides: + - files: + - 'integrationTests/node-esm/**/*.js' + parserOptions: + sourceType: module - files: '**/*.ts' parser: '@typescript-eslint/parser' parserOptions: @@ -493,7 +496,7 @@ overrides: tsdoc/syntax: error ########################################################################## - # `@typescript-eslint/eslint-plugin` rule list based on `v5.33.x` + # `@typescript-eslint/eslint-plugin` rule list based on `v5.37.x` ########################################################################## # Supported Rules @@ -696,8 +699,11 @@ overrides: node: true rules: node/no-sync: off + node/no-extraneous-import: [error, { allowModules: ['graphql'] }] import/no-unresolved: off + import/no-namespace: off import/no-nodejs-modules: off + import/no-extraneous-dependencies: off - files: 'resources/**' env: node: true @@ -735,7 +741,6 @@ overrides: version: detect rules: node/no-unpublished-require: off - node/no-missing-import: off import/no-default-export: off import/no-commonjs: off import/no-nodejs-modules: off diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e2d34fcdd..ba7102709e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -154,6 +154,25 @@ jobs: - name: Run Tests with coverage run: npm run testonly:cover + codeql: + name: Run CodeQL security scan + runs-on: ubuntu-latest + permissions: + security-events: write + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + persist-credentials: false + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: 'javascript, typescript' + + - name: Perform CodeQL analysis + uses: github/codeql-action/analyze@v2 + build-npm-dist: name: Build 'npmDist' artifact runs-on: ubuntu-latest diff --git a/.github/workflows/cmd-publish-pr-on-npm.yml b/.github/workflows/cmd-publish-pr-on-npm.yml index 115736fa70..b35ca89550 100644 --- a/.github/workflows/cmd-publish-pr-on-npm.yml +++ b/.github/workflows/cmd-publish-pr-on-npm.yml @@ -2,12 +2,12 @@ name: publish-pr-on-npm on: workflow_call: inputs: - pullRequestJSON: + pull_request_json: description: String that contain JSON payload for `pull_request` event. required: true type: string secrets: - NPM_CANARY_PR_PUBLISH_TOKEN: + npm_canary_pr_publish_token: description: NPM token to publish canary release. required: true jobs: @@ -18,7 +18,7 @@ jobs: uses: actions/checkout@v3 with: persist-credentials: false - ref: ${{ fromJSON(inputs.pullRequestJSON).merge_commit_sha }} + ref: ${{ fromJSON(inputs.pull_request_json).merge_commit_sha }} - name: Setup Node.js uses: actions/setup-node@v3 @@ -64,7 +64,7 @@ jobs: - name: Modify NPM package to be canary release env: - PULL_REQUEST_JSON: ${{ inputs.pullRequestJSON }} + PULL_REQUEST_JSON: ${{ inputs.pull_request_json }} uses: actions/github-script@v6 with: script: | @@ -105,7 +105,7 @@ jobs: - name: Publish NPM package run: npm publish --ignore-scripts ./npmDist env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_CANARY_PR_PUBLISH_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.npm_canary_pr_publish_token }} - name: Upload replyMessage uses: actions/upload-artifact@v3 diff --git a/.github/workflows/cmd-run-benchmark.yml b/.github/workflows/cmd-run-benchmark.yml index f17e7ed2f0..7f8d5764b3 100644 --- a/.github/workflows/cmd-run-benchmark.yml +++ b/.github/workflows/cmd-run-benchmark.yml @@ -2,7 +2,7 @@ name: run-benchmark on: workflow_call: inputs: - pullRequestJSON: + pull_request_json: description: String that contain JSON payload for `pull_request` event. required: true type: string @@ -15,11 +15,11 @@ jobs: uses: actions/checkout@v3 with: persist-credentials: false - ref: ${{ fromJSON(inputs.pullRequestJSON).merge_commit_sha }} + ref: ${{ fromJSON(inputs.pull_request_json).merge_commit_sha }} - name: Deepen cloned repo env: - BASE_SHA: ${{ fromJSON(inputs.pullRequestJSON).base.sha }} + BASE_SHA: ${{ fromJSON(inputs.pull_request_json).base.sha }} run: 'git fetch --depth=1 origin "$BASE_SHA:refs/tags/BASE"' - name: Setup Node.js diff --git a/.github/workflows/github-actions-bot.yml b/.github/workflows/github-actions-bot.yml index fccdb4ebae..6f9b48f2ee 100644 --- a/.github/workflows/github-actions-bot.yml +++ b/.github/workflows/github-actions-bot.yml @@ -56,7 +56,7 @@ jobs: runs-on: ubuntu-latest outputs: cmd: ${{ steps.parse-cmd.outputs.cmd }} - pullRequestJSON: ${{ steps.parse-cmd.outputs.pullRequestJSON }} + pull_request_json: ${{ steps.parse-cmd.outputs.pull_request_json }} steps: - uses: actions/github-script@v6 with: @@ -76,23 +76,23 @@ jobs: const { url } = context.payload.issue.pull_request; const { data } = await github.request(url); - core.setOutput('pullRequestJSON', JSON.stringify(data, null, 2)); + core.setOutput('pull_request_json', JSON.stringify(data, null, 2)); cmd-publish-pr-on-npm: needs: [accept-cmd] if: needs.accept-cmd.outputs.cmd == 'publish-pr-on-npm' uses: ./.github/workflows/cmd-publish-pr-on-npm.yml with: - pullRequestJSON: ${{ needs.accept-cmd.outputs.pullRequestJSON }} + pull_request_json: ${{ needs.accept-cmd.outputs.pull_request_json }} secrets: - NPM_CANARY_PR_PUBLISH_TOKEN: ${{ secrets.NPM_CANARY_PR_PUBLISH_TOKEN }} + npm_canary_pr_publish_token: ${{ secrets.npm_canary_pr_publish_token }} cmd-run-benchmark: needs: [accept-cmd] if: needs.accept-cmd.outputs.cmd == 'run-benchmark' uses: ./.github/workflows/cmd-run-benchmark.yml with: - pullRequestJSON: ${{ needs.accept-cmd.outputs.pullRequestJSON }} + pull_request_json: ${{ needs.accept-cmd.outputs.pull_request_json }} respond-to-cmd: needs: diff --git a/.gitignore b/.gitignore index e3f24a8518..b3a652de18 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,6 @@ /node_modules /reports /npmDist +/npmEsmDist /denoDist /websiteDist diff --git a/.mocharc.yml b/.mocharc.yml index 674de6b057..923173c1c4 100644 --- a/.mocharc.yml +++ b/.mocharc.yml @@ -1,7 +1,7 @@ fail-zero: true throw-deprecation: true check-leaks: true -require: - - 'ts-node/register/transpile-only' extension: - - 'ts' + - ts +node-option: + - 'loader=ts-node/esm/transpile-only' diff --git a/.prettierignore b/.prettierignore index 64479f1f37..726959a3f2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,5 +6,6 @@ /node_modules /reports /npmDist +/npmEsmDist /denoDist /websiteDist diff --git a/cspell.yml b/cspell.yml index a7fc29c7d9..6ae58bbd3f 100644 --- a/cspell.yml +++ b/cspell.yml @@ -21,6 +21,7 @@ overrides: - clsx - infima +validateDirectives: true ignoreRegExpList: - u\{[0-9a-f]{1,8}\} diff --git a/integrationTests/integration-test.ts b/integrationTests/integration-test.ts deleted file mode 100644 index 95e20a3bc7..0000000000 --- a/integrationTests/integration-test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import * as childProcess from 'node:child_process'; -import * as fs from 'node:fs'; -import * as os from 'node:os'; -import * as path from 'node:path'; - -import { describe, it } from 'mocha'; - -function exec(command: string, options = {}) { - const output = childProcess.execSync(command, { - encoding: 'utf-8', - ...options, - }); - return output?.trimEnd(); -} - -describe('Integration Tests', () => { - const tmpDir = path.join(os.tmpdir(), 'graphql-js-integrationTmp'); - fs.rmSync(tmpDir, { recursive: true, force: true }); - fs.mkdirSync(tmpDir); - - const distDir = path.resolve('./npmDist'); - const archiveName = exec(`npm --quiet pack ${distDir}`, { cwd: tmpDir }); - fs.renameSync( - path.join(tmpDir, archiveName), - path.join(tmpDir, 'graphql.tgz'), - ); - - function testOnNodeProject(projectName: string) { - const projectPath = path.join(__dirname, projectName); - - const packageJSONPath = path.join(projectPath, 'package.json'); - const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8')); - - it(packageJSON.description, () => { - fs.cpSync(projectPath, path.join(tmpDir, projectName), { - recursive: true, - }); - - const cwd = path.join(tmpDir, projectName); - // TODO: figure out a way to run it with --ignore-scripts - exec('npm --quiet install', { cwd, stdio: 'inherit' }); - exec('npm --quiet test', { cwd, stdio: 'inherit' }); - }).timeout(120000); - } - - testOnNodeProject('ts'); - testOnNodeProject('node'); - testOnNodeProject('webpack'); -}); diff --git a/integrationTests/node/index.cjs b/integrationTests/node/index.cjs new file mode 100644 index 0000000000..b3c9c43e86 --- /dev/null +++ b/integrationTests/node/index.cjs @@ -0,0 +1,26 @@ +const assert = require('assert'); +const { readFileSync } = require('fs'); + +const { graphqlSync } = require('graphql'); +const { buildSchema } = require('graphql/utilities'); +const { version } = require('graphql/version'); + +assert.deepStrictEqual( + version, + JSON.parse(readFileSync('./node_modules/graphql/package.json')).version, +); + +const schema = buildSchema('type Query { hello: String }'); + +const result = graphqlSync({ + schema, + source: '{ hello }', + rootValue: { hello: 'world' }, +}); + +assert.deepStrictEqual(result, { + data: { + __proto__: null, + hello: 'world', + }, +}); diff --git a/integrationTests/node/index.js b/integrationTests/node/index.mjs similarity index 62% rename from integrationTests/node/index.js rename to integrationTests/node/index.mjs index 3b39900906..6cd600729c 100644 --- a/integrationTests/node/index.js +++ b/integrationTests/node/index.mjs @@ -2,13 +2,13 @@ import assert from 'assert'; import { readFileSync } from 'fs'; -import { graphqlSync } from 'graphql'; -import { buildSchema } from 'graphql/utilities'; -import { version } from 'graphql/version'; +import { graphqlSync } from 'graphql-esm'; +import { buildSchema } from 'graphql-esm/utilities'; +import { version } from 'graphql-esm/version'; assert.deepStrictEqual( - version, - JSON.parse(readFileSync('./node_modules/graphql/package.json')).version, + version + '+esm', + JSON.parse(readFileSync('./node_modules/graphql-esm/package.json')).version, ); const schema = buildSchema('type Query { hello: String }'); diff --git a/integrationTests/node/package.json b/integrationTests/node/package.json index 2d2665ed9a..8271998588 100644 --- a/integrationTests/node/package.json +++ b/integrationTests/node/package.json @@ -6,6 +6,7 @@ "test": "node test.js" }, "dependencies": { - "graphql": "file:../graphql.tgz" + "graphql": "file:../graphql.tgz", + "graphql-esm": "file:../graphql-esm.tgz" } } diff --git a/integrationTests/node/test.js b/integrationTests/node/test.js index e3e55bb745..f47c48de89 100644 --- a/integrationTests/node/test.js +++ b/integrationTests/node/test.js @@ -14,7 +14,12 @@ for (const version of nodeVersions) { console.log(`Testing on node@${version} ...`); childProcess.execSync( - `docker run --rm --volume "$PWD":/usr/src/app -w /usr/src/app node:${version}-slim node ./index.js`, + `docker run --rm --volume "$PWD":/usr/src/app -w /usr/src/app node:${version}-slim node ./index.cjs`, + { stdio: 'inherit' }, + ); + + childProcess.execSync( + `docker run --rm --volume "$PWD":/usr/src/app -w /usr/src/app node:${version}-slim node ./index.mjs`, { stdio: 'inherit' }, ); } diff --git a/integrationTests/ts/esm.ts b/integrationTests/ts/esm.ts new file mode 100644 index 0000000000..4554d1efec --- /dev/null +++ b/integrationTests/ts/esm.ts @@ -0,0 +1,38 @@ +import type { ExecutionResult } from 'graphql-esm/execution'; + +import { graphqlSync } from 'graphql-esm'; +import { + GraphQLString, + GraphQLSchema, + GraphQLObjectType, +} from 'graphql-esm/type'; + +const queryType: GraphQLObjectType = new GraphQLObjectType({ + name: 'Query', + fields: () => ({ + sayHi: { + type: GraphQLString, + args: { + who: { + type: GraphQLString, + defaultValue: 'World', + }, + }, + resolve(_root, args: { who: string }) { + return 'Hello ' + args.who; + }, + }, + }), +}); + +const schema: GraphQLSchema = new GraphQLSchema({ query: queryType }); + +const result: ExecutionResult = graphqlSync({ + schema, + source: ` + query helloWho($who: String){ + test(who: $who) + } + `, + variableValues: { who: 'Dolly' }, +}); diff --git a/integrationTests/ts/package.json b/integrationTests/ts/package.json index 18c20e1097..119388ec01 100644 --- a/integrationTests/ts/package.json +++ b/integrationTests/ts/package.json @@ -7,9 +7,11 @@ }, "dependencies": { "graphql": "file:../graphql.tgz", + "graphql-esm": "file:../graphql-esm.tgz", "typescript-4.4": "npm:typescript@4.4.x", "typescript-4.5": "npm:typescript@4.5.x", "typescript-4.6": "npm:typescript@4.6.x", - "typescript-4.7": "npm:typescript@4.7.x" + "typescript-4.7": "npm:typescript@4.7.x", + "typescript-4.8": "npm:typescript@4.8.x" } } diff --git a/integrationTests/webpack/entry-esm.mjs b/integrationTests/webpack/entry-esm.mjs new file mode 100644 index 0000000000..1dec59e043 --- /dev/null +++ b/integrationTests/webpack/entry-esm.mjs @@ -0,0 +1,13 @@ +// eslint-disable-next-line node/no-missing-import, import/no-unresolved +import { graphqlSync } from 'graphql-esm'; + +// eslint-disable-next-line node/no-missing-import, import/no-unresolved +import { buildSchema } from 'graphql-esm/utilities/buildASTSchema'; + +const schema = buildSchema('type Query { hello: String }'); + +export const result = graphqlSync({ + schema, + source: '{ hello }', + rootValue: { hello: 'world' }, +}); diff --git a/integrationTests/webpack/package.json b/integrationTests/webpack/package.json index 74a2502ff7..66dd836f1e 100644 --- a/integrationTests/webpack/package.json +++ b/integrationTests/webpack/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "graphql": "file:../graphql.tgz", + "graphql-esm": "file:../graphql-esm.tgz", "webpack": "5.x.x", "webpack-cli": "4.x.x" } diff --git a/integrationTests/webpack/test.js b/integrationTests/webpack/test.js index b3b19410cf..e4b753b578 100644 --- a/integrationTests/webpack/test.js +++ b/integrationTests/webpack/test.js @@ -1,12 +1,20 @@ import assert from 'assert'; -// eslint-disable-next-line import/no-unresolved, node/no-missing-import -import mainCJS from './dist/main.cjs'; +import cjs from './dist/main-cjs.cjs'; +import mjs from './dist/main-mjs.cjs'; -assert.deepStrictEqual(mainCJS.result, { +assert.deepStrictEqual(cjs.result, { data: { __proto__: null, hello: 'world', }, }); + +assert.deepStrictEqual(mjs.result, { + data: { + __proto__: null, + hello: 'world', + }, +}); + console.log('Test script: Got correct result from Webpack bundle!'); diff --git a/integrationTests/webpack/webpack.config.json b/integrationTests/webpack/webpack.config.json index 4d3276186c..8381df4cee 100644 --- a/integrationTests/webpack/webpack.config.json +++ b/integrationTests/webpack/webpack.config.json @@ -1,8 +1,11 @@ { "mode": "production", - "entry": "./entry.js", + "entry": { + "cjs": "./entry.js", + "mjs": "./entry-esm.mjs" + }, "output": { - "filename": "main.cjs", + "filename": "main-[name].cjs", "library": { "type": "commonjs2" } diff --git a/package-lock.json b/package-lock.json index 98ce06205d..baf92e41f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,32 +9,32 @@ "version": "17.0.0-alpha.1", "license": "MIT", "devDependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/preset-classic": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", "@mdx-js/react": "1.6.22", - "@stryker-mutator/core": "6.1.2", - "@stryker-mutator/mocha-runner": "6.1.2", - "@stryker-mutator/typescript-checker": "6.1.2", + "@stryker-mutator/core": "6.2.2", + "@stryker-mutator/mocha-runner": "6.2.2", + "@stryker-mutator/typescript-checker": "6.2.2", "@svgr/webpack": "6.3.1", "@types/chai": "4.3.3", "@types/mocha": "9.1.1", - "@types/node": "18.7.2", + "@types/node": "18.7.18", "@types/prettier": "2.7.0", - "@typescript-eslint/eslint-plugin": "5.33.0", - "@typescript-eslint/parser": "5.33.0", + "@typescript-eslint/eslint-plugin": "5.37.0", + "@typescript-eslint/parser": "5.37.0", "c8": "7.12.0", "chai": "4.3.6", "clsx": "1.2.1", - "cspell": "6.6.1", - "docusaurus-plugin-typedoc-api": "2.3.0", - "eslint": "8.21.0", + "cspell": "6.8.2", + "docusaurus-plugin-typedoc-api": "2.4.0", + "eslint": "8.23.1", "eslint-plugin-import": "2.26.0", "eslint-plugin-internal-rules": "file:./resources/eslint-internal-rules", "eslint-plugin-node": "11.1.0", - "eslint-plugin-react": "7.30.1", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-simple-import-sort": "7.0.0", - "eslint-plugin-tsdoc": "0.2.16", + "eslint-plugin-simple-import-sort": "8.0.0", + "eslint-plugin-tsdoc": "0.2.17", "file-loader": "6.2.0", "mocha": "10.0.0", "prettier": "2.7.1", @@ -42,8 +42,8 @@ "react": "17.0.2", "react-dom": "17.0.2", "ts-node": "10.9.1", - "typedoc": "0.23.10", - "typescript": "4.7.4", + "typedoc": "0.23.14", + "typescript": "4.8.3", "url-loader": "4.1.1" }, "engines": { @@ -239,30 +239,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -287,12 +287,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -340,14 +340,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "engines": { @@ -367,14 +367,14 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -388,9 +388,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -404,9 +404,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -451,13 +451,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "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, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -500,9 +500,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -510,9 +510,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -531,9 +531,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -558,16 +558,16 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -619,9 +619,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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, "engines": { "node": ">=6.9.0" @@ -637,29 +637,29 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -751,9 +751,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -795,13 +795,13 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -846,16 +846,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.1.tgz", + "integrity": "sha512-LfIKNBBY7Q1OX5C4xAgRQffOg2OnhAo9fnbcOHgOC9Yytm2Sw+4XqHufRYU86tHomzepxtvuVaNO+3EVKR4ivw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" + "@babel/plugin-syntax-decorators": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1102,12 +1102,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1362,16 +1362,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -1399,9 +1400,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" @@ -1558,14 +1559,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1593,13 +1594,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1700,16 +1701,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1781,16 +1782,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz", + "integrity": "sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "engines": { @@ -1825,12 +1826,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { @@ -1886,13 +1887,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", - "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz", + "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-typescript": "^7.18.6" }, "engines": { @@ -1934,18 +1935,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1979,9 +1980,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -1991,9 +1992,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -2001,18 +2002,18 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { @@ -2085,9 +2086,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -2097,12 +2098,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", "dev": true, "dependencies": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -2124,19 +2125,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^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.18.11", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2145,9 +2146,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.18.10", @@ -2175,49 +2176,49 @@ } }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.6.1.tgz", - "integrity": "sha512-XSYxA6fpFepahOe2Cq6UEvPnoo8/wK7Py6x6yn6o+Y7op0pM5bXYKRrr8i2mlb5iC4m5kuwkc6whgtuUiPbo1Q==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.8.2.tgz", + "integrity": "sha512-E4sNdcG23nj0ztiI69PeU+ALL6DgL3GoqVZuLhpRwgRL4RN7n7FuUJdJ91cgpNvx50+HhdyxFqEpKRigD3yeNQ==", "dev": true, "dependencies": { "@cspell/dict-ada": "^2.0.1", "@cspell/dict-aws": "^2.0.0", "@cspell/dict-bash": "^2.0.4", - "@cspell/dict-companies": "^2.0.11", + "@cspell/dict-companies": "^2.0.13", "@cspell/dict-cpp": "^3.2.1", "@cspell/dict-cryptocurrencies": "^2.0.0", "@cspell/dict-csharp": "^3.0.1", - "@cspell/dict-css": "^2.0.0", + "@cspell/dict-css": "^2.1.0", "@cspell/dict-dart": "^1.1.1", "@cspell/dict-django": "^2.0.0", "@cspell/dict-docker": "^1.1.1", "@cspell/dict-dotnet": "^2.0.1", "@cspell/dict-elixir": "^2.0.1", - "@cspell/dict-en_us": "^2.3.0", + "@cspell/dict-en_us": "^2.3.3", "@cspell/dict-en-gb": "^1.1.33", "@cspell/dict-filetypes": "^2.1.1", - "@cspell/dict-fonts": "^2.0.1", + "@cspell/dict-fonts": "^2.1.0", "@cspell/dict-fullstack": "^2.0.6", "@cspell/dict-git": "^1.0.1", "@cspell/dict-golang": "^3.0.1", "@cspell/dict-haskell": "^2.0.1", - "@cspell/dict-html": "^3.0.3", + "@cspell/dict-html": "^3.3.2", "@cspell/dict-html-symbol-entities": "^3.0.0", "@cspell/dict-java": "^3.0.7", "@cspell/dict-latex": "^2.0.9", - "@cspell/dict-lorem-ipsum": "^2.0.0", + "@cspell/dict-lorem-ipsum": "^2.0.1", "@cspell/dict-lua": "^2.0.0", "@cspell/dict-node": "^3.0.1", "@cspell/dict-npm": "^3.1.2", "@cspell/dict-php": "^2.0.0", "@cspell/dict-powershell": "^2.0.0", - "@cspell/dict-public-licenses": "^1.0.5", + "@cspell/dict-public-licenses": "^1.0.6", "@cspell/dict-python": "^3.0.6", "@cspell/dict-r": "^1.0.3", "@cspell/dict-ruby": "^2.0.2", "@cspell/dict-rust": "^2.0.1", "@cspell/dict-scala": "^2.0.0", - "@cspell/dict-software-terms": "^2.2.2", + "@cspell/dict-software-terms": "^2.2.7", "@cspell/dict-sql": "^1.0.4", "@cspell/dict-swift": "^1.0.3", "@cspell/dict-typescript": "^2.0.1", @@ -2228,27 +2229,27 @@ } }, "node_modules/@cspell/cspell-pipe": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.6.1.tgz", - "integrity": "sha512-qppDwYKReUyp0oSL09zprE/5JrJ1drCOIIQscnnFY0BwDre7p3D2zJaONyTcu7wEyLFinrgkidZL+qG9vbyKbA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.8.2.tgz", + "integrity": "sha512-9GXBibZ8bcU+2KhX6WTEASPhIhsqdFYITwBJ39jfUl2MiPgpvjYxQKrAgnZOm5WpRzCUxoelU2SVaoI+rn/Stg==", "dev": true, "engines": { "node": ">=14" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.6.1.tgz", - "integrity": "sha512-EIjDFNc2MYONXsky5BkB/19L3jh4qn1MktxPJxXKPRmBhnDoAMid8XOwpqcskv1j/d8xd8YrJ8yiGni4IP7hvg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.8.2.tgz", + "integrity": "sha512-YvEauGv/QZb5xRiKKvwiXz7lj7twc5TgispnujgHYDEt6OcXiWjYj676WzKkGJ2yM+QfurGJCCvOb2L1HQ6rYg==", "dev": true, "engines": { "node": ">=14" } }, "node_modules/@cspell/cspell-types": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.6.1.tgz", - "integrity": "sha512-J93/LFZLbzqTHQWOcdt0dMviNFktUtvJLs3uAuJBS/nRzpReXlRx49KJ/QF2XzHzwvV8y7TEUMhE4k4VX6mmVg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.8.2.tgz", + "integrity": "sha512-jFg+D1L+MkIad2IR+qlnOYIuwqaosbTrtqhpWhbOGMvFQjxMyKg9IVxbmtjDCdRohdBUvRq96rkp0vx1FviiwQ==", "dev": true, "engines": { "node": ">=14" @@ -2273,9 +2274,9 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.11.tgz", - "integrity": "sha512-8Fw+dviHh3nu9y0jI+7kpObY/C15s4bDzWi5ZJpkAT65z+yZiIr6rxyoCR4vHpT5/TofbaRXFKWHoc/sqUYY2g==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.13.tgz", + "integrity": "sha512-EacGH6Yjd2u+sNRLd6+3jxbzWBSsmF4g52Xfxfv2T48qzRWJ1zqpX89ijihgYTwvZbf8H/6Lu+z1VU4e1gUp0g==", "dev": true }, "node_modules/@cspell/dict-cpp": { @@ -2297,9 +2298,9 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.0.0.tgz", - "integrity": "sha512-MrFyswFHnPh4H0u6IlV4eHy+ZCUrrHzeL161LyTOqCvaKpbZavMgNYXzZqTF9xafO0iLgwKrl+Gkclu1KVBg0Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.1.0.tgz", + "integrity": "sha512-glASAELcGhh4Ru0rTQ4G9mTQxSyPwsZOON/5BYflB6Kks8YC8nUvKrtMCoo5W7CPKPfSEa8zUNctFQ1+IUYDHA==", "dev": true }, "node_modules/@cspell/dict-dart": { @@ -2333,9 +2334,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.1.tgz", - "integrity": "sha512-mpjMY9Fo+cvt+BeL8bsoy8xpKhnILT0j6ith9OlYALELx8uPFyzSgFhkPBGam6jE8luG1XFsIsc0APQ7yzwhKw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.3.tgz", + "integrity": "sha512-csyKeaNktfpvMkmE2GOPTwsrQm3wWhLKVaDRaGU0qTcIjDiCvqv/iYgrVrKRkoddA3kdNTZ8YNCcix7lb6VkOg==", "dev": true }, "node_modules/@cspell/dict-en-gb": { @@ -2351,9 +2352,9 @@ "dev": true }, "node_modules/@cspell/dict-fonts": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.0.1.tgz", - "integrity": "sha512-UX9evXp7IPZ55G1NxVLADoRgGa+6MPSFx4zWveT6vHIVI9k50yZZY2QkIgQIOEPgk8RNrNe1Tf6HLfndgFL2kQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.1.0.tgz", + "integrity": "sha512-hk7xsbfWEUhc136Xj7I2TD7ouKAfWwzCVAQaHBxcVXAsVxu7bDOGj4FvE2jBzlkSUY8A9Ww8qS0GOFvowJshVg==", "dev": true }, "node_modules/@cspell/dict-fullstack": { @@ -2381,9 +2382,9 @@ "dev": true }, "node_modules/@cspell/dict-html": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.0.4.tgz", - "integrity": "sha512-DV1lAATRel7vuJZYpnR92pIr9ZeSE+uuQDnkuzJaCP9os+Y6zkkUfvNLbNsqe7wD5IzkSA2CtxOR44MMf2YfvQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.3.2.tgz", + "integrity": "sha512-cM5pQSEiqjrdk6cRFLrlLdWNT/J8399f/A6DjwjfYhHrGy0e/Rsjv76HZT0GlE1OqMoq9eG9jdQsfoYYgWTIpQ==", "dev": true }, "node_modules/@cspell/dict-html-symbol-entities": { @@ -2405,9 +2406,9 @@ "dev": true }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.0.tgz", - "integrity": "sha512-jKogAKtqvgPMleL6usyj3rZ0m8sVUR6drrD+wMnWSfdx1BmUyTsYiuh/mPEfLAebaYHELWSLQG3rDZRvV9Riqg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.1.tgz", + "integrity": "sha512-s7Ft8UiloUJwgz4z8uLeFvCkeTcZ43HQl7mSAlZd76eW+keLSsdeGmLDx2zaciqo+MftPGyzygVCwaJjTGxiew==", "dev": true }, "node_modules/@cspell/dict-lua": { @@ -2441,9 +2442,9 @@ "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.5.tgz", - "integrity": "sha512-N9bttzzhmCq/BN/TeP43075kj9TeaR8l9v0SPre05BRWsChVrWuMM1UvsT4ADXnsYJNl1xcn+q191S/fIzQhBg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.6.tgz", + "integrity": "sha512-Z9IUFPkkOpOsEdgPUfQOJNQ+qU6+iBAZWS/CR5sUqTX+s5VkPNVwQyVC2kdmgmE2U5qwzAPewG6nVKr2MVogwg==", "dev": true }, "node_modules/@cspell/dict-python": { @@ -2477,9 +2478,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.2.2.tgz", - "integrity": "sha512-s6l3lzKhxXWfu8QsSt1qoUK2l6iGbFKJd0T8XRYfsKnX6fVCUmHNueGWQ6TFCRXDRvHiwGB+UpPicyHPtSJJ5A==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.2.7.tgz", + "integrity": "sha512-tNdgfijX4PGIzwWyRQHqEsKEWqNc92HDdURcXBZNw2po7jUh+/FgqBoUgnJXyLastJ9PGX9847j9uNBPfShTgA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -2529,32 +2530,43 @@ } }, "node_modules/@docsearch/css": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.0.tgz", - "integrity": "sha512-jnNrO2JVYYhj2pP2FomlHIy6220n6mrLn2t9v2/qc+rM7M/fbIcKMgk9ky4RN+L/maUEmteckzg6/PIYoAAXJg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", + "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==", "dev": true }, "node_modules/@docsearch/react": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.0.tgz", - "integrity": "sha512-ATS3w5JBgQGQF0kHn5iOAPfnCCaoLouZQMmI7oENV//QMFrYbjhUZxBU9lIwAT7Rzybud+Jtb4nG5IEjBk3Ixw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", + "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", "dev": true, "dependencies": { "@algolia/autocomplete-core": "1.7.1", "@algolia/autocomplete-preset-algolia": "1.7.1", - "@docsearch/css": "3.2.0", + "@docsearch/css": "3.2.1", "algoliasearch": "^4.0.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, "node_modules/@docusaurus/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.1.tgz", - "integrity": "sha512-Prd46TtZdiixlTl8a+h9bI5HegkfREjSNkrX2rVEwJZeziSz4ya+l7QDnbnCB2XbxEG8cveFo/F9q5lixolDtQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "dev": true, "dependencies": { "@babel/core": "^7.18.6", @@ -2567,13 +2579,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2641,9 +2653,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.1.tgz", - "integrity": "sha512-MCJ6rRmlqLmlCsZIoIxOxDb0rYzIPEm9PYpsBW+CGNnbk+x8xK+11hnrxzvXHqDRNpxrq3Kq2jYUmg/DkqE6vg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "dev": true, "dependencies": { "cssnano-preset-advanced": "^5.3.8", @@ -2656,9 +2668,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.1.tgz", - "integrity": "sha512-wIWseCKko1w/WARcDjO3N/XoJ0q/VE42AthP0eNAfEazDjJ94NXbaI6wuUsuY/bMg6hTKGVIpphjj2LoX3g6dA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -2669,15 +2681,15 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.1.tgz", - "integrity": "sha512-tdNeljdilXCmhbaEND3SAgsqaw/oh7v9onT5yrIrL26OSk2AFwd+MIi4R8jt8vq33M0R4rz2wpknm0fQIkDdvQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "dev": true, "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2701,13 +2713,13 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.1.tgz", - "integrity": "sha512-f888ylnxHAM/3T8p1lx08+lTc6/g7AweSRfRuZvrVhHXj3Tz/nTTxaP6gPTGkJK7WLqTagpar/IGP6/74IBbkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "dev": true, "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.0.1", + "@docusaurus/types": "2.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2721,18 +2733,18 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.1.tgz", - "integrity": "sha512-/4ua3iFYcpwgpeYgHnhVGROB/ybnauLH2+rICb4vz/+Gn1hjAmGXVYq1fk8g49zGs3uxx5nc0H5bL9P0g977IQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2752,18 +2764,18 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.1.tgz", - "integrity": "sha512-2qeBWRy1EjgnXdwAO6/csDIS1UVNmhmtk/bQ2s9jqjpwM8YVgZ8QVdkxFAMWXgZWDQdwWwdP1rnmoEelE4HknQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2783,16 +2795,16 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.1.tgz", - "integrity": "sha512-6apSVeJENnNecAH5cm5VnRqR103M6qSI6IuiP7tVfD5H4AWrfDNkvJQV2+R2PIq3bGrwmX4fcXl1x4g0oo7iwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2806,14 +2818,14 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.1.tgz", - "integrity": "sha512-jpZBT5HK7SWx1LRQyv9d14i44vSsKXGZsSPA2ndth5HykHJsiAj9Fwl1AtzmtGYuBmI+iXQyOd4MAMHd4ZZ1tg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2827,14 +2839,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.1.tgz", - "integrity": "sha512-d5qb+ZeQcg1Czoxc+RacETjLdp2sN/TAd7PGN/GrvtijCdgNmvVAtZ9QgajBTG0YbJFVPTeZ39ad2bpoOexX0w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2846,14 +2858,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.1.tgz", - "integrity": "sha512-qiRufJe2FvIyzICbkjm4VbVCI1hyEju/CebfDKkKh2ZtV4q6DM1WZG7D6VoQSXL8MrMFB895gipOM4BwdM8VsQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2865,17 +2877,17 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.1.tgz", - "integrity": "sha512-KcYuIUIp2JPzUf+Xa7W2BSsjLgN1/0h+VAz7D/C3RYjAgC5ApPX8wO+TECmGfunl/m7WKGUmLabfOon/as64kQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2889,23 +2901,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.1.tgz", - "integrity": "sha512-nOoniTg46My1qdDlLWeFs55uEmxOJ+9WMF8KKG8KMCu5LAvpemMi7rQd4x8Tw+xiPHZ/sQzH9JmPTMPRE4QGPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "dev": true, "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/plugin-debug": "2.0.1", - "@docusaurus/plugin-google-analytics": "2.0.1", - "@docusaurus/plugin-google-gtag": "2.0.1", - "@docusaurus/plugin-sitemap": "2.0.1", - "@docusaurus/theme-classic": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-search-algolia": "2.0.1", - "@docusaurus/types": "2.0.1" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" }, "engines": { "node": ">=16.14" @@ -2929,23 +2941,23 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.1.tgz", - "integrity": "sha512-0jfigiqkUwIuKOw7Me5tqUM9BBvoQX7qqeevx7v4tkYQexPhk3VYSZo7aRuoJ9oyW5makCTPX551PMJzmq7+sw==", - "dev": true, - "dependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-translations": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "dev": true, + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", @@ -2969,17 +2981,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.1.tgz", - "integrity": "sha512-I3b6e/ryiTQMsbES40cP0DRGnfr0E2qghVq+XecyMKjBPejISoSFEDn0MsnbW8Q26k1Dh/0qDH8QKDqaZZgLhA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "dev": true, "dependencies": { - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2998,19 +3010,19 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz", - "integrity": "sha512-cw3NaOSKbYlsY6uNj4PgO+5mwyQ3aEWre5RlmvjStaz2cbD15Nr69VG8Rd/F6Q5VsCT8BvSdkPDdDG5d/ACexg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "dev": true, "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-translations": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", @@ -3029,9 +3041,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.1.tgz", - "integrity": "sha512-v1MYYlbsdX+rtKnXFcIAn9ar0Z6K0yjqnCYS0p/KLCLrfJwfJ8A3oRJw2HiaIb8jQfk1WMY2h5Qi1p4vHOekQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "dev": true, "dependencies": { "fs-extra": "^10.1.0", @@ -3042,9 +3054,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.1.tgz", - "integrity": "sha512-o+4hAFWkj3sBszVnRTAnNqtAIuIW0bNaYyDwQhQ6bdz3RAPEq9cDKZxMpajsj4z2nRty8XjzhyufAAjxFTyrfg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "dev": true, "dependencies": { "@types/history": "^4.7.11", @@ -3062,12 +3074,12 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.1.tgz", - "integrity": "sha512-u2Vdl/eoVwMfUjDCkg7FjxoiwFs/XhVVtNxQEw8cvB+qaw6QWyT73m96VZzWtUb1fDOefHoZ+bZ0ObFeKk9lMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "dev": true, "dependencies": { - "@docusaurus/logger": "2.0.1", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -3096,9 +3108,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.1.tgz", - "integrity": "sha512-kajCCDCXRd1HFH5EUW31MPaQcsyNlGakpkDoTBtBvpa4EIPvWaSKy7TIqYKHrZjX4tnJ0YbEJvaXfjjgdq5xSg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "dev": true, "dependencies": { "tslib": "^2.4.0" @@ -3116,13 +3128,13 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.1.tgz", - "integrity": "sha512-f14AnwFBy4/1A19zWthK+Ii80YDz+4qt8oPpK3julywXsheSxPBqgsND3LVBBvB2p3rJHvbo2m3HyB9Tco1JRw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "dev": true, "dependencies": { - "@docusaurus/logger": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3132,14 +3144,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -3149,6 +3161,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { @@ -3283,6 +3298,19 @@ "url": "https://github.com/sponsors/nzakas" } }, + "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", @@ -3509,18 +3537,18 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", - "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -3647,9 +3675,9 @@ } }, "node_modules/@stryker-mutator/api": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-6.1.2.tgz", - "integrity": "sha512-AfU6GWC65H0bWljREirjMSVSkD3nzT/1Vbivdn6nRvVySnwbX5J9KYI6EcaUnz+xRQL7XiF2Bhq/oHLZbC/vkQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-6.2.2.tgz", + "integrity": "sha512-ZMR3ubUh059Xb769ryE1LkwZR7PWbt5TITYYkHZd7pG5yLVzPMDP0d29CQBJW2H7YjlopgImVL8sw8U/RgDcGg==", "dev": true, "dependencies": { "mutation-testing-metrics": "1.7.10", @@ -3661,29 +3689,31 @@ } }, "node_modules/@stryker-mutator/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-6.1.2.tgz", - "integrity": "sha512-McVG9eStXBBMx/rDz33N32RNvDK5VE1zyK6fjJsrb+cQJRZWnN/HWj+aDVuh2Q/gPE0Mv6Q2ZfsvhZms8hTA2Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-6.2.2.tgz", + "integrity": "sha512-1JS8UIMrwWeHqp508HXwRNmsAkHCtGskCwFWLLJSarVH9lyB8gyhTbhkaRHJGiEuaSTsxV1LZ5VzLK6OLgPtxw==", "dev": true, "dependencies": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/instrumenter": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/instrumenter": "6.2.2", + "@stryker-mutator/util": "6.2.2", "ajv": "~8.11.0", "chalk": "~5.0.0", - "commander": "~9.3.0", + "commander": "~9.4.0", + "diff-match-patch": "1.0.5", "execa": "~6.1.0", "file-url": "~4.0.0", "get-port": "~6.1.0", "glob": "~8.0.0", - "inquirer": "~9.0.0", + "inquirer": "~9.1.0", "lodash.flatmap": "~4.5.0", "lodash.groupby": "~4.6.0", - "log4js": "~6.5.0", + "log4js": "~6.6.0", "minimatch": "~5.1.0", "mkdirp": "~1.0.3", - "mutation-testing-elements": "1.7.10", + "mutation-testing-elements": "1.7.12", "mutation-testing-metrics": "1.7.10", + "mutation-testing-report-schema": "1.7.10", "npm-run-path": "~5.1.0", "progress": "~2.0.0", "rimraf": "~3.0.0", @@ -3715,125 +3745,76 @@ } }, "node_modules/@stryker-mutator/core/node_modules/commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", "dev": true, "engines": { "node": "^12.20.0 || >=14" } }, "node_modules/@stryker-mutator/instrumenter": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-6.1.2.tgz", - "integrity": "sha512-Wn2RIivTvwtyDKvc0Nbi8WH1MbbqWbwOdt5bhnjBgK9zWxb2G23M4oHIX5F0h2g6GBQIdCU6ZHeeOF7UoQ+/xQ==", - "dev": true, - "dependencies": { - "@babel/core": "~7.18.0", - "@babel/generator": "~7.18.0", - "@babel/parser": "~7.18.0", - "@babel/plugin-proposal-class-properties": "~7.17.0", - "@babel/plugin-proposal-decorators": "~7.18.0", - "@babel/plugin-proposal-private-methods": "~7.17.0", - "@babel/preset-typescript": "~7.17.0", - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-6.2.2.tgz", + "integrity": "sha512-FZIvyL3uiIaLvOSKXe6jnq0FMo6lWy4NoGyYt5K/wmDxN2QuSaChGu/tVe4Z+Ui+4O3/DiGqWY5FWKGv1iHEPA==", + "dev": true, + "dependencies": { + "@babel/core": "~7.19.0", + "@babel/generator": "~7.19.0", + "@babel/parser": "~7.19.0", + "@babel/plugin-proposal-class-properties": "~7.18.0", + "@babel/plugin-proposal-decorators": "~7.19.0", + "@babel/plugin-proposal-private-methods": "~7.18.0", + "@babel/preset-typescript": "~7.18.0", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "angular-html-parser": "~1.8.0", - "weapon-regex": "~0.6.0" + "weapon-regex": "~1.0.2" }, "engines": { "node": ">=14.18.0" } }, - "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@stryker-mutator/mocha-runner": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-6.1.2.tgz", - "integrity": "sha512-+Wp6obwp/mrljzScPcPX0WR6Lu9WFGAw1FxU0Fpw88hKeDakVj7V49mVM/emRQKtF5oTi3N2pTph3zVXIw6FXQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-6.2.2.tgz", + "integrity": "sha512-yc6YNzKTal7ARu0sfJ6ERb8yQtTjgmoVtIEeRyDWW6JooUDERFq92Fw9rMBp+fW8Qgf5ZTdxbvFtpN0GtGe3Jw==", "dev": true, "dependencies": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "tslib": "~2.4.0" }, "engines": { "node": ">=14.18.0" }, "peerDependencies": { - "@stryker-mutator/core": "~6.1.0", + "@stryker-mutator/core": "~6.2.0", "mocha": ">= 7.2 < 11" } }, "node_modules/@stryker-mutator/typescript-checker": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/typescript-checker/-/typescript-checker-6.1.2.tgz", - "integrity": "sha512-O/JdgGGbxcCYy39iNKbxRPKiolyhqh343LOLW+bWFEzVyyKRxDPc7qmEyFXeHdgKyBmeYmCekdqmZErcUBQsRQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/typescript-checker/-/typescript-checker-6.2.2.tgz", + "integrity": "sha512-vYLrPden87i6Fyx6zgBLk2MSrtYDi/ig+ZgNotdavNy34VpiKPTkgpfAWjqkVCxyJhvQvkS6iag17xlWR+uYmg==", "dev": true, "dependencies": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "semver": "~7.3.2" }, "engines": { "node": ">=14.18.0" }, "peerDependencies": { - "@stryker-mutator/core": "~6.1.0", + "@stryker-mutator/core": "~6.2.0", "typescript": ">=3.6" } }, "node_modules/@stryker-mutator/util": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-6.1.2.tgz", - "integrity": "sha512-1tJ+lHQVvJCwrT9NYstUCJP+3k7Jg6PLnVjfGIedyCnfkYVWPPfQFEWeBNsfm50g/GrJ+iWylcvClaIfbRu9Ww==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-6.2.2.tgz", + "integrity": "sha512-BjE9wP8V8Vh4VMr/pReNLlMNxSzl25OHJBDK1Y4WN/b+HY9gVy7PiX2HEYiXg7LniHIZ54vX5VLuLzJOfb6pGQ==", "dev": true, "dependencies": { "lodash.flatmap": "~4.5.0" @@ -4184,9 +4165,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4210,9 +4191,9 @@ "dev": true }, "node_modules/@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==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -4222,9 +4203,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -4302,21 +4283,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", "dev": true }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -4354,9 +4325,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", - "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -4365,9 +4336,9 @@ } }, "node_modules/@types/react-router": { - "version": "5.1.18", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", - "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "dev": true, "dependencies": { "@types/history": "^4.7.11", @@ -4461,14 +4432,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", - "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", + "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/type-utils": "5.33.0", - "@typescript-eslint/utils": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/type-utils": "5.37.0", + "@typescript-eslint/utils": "5.37.0", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -4494,14 +4465,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", - "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", + "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", "debug": "^4.3.4" }, "engines": { @@ -4521,13 +4492,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", - "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", + "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0" + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4538,12 +4509,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", - "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", + "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.33.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/utils": "5.37.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4564,9 +4536,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", - "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", + "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4577,13 +4549,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", - "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", + "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4604,15 +4576,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", - "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", + "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4628,12 +4600,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", - "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", + "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/types": "5.37.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4651,9 +4623,9 @@ "dev": true }, "node_modules/@vscode/codicons": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.31.tgz", - "integrity": "sha512-fldpXy7pHsQAMlU1pnGI23ypQ6xLk5u6SiABMFoAmlj4f2MR0iwg7C19IB1xvAEGG+dkxOfRSrbKF8ry7QqGQA==", + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.32.tgz", + "integrity": "sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -4827,6 +4799,27 @@ "node": ">= 0.6" } }, + "node_modules/accepts/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", @@ -4867,9 +4860,9 @@ } }, "node_modules/address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -4956,9 +4949,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.0.tgz", - "integrity": "sha512-TLl/MSjtQ98mgkd8hngWkzSjE+dAWldZ1NpJtv2mT+ZoFJ2P2zDE85oF9WafJOXWN9FbVRmyxpO5H+qXcNaFng==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "dev": true, "dependencies": { "@algolia/events": "^4.0.1" @@ -5202,12 +5195,6 @@ "node": "*" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -5218,9 +5205,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", + "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", "dev": true, "funding": [ { @@ -5234,7 +5221,7 @@ ], "dependencies": { "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "caniuse-lite": "^1.0.30001399", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -5330,13 +5317,13 @@ "dev": true }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { @@ -5353,25 +5340,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5518,9 +5505,9 @@ } }, "node_modules/bonjour-service": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "dependencies": { "array-flatten": "^2.1.2", @@ -5794,9 +5781,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "version": "1.0.30001400", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz", + "integrity": "sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA==", "dev": true, "funding": [ { @@ -6248,18 +6235,6 @@ "node": ">=10" } }, - "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==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", @@ -6280,9 +6255,9 @@ } }, "node_modules/comment-json": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.2.tgz", - "integrity": "sha512-H8T+kl3nZesZu41zO2oNXIJWojNeK3mHxCLrsBNu6feksBXsgb+PtYz5daP5P86A0F3sz3840KVYehr04enISQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", "dev": true, "dependencies": { "array-timsort": "^1.0.3", @@ -6313,6 +6288,15 @@ "node": ">= 0.6" } }, + "node_modules/compressible/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", @@ -6525,9 +6509,9 @@ } }, "node_modules/core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -6536,32 +6520,22 @@ } }, "node_modules/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" + "browserslist": "^4.21.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", - "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", "dev": true, "hasInstallScript": true, "funding": { @@ -6630,17 +6604,17 @@ } }, "node_modules/cspell": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.6.1.tgz", - "integrity": "sha512-+mzcFfUM/+roBa2aCuLWQ/oFJ0EQqkMM7Yyjly3baVzXNCYoaxG9QrdVNbUSN6VjRdmpcDgHg5IPs1YfQmcZoA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.8.2.tgz", + "integrity": "sha512-WHF8tQXetHgAjyG6f0rDhWXRQllSpZULOIuDZj6PeZyHubuObzsMsW0asDvL8j+EGKXr8NPo4J3vjxahYmSJ+w==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "^6.6.1", + "@cspell/cspell-pipe": "^6.8.2", "chalk": "^4.1.2", "commander": "^9.4.0", - "cspell-gitignore": "^6.6.1", - "cspell-glob": "^6.6.1", - "cspell-lib": "^6.6.1", + "cspell-gitignore": "^6.8.2", + "cspell-glob": "^6.8.2", + "cspell-lib": "^6.8.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", "fs-extra": "^10.1.0", @@ -6662,12 +6636,12 @@ } }, "node_modules/cspell-gitignore": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.6.1.tgz", - "integrity": "sha512-QXQHtFZBJn3BIZrpB3ii0xqxUcTgrAnZnGIlnIYhhSI0wcXILDUwxymcr9WjlU0X6+9e9zQHHmE+IvP4nN+LSA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.8.2.tgz", + "integrity": "sha512-JoU/rGeGrjSqOMvY5q+bloxtO5Y8QLpJEEIAvHHZ+oTOlExZ/CIAYnO6X3lC6ylNRYc1+I2KEOFa6R0+0OSdVQ==", "dev": true, "dependencies": { - "cspell-glob": "^6.6.1", + "cspell-glob": "^6.8.2", "find-up": "^5.0.0" }, "bin": { @@ -6678,9 +6652,9 @@ } }, "node_modules/cspell-glob": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.6.1.tgz", - "integrity": "sha512-/sNMrWVDf9OOcaW8QeradLt89ztUQC6CLjUjSkf61hu9IW0xBfukNH9lUEhic9Qm0HCEcTshJgzRfo71LAYQFQ==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.8.2.tgz", + "integrity": "sha512-FKy2EIdQKO9b/vP0r8yqxtGQNA8M48DkwMSjW2mN1Qku5wRT8SPByKg87BjK4oztlIiQJoJ6+8OTrWnJwdbpQw==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -6690,13 +6664,13 @@ } }, "node_modules/cspell-grammar": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.6.1.tgz", - "integrity": "sha512-TmpxHT/7CkbINTlZ8FOshNKT/bTwREhglajW9V5kjTqClCyMK55358FPStnoIZgdqZ6tGgEyoKR8lfSVtEteKw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.8.2.tgz", + "integrity": "sha512-RHvIsNRDlBYKddKAdob5XT2+odOiO3eJVaw/vt5+CRx1cJSjuaIOyHwXKH2Xl1ioUUhEb9Ew3pg7JktRdzKn5w==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "^6.6.1", - "@cspell/cspell-types": "^6.6.1" + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2" }, "bin": { "cspell-grammar": "bin.js" @@ -6706,13 +6680,12 @@ } }, "node_modules/cspell-io": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.6.1.tgz", - "integrity": "sha512-8XntUwclNEGKLxUfgj6Gp/ZWExBbVfoWBJsubTjzhxqbHp8xt3foXMVD+eUJgQ8JOmxn3QV2Q/GyOagSWedDAw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.8.2.tgz", + "integrity": "sha512-QpdePUXD8fTM2XuZdeS5ygTeIW9pnaQhTVWBWGbnrYlMn5iV9Jo81dHheHw4InxQJUjhyS/CuxdNGfYZXGJuaQ==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "^6.6.1", - "@types/node-fetch": "^2.6.2", + "@cspell/cspell-service-bus": "^6.8.2", "node-fetch": "^2.6.7" }, "engines": { @@ -6720,30 +6693,30 @@ } }, "node_modules/cspell-lib": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.6.1.tgz", - "integrity": "sha512-sj1ITFEiindErP9TmQXdkj56bqu+EdjladNAtAv22Zb0WVsJkdbHErRkAXzLShLUeyoaGkF2oLWal4PFsxppXw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.8.2.tgz", + "integrity": "sha512-K7UoaKB3qzq5KVnKynQM0+v8+4aXAA0coBKA6tH5czY2KDeuJSUu14b9WM+nxrUbMOOvNuSv+NaYw5lryaMFsg==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "^6.6.1", - "@cspell/cspell-pipe": "^6.6.1", - "@cspell/cspell-types": "^6.6.1", + "@cspell/cspell-bundled-dicts": "^6.8.2", + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2", "clear-module": "^4.1.2", - "comment-json": "^4.2.2", + "comment-json": "^4.2.3", "configstore": "^5.0.1", "cosmiconfig": "^7.0.1", - "cspell-glob": "^6.6.1", - "cspell-grammar": "^6.6.1", - "cspell-io": "^6.6.1", - "cspell-trie-lib": "^6.6.1", - "fast-equals": "^4.0.1", + "cspell-glob": "^6.8.2", + "cspell-grammar": "^6.8.2", + "cspell-io": "^6.8.2", + "cspell-trie-lib": "^6.8.2", + "fast-equals": "^4.0.3", "find-up": "^5.0.0", "fs-extra": "^10.1.0", - "gensequence": "^3.1.1", + "gensequence": "^4.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.5", + "vscode-languageserver-textdocument": "^1.0.7", "vscode-uri": "^3.0.3" }, "engines": { @@ -6751,14 +6724,15 @@ } }, "node_modules/cspell-trie-lib": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.6.1.tgz", - "integrity": "sha512-8WKdKAy3/0RikfhoXAO2mv2Jrhx/mpRcgotbr93lhDRciJBAwQv4TfY9iF2KII0EdeNg9+qpqr/lNWtRaYjqYw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.8.2.tgz", + "integrity": "sha512-jaNszLtSQglpz1BKejQ4RBFyJVSsYHQGW+1Rj4Zm103OcL+g6r/E1lm/dIbX/1UC4pBrNamjcGzXtPOBZJtUeQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "^6.6.1", + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2", "fs-extra": "^10.1.0", - "gensequence": "^3.1.1" + "gensequence": "^4.0.2" }, "engines": { "node": ">=14" @@ -6774,9 +6748,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "dev": true, "engines": { "node": "^10 || ^12 || >=14" @@ -6812,9 +6786,9 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", "dev": true, "dependencies": { "cssnano": "^5.1.8", @@ -6846,6 +6820,9 @@ }, "esbuild": { "optional": true + }, + "lightningcss": { + "optional": true } } }, @@ -7048,9 +7025,9 @@ } }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, "node_modules/date-format": { @@ -7302,15 +7279,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7422,6 +7390,12 @@ "node": ">=0.3.1" } }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7465,17 +7439,17 @@ } }, "node_modules/docusaurus-plugin-typedoc-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc-api/-/docusaurus-plugin-typedoc-api-2.3.0.tgz", - "integrity": "sha512-cQy1y0vwvlJ/Z+7aYblfR8FuwRRUGr0NlJ3NzpBiRz/xBcCsIGTJaGbZqv2Y64DQBMle/Mu6uBXjfhBojFZRxA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc-api/-/docusaurus-plugin-typedoc-api-2.4.0.tgz", + "integrity": "sha512-eXHcS1gehUE/cvSnBYvb7l5wizd5lO82Lcu6eutofnvbWoNYSajJ9xHZVBBonfKyhGBlGlbk/as0fZieRr8H/g==", "dev": true, "dependencies": { "@docusaurus/plugin-content-docs": "^2.0.1", "@docusaurus/types": "^2.0.1", "@docusaurus/utils": "^2.0.1", - "@vscode/codicons": "^0.0.31", + "@vscode/codicons": "^0.0.32", "marked": "^4.0.18", - "typedoc": "^0.23.8" + "typedoc": "^0.23.10" }, "engines": { "node": ">=14.15.0", @@ -7602,9 +7576,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", + "version": "1.4.251", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.251.tgz", + "integrity": "sha512-k4o4cFrWPv4SoJGGAydd07GmlRVzmeDIJ6MaEChTUjk4Dmomn189tCicSzil2oyvbPoGgg2suwPDNWq4gWRhoQ==", "dev": true }, "node_modules/emoji-regex": { @@ -7664,9 +7638,9 @@ } }, "node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "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" @@ -7685,16 +7659,16 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "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.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -7706,9 +7680,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -7790,14 +7764,15 @@ } }, "node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.0", + "@eslint/eslintrc": "^1.3.2", "@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -7807,13 +7782,12 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", + "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", - "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", "globby": "^11.1.0", @@ -7822,6 +7796,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -7832,8 +7807,7 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -8089,9 +8063,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.30.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", - "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -8189,22 +8163,22 @@ } }, "node_modules/eslint-plugin-simple-import-sort": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", - "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-8.0.0.tgz", + "integrity": "sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==", "dev": true, "peerDependencies": { "eslint": ">=5.0.0" } }, "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz", - "integrity": "sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", + "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.1", - "@microsoft/tsdoc-config": "0.16.1" + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "0.16.2" } }, "node_modules/eslint-scope": { @@ -8362,9 +8336,9 @@ } }, "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -8669,15 +8643,15 @@ "dev": true }, "node_modules/fast-equals": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.1.tgz", - "integrity": "sha512-OXqyj3MD0p8Kee16Jz7CbCnXo+5CHKKu4xBh5UhC1NbmMkHn8WScLRy/B2q5UOlWMlNSQJc4mwXW30Lz+JUZJw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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", @@ -8775,16 +8749,16 @@ } }, "node_modules/figures": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", - "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9005,9 +8979,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "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/flux": { @@ -9024,9 +8998,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -9223,21 +9197,7 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "node": ">=6" } }, "node_modules/forwarded": { @@ -9351,12 +9311,12 @@ } }, "node_modules/gensequence": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz", - "integrity": "sha512-ys3h0hiteRwmY6BsvSttPmkhC0vEQHPJduANBRtH/dlDPZ0UBIb/dXy80IcckXyuQ6LKg+PloRqvGER9IS7F7g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-4.0.2.tgz", + "integrity": "sha512-mQiFskYFPFDSUpBJ/n3ebAV2Ufu6DZGvUPXzyWYzFfJr6/DyOOZVnjx6VTWE4y0RLvYWnc5tZq5sCjzEWhRjqQ==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=14" } }, "node_modules/gensync": { @@ -9387,9 +9347,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -10333,9 +10293,9 @@ "dev": true }, "node_modules/inquirer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.0.2.tgz", - "integrity": "sha512-AqmDHmz3bIe573OiM4svTZzajBzff1xpuzYAimW8gjzW5ncuPllWB8t/GKl+NSuKRJaKyIF2bU2RCx8H1dwqyQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.1.tgz", + "integrity": "sha512-hfS9EJ1pVkGNbYKqzdGwMj0Dqosd36Qvxd5pFy4657QT23gmtFTSqoYBisZR75DReeSMWPNa8J0Lf6TQCz8PvA==", "dev": true, "dependencies": { "ansi-escapes": "^5.0.0", @@ -10343,7 +10303,7 @@ "cli-cursor": "^4.0.0", "cli-width": "^4.0.0", "external-editor": "^3.0.3", - "figures": "^4.0.1", + "figures": "^5.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^6.1.2", @@ -10532,9 +10492,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -10899,9 +10859,9 @@ "dev": true }, "node_modules/is-unicode-supported": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "engines": { "node": ">=12" @@ -11065,6 +11025,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11132,9 +11098,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "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/jsonfile": { @@ -11368,16 +11334,16 @@ } }, "node_modules/log4js": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", - "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.1.tgz", + "integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==", "dev": true, "dependencies": { - "date-format": "^4.0.10", + "date-format": "^4.0.13", "debug": "^4.3.4", - "flatted": "^3.2.5", + "flatted": "^3.2.6", "rfdc": "^1.3.0", - "streamroller": "^3.1.1" + "streamroller": "^3.1.2" }, "engines": { "node": ">=8.0" @@ -11481,9 +11447,9 @@ } }, "node_modules/marked": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.18.tgz", - "integrity": "sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", + "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -11637,21 +11603,21 @@ } }, "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==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true, "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==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" }, "engines": { "node": ">= 0.6" @@ -11920,9 +11886,9 @@ } }, "node_modules/mutation-testing-elements": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-1.7.10.tgz", - "integrity": "sha512-qejt4InSYzFGhN84+mbpj96aKl41g0IRTIEVuOepKgcdMdrmb2dhXBB5Mysncmz7NF/VzXSTGutdQFTz9johfw==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-1.7.12.tgz", + "integrity": "sha512-6L5PiREMKWirDOVoMVpJtq4r1MfHZgme78PFQl9W59YQq/rqmHpYAcwrdUYikPVYASp4r91ZupiKlFHgCPiVBw==", "dev": true }, "node_modules/mutation-testing-metrics": { @@ -12136,9 +12102,9 @@ } }, "node_modules/object.assign": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", - "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "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", @@ -12560,12 +12526,12 @@ "dev": true }, "node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "dependencies": { - "entities": "^4.3.0" + "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -13363,18 +13329,18 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "dev": true, "dependencies": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" }, "engines": { "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.4.4" + "postcss": "^8.4.16" } }, "node_modules/postcss-svgo": { @@ -13500,9 +13466,9 @@ } }, "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "dev": true, "engines": { "node": ">=6" @@ -14059,9 +14025,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -14115,15 +14081,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -14156,15 +14122,15 @@ } }, "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -14848,9 +14814,9 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "dependencies": { "node-forge": "^1" @@ -14984,27 +14950,6 @@ "concat-map": "0.0.1" } }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-handler/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -15233,14 +15178,14 @@ } }, "node_modules/shiki": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", - "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "node_modules/side-channel": { @@ -15329,9 +15274,9 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", "dev": true, "engines": { "node": ">= 6.3.0" @@ -15858,9 +15803,9 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -15876,9 +15821,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz", - "integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.14", @@ -16291,9 +16236,9 @@ } }, "node_modules/type-fest": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz", - "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { "node": ">=12.20" @@ -16315,6 +16260,27 @@ "node": ">= 0.6" } }, + "node_modules/type-is/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-inject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/typed-inject/-/typed-inject-3.0.1.tgz", @@ -16345,15 +16311,15 @@ } }, "node_modules/typedoc": { - "version": "0.23.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.10.tgz", - "integrity": "sha512-03EUiu/ZuScUBMnY6p0lY+HTH8SwhzvRE3gImoemdPDWXPXlks83UGTx++lyquWeB1MTwm9D9Ca8RIjkK3AFfQ==", + "version": "0.23.14", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.14.tgz", + "integrity": "sha512-s2I+ZKBET38EctZvbXp2GooHrNaKjWZkrwGEK/sttnOGiKJqU0vHrsdcwLgKZGuo2aedNL3RRPj1LnAAeYscig==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.0.18", + "marked": "^4.0.19", "minimatch": "^5.1.0", - "shiki": "^0.10.1" + "shiki": "^0.11.1" }, "bin": { "typedoc": "bin/typedoc" @@ -16362,13 +16328,13 @@ "node": ">= 14.14" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x" + "typescript": "4.6.x || 4.7.x || 4.8.x" } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -16464,9 +16430,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" @@ -16629,9 +16595,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "funding": [ { @@ -16853,6 +16819,27 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/url-loader/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -16962,12 +16949,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "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", @@ -17044,9 +17025,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.5.tgz", - "integrity": "sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", "dev": true }, "node_modules/vscode-oniguruma": { @@ -17056,15 +17037,15 @@ "dev": true }, "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "node_modules/vscode-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz", - "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.4.tgz", + "integrity": "sha512-aEmKD6H8Sg8gaQAUrnadG0BMeWXtiWhRsj1a94n2FYsMkDpgnK7BRVzZjOUYIvkv2B+bp5Bmt4ImZCpYbnJwkg==", "dev": true }, "node_modules/wait-on": { @@ -17118,9 +17099,9 @@ } }, "node_modules/weapon-regex": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-0.6.0.tgz", - "integrity": "sha512-k1gh8cffl+uOEakFS3Ze32nBsoqmcXembTI3nNQMPMUKAr83YBShTrjYGyeVC9zNzW5Ac/+dcvk3PLYUtNtSEQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-1.0.3.tgz", + "integrity": "sha512-V8X6hPIzY1juvrSVREmtRhK9AHn/8c2z8XxaibESU+jyG/RinZ9x9x6aw8qEuFAi7R6Kl/EWGbU2Yq/9u6TTjw==", "dev": true }, "node_modules/web-namespaces": { @@ -17187,9 +17168,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dev": true, "dependencies": { "acorn": "^8.0.4", @@ -17241,6 +17222,27 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -17270,9 +17272,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz", - "integrity": "sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -17417,6 +17419,27 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/webpack/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -17583,9 +17606,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", + "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", "dev": true, "engines": { "node": ">=12" @@ -17984,27 +18007,27 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true }, "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -18021,12 +18044,12 @@ } }, "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -18064,14 +18087,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "dependencies": { @@ -18084,14 +18107,14 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -18099,9 +18122,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -18109,9 +18132,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.17.7", @@ -18146,13 +18169,13 @@ } }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "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, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { @@ -18183,9 +18206,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -18193,9 +18216,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helper-optimise-call-expression": { @@ -18208,9 +18231,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -18226,16 +18249,16 @@ } }, "@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" } }, "@babel/helper-simple-access": { @@ -18272,9 +18295,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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 }, "@babel/helper-validator-option": { @@ -18284,26 +18307,26 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/highlight": { @@ -18376,9 +18399,9 @@ } }, "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -18402,13 +18425,13 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } @@ -18435,16 +18458,16 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.1.tgz", + "integrity": "sha512-LfIKNBBY7Q1OX5C4xAgRQffOg2OnhAo9fnbcOHgOC9Yytm2Sw+4XqHufRYU86tHomzepxtvuVaNO+3EVKR4ivw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.19.1", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" + "@babel/plugin-syntax-decorators": "^7.19.0" } }, "@babel/plugin-proposal-dynamic-import": { @@ -18601,12 +18624,12 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-dynamic-import": { @@ -18774,16 +18797,17 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -18799,9 +18823,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" @@ -18898,14 +18922,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -18921,13 +18945,13 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { @@ -18986,16 +19010,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.19.0" } }, "@babel/plugin-transform-react-jsx-development": { @@ -19037,16 +19061,16 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz", + "integrity": "sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "dependencies": { @@ -19068,12 +19092,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, @@ -19105,13 +19129,13 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", - "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz", + "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-typescript": "^7.18.6" } }, @@ -19135,18 +19159,18 @@ } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -19180,9 +19204,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -19192,9 +19216,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -19202,18 +19226,18 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "dependencies": { @@ -19264,21 +19288,21 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", "dev": true, "requires": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" } }, @@ -19294,27 +19318,27 @@ } }, "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^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.18.11", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.18.10", @@ -19336,49 +19360,49 @@ "optional": true }, "@cspell/cspell-bundled-dicts": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.6.1.tgz", - "integrity": "sha512-XSYxA6fpFepahOe2Cq6UEvPnoo8/wK7Py6x6yn6o+Y7op0pM5bXYKRrr8i2mlb5iC4m5kuwkc6whgtuUiPbo1Q==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.8.2.tgz", + "integrity": "sha512-E4sNdcG23nj0ztiI69PeU+ALL6DgL3GoqVZuLhpRwgRL4RN7n7FuUJdJ91cgpNvx50+HhdyxFqEpKRigD3yeNQ==", "dev": true, "requires": { "@cspell/dict-ada": "^2.0.1", "@cspell/dict-aws": "^2.0.0", "@cspell/dict-bash": "^2.0.4", - "@cspell/dict-companies": "^2.0.11", + "@cspell/dict-companies": "^2.0.13", "@cspell/dict-cpp": "^3.2.1", "@cspell/dict-cryptocurrencies": "^2.0.0", "@cspell/dict-csharp": "^3.0.1", - "@cspell/dict-css": "^2.0.0", + "@cspell/dict-css": "^2.1.0", "@cspell/dict-dart": "^1.1.1", "@cspell/dict-django": "^2.0.0", "@cspell/dict-docker": "^1.1.1", "@cspell/dict-dotnet": "^2.0.1", "@cspell/dict-elixir": "^2.0.1", - "@cspell/dict-en_us": "^2.3.0", + "@cspell/dict-en_us": "^2.3.3", "@cspell/dict-en-gb": "^1.1.33", "@cspell/dict-filetypes": "^2.1.1", - "@cspell/dict-fonts": "^2.0.1", + "@cspell/dict-fonts": "^2.1.0", "@cspell/dict-fullstack": "^2.0.6", "@cspell/dict-git": "^1.0.1", "@cspell/dict-golang": "^3.0.1", "@cspell/dict-haskell": "^2.0.1", - "@cspell/dict-html": "^3.0.3", + "@cspell/dict-html": "^3.3.2", "@cspell/dict-html-symbol-entities": "^3.0.0", "@cspell/dict-java": "^3.0.7", "@cspell/dict-latex": "^2.0.9", - "@cspell/dict-lorem-ipsum": "^2.0.0", + "@cspell/dict-lorem-ipsum": "^2.0.1", "@cspell/dict-lua": "^2.0.0", "@cspell/dict-node": "^3.0.1", "@cspell/dict-npm": "^3.1.2", "@cspell/dict-php": "^2.0.0", "@cspell/dict-powershell": "^2.0.0", - "@cspell/dict-public-licenses": "^1.0.5", + "@cspell/dict-public-licenses": "^1.0.6", "@cspell/dict-python": "^3.0.6", "@cspell/dict-r": "^1.0.3", "@cspell/dict-ruby": "^2.0.2", "@cspell/dict-rust": "^2.0.1", "@cspell/dict-scala": "^2.0.0", - "@cspell/dict-software-terms": "^2.2.2", + "@cspell/dict-software-terms": "^2.2.7", "@cspell/dict-sql": "^1.0.4", "@cspell/dict-swift": "^1.0.3", "@cspell/dict-typescript": "^2.0.1", @@ -19386,21 +19410,21 @@ } }, "@cspell/cspell-pipe": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.6.1.tgz", - "integrity": "sha512-qppDwYKReUyp0oSL09zprE/5JrJ1drCOIIQscnnFY0BwDre7p3D2zJaONyTcu7wEyLFinrgkidZL+qG9vbyKbA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.8.2.tgz", + "integrity": "sha512-9GXBibZ8bcU+2KhX6WTEASPhIhsqdFYITwBJ39jfUl2MiPgpvjYxQKrAgnZOm5WpRzCUxoelU2SVaoI+rn/Stg==", "dev": true }, "@cspell/cspell-service-bus": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.6.1.tgz", - "integrity": "sha512-EIjDFNc2MYONXsky5BkB/19L3jh4qn1MktxPJxXKPRmBhnDoAMid8XOwpqcskv1j/d8xd8YrJ8yiGni4IP7hvg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.8.2.tgz", + "integrity": "sha512-YvEauGv/QZb5xRiKKvwiXz7lj7twc5TgispnujgHYDEt6OcXiWjYj676WzKkGJ2yM+QfurGJCCvOb2L1HQ6rYg==", "dev": true }, "@cspell/cspell-types": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.6.1.tgz", - "integrity": "sha512-J93/LFZLbzqTHQWOcdt0dMviNFktUtvJLs3uAuJBS/nRzpReXlRx49KJ/QF2XzHzwvV8y7TEUMhE4k4VX6mmVg==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.8.2.tgz", + "integrity": "sha512-jFg+D1L+MkIad2IR+qlnOYIuwqaosbTrtqhpWhbOGMvFQjxMyKg9IVxbmtjDCdRohdBUvRq96rkp0vx1FviiwQ==", "dev": true }, "@cspell/dict-ada": { @@ -19422,9 +19446,9 @@ "dev": true }, "@cspell/dict-companies": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.11.tgz", - "integrity": "sha512-8Fw+dviHh3nu9y0jI+7kpObY/C15s4bDzWi5ZJpkAT65z+yZiIr6rxyoCR4vHpT5/TofbaRXFKWHoc/sqUYY2g==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.13.tgz", + "integrity": "sha512-EacGH6Yjd2u+sNRLd6+3jxbzWBSsmF4g52Xfxfv2T48qzRWJ1zqpX89ijihgYTwvZbf8H/6Lu+z1VU4e1gUp0g==", "dev": true }, "@cspell/dict-cpp": { @@ -19446,9 +19470,9 @@ "dev": true }, "@cspell/dict-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.0.0.tgz", - "integrity": "sha512-MrFyswFHnPh4H0u6IlV4eHy+ZCUrrHzeL161LyTOqCvaKpbZavMgNYXzZqTF9xafO0iLgwKrl+Gkclu1KVBg0Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.1.0.tgz", + "integrity": "sha512-glASAELcGhh4Ru0rTQ4G9mTQxSyPwsZOON/5BYflB6Kks8YC8nUvKrtMCoo5W7CPKPfSEa8zUNctFQ1+IUYDHA==", "dev": true }, "@cspell/dict-dart": { @@ -19482,9 +19506,9 @@ "dev": true }, "@cspell/dict-en_us": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.1.tgz", - "integrity": "sha512-mpjMY9Fo+cvt+BeL8bsoy8xpKhnILT0j6ith9OlYALELx8uPFyzSgFhkPBGam6jE8luG1XFsIsc0APQ7yzwhKw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.3.tgz", + "integrity": "sha512-csyKeaNktfpvMkmE2GOPTwsrQm3wWhLKVaDRaGU0qTcIjDiCvqv/iYgrVrKRkoddA3kdNTZ8YNCcix7lb6VkOg==", "dev": true }, "@cspell/dict-en-gb": { @@ -19500,9 +19524,9 @@ "dev": true }, "@cspell/dict-fonts": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.0.1.tgz", - "integrity": "sha512-UX9evXp7IPZ55G1NxVLADoRgGa+6MPSFx4zWveT6vHIVI9k50yZZY2QkIgQIOEPgk8RNrNe1Tf6HLfndgFL2kQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.1.0.tgz", + "integrity": "sha512-hk7xsbfWEUhc136Xj7I2TD7ouKAfWwzCVAQaHBxcVXAsVxu7bDOGj4FvE2jBzlkSUY8A9Ww8qS0GOFvowJshVg==", "dev": true }, "@cspell/dict-fullstack": { @@ -19530,9 +19554,9 @@ "dev": true }, "@cspell/dict-html": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.0.4.tgz", - "integrity": "sha512-DV1lAATRel7vuJZYpnR92pIr9ZeSE+uuQDnkuzJaCP9os+Y6zkkUfvNLbNsqe7wD5IzkSA2CtxOR44MMf2YfvQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.3.2.tgz", + "integrity": "sha512-cM5pQSEiqjrdk6cRFLrlLdWNT/J8399f/A6DjwjfYhHrGy0e/Rsjv76HZT0GlE1OqMoq9eG9jdQsfoYYgWTIpQ==", "dev": true }, "@cspell/dict-html-symbol-entities": { @@ -19554,9 +19578,9 @@ "dev": true }, "@cspell/dict-lorem-ipsum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.0.tgz", - "integrity": "sha512-jKogAKtqvgPMleL6usyj3rZ0m8sVUR6drrD+wMnWSfdx1BmUyTsYiuh/mPEfLAebaYHELWSLQG3rDZRvV9Riqg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.1.tgz", + "integrity": "sha512-s7Ft8UiloUJwgz4z8uLeFvCkeTcZ43HQl7mSAlZd76eW+keLSsdeGmLDx2zaciqo+MftPGyzygVCwaJjTGxiew==", "dev": true }, "@cspell/dict-lua": { @@ -19590,9 +19614,9 @@ "dev": true }, "@cspell/dict-public-licenses": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.5.tgz", - "integrity": "sha512-N9bttzzhmCq/BN/TeP43075kj9TeaR8l9v0SPre05BRWsChVrWuMM1UvsT4ADXnsYJNl1xcn+q191S/fIzQhBg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.6.tgz", + "integrity": "sha512-Z9IUFPkkOpOsEdgPUfQOJNQ+qU6+iBAZWS/CR5sUqTX+s5VkPNVwQyVC2kdmgmE2U5qwzAPewG6nVKr2MVogwg==", "dev": true }, "@cspell/dict-python": { @@ -19626,9 +19650,9 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.2.2.tgz", - "integrity": "sha512-s6l3lzKhxXWfu8QsSt1qoUK2l6iGbFKJd0T8XRYfsKnX6fVCUmHNueGWQ6TFCRXDRvHiwGB+UpPicyHPtSJJ5A==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.2.7.tgz", + "integrity": "sha512-tNdgfijX4PGIzwWyRQHqEsKEWqNc92HDdURcXBZNw2po7jUh+/FgqBoUgnJXyLastJ9PGX9847j9uNBPfShTgA==", "dev": true }, "@cspell/dict-sql": { @@ -19677,27 +19701,27 @@ } }, "@docsearch/css": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.0.tgz", - "integrity": "sha512-jnNrO2JVYYhj2pP2FomlHIy6220n6mrLn2t9v2/qc+rM7M/fbIcKMgk9ky4RN+L/maUEmteckzg6/PIYoAAXJg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", + "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==", "dev": true }, "@docsearch/react": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.0.tgz", - "integrity": "sha512-ATS3w5JBgQGQF0kHn5iOAPfnCCaoLouZQMmI7oENV//QMFrYbjhUZxBU9lIwAT7Rzybud+Jtb4nG5IEjBk3Ixw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", + "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", "dev": true, "requires": { "@algolia/autocomplete-core": "1.7.1", "@algolia/autocomplete-preset-algolia": "1.7.1", - "@docsearch/css": "3.2.0", + "@docsearch/css": "3.2.1", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.1.tgz", - "integrity": "sha512-Prd46TtZdiixlTl8a+h9bI5HegkfREjSNkrX2rVEwJZeziSz4ya+l7QDnbnCB2XbxEG8cveFo/F9q5lixolDtQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "dev": true, "requires": { "@babel/core": "^7.18.6", @@ -19710,13 +19734,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -19774,9 +19798,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.1.tgz", - "integrity": "sha512-MCJ6rRmlqLmlCsZIoIxOxDb0rYzIPEm9PYpsBW+CGNnbk+x8xK+11hnrxzvXHqDRNpxrq3Kq2jYUmg/DkqE6vg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "dev": true, "requires": { "cssnano-preset-advanced": "^5.3.8", @@ -19786,9 +19810,9 @@ } }, "@docusaurus/logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.1.tgz", - "integrity": "sha512-wIWseCKko1w/WARcDjO3N/XoJ0q/VE42AthP0eNAfEazDjJ94NXbaI6wuUsuY/bMg6hTKGVIpphjj2LoX3g6dA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -19796,15 +19820,15 @@ } }, "@docusaurus/mdx-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.1.tgz", - "integrity": "sha512-tdNeljdilXCmhbaEND3SAgsqaw/oh7v9onT5yrIrL26OSk2AFwd+MIi4R8jt8vq33M0R4rz2wpknm0fQIkDdvQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "dev": true, "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -19821,13 +19845,13 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.1.tgz", - "integrity": "sha512-f888ylnxHAM/3T8p1lx08+lTc6/g7AweSRfRuZvrVhHXj3Tz/nTTxaP6gPTGkJK7WLqTagpar/IGP6/74IBbkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "dev": true, "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.0.1", + "@docusaurus/types": "2.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -19837,18 +19861,18 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.1.tgz", - "integrity": "sha512-/4ua3iFYcpwgpeYgHnhVGROB/ybnauLH2+rICb4vz/+Gn1hjAmGXVYq1fk8g49zGs3uxx5nc0H5bL9P0g977IQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -19861,18 +19885,18 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.1.tgz", - "integrity": "sha512-2qeBWRy1EjgnXdwAO6/csDIS1UVNmhmtk/bQ2s9jqjpwM8YVgZ8QVdkxFAMWXgZWDQdwWwdP1rnmoEelE4HknQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -19885,94 +19909,94 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.1.tgz", - "integrity": "sha512-6apSVeJENnNecAH5cm5VnRqR103M6qSI6IuiP7tVfD5H4AWrfDNkvJQV2+R2PIq3bGrwmX4fcXl1x4g0oo7iwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.1.tgz", - "integrity": "sha512-jpZBT5HK7SWx1LRQyv9d14i44vSsKXGZsSPA2ndth5HykHJsiAj9Fwl1AtzmtGYuBmI+iXQyOd4MAMHd4ZZ1tg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.1.tgz", - "integrity": "sha512-d5qb+ZeQcg1Czoxc+RacETjLdp2sN/TAd7PGN/GrvtijCdgNmvVAtZ9QgajBTG0YbJFVPTeZ39ad2bpoOexX0w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.1.tgz", - "integrity": "sha512-qiRufJe2FvIyzICbkjm4VbVCI1hyEju/CebfDKkKh2ZtV4q6DM1WZG7D6VoQSXL8MrMFB895gipOM4BwdM8VsQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.1.tgz", - "integrity": "sha512-KcYuIUIp2JPzUf+Xa7W2BSsjLgN1/0h+VAz7D/C3RYjAgC5ApPX8wO+TECmGfunl/m7WKGUmLabfOon/as64kQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.1.tgz", - "integrity": "sha512-nOoniTg46My1qdDlLWeFs55uEmxOJ+9WMF8KKG8KMCu5LAvpemMi7rQd4x8Tw+xiPHZ/sQzH9JmPTMPRE4QGPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "dev": true, "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/plugin-debug": "2.0.1", - "@docusaurus/plugin-google-analytics": "2.0.1", - "@docusaurus/plugin-google-gtag": "2.0.1", - "@docusaurus/plugin-sitemap": "2.0.1", - "@docusaurus/theme-classic": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-search-algolia": "2.0.1", - "@docusaurus/types": "2.0.1" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" } }, "@docusaurus/react-loadable": { @@ -19986,23 +20010,23 @@ } }, "@docusaurus/theme-classic": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.1.tgz", - "integrity": "sha512-0jfigiqkUwIuKOw7Me5tqUM9BBvoQX7qqeevx7v4tkYQexPhk3VYSZo7aRuoJ9oyW5makCTPX551PMJzmq7+sw==", - "dev": true, - "requires": { - "@docusaurus/core": "2.0.1", - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-translations": "2.0.1", - "@docusaurus/types": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-common": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "dev": true, + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", @@ -20019,17 +20043,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.1.tgz", - "integrity": "sha512-I3b6e/ryiTQMsbES40cP0DRGnfr0E2qghVq+XecyMKjBPejISoSFEDn0MsnbW8Q26k1Dh/0qDH8QKDqaZZgLhA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "dev": true, "requires": { - "@docusaurus/mdx-loader": "2.0.1", - "@docusaurus/module-type-aliases": "2.0.1", - "@docusaurus/plugin-content-blog": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/plugin-content-pages": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -20041,19 +20065,19 @@ } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz", - "integrity": "sha512-cw3NaOSKbYlsY6uNj4PgO+5mwyQ3aEWre5RlmvjStaz2cbD15Nr69VG8Rd/F6Q5VsCT8BvSdkPDdDG5d/ACexg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "dev": true, "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.0.1", - "@docusaurus/logger": "2.0.1", - "@docusaurus/plugin-content-docs": "2.0.1", - "@docusaurus/theme-common": "2.0.1", - "@docusaurus/theme-translations": "2.0.1", - "@docusaurus/utils": "2.0.1", - "@docusaurus/utils-validation": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", @@ -20065,9 +20089,9 @@ } }, "@docusaurus/theme-translations": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.1.tgz", - "integrity": "sha512-v1MYYlbsdX+rtKnXFcIAn9ar0Z6K0yjqnCYS0p/KLCLrfJwfJ8A3oRJw2HiaIb8jQfk1WMY2h5Qi1p4vHOekQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "dev": true, "requires": { "fs-extra": "^10.1.0", @@ -20075,9 +20099,9 @@ } }, "@docusaurus/types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.1.tgz", - "integrity": "sha512-o+4hAFWkj3sBszVnRTAnNqtAIuIW0bNaYyDwQhQ6bdz3RAPEq9cDKZxMpajsj4z2nRty8XjzhyufAAjxFTyrfg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "dev": true, "requires": { "@types/history": "^4.7.11", @@ -20091,12 +20115,12 @@ } }, "@docusaurus/utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.1.tgz", - "integrity": "sha512-u2Vdl/eoVwMfUjDCkg7FjxoiwFs/XhVVtNxQEw8cvB+qaw6QWyT73m96VZzWtUb1fDOefHoZ+bZ0ObFeKk9lMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "dev": true, "requires": { - "@docusaurus/logger": "2.0.1", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -20114,36 +20138,36 @@ } }, "@docusaurus/utils-common": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.1.tgz", - "integrity": "sha512-kajCCDCXRd1HFH5EUW31MPaQcsyNlGakpkDoTBtBvpa4EIPvWaSKy7TIqYKHrZjX4tnJ0YbEJvaXfjjgdq5xSg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "dev": true, "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.1.tgz", - "integrity": "sha512-f14AnwFBy4/1A19zWthK+Ii80YDz+4qt8oPpK3julywXsheSxPBqgsND3LVBBvB2p3rJHvbo2m3HyB9Tco1JRw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "dev": true, "requires": { - "@docusaurus/logger": "2.0.1", - "@docusaurus/utils": "2.0.1", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" } }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -20259,6 +20283,12 @@ "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "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", @@ -20440,18 +20470,18 @@ "dev": true }, "@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "@microsoft/tsdoc-config": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", - "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" @@ -20558,9 +20588,9 @@ } }, "@stryker-mutator/api": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-6.1.2.tgz", - "integrity": "sha512-AfU6GWC65H0bWljREirjMSVSkD3nzT/1Vbivdn6nRvVySnwbX5J9KYI6EcaUnz+xRQL7XiF2Bhq/oHLZbC/vkQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-6.2.2.tgz", + "integrity": "sha512-ZMR3ubUh059Xb769ryE1LkwZR7PWbt5TITYYkHZd7pG5yLVzPMDP0d29CQBJW2H7YjlopgImVL8sw8U/RgDcGg==", "dev": true, "requires": { "mutation-testing-metrics": "1.7.10", @@ -20569,29 +20599,31 @@ } }, "@stryker-mutator/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-6.1.2.tgz", - "integrity": "sha512-McVG9eStXBBMx/rDz33N32RNvDK5VE1zyK6fjJsrb+cQJRZWnN/HWj+aDVuh2Q/gPE0Mv6Q2ZfsvhZms8hTA2Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-6.2.2.tgz", + "integrity": "sha512-1JS8UIMrwWeHqp508HXwRNmsAkHCtGskCwFWLLJSarVH9lyB8gyhTbhkaRHJGiEuaSTsxV1LZ5VzLK6OLgPtxw==", "dev": true, "requires": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/instrumenter": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/instrumenter": "6.2.2", + "@stryker-mutator/util": "6.2.2", "ajv": "~8.11.0", "chalk": "~5.0.0", - "commander": "~9.3.0", + "commander": "~9.4.0", + "diff-match-patch": "1.0.5", "execa": "~6.1.0", "file-url": "~4.0.0", "get-port": "~6.1.0", "glob": "~8.0.0", - "inquirer": "~9.0.0", + "inquirer": "~9.1.0", "lodash.flatmap": "~4.5.0", "lodash.groupby": "~4.6.0", - "log4js": "~6.5.0", + "log4js": "~6.6.0", "minimatch": "~5.1.0", "mkdirp": "~1.0.3", - "mutation-testing-elements": "1.7.10", + "mutation-testing-elements": "1.7.12", "mutation-testing-metrics": "1.7.10", + "mutation-testing-report-schema": "1.7.10", "npm-run-path": "~5.1.0", "progress": "~2.0.0", "rimraf": "~3.0.0", @@ -20611,91 +20643,58 @@ "dev": true }, "commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", "dev": true } } }, "@stryker-mutator/instrumenter": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-6.1.2.tgz", - "integrity": "sha512-Wn2RIivTvwtyDKvc0Nbi8WH1MbbqWbwOdt5bhnjBgK9zWxb2G23M4oHIX5F0h2g6GBQIdCU6ZHeeOF7UoQ+/xQ==", - "dev": true, - "requires": { - "@babel/core": "~7.18.0", - "@babel/generator": "~7.18.0", - "@babel/parser": "~7.18.0", - "@babel/plugin-proposal-class-properties": "~7.17.0", - "@babel/plugin-proposal-decorators": "~7.18.0", - "@babel/plugin-proposal-private-methods": "~7.17.0", - "@babel/preset-typescript": "~7.17.0", - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-6.2.2.tgz", + "integrity": "sha512-FZIvyL3uiIaLvOSKXe6jnq0FMo6lWy4NoGyYt5K/wmDxN2QuSaChGu/tVe4Z+Ui+4O3/DiGqWY5FWKGv1iHEPA==", + "dev": true, + "requires": { + "@babel/core": "~7.19.0", + "@babel/generator": "~7.19.0", + "@babel/parser": "~7.19.0", + "@babel/plugin-proposal-class-properties": "~7.18.0", + "@babel/plugin-proposal-decorators": "~7.19.0", + "@babel/plugin-proposal-private-methods": "~7.18.0", + "@babel/preset-typescript": "~7.18.0", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "angular-html-parser": "~1.8.0", - "weapon-regex": "~0.6.0" - }, - "dependencies": { - "@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - } - }, - "@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" - } - } + "weapon-regex": "~1.0.2" } }, "@stryker-mutator/mocha-runner": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-6.1.2.tgz", - "integrity": "sha512-+Wp6obwp/mrljzScPcPX0WR6Lu9WFGAw1FxU0Fpw88hKeDakVj7V49mVM/emRQKtF5oTi3N2pTph3zVXIw6FXQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-6.2.2.tgz", + "integrity": "sha512-yc6YNzKTal7ARu0sfJ6ERb8yQtTjgmoVtIEeRyDWW6JooUDERFq92Fw9rMBp+fW8Qgf5ZTdxbvFtpN0GtGe3Jw==", "dev": true, "requires": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "tslib": "~2.4.0" } }, "@stryker-mutator/typescript-checker": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/typescript-checker/-/typescript-checker-6.1.2.tgz", - "integrity": "sha512-O/JdgGGbxcCYy39iNKbxRPKiolyhqh343LOLW+bWFEzVyyKRxDPc7qmEyFXeHdgKyBmeYmCekdqmZErcUBQsRQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/typescript-checker/-/typescript-checker-6.2.2.tgz", + "integrity": "sha512-vYLrPden87i6Fyx6zgBLk2MSrtYDi/ig+ZgNotdavNy34VpiKPTkgpfAWjqkVCxyJhvQvkS6iag17xlWR+uYmg==", "dev": true, "requires": { - "@stryker-mutator/api": "6.1.2", - "@stryker-mutator/util": "6.1.2", + "@stryker-mutator/api": "6.2.2", + "@stryker-mutator/util": "6.2.2", "semver": "~7.3.2" } }, "@stryker-mutator/util": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-6.1.2.tgz", - "integrity": "sha512-1tJ+lHQVvJCwrT9NYstUCJP+3k7Jg6PLnVjfGIedyCnfkYVWPPfQFEWeBNsfm50g/GrJ+iWylcvClaIfbRu9Ww==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-6.2.2.tgz", + "integrity": "sha512-BjE9wP8V8Vh4VMr/pReNLlMNxSzl25OHJBDK1Y4WN/b+HY9gVy7PiX2HEYiXg7LniHIZ54vX5VLuLzJOfb6pGQ==", "dev": true, "requires": { "lodash.flatmap": "~4.5.0" @@ -20917,9 +20916,9 @@ } }, "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "requires": { "@types/estree": "*", @@ -20943,9 +20942,9 @@ "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==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "requires": { "@types/body-parser": "*", @@ -20955,9 +20954,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "requires": { "@types/node": "*", @@ -21035,21 +21034,11 @@ "dev": true }, "@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", "dev": true }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -21087,9 +21076,9 @@ "dev": true }, "@types/react": { - "version": "18.0.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", - "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", "dev": true, "requires": { "@types/prop-types": "*", @@ -21098,9 +21087,9 @@ } }, "@types/react-router": { - "version": "5.1.18", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", - "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "dev": true, "requires": { "@types/history": "^4.7.11", @@ -21194,14 +21183,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", - "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", + "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/type-utils": "5.33.0", - "@typescript-eslint/utils": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/type-utils": "5.37.0", + "@typescript-eslint/utils": "5.37.0", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -21211,52 +21200,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", - "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", + "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", - "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", + "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0" + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0" } }, "@typescript-eslint/type-utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", - "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", + "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.33.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/utils": "5.37.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", - "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", + "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", - "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", + "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21265,26 +21255,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", - "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", + "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", - "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", + "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/types": "5.37.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -21295,9 +21285,9 @@ "dev": true }, "@vscode/codicons": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.31.tgz", - "integrity": "sha512-fldpXy7pHsQAMlU1pnGI23ypQ6xLk5u6SiABMFoAmlj4f2MR0iwg7C19IB1xvAEGG+dkxOfRSrbKF8ry7QqGQA==", + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.32.tgz", + "integrity": "sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg==", "dev": true }, "@webassemblyjs/ast": { @@ -21466,6 +21456,23 @@ "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + } } }, "acorn": { @@ -21495,9 +21502,9 @@ "dev": true }, "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true }, "aggregate-error": { @@ -21563,9 +21570,9 @@ } }, "algoliasearch-helper": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.0.tgz", - "integrity": "sha512-TLl/MSjtQ98mgkd8hngWkzSjE+dAWldZ1NpJtv2mT+ZoFJ2P2zDE85oF9WafJOXWN9FbVRmyxpO5H+qXcNaFng==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "dev": true, "requires": { "@algolia/events": "^4.0.1" @@ -21749,12 +21756,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -21762,13 +21763,13 @@ "dev": true }, "autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", + "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", "dev": true, "requires": { "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "caniuse-lite": "^1.0.30001399", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -21841,13 +21842,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "dependencies": { @@ -21860,22 +21861,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "bail": { @@ -21984,9 +21985,9 @@ } }, "bonjour-service": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, "requires": { "array-flatten": "^2.1.2", @@ -22184,9 +22185,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "version": "1.0.30001400", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz", + "integrity": "sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA==", "dev": true }, "ccount": { @@ -22508,15 +22509,6 @@ "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", @@ -22530,9 +22522,9 @@ "dev": true }, "comment-json": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.2.tgz", - "integrity": "sha512-H8T+kl3nZesZu41zO2oNXIJWojNeK3mHxCLrsBNu6feksBXsgb+PtYz5daP5P86A0F3sz3840KVYehr04enISQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", "dev": true, "requires": { "array-timsort": "^1.0.3", @@ -22555,6 +22547,14 @@ "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + } } }, "compression": { @@ -22717,33 +22717,24 @@ } }, "core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==", "dev": true }, "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.21.3" } }, "core-js-pure": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", - "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", "dev": true }, "core-util-is": { @@ -22798,17 +22789,17 @@ "dev": true }, "cspell": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.6.1.tgz", - "integrity": "sha512-+mzcFfUM/+roBa2aCuLWQ/oFJ0EQqkMM7Yyjly3baVzXNCYoaxG9QrdVNbUSN6VjRdmpcDgHg5IPs1YfQmcZoA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.8.2.tgz", + "integrity": "sha512-WHF8tQXetHgAjyG6f0rDhWXRQllSpZULOIuDZj6PeZyHubuObzsMsW0asDvL8j+EGKXr8NPo4J3vjxahYmSJ+w==", "dev": true, "requires": { - "@cspell/cspell-pipe": "^6.6.1", + "@cspell/cspell-pipe": "^6.8.2", "chalk": "^4.1.2", "commander": "^9.4.0", - "cspell-gitignore": "^6.6.1", - "cspell-glob": "^6.6.1", - "cspell-lib": "^6.6.1", + "cspell-gitignore": "^6.8.2", + "cspell-glob": "^6.8.2", + "cspell-lib": "^6.8.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", "fs-extra": "^10.1.0", @@ -22829,88 +22820,88 @@ } }, "cspell-gitignore": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.6.1.tgz", - "integrity": "sha512-QXQHtFZBJn3BIZrpB3ii0xqxUcTgrAnZnGIlnIYhhSI0wcXILDUwxymcr9WjlU0X6+9e9zQHHmE+IvP4nN+LSA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.8.2.tgz", + "integrity": "sha512-JoU/rGeGrjSqOMvY5q+bloxtO5Y8QLpJEEIAvHHZ+oTOlExZ/CIAYnO6X3lC6ylNRYc1+I2KEOFa6R0+0OSdVQ==", "dev": true, "requires": { - "cspell-glob": "^6.6.1", + "cspell-glob": "^6.8.2", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.6.1.tgz", - "integrity": "sha512-/sNMrWVDf9OOcaW8QeradLt89ztUQC6CLjUjSkf61hu9IW0xBfukNH9lUEhic9Qm0HCEcTshJgzRfo71LAYQFQ==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.8.2.tgz", + "integrity": "sha512-FKy2EIdQKO9b/vP0r8yqxtGQNA8M48DkwMSjW2mN1Qku5wRT8SPByKg87BjK4oztlIiQJoJ6+8OTrWnJwdbpQw==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.6.1.tgz", - "integrity": "sha512-TmpxHT/7CkbINTlZ8FOshNKT/bTwREhglajW9V5kjTqClCyMK55358FPStnoIZgdqZ6tGgEyoKR8lfSVtEteKw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.8.2.tgz", + "integrity": "sha512-RHvIsNRDlBYKddKAdob5XT2+odOiO3eJVaw/vt5+CRx1cJSjuaIOyHwXKH2Xl1ioUUhEb9Ew3pg7JktRdzKn5w==", "dev": true, "requires": { - "@cspell/cspell-pipe": "^6.6.1", - "@cspell/cspell-types": "^6.6.1" + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2" } }, "cspell-io": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.6.1.tgz", - "integrity": "sha512-8XntUwclNEGKLxUfgj6Gp/ZWExBbVfoWBJsubTjzhxqbHp8xt3foXMVD+eUJgQ8JOmxn3QV2Q/GyOagSWedDAw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.8.2.tgz", + "integrity": "sha512-QpdePUXD8fTM2XuZdeS5ygTeIW9pnaQhTVWBWGbnrYlMn5iV9Jo81dHheHw4InxQJUjhyS/CuxdNGfYZXGJuaQ==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "^6.6.1", - "@types/node-fetch": "^2.6.2", + "@cspell/cspell-service-bus": "^6.8.2", "node-fetch": "^2.6.7" } }, "cspell-lib": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.6.1.tgz", - "integrity": "sha512-sj1ITFEiindErP9TmQXdkj56bqu+EdjladNAtAv22Zb0WVsJkdbHErRkAXzLShLUeyoaGkF2oLWal4PFsxppXw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.8.2.tgz", + "integrity": "sha512-K7UoaKB3qzq5KVnKynQM0+v8+4aXAA0coBKA6tH5czY2KDeuJSUu14b9WM+nxrUbMOOvNuSv+NaYw5lryaMFsg==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "^6.6.1", - "@cspell/cspell-pipe": "^6.6.1", - "@cspell/cspell-types": "^6.6.1", + "@cspell/cspell-bundled-dicts": "^6.8.2", + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2", "clear-module": "^4.1.2", - "comment-json": "^4.2.2", + "comment-json": "^4.2.3", "configstore": "^5.0.1", "cosmiconfig": "^7.0.1", - "cspell-glob": "^6.6.1", - "cspell-grammar": "^6.6.1", - "cspell-io": "^6.6.1", - "cspell-trie-lib": "^6.6.1", - "fast-equals": "^4.0.1", + "cspell-glob": "^6.8.2", + "cspell-grammar": "^6.8.2", + "cspell-io": "^6.8.2", + "cspell-trie-lib": "^6.8.2", + "fast-equals": "^4.0.3", "find-up": "^5.0.0", "fs-extra": "^10.1.0", - "gensequence": "^3.1.1", + "gensequence": "^4.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.5", + "vscode-languageserver-textdocument": "^1.0.7", "vscode-uri": "^3.0.3" } }, "cspell-trie-lib": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.6.1.tgz", - "integrity": "sha512-8WKdKAy3/0RikfhoXAO2mv2Jrhx/mpRcgotbr93lhDRciJBAwQv4TfY9iF2KII0EdeNg9+qpqr/lNWtRaYjqYw==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.8.2.tgz", + "integrity": "sha512-jaNszLtSQglpz1BKejQ4RBFyJVSsYHQGW+1Rj4Zm103OcL+g6r/E1lm/dIbX/1UC4pBrNamjcGzXtPOBZJtUeQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "^6.6.1", + "@cspell/cspell-pipe": "^6.8.2", + "@cspell/cspell-types": "^6.8.2", "fs-extra": "^10.1.0", - "gensequence": "^3.1.1" + "gensequence": "^4.0.2" } }, "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "dev": true, "requires": {} }, @@ -22931,9 +22922,9 @@ } }, "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", "dev": true, "requires": { "cssnano": "^5.1.8", @@ -23086,9 +23077,9 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, "date-format": { @@ -23265,12 +23256,6 @@ "slash": "^3.0.0" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -23358,6 +23343,12 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -23392,17 +23383,17 @@ } }, "docusaurus-plugin-typedoc-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc-api/-/docusaurus-plugin-typedoc-api-2.3.0.tgz", - "integrity": "sha512-cQy1y0vwvlJ/Z+7aYblfR8FuwRRUGr0NlJ3NzpBiRz/xBcCsIGTJaGbZqv2Y64DQBMle/Mu6uBXjfhBojFZRxA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc-api/-/docusaurus-plugin-typedoc-api-2.4.0.tgz", + "integrity": "sha512-eXHcS1gehUE/cvSnBYvb7l5wizd5lO82Lcu6eutofnvbWoNYSajJ9xHZVBBonfKyhGBlGlbk/as0fZieRr8H/g==", "dev": true, "requires": { "@docusaurus/plugin-content-docs": "^2.0.1", "@docusaurus/types": "^2.0.1", "@docusaurus/utils": "^2.0.1", - "@vscode/codicons": "^0.0.31", + "@vscode/codicons": "^0.0.32", "marked": "^4.0.18", - "typedoc": "^0.23.8" + "typedoc": "^0.23.10" } }, "dom-converter": { @@ -23495,9 +23486,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", + "version": "1.4.251", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.251.tgz", + "integrity": "sha512-k4o4cFrWPv4SoJGGAydd07GmlRVzmeDIJ6MaEChTUjk4Dmomn189tCicSzil2oyvbPoGgg2suwPDNWq4gWRhoQ==", "dev": true }, "emoji-regex": { @@ -23544,9 +23535,9 @@ } }, "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "error-ex": { @@ -23559,16 +23550,16 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "requires": { "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.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -23580,9 +23571,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -23640,14 +23631,15 @@ "dev": true }, "eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", + "@eslint/eslintrc": "^1.3.2", "@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -23657,13 +23649,12 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", + "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", - "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", "globby": "^11.1.0", @@ -23672,6 +23663,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -23682,8 +23674,7 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ajv": { @@ -23953,9 +23944,9 @@ } }, "eslint-plugin-react": { - "version": "7.30.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", - "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "dev": true, "requires": { "array-includes": "^3.1.5", @@ -24029,20 +24020,20 @@ "requires": {} }, "eslint-plugin-simple-import-sort": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", - "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-8.0.0.tgz", + "integrity": "sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==", "dev": true, "requires": {} }, "eslint-plugin-tsdoc": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz", - "integrity": "sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", + "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.1", - "@microsoft/tsdoc-config": "0.16.1" + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "0.16.2" } }, "eslint-scope": { @@ -24087,9 +24078,9 @@ "dev": true }, "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -24315,15 +24306,15 @@ "dev": true }, "fast-equals": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.1.tgz", - "integrity": "sha512-OXqyj3MD0p8Kee16Jz7CbCnXo+5CHKKu4xBh5UhC1NbmMkHn8WScLRy/B2q5UOlWMlNSQJc4mwXW30Lz+JUZJw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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", @@ -24412,9 +24403,9 @@ } }, "figures": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", - "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "requires": { "escape-string-regexp": "^5.0.0", @@ -24577,9 +24568,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "flux": { @@ -24593,9 +24584,9 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "foreground-child": { @@ -24731,17 +24722,6 @@ } } }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -24821,9 +24801,9 @@ "dev": true }, "gensequence": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz", - "integrity": "sha512-ys3h0hiteRwmY6BsvSttPmkhC0vEQHPJduANBRtH/dlDPZ0UBIb/dXy80IcckXyuQ6LKg+PloRqvGER9IS7F7g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-4.0.2.tgz", + "integrity": "sha512-mQiFskYFPFDSUpBJ/n3ebAV2Ufu6DZGvUPXzyWYzFfJr6/DyOOZVnjx6VTWE4y0RLvYWnc5tZq5sCjzEWhRjqQ==", "dev": true }, "gensync": { @@ -24845,9 +24825,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -25554,9 +25534,9 @@ "dev": true }, "inquirer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.0.2.tgz", - "integrity": "sha512-AqmDHmz3bIe573OiM4svTZzajBzff1xpuzYAimW8gjzW5ncuPllWB8t/GKl+NSuKRJaKyIF2bU2RCx8H1dwqyQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.1.tgz", + "integrity": "sha512-hfS9EJ1pVkGNbYKqzdGwMj0Dqosd36Qvxd5pFy4657QT23gmtFTSqoYBisZR75DReeSMWPNa8J0Lf6TQCz8PvA==", "dev": true, "requires": { "ansi-escapes": "^5.0.0", @@ -25564,7 +25544,7 @@ "cli-cursor": "^4.0.0", "cli-width": "^4.0.0", "external-editor": "^3.0.3", - "figures": "^4.0.1", + "figures": "^5.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^6.1.2", @@ -25688,9 +25668,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", "dev": true }, "is-ci": { @@ -25920,9 +25900,9 @@ "dev": true }, "is-unicode-supported": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true }, "is-weakref": { @@ -26047,6 +26027,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -26099,9 +26085,9 @@ "dev": true }, "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "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 }, "jsonfile": { @@ -26287,16 +26273,16 @@ } }, "log4js": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", - "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.1.tgz", + "integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==", "dev": true, "requires": { - "date-format": "^4.0.10", + "date-format": "^4.0.13", "debug": "^4.3.4", - "flatted": "^3.2.5", + "flatted": "^3.2.6", "rfdc": "^1.3.0", - "streamroller": "^3.1.1" + "streamroller": "^3.1.2" } }, "loose-envify": { @@ -26377,9 +26363,9 @@ "dev": true }, "marked": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.18.tgz", - "integrity": "sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", + "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==", "dev": true }, "mdast-squeeze-paragraphs": { @@ -26490,18 +26476,18 @@ "dev": true }, "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "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==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -26696,9 +26682,9 @@ } }, "mutation-testing-elements": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-1.7.10.tgz", - "integrity": "sha512-qejt4InSYzFGhN84+mbpj96aKl41g0IRTIEVuOepKgcdMdrmb2dhXBB5Mysncmz7NF/VzXSTGutdQFTz9johfw==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-1.7.12.tgz", + "integrity": "sha512-6L5PiREMKWirDOVoMVpJtq4r1MfHZgme78PFQl9W59YQq/rqmHpYAcwrdUYikPVYASp4r91ZupiKlFHgCPiVBw==", "dev": true }, "mutation-testing-metrics": { @@ -26855,9 +26841,9 @@ "dev": true }, "object.assign": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", - "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "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", @@ -27156,12 +27142,12 @@ "dev": true }, "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "requires": { - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "parse5-htmlparser2-tree-adapter": { @@ -27692,12 +27678,12 @@ } }, "postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "dev": true, "requires": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" } }, "postcss-svgo": { @@ -27774,9 +27760,9 @@ "requires": {} }, "prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "dev": true }, "process-nextick-args": { @@ -28224,9 +28210,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -28265,15 +28251,15 @@ "dev": true }, "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dev": true, "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } @@ -28297,15 +28283,15 @@ } }, "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -28831,9 +28817,9 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" @@ -28952,21 +28938,6 @@ "concat-map": "0.0.1" } }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "~1.33.0" - } - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -29159,14 +29130,14 @@ } }, "shiki": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", - "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.11.1.tgz", + "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" + "vscode-textmate": "^6.0.0" } }, "side-channel": { @@ -29241,9 +29212,9 @@ } }, "sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", "dev": true }, "source-map": { @@ -29633,9 +29604,9 @@ "dev": true }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -29653,9 +29624,9 @@ } }, "terser-webpack-plugin": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz", - "integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.14", @@ -29954,9 +29925,9 @@ "dev": true }, "type-fest": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz", - "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true }, "type-is": { @@ -29967,6 +29938,23 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + } } }, "typed-inject": { @@ -29996,21 +29984,21 @@ } }, "typedoc": { - "version": "0.23.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.10.tgz", - "integrity": "sha512-03EUiu/ZuScUBMnY6p0lY+HTH8SwhzvRE3gImoemdPDWXPXlks83UGTx++lyquWeB1MTwm9D9Ca8RIjkK3AFfQ==", + "version": "0.23.14", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.14.tgz", + "integrity": "sha512-s2I+ZKBET38EctZvbXp2GooHrNaKjWZkrwGEK/sttnOGiKJqU0vHrsdcwLgKZGuo2aedNL3RRPj1LnAAeYscig==", "dev": true, "requires": { "lunr": "^2.3.9", - "marked": "^4.0.18", + "marked": "^4.0.19", "minimatch": "^5.1.0", - "shiki": "^0.10.1" + "shiki": "^0.11.1" } }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true }, "ua-parser-js": { @@ -30070,9 +30058,9 @@ "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, "unified": { @@ -30183,9 +30171,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -30334,6 +30322,21 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -30409,12 +30412,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "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", @@ -30473,9 +30470,9 @@ } }, "vscode-languageserver-textdocument": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.5.tgz", - "integrity": "sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", "dev": true }, "vscode-oniguruma": { @@ -30485,15 +30482,15 @@ "dev": true }, "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-6.0.0.tgz", + "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==", "dev": true }, "vscode-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz", - "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.4.tgz", + "integrity": "sha512-aEmKD6H8Sg8gaQAUrnadG0BMeWXtiWhRsj1a94n2FYsMkDpgnK7BRVzZjOUYIvkv2B+bp5Bmt4ImZCpYbnJwkg==", "dev": true }, "wait-on": { @@ -30538,9 +30535,9 @@ } }, "weapon-regex": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-0.6.0.tgz", - "integrity": "sha512-k1gh8cffl+uOEakFS3Ze32nBsoqmcXembTI3nNQMPMUKAr83YBShTrjYGyeVC9zNzW5Ac/+dcvk3PLYUtNtSEQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-1.0.3.tgz", + "integrity": "sha512-V8X6hPIzY1juvrSVREmtRhK9AHn/8c2z8XxaibESU+jyG/RinZ9x9x6aw8qEuFAi7R6Kl/EWGbU2Yq/9u6TTjw==", "dev": true }, "web-namespaces": { @@ -30612,6 +30609,21 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -30626,9 +30638,9 @@ } }, "webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dev": true, "requires": { "acorn": "^8.0.4", @@ -30663,6 +30675,21 @@ "schema-utils": "^4.0.0" }, "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -30684,9 +30711,9 @@ } }, "webpack-dev-server": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz", - "integrity": "sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -30863,9 +30890,9 @@ "dev": true }, "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", + "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", "dev": true }, "strip-ansi": { diff --git a/package.json b/package.json index 1131bb7804..6ee15e9658 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "A Query Language and Runtime which can target any service.", "license": "MIT", "private": true, + "type": "module", "typesVersions": { ">=4.4.0": { "*": [ @@ -43,9 +44,10 @@ "prettier": "prettier --cache --cache-strategy metadata --write --list-different .", "prettier:check": "prettier --cache --cache-strategy metadata --check .", "check:spelling": "cspell --cache --no-progress '**/*'", - "check:integrations": "npm run build:npm && npm run build:deno && mocha --full-trace integrationTests/*-test.ts", - "start": "DOCUSAURUS_GENERATED_FILES_DIR_NAME=\"$(pwd)/.docusaurus\" docusaurus start ./website", - "build:website": "DOCUSAURUS_GENERATED_FILES_DIR_NAME=\"$(pwd)/.docusaurus\" docusaurus build --out-dir=\"$(pwd)/websiteDist\" ./website", + "check:integrations": "mocha --full-trace resources/integration-test.ts", + "serve": "docusaurus serve --dir websiteDist/ --config website/docusaurus.config.cjs", + "start": "npm run build:website && npm run serve", + "build:website": "ts-node resources/build-docusaurus.ts", "build:npm": "ts-node resources/build-npm.ts", "build:deno": "ts-node resources/build-deno.ts", "diff:npm": "ts-node resources/diff-npm-package.ts", @@ -53,32 +55,32 @@ "gitpublish:deno": "bash ./resources/gitpublish.sh deno denoDist" }, "devDependencies": { - "@docusaurus/core": "2.0.1", - "@docusaurus/preset-classic": "2.0.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", "@mdx-js/react": "1.6.22", - "@stryker-mutator/core": "6.1.2", - "@stryker-mutator/mocha-runner": "6.1.2", - "@stryker-mutator/typescript-checker": "6.1.2", + "@stryker-mutator/core": "6.2.2", + "@stryker-mutator/mocha-runner": "6.2.2", + "@stryker-mutator/typescript-checker": "6.2.2", "@svgr/webpack": "6.3.1", "@types/chai": "4.3.3", "@types/mocha": "9.1.1", - "@types/node": "18.7.2", + "@types/node": "18.7.18", "@types/prettier": "2.7.0", - "@typescript-eslint/eslint-plugin": "5.33.0", - "@typescript-eslint/parser": "5.33.0", + "@typescript-eslint/eslint-plugin": "5.37.0", + "@typescript-eslint/parser": "5.37.0", "c8": "7.12.0", "chai": "4.3.6", "clsx": "1.2.1", - "cspell": "6.6.1", - "docusaurus-plugin-typedoc-api": "2.3.0", - "eslint": "8.21.0", + "cspell": "6.8.2", + "docusaurus-plugin-typedoc-api": "2.4.0", + "eslint": "8.23.1", "eslint-plugin-import": "2.26.0", "eslint-plugin-internal-rules": "file:./resources/eslint-internal-rules", "eslint-plugin-node": "11.1.0", - "eslint-plugin-react": "7.30.1", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-simple-import-sort": "7.0.0", - "eslint-plugin-tsdoc": "0.2.16", + "eslint-plugin-simple-import-sort": "8.0.0", + "eslint-plugin-tsdoc": "0.2.17", "file-loader": "6.2.0", "mocha": "10.0.0", "prettier": "2.7.1", @@ -86,8 +88,8 @@ "react": "17.0.2", "react-dom": "17.0.2", "ts-node": "10.9.1", - "typedoc": "0.23.10", - "typescript": "4.7.4", + "typedoc": "0.23.14", + "typescript": "4.8.3", "url-loader": "4.1.1" }, "publishConfig": { diff --git a/resources/benchmark.ts b/resources/benchmark.ts index c01592dc2d..51ac67b30d 100644 --- a/resources/benchmark.ts +++ b/resources/benchmark.ts @@ -1,11 +1,10 @@ -import * as assert from 'node:assert'; -import * as cp from 'node:child_process'; -import * as fs from 'node:fs'; -import * as os from 'node:os'; -import * as path from 'node:path'; -import * as url from 'node:url'; +import assert from 'node:assert'; +import cp from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import url from 'node:url'; -import { exec, localRepoPath } from './utils'; +import { git, localRepoPath, makeTmpDir, npm } from './utils.js'; const NS_PER_SEC = 1e9; const LOCAL = 'local'; @@ -35,18 +34,13 @@ interface BenchmarkProject { function prepareBenchmarkProjects( revisionList: ReadonlyArray, ): Array { - const tmpDir = path.join(os.tmpdir(), 'graphql-js-benchmark'); - fs.rmSync(tmpDir, { recursive: true, force: true }); - fs.mkdirSync(tmpDir); - - const setupDir = path.join(tmpDir, 'setup'); - fs.mkdirSync(setupDir); + const { tmpDirPath } = makeTmpDir('graphql-js-benchmark'); return revisionList.map((revision) => { console.log(`🍳 Preparing ${revision}...`); - const projectPath = path.join(setupDir, revision); + const projectPath = tmpDirPath('setup', revision); fs.rmSync(projectPath, { recursive: true, force: true }); - fs.mkdirSync(projectPath); + fs.mkdirSync(projectPath, { recursive: true }); fs.cpSync(localRepoPath('benchmark'), path.join(projectPath, 'benchmark'), { recursive: true, @@ -63,7 +57,7 @@ function prepareBenchmarkProjects( path.join(projectPath, 'package.json'), JSON.stringify(packageJSON, null, 2), ); - exec('npm --quiet install --ignore-scripts ', { cwd: projectPath }); + npm({ cwd: projectPath, quiet: true }).install('--ignore-scripts'); return { revision, projectPath }; }); @@ -71,37 +65,35 @@ function prepareBenchmarkProjects( function prepareNPMPackage(revision: string) { if (revision === LOCAL) { const repoDir = localRepoPath(); - const archivePath = path.join(tmpDir, 'graphql-local.tgz'); + const archivePath = tmpDirPath('graphql-local.tgz'); fs.renameSync(buildNPMArchive(repoDir), archivePath); return archivePath; } // Returns the complete git hash for a given git revision reference. - const hash = exec(`git rev-parse "${revision}"`); + const hash = git().revParse(revision); - const archivePath = path.join(tmpDir, `graphql-${hash}.tgz`); + const archivePath = tmpDirPath(`graphql-${hash}.tgz`); if (fs.existsSync(archivePath)) { return archivePath; } - const repoDir = path.join(tmpDir, hash); + const repoDir = tmpDirPath(hash); fs.rmSync(repoDir, { recursive: true, force: true }); fs.mkdirSync(repoDir); - exec(`git clone --quiet "${localRepoPath()}" "${repoDir}"`); - exec(`git checkout --quiet --detach "${hash}"`, { cwd: repoDir }); - exec('npm --quiet ci --ignore-scripts', { cwd: repoDir }); + git({ quiet: true }).clone(localRepoPath(), repoDir); + git({ cwd: repoDir, quiet: true }).checkout('--detach', hash); + npm({ cwd: repoDir, quiet: true }).ci('--ignore-scripts'); fs.renameSync(buildNPMArchive(repoDir), archivePath); fs.rmSync(repoDir, { recursive: true }); return archivePath; } function buildNPMArchive(repoDir: string) { - exec('npm --quiet run build:npm', { cwd: repoDir }); + npm({ cwd: repoDir, quiet: true }).run('build:npm'); const distDir = path.join(repoDir, 'npmDist'); - const archiveName = exec(`npm --quiet pack ${distDir}`, { - cwd: repoDir, - }); + const archiveName = npm({ cwd: repoDir, quiet: true }).pack(distDir); return path.join(repoDir, archiveName); } } diff --git a/resources/build-deno.ts b/resources/build-deno.ts index 0d7ba254c8..c5da8ce706 100644 --- a/resources/build-deno.ts +++ b/resources/build-deno.ts @@ -1,40 +1,38 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; +import fs from 'node:fs'; +import path from 'node:path'; -import * as ts from 'typescript'; +import ts from 'typescript'; -import { addExtensionToImportPaths } from './add-extension-to-import-paths'; -import { inlineInvariant } from './inline-invariant'; -import { readdirRecursive, showDirStats, writeGeneratedFile } from './utils'; +import { changeExtensionInImportPaths } from './change-extension-in-import-paths.js'; +import { inlineInvariant } from './inline-invariant.js'; +import { readTSConfig, showDirStats, writeGeneratedFile } from './utils.js'; fs.rmSync('./denoDist', { recursive: true, force: true }); fs.mkdirSync('./denoDist'); -const srcFiles = readdirRecursive('./src', { ignoreDir: /^__.*__$/ }); -for (const filepath of srcFiles) { - if (filepath.endsWith('.ts')) { - const srcPath = path.join('./src', filepath); - - const sourceFile = ts.createSourceFile( - srcPath, - fs.readFileSync(srcPath, 'utf-8'), - ts.ScriptTarget.Latest, - ); - - const transformed = ts.transform(sourceFile, [ - addExtensionToImportPaths({ extension: '.ts' }), - inlineInvariant, - ]); - const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); - const newContent = printer.printBundle( - ts.createBundle(transformed.transformed), - ); - - transformed.dispose(); - - const destPath = path.join('./denoDist', filepath); - writeGeneratedFile(destPath, newContent); +const tsProgram = ts.createProgram(['src/index.ts'], readTSConfig()); +for (const sourceFile of tsProgram.getSourceFiles()) { + if ( + tsProgram.isSourceFileFromExternalLibrary(sourceFile) || + tsProgram.isSourceFileDefaultLibrary(sourceFile) + ) { + continue; } + + const transformed = ts.transform(sourceFile, [ + changeExtensionInImportPaths({ extension: '.ts' }), + inlineInvariant, + ]); + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const newContent = printer.printBundle( + ts.factory.createBundle(transformed.transformed), + ); + + transformed.dispose(); + + const filepath = path.relative('./src', sourceFile.fileName); + const destPath = path.join('./denoDist', filepath); + writeGeneratedFile(destPath, newContent); } fs.copyFileSync('./LICENSE', './denoDist/LICENSE'); diff --git a/resources/build-docusaurus.ts b/resources/build-docusaurus.ts new file mode 100644 index 0000000000..8928bac07c --- /dev/null +++ b/resources/build-docusaurus.ts @@ -0,0 +1,39 @@ +// The whole script is a hack to allow building Docusaurus in ESM project +// https://github.com/facebook/docusaurus/issues/6520 +// Should be just: `docusaurus build --out-dir ./websiteDist ./website` + +import fs from 'node:fs'; + +import { localRepoPath, makeTmpDir, npm, readPackageJSON } from './utils.js'; + +const { tmpDirPath } = makeTmpDir('graphql-js-run-docusaurus'); + +const packageJSON = readPackageJSON(); +delete packageJSON.type; +fs.writeFileSync(tmpDirPath('package.json'), JSON.stringify(packageJSON)); + +copyToTmpDir('package-lock.json'); +copyToTmpDir('tsconfig.json'); +copyToTmpDir('src'); +copyToTmpDir('website'); + +npm({ cwd: tmpDirPath(), quiet: true }).ci('--ignore-scripts'); + +const env = { + ...process.env, + DOCUSAURUS_GENERATED_FILES_DIR_NAME: tmpDirPath('.docusaurus'), +}; +npm({ env, cwd: tmpDirPath() }).exec( + 'docusaurus', + '--', + 'build', + '--out-dir', + localRepoPath('websiteDist'), + tmpDirPath('website'), +); + +function copyToTmpDir(relativePath: string) { + fs.cpSync(localRepoPath(relativePath), tmpDirPath(relativePath), { + recursive: true, + }); +} diff --git a/resources/build-npm.ts b/resources/build-npm.ts index 91874c29eb..4ccd249a76 100644 --- a/resources/build-npm.ts +++ b/resources/build-npm.ts @@ -1,76 +1,33 @@ -import * as assert from 'node:assert'; -import * as fs from 'node:fs'; -import * as path from 'node:path'; +import assert from 'node:assert'; +import fs from 'node:fs'; +import path from 'node:path'; -import * as ts from 'typescript'; +import ts from 'typescript'; -import { addExtensionToImportPaths } from './add-extension-to-import-paths'; -import { inlineInvariant } from './inline-invariant'; +import { changeExtensionInImportPaths } from './change-extension-in-import-paths.js'; +import { inlineInvariant } from './inline-invariant.js'; import { - localRepoPath, - readdirRecursive, readPackageJSON, + readTSConfig, showDirStats, writeGeneratedFile, -} from './utils'; +} from './utils.js'; -fs.rmSync('./npmDist', { recursive: true, force: true }); -fs.mkdirSync('./npmDist'); - -// Based on https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#getting-the-dts-from-a-javascript-file -const tsConfigPath = localRepoPath('tsconfig.json'); -const { config: tsConfig, error: tsConfigError } = ts.parseConfigFileTextToJson( - tsConfigPath, - fs.readFileSync(tsConfigPath, 'utf-8'), -); -assert(tsConfigError === undefined, 'Fail to parse config: ' + tsConfigError); -assert( - tsConfig.compilerOptions, - '"tsconfig.json" should have `compilerOptions`', -); - -const { options: tsOptions, errors: tsOptionsErrors } = - ts.convertCompilerOptionsFromJson( - { - ...tsConfig.compilerOptions, - module: 'es2020', - noEmit: false, - declaration: true, - declarationDir: './npmDist', - outDir: './npmDist', - }, - process.cwd(), - ); - -assert( - tsOptionsErrors.length === 0, - 'Fail to parse options: ' + tsOptionsErrors, -); - -const tsHost = ts.createCompilerHost(tsOptions); -tsHost.writeFile = writeGeneratedFile; - -const tsProgram = ts.createProgram(['src/index.ts'], tsOptions, tsHost); -const tsResult = tsProgram.emit(undefined, undefined, undefined, undefined, { - after: [addExtensionToImportPaths({ extension: '.js' }), inlineInvariant], -}); -assert( - !tsResult.emitSkipped, - 'Fail to generate `*.d.ts` files, please run `npm run check`', -); +console.log('\n./npmDist'); +buildPackage('./npmDist', false); +showDirStats('./npmDist'); -fs.copyFileSync('./LICENSE', './npmDist/LICENSE'); -fs.copyFileSync('./README.md', './npmDist/README.md'); +console.log('\n./npmEsmDist'); +buildPackage('./npmEsmDist', true); +showDirStats('./npmEsmDist'); -// Should be done as the last step so only valid packages can be published -writeGeneratedFile( - './npmDist/package.json', - JSON.stringify(buildPackageJSON()), -); +function buildPackage(outDir: string, isESMOnly: boolean): void { + fs.rmSync(outDir, { recursive: true, force: true }); + fs.mkdirSync(outDir); -showDirStats('./npmDist'); + fs.copyFileSync('./LICENSE', `./${outDir}/LICENSE`); + fs.copyFileSync('./README.md', `./${outDir}/README.md`); -function buildPackageJSON() { const packageJSON = readPackageJSON(); delete packageJSON.private; @@ -86,7 +43,7 @@ function buildPackageJSON() { // TODO: revisit once TS implements https://github.com/microsoft/TypeScript/issues/32166 const notSupportedTSVersionFile = 'NotSupportedTSVersion.d.ts'; fs.writeFileSync( - path.join('./npmDist', notSupportedTSVersionFile), + path.join(outDir, notSupportedTSVersionFile), // Provoke syntax error to show this message `"Package 'graphql' support only TS versions that are ${supportedTSVersions[0]}".`, ); @@ -96,20 +53,6 @@ function buildPackageJSON() { '*': { '*': [notSupportedTSVersionFile] }, }; - packageJSON.type = 'module'; - packageJSON.exports = {}; - - for (const filepath of readdirRecursive('./src', { ignoreDir: /^__.*__$/ })) { - if (path.basename(filepath) === 'index.ts') { - const key = path.dirname(filepath); - packageJSON.exports[key] = filepath.replace(/\.ts$/, '.js'); - } - } - - // Temporary workaround to allow "internal" imports, no grantees provided - packageJSON.exports['./*.js'] = './*.js'; - packageJSON.exports['./*'] = './*.js'; - // TODO: move to integration tests const publishTag = packageJSON.publishConfig?.tag; assert(publishTag != null, 'Should have packageJSON.publishConfig defined!'); @@ -138,5 +81,73 @@ function buildPackageJSON() { ); } - return packageJSON; + if (isESMOnly) { + packageJSON.exports = {}; + + const { emittedTSFiles } = emitTSFiles({ + outDir, + module: 'es2020', + extension: '.js', + }); + + for (const filepath of emittedTSFiles) { + if (path.basename(filepath) === 'index.js') { + const relativePath = './' + path.relative('./npmEsmDist', filepath); + packageJSON.exports[path.dirname(relativePath)] = relativePath; + } + } + + // Temporary workaround to allow "internal" imports, no grantees provided + packageJSON.exports['./*.js'] = './*.js'; + packageJSON.exports['./*'] = './*.js'; + + packageJSON.publishConfig.tag += '-esm'; + packageJSON.version += '+esm'; + } else { + delete packageJSON.type; + packageJSON.main = 'index'; + packageJSON.module = 'index.mjs'; + emitTSFiles({ outDir, module: 'commonjs', extension: '.js' }); + emitTSFiles({ outDir, module: 'es2020', extension: '.mjs' }); + } + + // Should be done as the last step so only valid packages can be published + writeGeneratedFile(`./${outDir}/package.json`, JSON.stringify(packageJSON)); +} + +// Based on https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#getting-the-dts-from-a-javascript-file +function emitTSFiles(options: { + outDir: string; + module: string; + extension: string; +}): { + emittedTSFiles: ReadonlyArray; +} { + const { outDir, module, extension } = options; + const tsOptions = readTSConfig({ + module, + noEmit: false, + declaration: true, + declarationDir: outDir, + outDir, + listEmittedFiles: true, + }); + + const tsHost = ts.createCompilerHost(tsOptions); + tsHost.writeFile = (filepath, body) => + writeGeneratedFile(filepath.replace(/.js$/, extension), body); + + const tsProgram = ts.createProgram(['src/index.ts'], tsOptions, tsHost); + const tsResult = tsProgram.emit(undefined, undefined, undefined, undefined, { + after: [changeExtensionInImportPaths({ extension }), inlineInvariant], + }); + assert( + !tsResult.emitSkipped, + 'Fail to generate `*.d.ts` files, please run `npm run check`', + ); + + assert(tsResult.emittedFiles != null); + return { + emittedTSFiles: tsResult.emittedFiles.sort((a, b) => a.localeCompare(b)), + }; } diff --git a/resources/add-extension-to-import-paths.ts b/resources/change-extension-in-import-paths.ts similarity index 73% rename from resources/add-extension-to-import-paths.ts rename to resources/change-extension-in-import-paths.ts index cb9150edc7..7775930a33 100644 --- a/resources/add-extension-to-import-paths.ts +++ b/resources/change-extension-in-import-paths.ts @@ -1,7 +1,7 @@ -import * as assert from 'node:assert'; -import * as util from 'node:util'; +import assert from 'node:assert'; +import util from 'node:util'; -import * as ts from 'typescript'; +import ts from 'typescript'; /** * Adds extension to all paths imported inside MJS files @@ -9,19 +9,19 @@ import * as ts from 'typescript'; * Transforms: * * ``` - * import { foo } from './bar'; - * export { foo } from './bar'; + * import { foo } from './bar.js'; + * export { foo } from './bar.js'; * ``` * * to: * * ``` - * import { foo } from './bar.mjs'; - * export { foo } from './bar.mjs'; + * import { foo } from './bar.ts'; + * export { foo } from './bar.ts'; * ``` * */ -export function addExtensionToImportPaths(config: { extension: string }) { +export function changeExtensionInImportPaths(config: { extension: string }) { const { extension } = config; return (context: ts.TransformationContext) => { const { factory } = context; @@ -35,13 +35,15 @@ export function addExtensionToImportPaths(config: { extension: string }) { function visitNode(node: ts.Node): ts.Node { const source: string | undefined = (node as any).moduleSpecifier?.text; if (source?.startsWith('./') || source?.startsWith('../')) { + const newSource = source.replace(/\.js$/, extension); + if (ts.isImportDeclaration(node)) { return factory.updateImportDeclaration( node, node.decorators, node.modifiers, node.importClause, - ts.createStringLiteral(source + extension), + factory.createStringLiteral(newSource), node.assertClause, ); } @@ -52,7 +54,7 @@ export function addExtensionToImportPaths(config: { extension: string }) { node.modifiers, node.isTypeOnly, node.exportClause, - ts.createStringLiteral(source + extension), + factory.createStringLiteral(newSource), node.assertClause, ); } diff --git a/resources/diff-npm-package.ts b/resources/diff-npm-package.ts index 0ed971ac60..c61f54aa32 100644 --- a/resources/diff-npm-package.ts +++ b/resources/diff-npm-package.ts @@ -1,14 +1,18 @@ -import * as assert from 'node:assert'; -import * as fs from 'node:fs'; -import * as os from 'node:os'; -import * as path from 'node:path'; +import assert from 'node:assert'; +import childProcess from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; -import { exec, localRepoPath, writeGeneratedFile } from './utils'; +import { + git, + localRepoPath, + makeTmpDir, + npm, + writeGeneratedFile, +} from './utils.js'; const LOCAL = 'local'; -const tmpDir = path.join(os.tmpdir(), 'graphql-js-npm-diff'); -fs.rmSync(tmpDir, { recursive: true, force: true }); -fs.mkdirSync(tmpDir); +const { tmpDirPath } = makeTmpDir('graphql-js-npm-diff'); const args = process.argv.slice(2); let [fromRevision, toRevision] = args; @@ -27,7 +31,7 @@ console.log(`📦 Building NPM package for ${toRevision}...`); const toPackage = prepareNPMPackage(toRevision); console.log('➖➕ Generating diff...'); -const diff = exec(`npm diff --diff=${fromPackage} --diff=${toPackage}`); +const diff = npm().diff('--diff', fromPackage, '--diff', toPackage); if (diff === '') { console.log('No changes found!'); @@ -78,19 +82,19 @@ function generateReport(diffString: string): string { function prepareNPMPackage(revision: string): string { if (revision === LOCAL) { - exec('npm --quiet run build:npm', { cwd: localRepoPath() }); + npm({ cwd: localRepoPath(), quiet: true }).run('build:npm'); return localRepoPath('npmDist'); } // Returns the complete git hash for a given git revision reference. - const hash = exec(`git rev-parse "${revision}"`); + const hash = git().revParse(revision); assert(hash != null); - const repoDir = path.join(tmpDir, hash); + const repoDir = tmpDirPath(hash); fs.rmSync(repoDir, { recursive: true, force: true }); fs.mkdirSync(repoDir); - exec(`git archive "${hash}" | tar -xC "${repoDir}"`); - exec('npm --quiet ci --ignore-scripts', { cwd: repoDir }); - exec('npm --quiet run build:npm', { cwd: repoDir }); + childProcess.execSync(`git archive "${hash}" | tar -xC "${repoDir}"`); + npm({ cwd: repoDir, quiet: true }).ci('--ignore-scripts'); + npm({ cwd: repoDir, quiet: true }).run('build:npm'); return path.join(repoDir, 'npmDist'); } diff --git a/resources/gen-changelog.ts b/resources/gen-changelog.ts index 261b32d52a..baae5d15d4 100644 --- a/resources/gen-changelog.ts +++ b/resources/gen-changelog.ts @@ -1,4 +1,4 @@ -import { exec, readPackageJSON } from './utils'; +import { git, readPackageJSON } from './utils.js'; const packageJSON = readPackageJSON(); const labelsConfig: { [label: string]: { section: string; fold?: boolean } } = { @@ -53,36 +53,23 @@ if (repoURLMatch?.groups == null) { } const { githubOrg, githubRepo } = repoURLMatch.groups; -getChangeLog() - .then((changelog) => process.stdout.write(changelog)) - .catch((error) => { - console.error(error); - process.exit(1); - }); +process.stdout.write(await genChangeLog()); -function getChangeLog(): Promise { +async function genChangeLog(): Promise { const { version } = packageJSON; let tag: string | null = null; - let commitsList = exec(`git rev-list --reverse v${version}..`); - if (commitsList === '') { - const parentPackageJSON = exec('git cat-file blob HEAD~1:package.json'); + let commitsList = git().revList('--reverse', `v${version}..`); + if (commitsList.length === 0) { + const parentPackageJSON = git().catFile('blob', 'HEAD~1:package.json'); const parentVersion = JSON.parse(parentPackageJSON).version; - commitsList = exec(`git rev-list --reverse v${parentVersion}..HEAD~1`); + commitsList = git().revList('--reverse', `v${parentVersion}..HEAD~1`); tag = `v${version}`; } - const date = exec('git log -1 --format=%cd --date=short'); - return getCommitsInfo(commitsList.split('\n')) - .then((commitsInfo) => getPRsInfo(commitsInfoToPRs(commitsInfo))) - .then((prsInfo) => genChangeLog(tag, date, prsInfo)); -} + const allPRs = await getPRsInfo(commitsList); + const date = git().log('-1', '--format=%cd', '--date=short'); -function genChangeLog( - tag: string | null, - date: string, - allPRs: ReadonlyArray, -): string { const byLabel: { [label: string]: Array } = {}; const committersByLogin: { [login: string]: AuthorInfo } = {}; @@ -181,9 +168,9 @@ interface CommitInfo { }; } -async function batchCommitInfo( +async function batchCommitToPR( commits: ReadonlyArray, -): Promise> { +): Promise> { let commitsSubQuery = ''; for (const oid of commits) { commitsSubQuery += ` @@ -212,11 +199,12 @@ async function batchCommitInfo( } `); - const commitsInfo = []; + const prNumbers = []; for (const oid of commits) { - commitsInfo.push(response.repository['commit_' + oid]); + const commitInfo: CommitInfo = response.repository['commit_' + oid]; + prNumbers.push(commitInfoToPR(commitInfo)); } - return commitsInfo; + return prNumbers; } interface AuthorInfo { @@ -237,7 +225,9 @@ interface PRInfo { }; } -async function batchPRInfo(prNumbers: Array): Promise> { +async function batchPRInfo( + prNumbers: ReadonlyArray, +): Promise> { let prsSubQuery = ''; for (const number of prNumbers) { prsSubQuery += ` @@ -276,56 +266,47 @@ async function batchPRInfo(prNumbers: Array): Promise> { return prsInfo; } -function commitsInfoToPRs(commits: ReadonlyArray): Array { - const prNumbers = new Set(); - for (const commit of commits) { - const associatedPRs = commit.associatedPullRequests.nodes.filter( - (pr) => pr.repository.nameWithOwner === `${githubOrg}/${githubRepo}`, - ); - if (associatedPRs.length === 0) { - const match = / \(#(?[0-9]+)\)$/m.exec(commit.message); - if (match?.groups?.prNumber != null) { - prNumbers.add(parseInt(match.groups.prNumber, 10)); - continue; - } - throw new Error( - `Commit ${commit.oid} has no associated PR: ${commit.message}`, - ); - } - if (associatedPRs.length > 1) { - throw new Error( - `Commit ${commit.oid} is associated with multiple PRs: ${commit.message}`, - ); +function commitInfoToPR(commit: CommitInfo): number { + const associatedPRs = commit.associatedPullRequests.nodes.filter( + (pr) => pr.repository.nameWithOwner === `${githubOrg}/${githubRepo}`, + ); + if (associatedPRs.length === 0) { + const match = / \(#(?[0-9]+)\)$/m.exec(commit.message); + if (match?.groups?.prNumber != null) { + return parseInt(match.groups.prNumber, 10); } - - prNumbers.add(associatedPRs[0].number); + throw new Error( + `Commit ${commit.oid} has no associated PR: ${commit.message}`, + ); + } + if (associatedPRs.length > 1) { + throw new Error( + `Commit ${commit.oid} is associated with multiple PRs: ${commit.message}`, + ); } - return [...prNumbers.values()]; + return associatedPRs[0].number; } async function getPRsInfo( - prNumbers: ReadonlyArray, -): Promise> { - // Split pr into batches of 50 to prevent timeouts - const prInfoPromises = []; - for (let i = 0; i < prNumbers.length; i += 50) { - const batch = prNumbers.slice(i, i + 50); - prInfoPromises.push(batchPRInfo(batch)); - } + commits: ReadonlyArray, +): Promise> { + let prNumbers = await splitBatches(commits, batchCommitToPR); + prNumbers = Array.from(new Set(prNumbers)); // Remove duplicates - return (await Promise.all(prInfoPromises)).flat(); + return splitBatches(prNumbers, batchPRInfo); } -async function getCommitsInfo( - commits: ReadonlyArray, -): Promise> { - // Split commits into batches of 50 to prevent timeouts - const commitInfoPromises = []; - for (let i = 0; i < commits.length; i += 50) { - const batch = commits.slice(i, i + 50); - commitInfoPromises.push(batchCommitInfo(batch)); +// Split commits into batches of 50 to prevent timeouts +async function splitBatches( + array: ReadonlyArray, + batchFn: (array: ReadonlyArray) => Promise>, +): Promise> { + const promises = []; + for (let i = 0; i < array.length; i += 50) { + const batchItems = array.slice(i, i + 50); + promises.push(batchFn(batchItems)); } - return (await Promise.all(commitInfoPromises)).flat(); + return (await Promise.all(promises)).flat(); } diff --git a/resources/gen-version.ts b/resources/gen-version.ts index beb4225741..9a6ed637af 100644 --- a/resources/gen-version.ts +++ b/resources/gen-version.ts @@ -1,4 +1,4 @@ -import { readPackageJSON, writeGeneratedFile } from './utils'; +import { readPackageJSON, writeGeneratedFile } from './utils.js'; const { version } = readPackageJSON(); const versionMatch = /^(\d+)\.(\d+)\.(\d+)-?(.*)?$/.exec(version); diff --git a/resources/inline-invariant.ts b/resources/inline-invariant.ts index 541d8ee131..6352b52b79 100644 --- a/resources/inline-invariant.ts +++ b/resources/inline-invariant.ts @@ -1,4 +1,4 @@ -import * as ts from 'typescript'; +import ts from 'typescript'; /** * Eliminates function call to `invariant` if the condition is met. diff --git a/resources/integration-test.ts b/resources/integration-test.ts new file mode 100644 index 0000000000..47afc844d6 --- /dev/null +++ b/resources/integration-test.ts @@ -0,0 +1,41 @@ +import fs from 'node:fs'; + +import { describe, it } from 'mocha'; + +import { localRepoPath, makeTmpDir, npm, readPackageJSON } from './utils.js'; + +describe('Integration Tests', () => { + const { tmpDirPath } = makeTmpDir('graphql-js-integrationTmp'); + fs.cpSync(localRepoPath('integrationTests'), tmpDirPath(), { + recursive: true, + }); + + npm().run('build:npm'); + + const distDir = localRepoPath('npmDist'); + const archiveName = npm({ cwd: tmpDirPath(), quiet: true }).pack(distDir); + fs.renameSync(tmpDirPath(archiveName), tmpDirPath('graphql.tgz')); + + const esmDistDir = localRepoPath('npmEsmDist'); + const archiveEsmName = npm({ cwd: tmpDirPath(), quiet: true }).pack( + esmDistDir, + ); + fs.renameSync(tmpDirPath(archiveEsmName), tmpDirPath('graphql-esm.tgz')); + + npm().run('build:deno'); + + function testOnNodeProject(projectName: string) { + const projectPath = tmpDirPath(projectName); + const packageJSON = readPackageJSON(projectPath); + + it(packageJSON.description, () => { + // TODO: figure out a way to run it with --ignore-scripts + npm({ cwd: projectPath, quiet: true }).install(); + npm({ cwd: projectPath, quiet: true }).run('test'); + }).timeout(120000); + } + + testOnNodeProject('ts'); + testOnNodeProject('node'); + testOnNodeProject('webpack'); +}); diff --git a/resources/utils.ts b/resources/utils.ts index 1eb5b57f19..15984ed135 100644 --- a/resources/utils.ts +++ b/resources/utils.ts @@ -1,47 +1,141 @@ -import * as assert from 'node:assert'; -import * as childProcess from 'node:child_process'; -import * as fs from 'node:fs'; -import * as path from 'node:path'; +import assert from 'node:assert'; +import childProcess from 'node:child_process'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; -import * as prettier from 'prettier'; +import prettier from 'prettier'; +import ts from 'typescript'; export function localRepoPath(...paths: ReadonlyArray): string { - return path.join(__dirname, '..', ...paths); + const repoDir = new URL('..', import.meta.url).pathname; + return path.join(repoDir, ...paths); } -type ExecOptions = Parameters[1]; -export function exec(command: string, options?: ExecOptions): string { - const output = childProcess.execSync(command, { +interface MakeTmpDirReturn { + tmpDirPath: (...paths: ReadonlyArray) => string; +} + +export function makeTmpDir(name: string): MakeTmpDirReturn { + const tmpDir = path.join(os.tmpdir(), name); + fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.mkdirSync(tmpDir); + + return { + tmpDirPath: (...paths) => path.join(tmpDir, ...paths), + }; +} + +interface NPMOptions extends SpawnOptions { + quiet?: boolean; +} + +export function npm(options?: NPMOptions) { + const globalOptions = options?.quiet === true ? ['--quiet'] : []; + return { + run(...args: ReadonlyArray): void { + spawn('npm', [...globalOptions, 'run', ...args], options); + }, + install(...args: ReadonlyArray): void { + spawn('npm', [...globalOptions, 'install', ...args], options); + }, + ci(...args: ReadonlyArray): void { + spawn('npm', [...globalOptions, 'ci', ...args], options); + }, + exec(...args: ReadonlyArray): void { + spawn('npm', [...globalOptions, 'exec', ...args], options); + }, + pack(...args: ReadonlyArray): string { + return spawnOutput('npm', [...globalOptions, 'pack', ...args], options); + }, + diff(...args: ReadonlyArray): string { + return spawnOutput('npm', [...globalOptions, 'diff', ...args], options); + }, + }; +} + +interface GITOptions extends SpawnOptions { + quiet?: boolean; +} + +export function git(options?: GITOptions) { + const cmdOptions = options?.quiet === true ? ['--quiet'] : []; + return { + clone(...args: ReadonlyArray): void { + spawn('git', ['clone', ...cmdOptions, ...args], options); + }, + checkout(...args: ReadonlyArray): void { + spawn('git', ['checkout', ...cmdOptions, ...args], options); + }, + revParse(...args: ReadonlyArray): string { + return spawnOutput('git', ['rev-parse', ...cmdOptions, ...args], options); + }, + revList(...args: ReadonlyArray): Array { + const allArgs = ['rev-list', ...cmdOptions, ...args]; + return spawnOutput('git', allArgs, options).split('\n'); + }, + catFile(...args: ReadonlyArray): string { + return spawnOutput('git', ['cat-file', ...cmdOptions, ...args], options); + }, + log(...args: ReadonlyArray): string { + return spawnOutput('git', ['log', ...cmdOptions, ...args], options); + }, + }; +} + +interface SpawnOptions { + cwd?: string; + env?: typeof process.env; +} + +function spawnOutput( + command: string, + args: ReadonlyArray, + options?: SpawnOptions, +): string { + const result = childProcess.spawnSync(command, args, { maxBuffer: 10 * 1024 * 1024, // 10MB stdio: ['inherit', 'pipe', 'inherit'], encoding: 'utf-8', ...options, }); - return output.toString().trimEnd(); -} - -export function readdirRecursive( - dirPath: string, - opts: { ignoreDir?: RegExp } = {}, -): Array { - const { ignoreDir } = opts; - const result = []; - for (const dirent of fs.readdirSync(dirPath, { withFileTypes: true })) { - const name = dirent.name; - if (!dirent.isDirectory()) { - result.push(dirent.name); - continue; - } - if (ignoreDir?.test(name)) { - continue; + if (result.status !== 0) { + throw new Error(`Command failed: ${command} ${args.join(' ')}`); + } + + return result.stdout.toString().trimEnd(); +} + +function spawn( + command: string, + args: ReadonlyArray, + options?: SpawnOptions, +): void { + const result = childProcess.spawnSync(command, args, { + stdio: 'inherit', + ...options, + }); + if (result.status !== 0) { + throw new Error(`Command failed: ${command} ${args.join(' ')}`); + } +} + +function* readdirRecursive(dirPath: string): Generator<{ + name: string; + filepath: string; + stats: fs.Stats; +}> { + for (const name of fs.readdirSync(dirPath)) { + const filepath = path.join(dirPath, name); + const stats = fs.lstatSync(filepath); + + if (stats.isDirectory()) { + yield* readdirRecursive(filepath); + } else { + yield { name, filepath, stats }; } - const list = readdirRecursive(path.join(dirPath, name), opts).map((f) => - path.join(name, f), - ); - result.push(...list); } - return result.map((filepath) => './' + filepath); } export function showDirStats(dirPath: string): void { @@ -50,18 +144,14 @@ export function showDirStats(dirPath: string): void { } = {}; let totalSize = 0; - for (const filepath of readdirRecursive(dirPath)) { - const name = filepath.split(path.sep).at(-1); - assert(name != null); - const [base, ...splitExt] = name.split('.'); - const ext = splitExt.join('.'); + for (const { name, filepath, stats } of readdirRecursive(dirPath)) { + const ext = name.split('.').slice(1).join('.'); + const filetype = ext ? '*.' + ext : name; - const filetype = ext ? '*.' + ext : base; - fileTypes[filetype] = fileTypes[filetype] || { filepaths: [], size: 0 }; + fileTypes[filetype] = fileTypes[filetype] ?? { filepaths: [], size: 0 }; - const { size } = fs.lstatSync(path.join(dirPath, filepath)); - totalSize += size; - fileTypes[filetype].size += size; + totalSize += stats.size; + fileTypes[filetype].size += stats.size; fileTypes[filetype].filepaths.push(filepath); } @@ -72,7 +162,8 @@ export function showDirStats(dirPath: string): void { if (numFiles > 1) { stats.push([filetype + ' x' + numFiles, typeStats.size]); } else { - stats.push([typeStats.filepaths[0], typeStats.size]); + const relativePath = path.relative(dirPath, typeStats.filepaths[0]); + stats.push([relativePath, typeStats.size]); } } stats.sort((a, b) => b[1] - a[1]); @@ -108,6 +199,7 @@ export function writeGeneratedFile(filepath: string, body: string): void { } interface PackageJSON { + description: string; version: string; private?: boolean; repository?: { url?: string }; @@ -117,9 +209,44 @@ interface PackageJSON { types?: string; typesVersions: { [ranges: string]: { [path: string]: Array } }; devDependencies?: { [name: string]: string }; - publishConfig?: { tag?: string }; + publishConfig: { tag: string }; + + // TODO: remove after we drop CJS support + main?: string; + module?: string; } -export function readPackageJSON(): PackageJSON { - return JSON.parse(fs.readFileSync(localRepoPath('package.json'), 'utf-8')); +export function readPackageJSON( + dirPath: string = localRepoPath(), +): PackageJSON { + const filepath = path.join(dirPath, 'package.json'); + return JSON.parse(fs.readFileSync(filepath, 'utf-8')); +} + +export function readTSConfig(overrides?: any): ts.CompilerOptions { + const tsConfigPath = localRepoPath('tsconfig.json'); + + const { config: tsConfig, error: tsConfigError } = + ts.parseConfigFileTextToJson( + tsConfigPath, + fs.readFileSync(tsConfigPath, 'utf-8'), + ); + assert(tsConfigError === undefined, 'Fail to parse config: ' + tsConfigError); + assert( + tsConfig.compilerOptions, + '"tsconfig.json" should have `compilerOptions`', + ); + + const { options: tsOptions, errors: tsOptionsErrors } = + ts.convertCompilerOptionsFromJson( + { ...tsConfig.compilerOptions, ...overrides }, + process.cwd(), + ); + + assert( + tsOptionsErrors.length === 0, + 'Fail to parse options: ' + tsOptionsErrors, + ); + + return tsOptions; } diff --git a/src/__testUtils__/__tests__/dedent-test.ts b/src/__testUtils__/__tests__/dedent-test.ts index dfaf28e979..0469d2b75e 100644 --- a/src/__testUtils__/__tests__/dedent-test.ts +++ b/src/__testUtils__/__tests__/dedent-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent, dedentString } from '../dedent'; +import { dedent, dedentString } from '../dedent.js'; describe('dedentString', () => { it('removes indentation in typical usage', () => { diff --git a/src/__testUtils__/__tests__/expectEqualPromisesOrValues-test.ts b/src/__testUtils__/__tests__/expectEqualPromisesOrValues-test.ts index 71dcc0b337..52b23715b7 100644 --- a/src/__testUtils__/__tests__/expectEqualPromisesOrValues-test.ts +++ b/src/__testUtils__/__tests__/expectEqualPromisesOrValues-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectEqualPromisesOrValues } from '../expectEqualPromisesOrValues'; -import { expectPromise } from '../expectPromise'; +import { expectEqualPromisesOrValues } from '../expectEqualPromisesOrValues.js'; +import { expectPromise } from '../expectPromise.js'; describe('expectEqualPromisesOrValues', () => { it('throws when given unequal values', () => { diff --git a/src/__testUtils__/__tests__/expectMatchingValues-test.ts b/src/__testUtils__/__tests__/expectMatchingValues-test.ts index 8db828b723..aadd7cfb5a 100644 --- a/src/__testUtils__/__tests__/expectMatchingValues-test.ts +++ b/src/__testUtils__/__tests__/expectMatchingValues-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectEqualPromisesOrValues } from '../expectEqualPromisesOrValues'; +import { expectEqualPromisesOrValues } from '../expectEqualPromisesOrValues.js'; describe('expectMatchingValues', () => { it('throws when given unequal values', () => { diff --git a/src/__testUtils__/__tests__/expectPromise-test.ts b/src/__testUtils__/__tests__/expectPromise-test.ts index 240c027b9c..f54160ad50 100644 --- a/src/__testUtils__/__tests__/expectPromise-test.ts +++ b/src/__testUtils__/__tests__/expectPromise-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectPromise } from '../expectPromise'; +import { expectPromise } from '../expectPromise.js'; describe('expectPromise', () => { it('throws if passed a value', () => { diff --git a/src/__testUtils__/__tests__/genFuzzStrings-test.ts b/src/__testUtils__/__tests__/genFuzzStrings-test.ts index 516ed00fe7..d57a3746f5 100644 --- a/src/__testUtils__/__tests__/genFuzzStrings-test.ts +++ b/src/__testUtils__/__tests__/genFuzzStrings-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { genFuzzStrings } from '../genFuzzStrings'; +import { genFuzzStrings } from '../genFuzzStrings.js'; function expectFuzzStrings(options: { allowedChars: ReadonlyArray; diff --git a/src/__testUtils__/__tests__/inspectStr-test.ts b/src/__testUtils__/__tests__/inspectStr-test.ts index 9c3eba3a95..e601a87014 100644 --- a/src/__testUtils__/__tests__/inspectStr-test.ts +++ b/src/__testUtils__/__tests__/inspectStr-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { inspectStr } from '../inspectStr'; +import { inspectStr } from '../inspectStr.js'; describe('inspectStr', () => { it('handles null and undefined values', () => { diff --git a/src/__testUtils__/__tests__/resolveOnNextTick-test.ts b/src/__testUtils__/__tests__/resolveOnNextTick-test.ts index 0916b44a0c..96e618b2db 100644 --- a/src/__testUtils__/__tests__/resolveOnNextTick-test.ts +++ b/src/__testUtils__/__tests__/resolveOnNextTick-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { resolveOnNextTick } from '../resolveOnNextTick'; +import { resolveOnNextTick } from '../resolveOnNextTick.js'; describe('resolveOnNextTick', () => { it('resolves promise on the next tick', async () => { diff --git a/src/__testUtils__/expectEqualPromisesOrValues.ts b/src/__testUtils__/expectEqualPromisesOrValues.ts index d7e4adcece..6911fb32c0 100644 --- a/src/__testUtils__/expectEqualPromisesOrValues.ts +++ b/src/__testUtils__/expectEqualPromisesOrValues.ts @@ -1,9 +1,9 @@ import { assert } from 'chai'; -import { isPromise } from '../jsutils/isPromise'; -import type { PromiseOrValue } from '../jsutils/PromiseOrValue'; +import { isPromise } from '../jsutils/isPromise.js'; +import type { PromiseOrValue } from '../jsutils/PromiseOrValue.js'; -import { expectMatchingValues } from './expectMatchingValues'; +import { expectMatchingValues } from './expectMatchingValues.js'; export function expectEqualPromisesOrValues( items: ReadonlyArray>, diff --git a/src/__testUtils__/expectJSON.ts b/src/__testUtils__/expectJSON.ts index 64e2ba5dea..6de15ccacf 100644 --- a/src/__testUtils__/expectJSON.ts +++ b/src/__testUtils__/expectJSON.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; -import { isObjectLike } from '../jsutils/isObjectLike'; -import { mapValue } from '../jsutils/mapValue'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import { mapValue } from '../jsutils/mapValue.js'; /** * Deeply transforms an arbitrary value to a JSON-safe value by calling toJSON diff --git a/src/__testUtils__/expectMatchingValues.ts b/src/__testUtils__/expectMatchingValues.ts index 87f8fa7f62..7285a9b9df 100644 --- a/src/__testUtils__/expectMatchingValues.ts +++ b/src/__testUtils__/expectMatchingValues.ts @@ -1,4 +1,4 @@ -import { expectJSON } from './expectJSON'; +import { expectJSON } from './expectJSON.js'; export function expectMatchingValues(values: ReadonlyArray): T { const [firstValue, ...remainingValues] = values; diff --git a/src/__testUtils__/expectPromise.ts b/src/__testUtils__/expectPromise.ts index 59315ed7d0..b374faea3c 100644 --- a/src/__testUtils__/expectPromise.ts +++ b/src/__testUtils__/expectPromise.ts @@ -1,7 +1,7 @@ import { assert, expect } from 'chai'; -import { inspect } from '../jsutils/inspect'; -import { isPromise } from '../jsutils/isPromise'; +import { inspect } from '../jsutils/inspect.js'; +import { isPromise } from '../jsutils/isPromise.js'; export function expectPromise(maybePromise: unknown) { assert( diff --git a/src/__testUtils__/inspectStr.ts b/src/__testUtils__/inspectStr.ts index 721d6e673a..74c40e3145 100644 --- a/src/__testUtils__/inspectStr.ts +++ b/src/__testUtils__/inspectStr.ts @@ -1,4 +1,4 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; /** * Special inspect function to produce readable string literal for error messages in tests diff --git a/src/__tests__/starWarsIntrospection-test.ts b/src/__tests__/starWarsIntrospection-test.ts index d637787c4a..224c506c19 100644 --- a/src/__tests__/starWarsIntrospection-test.ts +++ b/src/__tests__/starWarsIntrospection-test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { graphqlSync } from '../graphql'; +import { graphqlSync } from '../graphql.js'; -import { StarWarsSchema } from './starWarsSchema'; +import { StarWarsSchema } from './starWarsSchema.js'; function queryStarWars(source: string) { const result = graphqlSync({ schema: StarWarsSchema, source }); diff --git a/src/__tests__/starWarsQuery-test.ts b/src/__tests__/starWarsQuery-test.ts index 2662079d01..ecc69b2b02 100644 --- a/src/__tests__/starWarsQuery-test.ts +++ b/src/__tests__/starWarsQuery-test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../__testUtils__/expectJSON'; +import { expectJSON } from '../__testUtils__/expectJSON.js'; -import { graphql } from '../graphql'; +import { graphql } from '../graphql.js'; -import { StarWarsSchema as schema } from './starWarsSchema'; +import { StarWarsSchema as schema } from './starWarsSchema.js'; describe('Star Wars Query Tests', () => { describe('Basic Queries', () => { diff --git a/src/__tests__/starWarsSchema.ts b/src/__tests__/starWarsSchema.ts index c646c8aea3..f42203c37d 100644 --- a/src/__tests__/starWarsSchema.ts +++ b/src/__tests__/starWarsSchema.ts @@ -4,11 +4,11 @@ import { GraphQLList, GraphQLNonNull, GraphQLObjectType, -} from '../type/definition'; -import { GraphQLString } from '../type/scalars'; -import { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import { GraphQLString } from '../type/scalars.js'; +import { GraphQLSchema } from '../type/schema.js'; -import { getDroid, getFriends, getHero, getHuman } from './starWarsData'; +import { getDroid, getFriends, getHero, getHuman } from './starWarsData.js'; /** * This is designed to be an end-to-end test, demonstrating diff --git a/src/__tests__/starWarsValidation-test.ts b/src/__tests__/starWarsValidation-test.ts index 65e6c7f666..afd2e7ee3d 100644 --- a/src/__tests__/starWarsValidation-test.ts +++ b/src/__tests__/starWarsValidation-test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../language/parser'; -import { Source } from '../language/source'; +import { parse } from '../language/parser.js'; +import { Source } from '../language/source.js'; -import { validate } from '../validation/validate'; +import { validate } from '../validation/validate.js'; -import { StarWarsSchema } from './starWarsSchema'; +import { StarWarsSchema } from './starWarsSchema.js'; /** * Helper function to test a query and the expected response. diff --git a/src/__tests__/version-test.ts b/src/__tests__/version-test.ts index 3680512de8..eee4250d1c 100644 --- a/src/__tests__/version-test.ts +++ b/src/__tests__/version-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { version, versionInfo } from '../version'; +import { version, versionInfo } from '../version.js'; describe('Version', () => { it('versionInfo', () => { diff --git a/src/error/GraphQLError.ts b/src/error/GraphQLError.ts index 7ae1cfd935..d4c2508b6d 100644 --- a/src/error/GraphQLError.ts +++ b/src/error/GraphQLError.ts @@ -1,11 +1,14 @@ -import { isObjectLike } from '../jsutils/isObjectLike'; -import type { Maybe } from '../jsutils/Maybe'; - -import type { ASTNode, Location } from '../language/ast'; -import type { SourceLocation } from '../language/location'; -import { getLocation } from '../language/location'; -import { printLocation, printSourceLocation } from '../language/printLocation'; -import type { Source } from '../language/source'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import type { Maybe } from '../jsutils/Maybe.js'; + +import type { ASTNode, Location } from '../language/ast.js'; +import type { SourceLocation } from '../language/location.js'; +import { getLocation } from '../language/location.js'; +import { + printLocation, + printSourceLocation, +} from '../language/printLocation.js'; +import type { Source } from '../language/source.js'; /** * Custom extensions diff --git a/src/error/__tests__/GraphQLError-test.ts b/src/error/__tests__/GraphQLError-test.ts index 95fe196487..7cfda2a5a3 100644 --- a/src/error/__tests__/GraphQLError-test.ts +++ b/src/error/__tests__/GraphQLError-test.ts @@ -1,13 +1,13 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { Kind } from '../../language/kinds'; -import { parse } from '../../language/parser'; -import { Source } from '../../language/source'; +import { Kind } from '../../language/kinds.js'; +import { parse } from '../../language/parser.js'; +import { Source } from '../../language/source.js'; -import { GraphQLError } from '../GraphQLError'; +import { GraphQLError } from '../GraphQLError.js'; const source = new Source(dedent` { diff --git a/src/error/__tests__/locatedError-test.ts b/src/error/__tests__/locatedError-test.ts index e270d09a6d..c60e1c5873 100644 --- a/src/error/__tests__/locatedError-test.ts +++ b/src/error/__tests__/locatedError-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { GraphQLError } from '../GraphQLError'; -import { locatedError } from '../locatedError'; +import { GraphQLError } from '../GraphQLError.js'; +import { locatedError } from '../locatedError.js'; describe('locatedError', () => { it('passes GraphQLError through', () => { diff --git a/src/error/index.ts b/src/error/index.ts index 0d51428ed3..ed9e24d241 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,10 +1,10 @@ -export { GraphQLError } from './GraphQLError'; +export { GraphQLError } from './GraphQLError.js'; export type { GraphQLErrorOptions, GraphQLFormattedError, GraphQLErrorExtensions, -} from './GraphQLError'; +} from './GraphQLError.js'; -export { syntaxError } from './syntaxError'; +export { syntaxError } from './syntaxError.js'; -export { locatedError } from './locatedError'; +export { locatedError } from './locatedError.js'; diff --git a/src/error/locatedError.ts b/src/error/locatedError.ts index bafb9da9b6..e21b86a1b1 100644 --- a/src/error/locatedError.ts +++ b/src/error/locatedError.ts @@ -1,9 +1,9 @@ -import type { Maybe } from '../jsutils/Maybe'; -import { toError } from '../jsutils/toError'; +import type { Maybe } from '../jsutils/Maybe.js'; +import { toError } from '../jsutils/toError.js'; -import type { ASTNode } from '../language/ast'; +import type { ASTNode } from '../language/ast.js'; -import { GraphQLError } from './GraphQLError'; +import { GraphQLError } from './GraphQLError.js'; /** * Given an arbitrary value, presumably thrown while attempting to execute a diff --git a/src/error/syntaxError.ts b/src/error/syntaxError.ts index 386ece72da..af8e626207 100644 --- a/src/error/syntaxError.ts +++ b/src/error/syntaxError.ts @@ -1,6 +1,6 @@ -import type { Source } from '../language/source'; +import type { Source } from '../language/source.js'; -import { GraphQLError } from './GraphQLError'; +import { GraphQLError } from './GraphQLError.js'; /** * Produces a GraphQLError representing a syntax error, containing useful diff --git a/src/execution/__tests__/abstract-test.ts b/src/execution/__tests__/abstract-test.ts index 5253d0d9e0..5e184880a4 100644 --- a/src/execution/__tests__/abstract-test.ts +++ b/src/execution/__tests__/abstract-test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; import { assertInterfaceType, @@ -11,13 +11,13 @@ import { GraphQLList, GraphQLObjectType, GraphQLUnionType, -} from '../../type/definition'; -import { GraphQLBoolean, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import { GraphQLBoolean, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { execute, executeSync } from '../execute'; +import { execute, executeSync } from '../execute.js'; async function executeQuery(args: { schema: GraphQLSchema; diff --git a/src/execution/__tests__/defer-test.ts b/src/execution/__tests__/defer-test.ts new file mode 100644 index 0000000000..95c54479c2 --- /dev/null +++ b/src/execution/__tests__/defer-test.ts @@ -0,0 +1,701 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; + +import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { expectPromise } from '../../__testUtils__/expectPromise.js'; +import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; + +import type { DocumentNode } from '../../language/ast.js'; +import { parse } from '../../language/parser.js'; + +import { + GraphQLList, + GraphQLNonNull, + GraphQLObjectType, +} from '../../type/definition.js'; +import { GraphQLID, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; + +import type { + InitialIncrementalExecutionResult, + SubsequentIncrementalExecutionResult, +} from '../execute.js'; +import { execute, experimentalExecuteIncrementally } from '../execute.js'; + +const friendType = new GraphQLObjectType({ + fields: { + id: { type: GraphQLID }, + name: { type: GraphQLString }, + }, + name: 'Friend', +}); + +const friends = [ + { name: 'Han', id: 2 }, + { name: 'Leia', id: 3 }, + { name: 'C-3PO', id: 4 }, +]; + +const heroType = new GraphQLObjectType({ + fields: { + id: { type: GraphQLID }, + name: { type: GraphQLString }, + slowField: { + type: GraphQLString, + resolve: async () => { + await resolveOnNextTick(); + return 'slow'; + }, + }, + errorField: { + type: GraphQLString, + resolve: () => { + throw new Error('bad'); + }, + }, + nonNullErrorField: { + type: new GraphQLNonNull(GraphQLString), + resolve: () => null, + }, + promiseNonNullErrorField: { + type: new GraphQLNonNull(GraphQLString), + resolve: () => Promise.resolve(null), + }, + friends: { + type: new GraphQLList(friendType), + resolve: () => friends, + }, + }, + name: 'Hero', +}); + +const hero = { name: 'Luke', id: 1 }; + +const query = new GraphQLObjectType({ + fields: { + hero: { + type: heroType, + resolve: () => hero, + }, + }, + name: 'Query', +}); + +const schema = new GraphQLSchema({ query }); + +async function complete(document: DocumentNode) { + const result = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: {}, + }); + + if ('initialResult' in result) { + const results: Array< + InitialIncrementalExecutionResult | SubsequentIncrementalExecutionResult + > = [result.initialResult]; + for await (const patch of result.subsequentResults) { + results.push(patch); + } + return results; + } + return result; +} + +describe('Execute: defer directive', () => { + it('Can defer fragments containing scalar types', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + id + name + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + id: '1', + name: 'Luke', + }, + path: ['hero'], + }, + ], + hasNext: false, + }, + ]); + }); + it('Can disable defer using if argument', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer(if: false) + } + } + fragment NameFragment on Hero { + name + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual({ + data: { + hero: { + id: '1', + name: 'Luke', + }, + }, + }); + }); + it('Does not disable defer with null if argument', async () => { + const document = parse(` + query HeroNameQuery($shouldDefer: Boolean) { + hero { + id + ...NameFragment @defer(if: $shouldDefer) + } + } + fragment NameFragment on Hero { + name + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + hasNext: true, + }, + { + incremental: [ + { + data: { name: 'Luke' }, + path: ['hero'], + }, + ], + hasNext: false, + }, + ]); + }); + it('Can defer fragments on the top level Query field', async () => { + const document = parse(` + query HeroNameQuery { + ...QueryFragment @defer(label: "DeferQuery") + } + fragment QueryFragment on Query { + hero { + id + } + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: {}, + hasNext: true, + }, + { + incremental: [ + { + data: { + hero: { + id: '1', + }, + }, + path: [], + label: 'DeferQuery', + }, + ], + hasNext: false, + }, + ]); + }); + it('Can defer fragments with errors on the top level Query field', async () => { + const document = parse(` + query HeroNameQuery { + ...QueryFragment @defer(label: "DeferQuery") + } + fragment QueryFragment on Query { + hero { + errorField + } + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: {}, + hasNext: true, + }, + { + incremental: [ + { + data: { + hero: { + errorField: null, + }, + }, + errors: [ + { + message: 'bad', + locations: [{ line: 7, column: 11 }], + path: ['hero', 'errorField'], + }, + ], + path: [], + label: 'DeferQuery', + }, + ], + hasNext: false, + }, + ]); + }); + it('Can defer a fragment within an already deferred fragment', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...TopFragment @defer(label: "DeferTop") + } + } + fragment TopFragment on Hero { + name + ...NestedFragment @defer(label: "DeferNested") + } + fragment NestedFragment on Hero { + friends { + name + } + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }], + }, + path: ['hero'], + label: 'DeferNested', + }, + { + data: { + name: 'Luke', + }, + path: ['hero'], + label: 'DeferTop', + }, + ], + hasNext: false, + }, + ]); + }); + it('Can defer a fragment that is also not deferred, deferred fragment is first', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...TopFragment @defer(label: "DeferTop") + ...TopFragment + } + } + fragment TopFragment on Hero { + name + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + name: 'Luke', + }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + name: 'Luke', + }, + path: ['hero'], + label: 'DeferTop', + }, + ], + hasNext: false, + }, + ]); + }); + it('Can defer a fragment that is also not deferred, non-deferred fragment is first', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...TopFragment + ...TopFragment @defer(label: "DeferTop") + } + } + fragment TopFragment on Hero { + name + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + name: 'Luke', + }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + name: 'Luke', + }, + path: ['hero'], + label: 'DeferTop', + }, + ], + hasNext: false, + }, + ]); + }); + + it('Can defer an inline fragment', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ... on Hero @defer(label: "InlineDeferred") { + name + } + } + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + hasNext: true, + }, + { + incremental: [ + { data: { name: 'Luke' }, path: ['hero'], label: 'InlineDeferred' }, + ], + hasNext: false, + }, + ]); + }); + it('Handles errors thrown in deferred fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + errorField + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + hasNext: true, + }, + { + incremental: [ + { + data: { errorField: null }, + path: ['hero'], + errors: [ + { + message: 'bad', + locations: [{ line: 9, column: 9 }], + path: ['hero', 'errorField'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles non-nullable errors thrown in deferred fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + nonNullErrorField + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + hasNext: true, + }, + { + incremental: [ + { + data: null, + path: ['hero'], + errors: [ + { + message: + 'Cannot return null for non-nullable field Hero.nonNullErrorField.', + locations: [{ line: 9, column: 9 }], + path: ['hero', 'nonNullErrorField'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles non-nullable errors thrown outside deferred fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + nonNullErrorField + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + id + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual({ + errors: [ + { + message: + 'Cannot return null for non-nullable field Hero.nonNullErrorField.', + locations: [ + { + line: 4, + column: 11, + }, + ], + path: ['hero', 'nonNullErrorField'], + }, + ], + data: { + hero: null, + }, + }); + }); + it('Handles async non-nullable errors thrown in deferred fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + promiseNonNullErrorField + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + hasNext: true, + }, + { + incremental: [ + { + data: null, + path: ['hero'], + errors: [ + { + message: + 'Cannot return null for non-nullable field Hero.promiseNonNullErrorField.', + locations: [{ line: 9, column: 9 }], + path: ['hero', 'promiseNonNullErrorField'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Returns payloads in correct order', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + slowField + friends { + ...NestedFragment @defer + } + } + fragment NestedFragment on Friend { + name + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { id: '1' }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { slowField: 'slow', friends: [{}, {}, {}] }, + path: ['hero'], + }, + ], + hasNext: true, + }, + { + incremental: [ + { data: { name: 'Han' }, path: ['hero', 'friends', 0] }, + { data: { name: 'Leia' }, path: ['hero', 'friends', 1] }, + { data: { name: 'C-3PO' }, path: ['hero', 'friends', 2] }, + ], + hasNext: false, + }, + ]); + }); + it('Returns payloads from synchronous data in correct order', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + name + friends { + ...NestedFragment @defer + } + } + fragment NestedFragment on Friend { + name + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { id: '1' }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + name: 'Luke', + friends: [{}, {}, {}], + }, + path: ['hero'], + }, + ], + hasNext: true, + }, + { + incremental: [ + { data: { name: 'Han' }, path: ['hero', 'friends', 0] }, + { data: { name: 'Leia' }, path: ['hero', 'friends', 1] }, + { data: { name: 'C-3PO' }, path: ['hero', 'friends', 2] }, + ], + hasNext: false, + }, + ]); + }); + + it('original execute function throws error if anything is deferred and everything else is sync', () => { + const doc = ` + query Deferred { + ... @defer { hero { id } } + } + `; + expect(() => + execute({ + schema, + document: parse(doc), + rootValue: {}, + }), + ).to.throw( + 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)', + ); + }); + + it('original execute function resolves to error if anything is deferred and something else is async', async () => { + const doc = ` + query Deferred { + hero { slowField } + ... @defer { hero { id } } + } + `; + expectJSON( + await expectPromise( + execute({ + schema, + document: parse(doc), + rootValue: {}, + }), + ).toResolve(), + ).toDeepEqual({ + errors: [ + { + message: + 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)', + }, + ], + }); + }); +}); diff --git a/src/execution/__tests__/directives-test.ts b/src/execution/__tests__/directives-test.ts index d94c0f2b8a..2a89f07b6f 100644 --- a/src/execution/__tests__/directives-test.ts +++ b/src/execution/__tests__/directives-test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { GraphQLObjectType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { executeSync } from '../execute'; +import { executeSync } from '../execute.js'; const schema = new GraphQLSchema({ query: new GraphQLObjectType({ diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index c4912d84e4..838eeedf07 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1,13 +1,13 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; -import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { Kind } from '../../language/kinds'; -import { parse } from '../../language/parser'; +import { Kind } from '../../language/kinds.js'; +import { parse } from '../../language/parser.js'; import { GraphQLInterfaceType, @@ -16,11 +16,15 @@ import { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../../type/definition'; -import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import { + GraphQLBoolean, + GraphQLInt, + GraphQLString, +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { execute, executeSync } from '../execute'; +import { execute, executeSync } from '../execute.js'; describe('Execute: Handles basic execution tasks', () => { it('executes arbitrary code', async () => { diff --git a/src/execution/__tests__/flattenAsyncIterable-test.ts b/src/execution/__tests__/flattenAsyncIterable-test.ts new file mode 100644 index 0000000000..d508f543f9 --- /dev/null +++ b/src/execution/__tests__/flattenAsyncIterable-test.ts @@ -0,0 +1,149 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; + +import { flattenAsyncIterable } from '../flattenAsyncIterable.js'; + +describe('flattenAsyncIterable', () => { + it('flatten nested async generators', async () => { + async function* source() { + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(1.1); + yield await Promise.resolve(1.2); + })(), + ); + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(2.1); + yield await Promise.resolve(2.2); + })(), + ); + } + + const doubles = flattenAsyncIterable(source()); + + const result = []; + for await (const x of doubles) { + result.push(x); + } + expect(result).to.deep.equal([1.1, 1.2, 2.1, 2.2]); + }); + + it('allows returning early from a nested async generator', async () => { + async function* source() { + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(1.1); + yield await Promise.resolve(1.2); + })(), + ); + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(2.1); /* c8 ignore start */ + // Not reachable, early return + yield await Promise.resolve(2.2); + })(), + ); + // Not reachable, early return + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(3.1); + yield await Promise.resolve(3.2); + })(), + ); + } + /* c8 ignore stop */ + + const doubles = flattenAsyncIterable(source()); + + expect(await doubles.next()).to.deep.equal({ value: 1.1, done: false }); + expect(await doubles.next()).to.deep.equal({ value: 1.2, done: false }); + expect(await doubles.next()).to.deep.equal({ value: 2.1, done: false }); + + // Early return + expect(await doubles.return()).to.deep.equal({ + value: undefined, + done: true, + }); + + // Subsequent next calls + expect(await doubles.next()).to.deep.equal({ + value: undefined, + done: true, + }); + expect(await doubles.next()).to.deep.equal({ + value: undefined, + done: true, + }); + }); + + it('allows throwing errors from a nested async generator', async () => { + async function* source() { + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(1.1); + yield await Promise.resolve(1.2); + })(), + ); + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(2.1); /* c8 ignore start */ + // Not reachable, early return + yield await Promise.resolve(2.2); + })(), + ); + // Not reachable, early return + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(3.1); + yield await Promise.resolve(3.2); + })(), + ); + } + /* c8 ignore stop */ + + const doubles = flattenAsyncIterable(source()); + + expect(await doubles.next()).to.deep.equal({ value: 1.1, done: false }); + expect(await doubles.next()).to.deep.equal({ value: 1.2, done: false }); + expect(await doubles.next()).to.deep.equal({ value: 2.1, done: false }); + + // Throw error + let caughtError; + try { + await doubles.throw('ouch'); /* c8 ignore start */ + } catch (e) { + caughtError = e; + } + expect(caughtError).to.equal('ouch'); + }); + it('completely yields sub-iterables even when next() called in parallel', async () => { + async function* source() { + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(1.1); + yield await Promise.resolve(1.2); + })(), + ); + yield await Promise.resolve( + (async function* nested(): AsyncGenerator { + yield await Promise.resolve(2.1); + yield await Promise.resolve(2.2); + })(), + ); + } + + const result = flattenAsyncIterable(source()); + + const promise1 = result.next(); + const promise2 = result.next(); + expect(await promise1).to.deep.equal({ value: 1.1, done: false }); + expect(await promise2).to.deep.equal({ value: 1.2, done: false }); + expect(await result.next()).to.deep.equal({ value: 2.1, done: false }); + expect(await result.next()).to.deep.equal({ value: 2.2, done: false }); + expect(await result.next()).to.deep.equal({ + value: undefined, + done: true, + }); + }); +}); diff --git a/src/execution/__tests__/lists-test.ts b/src/execution/__tests__/lists-test.ts index 3fdd77ab56..32f954c5e3 100644 --- a/src/execution/__tests__/lists-test.ts +++ b/src/execution/__tests__/lists-test.ts @@ -1,21 +1,21 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import type { PromiseOrValue } from '../../jsutils/PromiseOrValue'; +import type { PromiseOrValue } from '../../jsutils/PromiseOrValue.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import type { GraphQLFieldResolver } from '../../type/definition'; -import { GraphQLList, GraphQLObjectType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import type { GraphQLFieldResolver } from '../../type/definition.js'; +import { GraphQLList, GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import type { ExecutionResult } from '../execute'; -import { execute, executeSync } from '../execute'; +import type { ExecutionResult } from '../execute.js'; +import { execute, executeSync } from '../execute.js'; describe('Execute: Accepts any iterable as list value', () => { function complete(rootValue: unknown) { diff --git a/src/execution/__tests__/mapAsyncIterable-test.ts b/src/execution/__tests__/mapAsyncIterable-test.ts index d70714fa74..0b26ab7327 100644 --- a/src/execution/__tests__/mapAsyncIterable-test.ts +++ b/src/execution/__tests__/mapAsyncIterable-test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectPromise } from '../../__testUtils__/expectPromise'; +import { expectPromise } from '../../__testUtils__/expectPromise.js'; -import { mapAsyncIterable } from '../mapAsyncIterable'; +import { mapAsyncIterable } from '../mapAsyncIterable.js'; /* eslint-disable @typescript-eslint/require-await */ describe('mapAsyncIterable', () => { diff --git a/src/execution/__tests__/mutations-test.ts b/src/execution/__tests__/mutations-test.ts index 0f0ad1cbf8..fa533c75ea 100644 --- a/src/execution/__tests__/mutations-test.ts +++ b/src/execution/__tests__/mutations-test.ts @@ -1,16 +1,20 @@ -import { expect } from 'chai'; +import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; -import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { GraphQLObjectType } from '../../type/definition'; -import { GraphQLInt } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLInt } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { execute, executeSync } from '../execute'; +import { + execute, + executeSync, + experimentalExecuteIncrementally, +} from '../execute.js'; class NumberHolder { theNumber: number; @@ -50,6 +54,13 @@ class Root { const numberHolderType = new GraphQLObjectType({ fields: { theNumber: { type: GraphQLInt }, + promiseToGetTheNumber: { + type: GraphQLInt, + resolve: async (root) => { + await new Promise((resolve) => setTimeout(resolve, 0)); + return root.theNumber; + }, + }, }, name: 'NumberHolder', }); @@ -191,4 +202,132 @@ describe('Execute: Handles mutation execution ordering', () => { ], }); }); + it('Mutation fields with @defer do not block next mutation', async () => { + const document = parse(` + mutation M { + first: promiseToChangeTheNumber(newNumber: 1) { + ...DeferFragment @defer(label: "defer-label") + }, + second: immediatelyChangeTheNumber(newNumber: 2) { + theNumber + } + } + fragment DeferFragment on NumberHolder { + promiseToGetTheNumber + } + `); + + const rootValue = new Root(6); + const mutationResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue, + }); + const patches = []; + + assert('initialResult' in mutationResult); + patches.push(mutationResult.initialResult); + for await (const patch of mutationResult.subsequentResults) { + patches.push(patch); + } + + expect(patches).to.deep.equal([ + { + data: { + first: {}, + second: { theNumber: 2 }, + }, + hasNext: true, + }, + { + incremental: [ + { + label: 'defer-label', + path: ['first'], + data: { + promiseToGetTheNumber: 2, + }, + }, + ], + hasNext: false, + }, + ]); + }); + it('Mutation inside of a fragment', async () => { + const document = parse(` + mutation M { + ...MutationFragment + second: immediatelyChangeTheNumber(newNumber: 2) { + theNumber + } + } + fragment MutationFragment on Mutation { + first: promiseToChangeTheNumber(newNumber: 1) { + theNumber + }, + } + `); + + const rootValue = new Root(6); + const mutationResult = await execute({ schema, document, rootValue }); + + expect(mutationResult).to.deep.equal({ + data: { + first: { theNumber: 1 }, + second: { theNumber: 2 }, + }, + }); + }); + it('Mutation with @defer is not executed serially', async () => { + const document = parse(` + mutation M { + ...MutationFragment @defer(label: "defer-label") + second: immediatelyChangeTheNumber(newNumber: 2) { + theNumber + } + } + fragment MutationFragment on Mutation { + first: promiseToChangeTheNumber(newNumber: 1) { + theNumber + }, + } + `); + + const rootValue = new Root(6); + const mutationResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue, + }); + const patches = []; + + assert('initialResult' in mutationResult); + patches.push(mutationResult.initialResult); + for await (const patch of mutationResult.subsequentResults) { + patches.push(patch); + } + + expect(patches).to.deep.equal([ + { + data: { + second: { theNumber: 2 }, + }, + hasNext: true, + }, + { + incremental: [ + { + label: 'defer-label', + path: [], + data: { + first: { + theNumber: 1, + }, + }, + }, + ], + hasNext: false, + }, + ]); + }); }); diff --git a/src/execution/__tests__/nonnull-test.ts b/src/execution/__tests__/nonnull-test.ts index 427f2a64d6..a136a2a4f0 100644 --- a/src/execution/__tests__/nonnull-test.ts +++ b/src/execution/__tests__/nonnull-test.ts @@ -1,18 +1,20 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { parse } from '../../language/parser'; +import type { PromiseOrValue } from '../../jsutils/PromiseOrValue.js'; -import { GraphQLNonNull, GraphQLObjectType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { parse } from '../../language/parser.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { GraphQLNonNull, GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import type { ExecutionResult } from '../execute'; -import { execute, executeSync } from '../execute'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; + +import type { ExecutionResult } from '../execute.js'; +import { execute, executeSync } from '../execute.js'; const syncError = new Error('sync'); const syncNonNullError = new Error('syncNonNull'); @@ -109,7 +111,7 @@ const schema = buildSchema(` function executeQuery( query: string, rootValue: unknown, -): ExecutionResult | Promise { +): PromiseOrValue { return execute({ schema, document: parse(query), rootValue }); } diff --git a/src/execution/__tests__/resolve-test.ts b/src/execution/__tests__/resolve-test.ts index a34da196c6..b13a4266f0 100644 --- a/src/execution/__tests__/resolve-test.ts +++ b/src/execution/__tests__/resolve-test.ts @@ -1,14 +1,14 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import type { GraphQLFieldConfig } from '../../type/definition'; -import { GraphQLObjectType } from '../../type/definition'; -import { GraphQLInt, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import type { GraphQLFieldConfig } from '../../type/definition.js'; +import { GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLInt, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { executeSync } from '../execute'; +import { executeSync } from '../execute.js'; describe('Execute: resolve function', () => { function testSchema(testField: GraphQLFieldConfig) { diff --git a/src/execution/__tests__/schema-test.ts b/src/execution/__tests__/schema-test.ts index f9b4e47439..3e94ecf59a 100644 --- a/src/execution/__tests__/schema-test.ts +++ b/src/execution/__tests__/schema-test.ts @@ -1,22 +1,22 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; import { GraphQLList, GraphQLNonNull, GraphQLObjectType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { GraphQLBoolean, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { executeSync } from '../execute'; +import { executeSync } from '../execute.js'; describe('Execute: Handles execution with a complex schema', () => { it('executes using a schema', () => { diff --git a/src/execution/__tests__/simplePubSub-test.ts b/src/execution/__tests__/simplePubSub-test.ts index e919d770e3..48d45afbc0 100644 --- a/src/execution/__tests__/simplePubSub-test.ts +++ b/src/execution/__tests__/simplePubSub-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { SimplePubSub } from './simplePubSub'; +import { SimplePubSub } from './simplePubSub.js'; describe('SimplePubSub', () => { it('subscribe async-iterator mock', async () => { diff --git a/src/execution/__tests__/stream-test.ts b/src/execution/__tests__/stream-test.ts new file mode 100644 index 0000000000..8378d320e2 --- /dev/null +++ b/src/execution/__tests__/stream-test.ts @@ -0,0 +1,1744 @@ +import { assert } from 'chai'; +import { describe, it } from 'mocha'; + +import { expectJSON } from '../../__testUtils__/expectJSON.js'; + +import type { PromiseOrValue } from '../../jsutils/PromiseOrValue.js'; + +import type { DocumentNode } from '../../language/ast.js'; +import { parse } from '../../language/parser.js'; + +import { + GraphQLList, + GraphQLNonNull, + GraphQLObjectType, +} from '../../type/definition.js'; +import { GraphQLID, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; + +import type { + InitialIncrementalExecutionResult, + SubsequentIncrementalExecutionResult, +} from '../execute.js'; +import { experimentalExecuteIncrementally } from '../execute.js'; + +const friendType = new GraphQLObjectType({ + fields: { + id: { type: GraphQLID }, + name: { type: GraphQLString }, + nonNullName: { type: new GraphQLNonNull(GraphQLString) }, + }, + name: 'Friend', +}); + +const friends = [ + { name: 'Luke', id: 1 }, + { name: 'Han', id: 2 }, + { name: 'Leia', id: 3 }, +]; + +const query = new GraphQLObjectType({ + fields: { + scalarList: { + type: new GraphQLList(GraphQLString), + }, + scalarListList: { + type: new GraphQLList(new GraphQLList(GraphQLString)), + }, + friendList: { + type: new GraphQLList(friendType), + }, + nonNullFriendList: { + type: new GraphQLList(new GraphQLNonNull(friendType)), + }, + nestedObject: { + type: new GraphQLObjectType({ + name: 'NestedObject', + fields: { + scalarField: { + type: GraphQLString, + }, + nonNullScalarField: { + type: new GraphQLNonNull(GraphQLString), + }, + nestedFriendList: { type: new GraphQLList(friendType) }, + deeperNestedObject: { + type: new GraphQLObjectType({ + name: 'DeeperNestedObject', + fields: { + nonNullScalarField: { + type: new GraphQLNonNull(GraphQLString), + }, + deeperNestedFriendList: { type: new GraphQLList(friendType) }, + }, + }), + }, + }, + }), + }, + }, + name: 'Query', +}); + +const schema = new GraphQLSchema({ query }); + +async function complete(document: DocumentNode, rootValue: unknown = {}) { + const result = await experimentalExecuteIncrementally({ + schema, + document, + rootValue, + }); + + if ('initialResult' in result) { + const results: Array< + InitialIncrementalExecutionResult | SubsequentIncrementalExecutionResult + > = [result.initialResult]; + for await (const patch of result.subsequentResults) { + results.push(patch); + } + return results; + } + return result; +} + +async function completeAsync( + document: DocumentNode, + numCalls: number, + rootValue: unknown = {}, +) { + const result = await experimentalExecuteIncrementally({ + schema, + document, + rootValue, + }); + + assert('initialResult' in result); + + const iterator = result.subsequentResults[Symbol.asyncIterator](); + + const promises: Array< + PromiseOrValue< + IteratorResult< + InitialIncrementalExecutionResult | SubsequentIncrementalExecutionResult + > + > + > = [{ done: false, value: result.initialResult }]; + for (let i = 0; i < numCalls; i++) { + promises.push(iterator.next()); + } + return Promise.all(promises); +} + +function createResolvablePromise(): [Promise, (value?: T) => void] { + let resolveFn; + const promise = new Promise((resolve) => { + resolveFn = resolve; + }); + return [promise, resolveFn as unknown as (value?: T) => void]; +} + +describe('Execute: stream directive', () => { + it('Can stream a list field', async () => { + const document = parse('{ scalarList @stream(initialCount: 1) }'); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual([ + { + data: { + scalarList: ['apple'], + }, + hasNext: true, + }, + { + incremental: [{ items: ['banana'], path: ['scalarList', 1] }], + hasNext: true, + }, + { + incremental: [{ items: ['coconut'], path: ['scalarList', 2] }], + hasNext: false, + }, + ]); + }); + it('Can use default value of initialCount', async () => { + const document = parse('{ scalarList @stream }'); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual([ + { + data: { + scalarList: [], + }, + hasNext: true, + }, + { + incremental: [{ items: ['apple'], path: ['scalarList', 0] }], + hasNext: true, + }, + { + incremental: [{ items: ['banana'], path: ['scalarList', 1] }], + hasNext: true, + }, + { + incremental: [{ items: ['coconut'], path: ['scalarList', 2] }], + hasNext: false, + }, + ]); + }); + it('Negative values of initialCount throw field errors', async () => { + const document = parse('{ scalarList @stream(initialCount: -2) }'); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual({ + errors: [ + { + message: 'initialCount must be a positive integer', + locations: [ + { + line: 1, + column: 3, + }, + ], + path: ['scalarList'], + }, + ], + data: { + scalarList: null, + }, + }); + }); + it('Returns label from stream directive', async () => { + const document = parse( + '{ scalarList @stream(initialCount: 1, label: "scalar-stream") }', + ); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual([ + { + data: { + scalarList: ['apple'], + }, + hasNext: true, + }, + { + incremental: [ + { + items: ['banana'], + path: ['scalarList', 1], + label: 'scalar-stream', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: ['coconut'], + path: ['scalarList', 2], + label: 'scalar-stream', + }, + ], + hasNext: false, + }, + ]); + }); + it('Can disable @stream using if argument', async () => { + const document = parse( + '{ scalarList @stream(initialCount: 0, if: false) }', + ); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual({ + data: { scalarList: ['apple', 'banana', 'coconut'] }, + }); + }); + it('Does not disable stream with null if argument', async () => { + const document = parse( + 'query ($shouldStream: Boolean) { scalarList @stream(initialCount: 2, if: $shouldStream) }', + ); + const result = await complete(document, { + scalarList: () => ['apple', 'banana', 'coconut'], + }); + expectJSON(result).toDeepEqual([ + { + data: { scalarList: ['apple', 'banana'] }, + hasNext: true, + }, + { + incremental: [{ items: ['coconut'], path: ['scalarList', 2] }], + hasNext: false, + }, + ]); + }); + it('Can stream multi-dimensional lists', async () => { + const document = parse('{ scalarListList @stream(initialCount: 1) }'); + const result = await complete(document, { + scalarListList: () => [ + ['apple', 'apple', 'apple'], + ['banana', 'banana', 'banana'], + ['coconut', 'coconut', 'coconut'], + ], + }); + expectJSON(result).toDeepEqual([ + { + data: { + scalarListList: [['apple', 'apple', 'apple']], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [['banana', 'banana', 'banana']], + path: ['scalarListList', 1], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [['coconut', 'coconut', 'coconut']], + path: ['scalarListList', 2], + }, + ], + hasNext: false, + }, + ]); + }); + it('Can stream a field that returns a list of promises', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await complete(document, { + friendList: () => friends.map((f) => Promise.resolve(f)), + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [ + { + name: 'Luke', + id: '1', + }, + { + name: 'Han', + id: '2', + }, + ], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [ + { + name: 'Leia', + id: '3', + }, + ], + path: ['friendList', 2], + }, + ], + hasNext: false, + }, + ]); + }); + it('Can stream in correct order with lists of promises', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 0) { + name + id + } + } + `); + const result = await complete(document, { + friendList: () => friends.map((f) => Promise.resolve(f)), + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Luke', id: '1' }], + path: ['friendList', 0], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Han', id: '2' }], + path: ['friendList', 1], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles rejections in a field that returns a list of promises before initialCount is reached', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await complete(document, { + friendList: () => + friends.map((f, i) => { + if (i === 1) { + return Promise.reject(new Error('bad')); + } + return Promise.resolve(f); + }), + }); + expectJSON(result).toDeepEqual([ + { + errors: [ + { + message: 'bad', + locations: [{ line: 3, column: 9 }], + path: ['friendList', 1], + }, + ], + data: { + friendList: [{ name: 'Luke', id: '1' }, null], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles rejections in a field that returns a list of promises after initialCount is reached', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 1) { + name + id + } + } + `); + const result = await complete(document, { + friendList: () => + friends.map((f, i) => { + if (i === 1) { + return Promise.reject(new Error('bad')); + } + return Promise.resolve(f); + }), + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ name: 'Luke', id: '1' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [null], + path: ['friendList', 1], + errors: [ + { + message: 'bad', + locations: [{ line: 3, column: 9 }], + path: ['friendList', 1], + }, + ], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: false, + }, + ]); + }); + it('Can stream a field that returns an async iterable', async () => { + const document = parse(` + query { + friendList @stream { + name + id + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + yield await Promise.resolve(friends[2]); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Luke', id: '1' }], + path: ['friendList', 0], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Han', id: '2' }], + path: ['friendList', 1], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + it('Can stream a field that returns an async iterable, using a non-zero initialCount', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + yield await Promise.resolve(friends[2]); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [ + { name: 'Luke', id: '1' }, + { name: 'Han', id: '2' }, + ], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + it('Negative values of initialCount throw field errors on a field that returns an async iterable', async () => { + const document = parse(` + query { + friendList @stream(initialCount: -2) { + name + id + } + } + `); + const result = await complete(document, { + // eslint-disable-next-line @typescript-eslint/no-empty-function + async *friendList() {}, + }); + expectJSON(result).toDeepEqual({ + errors: [ + { + message: 'initialCount must be a positive integer', + locations: [{ line: 3, column: 9 }], + path: ['friendList'], + }, + ], + data: { + friendList: null, + }, + }); + }); + it('Can handle concurrent calls to .next() without waiting', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await completeAsync(document, 3, { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + yield await Promise.resolve(friends[2]); + }, + }); + expectJSON(result).toDeepEqual([ + { + done: false, + value: { + data: { + friendList: [ + { name: 'Luke', id: '1' }, + { name: 'Han', id: '2' }, + ], + }, + hasNext: true, + }, + }, + { + done: false, + value: { + incremental: [ + { + items: [{ name: 'Leia', id: '3' }], + path: ['friendList', 2], + }, + ], + hasNext: true, + }, + }, + { done: false, value: { hasNext: false } }, + { done: true, value: undefined }, + ]); + }); + it('Handles error thrown in async iterable before initialCount is reached', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(friends[0]); + throw new Error('bad'); + }, + }); + expectJSON(result).toDeepEqual({ + errors: [ + { + message: 'bad', + locations: [{ line: 3, column: 9 }], + path: ['friendList', 1], + }, + ], + data: { + friendList: [{ name: 'Luke', id: '1' }, null], + }, + }); + }); + it('Handles error thrown in async iterable after initialCount is reached', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 1) { + name + id + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(friends[0]); + throw new Error('bad'); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ name: 'Luke', id: '1' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [null], + path: ['friendList', 1], + errors: [ + { + message: 'bad', + locations: [{ line: 3, column: 9 }], + path: ['friendList', 1], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles null returned in non-null list items after initialCount is reached', async () => { + const document = parse(` + query { + nonNullFriendList @stream(initialCount: 1) { + name + } + } + `); + const result = await complete(document, { + nonNullFriendList: () => [friends[0], null], + }); + + expectJSON(result).toDeepEqual([ + { + data: { + nonNullFriendList: [{ name: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: null, + path: ['nonNullFriendList', 1], + errors: [ + { + message: + 'Cannot return null for non-nullable field Query.nonNullFriendList.', + locations: [{ line: 3, column: 9 }], + path: ['nonNullFriendList', 1], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles null returned in non-null async iterable list items after initialCount is reached', async () => { + const document = parse(` + query { + nonNullFriendList @stream(initialCount: 1) { + name + } + } + `); + const result = await complete(document, { + async *nonNullFriendList() { + try { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(null); /* c8 ignore start */ + // Not reachable, early return + } finally { + /* c8 ignore stop */ + // eslint-disable-next-line no-unsafe-finally + throw new Error('Oops'); + } + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + nonNullFriendList: [{ name: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: null, + path: ['nonNullFriendList', 1], + errors: [ + { + message: + 'Cannot return null for non-nullable field Query.nonNullFriendList.', + locations: [{ line: 3, column: 9 }], + path: ['nonNullFriendList', 1], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles errors thrown by completeValue after initialCount is reached', async () => { + const document = parse(` + query { + scalarList @stream(initialCount: 1) + } + `); + const result = await complete(document, { + scalarList: () => [friends[0].name, {}], + }); + expectJSON(result).toDeepEqual([ + { + data: { + scalarList: ['Luke'], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [null], + path: ['scalarList', 1], + errors: [ + { + message: 'String cannot represent value: {}', + locations: [{ line: 3, column: 9 }], + path: ['scalarList', 1], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles async errors thrown by completeValue after initialCount is reached', async () => { + const document = parse(` + query { + nonNullFriendList @stream(initialCount: 1) { + nonNullName + } + } + `); + const result = await complete(document, { + nonNullFriendList: () => [ + Promise.resolve({ nonNullName: friends[0].name }), + Promise.resolve({ + nonNullName: () => Promise.reject(new Error('Oops')), + }), + Promise.resolve({ nonNullName: friends[1].name }), + ], + }); + expectJSON(result).toDeepEqual([ + { + data: { + nonNullFriendList: [{ nonNullName: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: null, + path: ['nonNullFriendList', 1], + errors: [ + { + message: 'Oops', + locations: [{ line: 4, column: 11 }], + path: ['nonNullFriendList', 1, 'nonNullName'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles async errors thrown by completeValue after initialCount is reached from async iterable', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 1) { + nonNullName + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve({ nonNullName: friends[0].name }); + yield await Promise.resolve({ + nonNullName: () => Promise.reject(new Error('Oops')), + }); + yield await Promise.resolve({ nonNullName: friends[1].name }); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ nonNullName: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [null], + path: ['friendList', 1], + errors: [ + { + message: 'Oops', + locations: [{ line: 4, column: 11 }], + path: ['friendList', 1, 'nonNullName'], + }, + ], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ nonNullName: 'Han' }], + path: ['friendList', 2], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + it('Filters payloads that are nulled', async () => { + const document = parse(` + query { + nestedObject { + nonNullScalarField + nestedFriendList @stream(initialCount: 0) { + name + } + } + } + `); + const result = await complete(document, { + nestedObject: { + nonNullScalarField: () => Promise.resolve(null), + async *nestedFriendList() { + yield await Promise.resolve(friends[0]); + }, + }, + }); + expectJSON(result).toDeepEqual({ + errors: [ + { + message: + 'Cannot return null for non-nullable field NestedObject.nonNullScalarField.', + locations: [{ line: 4, column: 11 }], + path: ['nestedObject', 'nonNullScalarField'], + }, + ], + data: { + nestedObject: null, + }, + }); + }); + it('Does not filter payloads when null error is in a different path', async () => { + const document = parse(` + query { + otherNestedObject: nestedObject { + ... @defer { + scalarField + } + } + nestedObject { + nestedFriendList @stream(initialCount: 0) { + name + } + } + } + `); + const result = await complete(document, { + nestedObject: { + scalarField: () => Promise.reject(new Error('Oops')), + async *nestedFriendList() { + yield await Promise.resolve(friends[0]); + }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + otherNestedObject: {}, + nestedObject: { nestedFriendList: [] }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { scalarField: null }, + path: ['otherNestedObject'], + errors: [ + { + message: 'Oops', + locations: [{ line: 5, column: 13 }], + path: ['otherNestedObject', 'scalarField'], + }, + ], + }, + { + items: [{ name: 'Luke' }], + path: ['nestedObject', 'nestedFriendList', 0], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + it('Filters stream payloads that are nulled in a deferred payload', async () => { + const document = parse(` + query { + nestedObject { + ... @defer { + deeperNestedObject { + nonNullScalarField + deeperNestedFriendList @stream(initialCount: 0) { + name + } + } + } + } + } + `); + const result = await complete(document, { + nestedObject: { + deeperNestedObject: { + nonNullScalarField: () => Promise.resolve(null), + async *deeperNestedFriendList() { + yield await Promise.resolve(friends[0]); + }, + }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + nestedObject: {}, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + deeperNestedObject: null, + }, + path: ['nestedObject'], + errors: [ + { + message: + 'Cannot return null for non-nullable field DeeperNestedObject.nonNullScalarField.', + locations: [{ line: 6, column: 15 }], + path: [ + 'nestedObject', + 'deeperNestedObject', + 'nonNullScalarField', + ], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Filters defer payloads that are nulled in a stream response', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 0) { + nonNullName + ... @defer { + name + } + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve({ + name: friends[0].name, + nonNullName: () => Promise.resolve(null), + }); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [null], + path: ['friendList', 0], + errors: [ + { + message: + 'Cannot return null for non-nullable field Friend.nonNullName.', + locations: [{ line: 4, column: 9 }], + path: ['friendList', 0, 'nonNullName'], + }, + ], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + + it('Returns iterator and ignores errors when stream payloads are filtered', async () => { + let returned = false; + let index = 0; + const iterable = { + [Symbol.asyncIterator]: () => ({ + next: () => { + const friend = friends[index++]; + if (!friend) { + return Promise.resolve({ done: true, value: undefined }); + } + return Promise.resolve({ + done: false, + value: { + name: friend.name, + nonNullName: null, + }, + }); + }, + return: () => { + returned = true; + return Promise.reject(new Error('Oops')); + }, + }), + }; + + const document = parse(` + query { + nestedObject { + ... @defer { + deeperNestedObject { + nonNullScalarField + deeperNestedFriendList @stream(initialCount: 0) { + name + } + } + } + } + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + nestedObject: { + deeperNestedObject: { + nonNullScalarField: () => Promise.resolve(null), + deeperNestedFriendList: iterable, + }, + }, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + nestedObject: {}, + }, + hasNext: true, + }); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + done: false, + value: { + incremental: [ + { + data: { + deeperNestedObject: null, + }, + path: ['nestedObject'], + errors: [ + { + message: + 'Cannot return null for non-nullable field DeeperNestedObject.nonNullScalarField.', + locations: [{ line: 6, column: 15 }], + path: [ + 'nestedObject', + 'deeperNestedObject', + 'nonNullScalarField', + ], + }, + ], + }, + ], + hasNext: true, + }, + }); + const result3 = await iterator.next(); + expectJSON(result3).toDeepEqual({ + done: false, + value: { hasNext: false }, + }); + + const result4 = await iterator.next(); + expectJSON(result4).toDeepEqual({ done: true, value: undefined }); + + assert(returned); + }); + it('Handles promises returned by completeValue after initialCount is reached', async () => { + const document = parse(` + query { + friendList @stream(initialCount: 1) { + id + name + } + } + `); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + yield await Promise.resolve({ + id: friends[2].id, + name: () => Promise.resolve(friends[2].name), + }); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ id: '1', name: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '2', name: 'Han' }], + path: ['friendList', 1], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '3', name: 'Leia' }], + path: ['friendList', 2], + }, + ], + hasNext: true, + }, + { + hasNext: false, + }, + ]); + }); + it('Returns payloads in correct order when parent deferred fragment resolves slower than stream', async () => { + const [slowFieldPromise, resolveSlowField] = createResolvablePromise(); + const document = parse(` + query { + nestedObject { + ... DeferFragment @defer + } + } + fragment DeferFragment on NestedObject { + scalarField + nestedFriendList @stream(initialCount: 0) { + name + } + } + `); + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + nestedObject: { + scalarField: () => slowFieldPromise, + async *nestedFriendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + }, + }, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + nestedObject: {}, + }, + hasNext: true, + }); + + const result2Promise = iterator.next(); + resolveSlowField('slow'); + const result2 = await result2Promise; + expectJSON(result2).toDeepEqual({ + value: { + incremental: [ + { + data: { scalarField: 'slow', nestedFriendList: [] }, + path: ['nestedObject'], + }, + ], + hasNext: true, + }, + done: false, + }); + const result3 = await iterator.next(); + expectJSON(result3).toDeepEqual({ + value: { + incremental: [ + { + items: [{ name: 'Luke' }], + path: ['nestedObject', 'nestedFriendList', 0], + }, + ], + hasNext: true, + }, + done: false, + }); + const result4 = await iterator.next(); + expectJSON(result4).toDeepEqual({ + value: { + incremental: [ + { + items: [{ name: 'Han' }], + path: ['nestedObject', 'nestedFriendList', 1], + }, + ], + hasNext: true, + }, + done: false, + }); + const result5 = await iterator.next(); + expectJSON(result5).toDeepEqual({ + value: { hasNext: false }, + done: false, + }); + const result6 = await iterator.next(); + expectJSON(result6).toDeepEqual({ + value: undefined, + done: true, + }); + }); + it('Can @defer fields that are resolved after async iterable is complete', async () => { + const [slowFieldPromise, resolveSlowField] = createResolvablePromise(); + const [iterableCompletionPromise, resolveIterableCompletion] = + createResolvablePromise(); + + const document = parse(` + query { + friendList @stream(initialCount: 1, label:"stream-label") { + ...NameFragment @defer(label: "DeferName") @defer(label: "DeferName") + id + } + } + fragment NameFragment on Friend { + name + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve({ + id: friends[1].id, + name: () => slowFieldPromise, + }); + await iterableCompletionPromise; + }, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + friendList: [{ id: '1' }], + }, + hasNext: true, + }); + + const result2Promise = iterator.next(); + resolveIterableCompletion(); + const result2 = await result2Promise; + expectJSON(result2).toDeepEqual({ + value: { + incremental: [ + { + data: { name: 'Luke' }, + path: ['friendList', 0], + label: 'DeferName', + }, + { + items: [{ id: '2' }], + path: ['friendList', 1], + label: 'stream-label', + }, + ], + hasNext: true, + }, + done: false, + }); + + const result3Promise = iterator.next(); + resolveSlowField('Han'); + const result3 = await result3Promise; + expectJSON(result3).toDeepEqual({ + value: { + incremental: [ + { + data: { name: 'Han' }, + path: ['friendList', 1], + label: 'DeferName', + }, + ], + hasNext: false, + }, + done: false, + }); + const result4 = await iterator.next(); + expectJSON(result4).toDeepEqual({ + value: undefined, + done: true, + }); + }); + it('Can @defer fields that are resolved before async iterable is complete', async () => { + const [slowFieldPromise, resolveSlowField] = createResolvablePromise(); + const [iterableCompletionPromise, resolveIterableCompletion] = + createResolvablePromise(); + + const document = parse(` + query { + friendList @stream(initialCount: 1, label:"stream-label") { + ...NameFragment @defer(label: "DeferName") @defer(label: "DeferName") + id + } + } + fragment NameFragment on Friend { + name + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + async *friendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve({ + id: friends[1].id, + name: () => slowFieldPromise, + }); + await iterableCompletionPromise; + }, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + friendList: [{ id: '1' }], + }, + hasNext: true, + }); + + const result2Promise = iterator.next(); + resolveSlowField('Han'); + const result2 = await result2Promise; + expectJSON(result2).toDeepEqual({ + value: { + incremental: [ + { + data: { name: 'Luke' }, + path: ['friendList', 0], + label: 'DeferName', + }, + { + items: [{ id: '2' }], + path: ['friendList', 1], + label: 'stream-label', + }, + ], + hasNext: true, + }, + done: false, + }); + + const result3 = await iterator.next(); + expectJSON(result3).toDeepEqual({ + value: { + incremental: [ + { + data: { name: 'Han' }, + path: ['friendList', 1], + label: 'DeferName', + }, + ], + hasNext: true, + }, + done: false, + }); + const result4Promise = iterator.next(); + resolveIterableCompletion(); + const result4 = await result4Promise; + expectJSON(result4).toDeepEqual({ + value: { hasNext: false }, + done: false, + }); + + const result5 = await iterator.next(); + expectJSON(result5).toDeepEqual({ + value: undefined, + done: true, + }); + }); + it('Returns underlying async iterables when returned generator is returned', async () => { + let returned = false; + let index = 0; + const iterable = { + [Symbol.asyncIterator]: () => ({ + next: () => { + const friend = friends[index++]; + if (!friend) { + return Promise.resolve({ done: true, value: undefined }); + } + return Promise.resolve({ done: false, value: friend }); + }, + return: () => { + returned = true; + }, + }), + }; + + const document = parse(` + query { + friendList @stream(initialCount: 1) { + id + ... @defer { + name + } + } + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + friendList: iterable, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + friendList: [ + { + id: '1', + }, + ], + }, + hasNext: true, + }); + const returnPromise = iterator.return(); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + done: true, + value: undefined, + }); + await returnPromise; + assert(returned); + }); + it('Can return async iterable when underlying iterable does not have a return method', async () => { + let index = 0; + const iterable = { + [Symbol.asyncIterator]: () => ({ + next: () => { + const friend = friends[index++]; + if (!friend) { + return Promise.resolve({ done: true, value: undefined }); + } + return Promise.resolve({ done: false, value: friend }); + }, + }), + }; + + const document = parse(` + query { + friendList @stream(initialCount: 1) { + name + id + } + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + friendList: iterable, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + friendList: [ + { + id: '1', + name: 'Luke', + }, + ], + }, + hasNext: true, + }); + + const returnPromise = iterator.return(); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + done: true, + value: undefined, + }); + await returnPromise; + }); + it('Returns underlying async iterables when returned generator is thrown', async () => { + let index = 0; + let returned = false; + const iterable = { + [Symbol.asyncIterator]: () => ({ + next: () => { + const friend = friends[index++]; + if (!friend) { + return Promise.resolve({ done: true, value: undefined }); + } + return Promise.resolve({ done: false, value: friend }); + }, + return: () => { + returned = true; + }, + }), + }; + const document = parse(` + query { + friendList @stream(initialCount: 1) { + ... @defer { + name + } + id + } + } + `); + + const executeResult = await experimentalExecuteIncrementally({ + schema, + document, + rootValue: { + friendList: iterable, + }, + }); + assert('initialResult' in executeResult); + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: { + friendList: [ + { + id: '1', + }, + ], + }, + hasNext: true, + }); + + const throwPromise = iterator.throw(new Error('bad')); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + done: true, + value: undefined, + }); + try { + await throwPromise; /* c8 ignore start */ + // Not reachable, always throws + /* c8 ignore stop */ + } catch (e) { + // ignore error + } + assert(returned); + }); +}); diff --git a/src/execution/__tests__/subscribe-test.ts b/src/execution/__tests__/subscribe-test.ts index 793a53f59f..0dc2e3140c 100644 --- a/src/execution/__tests__/subscribe-test.ts +++ b/src/execution/__tests__/subscribe-test.ts @@ -1,25 +1,33 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectEqualPromisesOrValues } from '../../__testUtils__/expectEqualPromisesOrValues'; -import { expectJSON } from '../../__testUtils__/expectJSON'; -import { expectPromise } from '../../__testUtils__/expectPromise'; -import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick'; - -import { isAsyncIterable } from '../../jsutils/isAsyncIterable'; -import { isPromise } from '../../jsutils/isPromise'; -import type { PromiseOrValue } from '../../jsutils/PromiseOrValue'; - -import { parse } from '../../language/parser'; - -import { GraphQLList, GraphQLObjectType } from '../../type/definition'; -import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; - -import type { ExecutionArgs, ExecutionResult } from '../execute'; -import { createSourceEventStream, subscribe } from '../execute'; - -import { SimplePubSub } from './simplePubSub'; +import { expectEqualPromisesOrValues } from '../../__testUtils__/expectEqualPromisesOrValues.js'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { expectPromise } from '../../__testUtils__/expectPromise.js'; +import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; + +import { isAsyncIterable } from '../../jsutils/isAsyncIterable.js'; +import { isPromise } from '../../jsutils/isPromise.js'; +import type { PromiseOrValue } from '../../jsutils/PromiseOrValue.js'; + +import { parse } from '../../language/parser.js'; + +import { GraphQLList, GraphQLObjectType } from '../../type/definition.js'; +import { + GraphQLBoolean, + GraphQLInt, + GraphQLString, +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; + +import type { ExecutionArgs, ExecutionResult } from '../execute.js'; +import { + createSourceEventStream, + experimentalSubscribeIncrementally, + subscribe, +} from '../execute.js'; + +import { SimplePubSub } from './simplePubSub.js'; interface Email { from: string; @@ -33,6 +41,10 @@ const EmailType = new GraphQLObjectType({ fields: { from: { type: GraphQLString }, subject: { type: GraphQLString }, + asyncSubject: { + type: GraphQLString, + resolve: (email) => Promise.resolve(email.subject), + }, message: { type: GraphQLString }, unread: { type: GraphQLBoolean }, }, @@ -84,17 +96,26 @@ const emailSchema = new GraphQLSchema({ }), }); -function createSubscription(pubsub: SimplePubSub) { +function createSubscription( + pubsub: SimplePubSub, + variableValues?: { readonly [variable: string]: unknown }, + originalSubscribe: boolean = false, +) { const document = parse(` - subscription ($priority: Int = 0) { + subscription ($priority: Int = 0, $shouldDefer: Boolean = false, $asyncResolver: Boolean = false) { importantEmail(priority: $priority) { email { from subject + ... @include(if: $asyncResolver) { + asyncSubject + } } - inbox { - unread - total + ... @defer(if: $shouldDefer) { + inbox { + unread + total + } } } } @@ -124,7 +145,12 @@ function createSubscription(pubsub: SimplePubSub) { }), }; - return subscribe({ schema: emailSchema, document, rootValue: data }); + return (originalSubscribe ? subscribe : experimentalSubscribeIncrementally)({ + schema: emailSchema, + document, + rootValue: data, + variableValues, + }); } const DummyQueryType = new GraphQLObjectType({ @@ -549,6 +575,45 @@ describe('Subscription Publish Phase', () => { expect(await payload2).to.deep.equal(expectedPayload); }); + it('produces a payload when queried fields are async', async () => { + const pubsub = new SimplePubSub(); + + const subscription = createSubscription(pubsub, { asyncResolver: true }); + assert(isAsyncIterable(subscription)); + + expect( + pubsub.emit({ + from: 'yuzhi@graphql.org', + subject: 'Alright', + message: 'Tests are good', + unread: true, + }), + ).to.equal(true); + + expect(await subscription.next()).to.deep.equal({ + done: false, + value: { + data: { + importantEmail: { + email: { + from: 'yuzhi@graphql.org', + subject: 'Alright', + asyncSubject: 'Alright', + }, + inbox: { + unread: 1, + total: 2, + }, + }, + }, + }, + }); + expect(await subscription.return()).to.deep.equal({ + done: true, + value: undefined, + }); + }); + it('produces a payload per subscription event', async () => { const pubsub = new SimplePubSub(); const subscription = createSubscription(pubsub); @@ -638,6 +703,213 @@ describe('Subscription Publish Phase', () => { }); }); + it('produces additional payloads for subscriptions with @defer', async () => { + const pubsub = new SimplePubSub(); + const subscription = await createSubscription(pubsub, { + shouldDefer: true, + }); + assert(isAsyncIterable(subscription)); + // Wait for the next subscription payload. + const payload = subscription.next(); + + // A new email arrives! + expect( + pubsub.emit({ + from: 'yuzhi@graphql.org', + subject: 'Alright', + message: 'Tests are good', + unread: true, + }), + ).to.equal(true); + + // The previously waited on payload now has a value. + expect(await payload).to.deep.equal({ + done: false, + value: { + data: { + importantEmail: { + email: { + from: 'yuzhi@graphql.org', + subject: 'Alright', + }, + }, + }, + hasNext: true, + }, + }); + + // Wait for the next payload from @defer + expect(await subscription.next()).to.deep.equal({ + done: false, + value: { + incremental: [ + { + data: { + inbox: { + unread: 1, + total: 2, + }, + }, + path: ['importantEmail'], + }, + ], + hasNext: false, + }, + }); + + // Another new email arrives, after all incrementally delivered payloads are received. + expect( + pubsub.emit({ + from: 'hyo@graphql.org', + subject: 'Tools', + message: 'I <3 making things', + unread: true, + }), + ).to.equal(true); + + // The next waited on payload will have a value. + expect(await subscription.next()).to.deep.equal({ + done: false, + value: { + data: { + importantEmail: { + email: { + from: 'hyo@graphql.org', + subject: 'Tools', + }, + }, + }, + hasNext: true, + }, + }); + + // Another new email arrives, before the incrementally delivered payloads from the last email was received. + expect( + pubsub.emit({ + from: 'adam@graphql.org', + subject: 'Important', + message: 'Read me please', + unread: true, + }), + ).to.equal(true); + + // Deferred payload from previous event is received. + expect(await subscription.next()).to.deep.equal({ + done: false, + value: { + incremental: [ + { + data: { + inbox: { + unread: 2, + total: 3, + }, + }, + path: ['importantEmail'], + }, + ], + hasNext: false, + }, + }); + + // Next payload from last event + expect(await subscription.next()).to.deep.equal({ + done: false, + value: { + data: { + importantEmail: { + email: { + from: 'adam@graphql.org', + subject: 'Important', + }, + }, + }, + hasNext: true, + }, + }); + + // The client disconnects before the deferred payload is consumed. + expect(await subscription.return()).to.deep.equal({ + done: true, + value: undefined, + }); + + // Awaiting a subscription after closing it results in completed results. + expect(await subscription.next()).to.deep.equal({ + done: true, + value: undefined, + }); + }); + + it('original subscribe function returns errors with @defer', async () => { + const pubsub = new SimplePubSub(); + const subscription = await createSubscription( + pubsub, + { + shouldDefer: true, + }, + true, + ); + assert(isAsyncIterable(subscription)); + // Wait for the next subscription payload. + const payload = subscription.next(); + + // A new email arrives! + expect( + pubsub.emit({ + from: 'yuzhi@graphql.org', + subject: 'Alright', + message: 'Tests are good', + unread: true, + }), + ).to.equal(true); + + const errorPayload = { + done: false, + value: { + errors: [ + { + message: + 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)', + }, + ], + }, + }; + + // The previously waited on payload now has a value. + expectJSON(await payload).toDeepEqual(errorPayload); + + // Wait for the next payload from @defer + expectJSON(await subscription.next()).toDeepEqual(errorPayload); + + // Another new email arrives, after all incrementally delivered payloads are received. + expect( + pubsub.emit({ + from: 'hyo@graphql.org', + subject: 'Tools', + message: 'I <3 making things', + unread: true, + }), + ).to.equal(true); + + // The next waited on payload will have a value. + expectJSON(await subscription.next()).toDeepEqual(errorPayload); + // The next waited on payload will have a value. + expectJSON(await subscription.next()).toDeepEqual(errorPayload); + + // The client disconnects before the deferred payload is consumed. + expectJSON(await subscription.return()).toDeepEqual({ + done: true, + value: undefined, + }); + + // Awaiting a subscription after closing it results in completed results. + expectJSON(await subscription.next()).toDeepEqual({ + done: true, + value: undefined, + }); + }); + it('produces a payload when there are multiple events', async () => { const pubsub = new SimplePubSub(); const subscription = createSubscription(pubsub); diff --git a/src/execution/__tests__/sync-test.ts b/src/execution/__tests__/sync-test.ts index 021f09fa3c..f5efa4097c 100644 --- a/src/execution/__tests__/sync-test.ts +++ b/src/execution/__tests__/sync-test.ts @@ -1,19 +1,19 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { GraphQLObjectType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { validate } from '../../validation/validate'; +import { validate } from '../../validation/validate.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import { execute, executeSync } from '../execute'; +import { execute, executeSync } from '../execute.js'; describe('Execute: synchronously when possible', () => { const schema = new GraphQLSchema({ @@ -113,6 +113,24 @@ describe('Execute: synchronously when possible', () => { }); }).to.throw('GraphQL execution failed to complete synchronously.'); }); + + it('throws if encountering async iterable execution', () => { + const doc = ` + query Example { + ...deferFrag @defer(label: "deferLabel") + } + fragment deferFrag on Query { + syncField + } + `; + expect(() => { + executeSync({ + schema, + document: parse(doc), + rootValue: 'rootValue', + }); + }).to.throw('GraphQL execution failed to complete synchronously.'); + }); }); describe('graphqlSync', () => { diff --git a/src/execution/__tests__/union-interface-test.ts b/src/execution/__tests__/union-interface-test.ts index 1ab72cad41..b7691fa689 100644 --- a/src/execution/__tests__/union-interface-test.ts +++ b/src/execution/__tests__/union-interface-test.ts @@ -1,18 +1,18 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; import { GraphQLInterfaceType, GraphQLList, GraphQLObjectType, GraphQLUnionType, -} from '../../type/definition'; -import { GraphQLBoolean, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import { GraphQLBoolean, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { executeSync } from '../execute'; +import { executeSync } from '../execute.js'; class Dog { name: string; diff --git a/src/execution/__tests__/variables-test.ts b/src/execution/__tests__/variables-test.ts index f21bb95032..7c74d8ee92 100644 --- a/src/execution/__tests__/variables-test.ts +++ b/src/execution/__tests__/variables-test.ts @@ -1,17 +1,17 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { Kind } from '../../language/kinds'; -import { parse } from '../../language/parser'; +import { Kind } from '../../language/kinds.js'; +import { parse } from '../../language/parser.js'; import type { GraphQLArgumentConfig, GraphQLFieldConfig, -} from '../../type/definition'; +} from '../../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, @@ -19,12 +19,12 @@ import { GraphQLNonNull, GraphQLObjectType, GraphQLScalarType, -} from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { executeSync } from '../execute'; -import { getVariableValues } from '../values'; +import { executeSync } from '../execute.js'; +import { getVariableValues } from '../values.js'; const TestComplexScalar = new GraphQLScalarType({ name: 'ComplexScalar', diff --git a/src/execution/collectFields.ts b/src/execution/collectFields.ts index bd85f73dcc..098e1f45b5 100644 --- a/src/execution/collectFields.ts +++ b/src/execution/collectFields.ts @@ -1,5 +1,5 @@ -import { AccumulatorMap } from '../jsutils/AccumulatorMap'; -import type { ObjMap } from '../jsutils/ObjMap'; +import { AccumulatorMap } from '../jsutils/AccumulatorMap.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; import type { FieldNode, @@ -7,20 +7,31 @@ import type { FragmentSpreadNode, InlineFragmentNode, SelectionSetNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; -import type { GraphQLObjectType } from '../type/definition'; -import { isAbstractType } from '../type/definition'; +import type { GraphQLObjectType } from '../type/definition.js'; +import { isAbstractType } from '../type/definition.js'; import { + GraphQLDeferDirective, GraphQLIncludeDirective, GraphQLSkipDirective, -} from '../type/directives'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/directives.js'; +import type { GraphQLSchema } from '../type/schema.js'; -import { typeFromAST } from '../utilities/typeFromAST'; +import { typeFromAST } from '../utilities/typeFromAST.js'; -import { getDirectiveValues } from './values'; +import { getDirectiveValues } from './values.js'; + +export interface PatchFields { + label: string | undefined; + fields: Map>; +} + +export interface FieldsAndPatches { + fields: Map>; + patches: Array; +} /** * Given a selectionSet, collects all of the fields and returns them. @@ -37,8 +48,9 @@ export function collectFields( variableValues: { [variable: string]: unknown }, runtimeType: GraphQLObjectType, selectionSet: SelectionSetNode, -): Map> { +): FieldsAndPatches { const fields = new AccumulatorMap(); + const patches: Array = []; collectFieldsImpl( schema, fragments, @@ -46,9 +58,10 @@ export function collectFields( runtimeType, selectionSet, fields, + patches, new Set(), ); - return fields; + return { fields, patches }; } /** @@ -67,9 +80,16 @@ export function collectSubfields( variableValues: { [variable: string]: unknown }, returnType: GraphQLObjectType, fieldNodes: ReadonlyArray, -): Map> { +): FieldsAndPatches { const subFieldNodes = new AccumulatorMap(); const visitedFragmentNames = new Set(); + + const subPatches: Array = []; + const subFieldsAndPatches = { + fields: subFieldNodes, + patches: subPatches, + }; + for (const node of fieldNodes) { if (node.selectionSet) { collectFieldsImpl( @@ -79,11 +99,12 @@ export function collectSubfields( returnType, node.selectionSet, subFieldNodes, + subPatches, visitedFragmentNames, ); } } - return subFieldNodes; + return subFieldsAndPatches; } // eslint-disable-next-line max-params @@ -94,6 +115,7 @@ function collectFieldsImpl( runtimeType: GraphQLObjectType, selectionSet: SelectionSetNode, fields: AccumulatorMap, + patches: Array, visitedFragmentNames: Set, ): void { for (const selection of selectionSet.selections) { @@ -112,26 +134,51 @@ function collectFieldsImpl( ) { continue; } - collectFieldsImpl( - schema, - fragments, - variableValues, - runtimeType, - selection.selectionSet, - fields, - visitedFragmentNames, - ); + + const defer = getDeferValues(variableValues, selection); + + if (defer) { + const patchFields = new AccumulatorMap(); + collectFieldsImpl( + schema, + fragments, + variableValues, + runtimeType, + selection.selectionSet, + patchFields, + patches, + visitedFragmentNames, + ); + patches.push({ + label: defer.label, + fields: patchFields, + }); + } else { + collectFieldsImpl( + schema, + fragments, + variableValues, + runtimeType, + selection.selectionSet, + fields, + patches, + visitedFragmentNames, + ); + } break; } case Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; - if ( - visitedFragmentNames.has(fragName) || - !shouldIncludeNode(variableValues, selection) - ) { + + if (!shouldIncludeNode(variableValues, selection)) { + continue; + } + + const defer = getDeferValues(variableValues, selection); + if (visitedFragmentNames.has(fragName) && !defer) { continue; } - visitedFragmentNames.add(fragName); + const fragment = fragments[fragName]; if ( !fragment || @@ -139,21 +186,69 @@ function collectFieldsImpl( ) { continue; } - collectFieldsImpl( - schema, - fragments, - variableValues, - runtimeType, - fragment.selectionSet, - fields, - visitedFragmentNames, - ); + + if (!defer) { + visitedFragmentNames.add(fragName); + } + + if (defer) { + const patchFields = new AccumulatorMap(); + collectFieldsImpl( + schema, + fragments, + variableValues, + runtimeType, + fragment.selectionSet, + patchFields, + patches, + visitedFragmentNames, + ); + patches.push({ + label: defer.label, + fields: patchFields, + }); + } else { + collectFieldsImpl( + schema, + fragments, + variableValues, + runtimeType, + fragment.selectionSet, + fields, + patches, + visitedFragmentNames, + ); + } break; } } } } +/** + * Returns an object containing the `@defer` arguments if a field should be + * deferred based on the experimental flag, defer directive present and + * not disabled by the "if" argument. + */ +function getDeferValues( + variableValues: { [variable: string]: unknown }, + node: FragmentSpreadNode | InlineFragmentNode, +): undefined | { label: string | undefined } { + const defer = getDirectiveValues(GraphQLDeferDirective, node, variableValues); + + if (!defer) { + return; + } + + if (defer.if === false) { + return; + } + + return { + label: typeof defer.label === 'string' ? defer.label : undefined, + }; +} + /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 31aed591fa..e6d33110e7 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -1,30 +1,30 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { isAsyncIterable } from '../jsutils/isAsyncIterable'; -import { isIterableObject } from '../jsutils/isIterableObject'; -import { isObjectLike } from '../jsutils/isObjectLike'; -import { isPromise } from '../jsutils/isPromise'; -import type { Maybe } from '../jsutils/Maybe'; -import { memoize3 } from '../jsutils/memoize3'; -import type { ObjMap } from '../jsutils/ObjMap'; -import type { Path } from '../jsutils/Path'; -import { addPath, pathToArray } from '../jsutils/Path'; -import { promiseForObject } from '../jsutils/promiseForObject'; -import type { PromiseOrValue } from '../jsutils/PromiseOrValue'; -import { promiseReduce } from '../jsutils/promiseReduce'; - -import type { GraphQLFormattedError } from '../error/GraphQLError'; -import { GraphQLError } from '../error/GraphQLError'; -import { locatedError } from '../error/locatedError'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { isAsyncIterable } from '../jsutils/isAsyncIterable.js'; +import { isIterableObject } from '../jsutils/isIterableObject.js'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import { isPromise } from '../jsutils/isPromise.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import { memoize3 } from '../jsutils/memoize3.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; +import type { Path } from '../jsutils/Path.js'; +import { addPath, pathToArray } from '../jsutils/Path.js'; +import { promiseForObject } from '../jsutils/promiseForObject.js'; +import type { PromiseOrValue } from '../jsutils/PromiseOrValue.js'; +import { promiseReduce } from '../jsutils/promiseReduce.js'; + +import type { GraphQLFormattedError } from '../error/GraphQLError.js'; +import { GraphQLError } from '../error/GraphQLError.js'; +import { locatedError } from '../error/locatedError.js'; import type { DocumentNode, FieldNode, FragmentDefinitionNode, OperationDefinitionNode, -} from '../language/ast'; -import { OperationTypeNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +} from '../language/ast.js'; +import { OperationTypeNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; import type { GraphQLAbstractType, @@ -36,23 +36,29 @@ import type { GraphQLOutputType, GraphQLResolveInfo, GraphQLTypeResolver, -} from '../type/definition'; +} from '../type/definition.js'; import { isAbstractType, isLeafType, isListType, isNonNullType, isObjectType, -} from '../type/definition'; -import type { GraphQLSchema } from '../type/schema'; -import { assertValidSchema } from '../type/validate'; +} from '../type/definition.js'; +import { GraphQLStreamDirective } from '../type/directives.js'; +import type { GraphQLSchema } from '../type/schema.js'; +import { assertValidSchema } from '../type/validate.js'; import { collectFields, collectSubfields as _collectSubfields, -} from './collectFields'; -import { mapAsyncIterable } from './mapAsyncIterable'; -import { getArgumentValues, getVariableValues } from './values'; +} from './collectFields.js'; +import { flattenAsyncIterable } from './flattenAsyncIterable.js'; +import { mapAsyncIterable } from './mapAsyncIterable.js'; +import { + getArgumentValues, + getDirectiveValues, + getVariableValues, +} from './values.js'; /* eslint-disable max-params */ // This file contains a lot of such errors but we plan to refactor it anyway @@ -115,6 +121,7 @@ export interface ExecutionContext { typeResolver: GraphQLTypeResolver; subscribeFieldResolver: GraphQLFieldResolver; errors: Array; + subsequentPayloads: Set; } /** @@ -122,7 +129,9 @@ export interface ExecutionContext { * * - `errors` is included when any errors occurred as a non-empty array. * - `data` is the result of a successful execution of the query. + * - `hasNext` is true if a future payload is expected. * - `extensions` is reserved for adding non-standard properties. + * - `incremental` is a list of the results from defer/stream directives. */ export interface ExecutionResult< TData = ObjMap, @@ -142,6 +151,106 @@ export interface FormattedExecutionResult< extensions?: TExtensions; } +export interface ExperimentalIncrementalExecutionResults< + TData = ObjMap, + TExtensions = ObjMap, +> { + initialResult: InitialIncrementalExecutionResult; + subsequentResults: AsyncGenerator< + SubsequentIncrementalExecutionResult, + void, + void + >; +} + +export interface InitialIncrementalExecutionResult< + TData = ObjMap, + TExtensions = ObjMap, +> extends ExecutionResult { + hasNext: boolean; + incremental?: ReadonlyArray>; + extensions?: TExtensions; +} + +export interface FormattedInitialIncrementalExecutionResult< + TData = ObjMap, + TExtensions = ObjMap, +> extends FormattedExecutionResult { + hasNext: boolean; + incremental?: ReadonlyArray>; + extensions?: TExtensions; +} + +export interface SubsequentIncrementalExecutionResult< + TData = ObjMap, + TExtensions = ObjMap, +> { + hasNext: boolean; + incremental?: ReadonlyArray>; + extensions?: TExtensions; +} + +export interface FormattedSubsequentIncrementalExecutionResult< + TData = ObjMap, + TExtensions = ObjMap, +> { + hasNext: boolean; + incremental?: ReadonlyArray>; + extensions?: TExtensions; +} + +export interface IncrementalDeferResult< + TData = ObjMap, + TExtensions = ObjMap, +> extends ExecutionResult { + path?: ReadonlyArray; + label?: string; +} + +export interface FormattedIncrementalDeferResult< + TData = ObjMap, + TExtensions = ObjMap, +> extends FormattedExecutionResult { + path?: ReadonlyArray; + label?: string; +} + +export interface IncrementalStreamResult< + TData = Array, + TExtensions = ObjMap, +> { + errors?: ReadonlyArray; + items?: TData | null; + path?: ReadonlyArray; + label?: string; + extensions?: TExtensions; +} + +export interface FormattedIncrementalStreamResult< + TData = Array, + TExtensions = ObjMap, +> { + errors?: ReadonlyArray; + items?: TData | null; + path?: ReadonlyArray; + label?: string; + extensions?: TExtensions; +} + +export type IncrementalResult< + TData = ObjMap, + TExtensions = ObjMap, +> = + | IncrementalDeferResult + | IncrementalStreamResult; + +export type FormattedIncrementalResult< + TData = ObjMap, + TExtensions = ObjMap, +> = + | FormattedIncrementalDeferResult + | FormattedIncrementalStreamResult; + export interface ExecutionArgs { schema: GraphQLSchema; document: DocumentNode; @@ -154,6 +263,9 @@ export interface ExecutionArgs { subscribeFieldResolver?: Maybe>; } +const UNEXPECTED_MULTIPLE_PAYLOADS = + 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)'; + /** * Implements the "Executing requests" section of the GraphQL specification. * @@ -163,8 +275,47 @@ export interface ExecutionArgs { * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. + * + * This function does not support incremental delivery (`@defer` and `@stream`). + * If an operation which would defer or stream data is executed with this + * function, it will throw or resolve to an object containing an error instead. + * Use `experimentalExecuteIncrementally` if you want to support incremental + * delivery. */ export function execute(args: ExecutionArgs): PromiseOrValue { + const result = experimentalExecuteIncrementally(args); + if (!isPromise(result)) { + if ('initialResult' in result) { + throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); + } + return result; + } + + return result.then((incrementalResult) => { + if ('initialResult' in incrementalResult) { + return { + errors: [new GraphQLError(UNEXPECTED_MULTIPLE_PAYLOADS)], + }; + } + return incrementalResult; + }); +} + +/** + * Implements the "Executing requests" section of the GraphQL specification, + * including `@defer` and `@stream` as proposed in + * https://github.com/graphql/graphql-spec/pull/742 + * + * This function returns a Promise of an ExperimentalIncrementalExecutionResults + * object. This object either consists of a single ExecutionResult, or an + * object containing an `initialResult` and a stream of `subsequentResults`. + * + * If the arguments to this function do not result in a legal execution context, + * a GraphQLError will be thrown immediately explaining the invalid input. + */ +export function experimentalExecuteIncrementally( + args: ExecutionArgs, +): PromiseOrValue { // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. const exeContext = buildExecutionContext(args); @@ -179,7 +330,7 @@ export function execute(args: ExecutionArgs): PromiseOrValue { function executeImpl( exeContext: ExecutionContext, -): PromiseOrValue { +): PromiseOrValue { // Return a Promise that will eventually resolve to the data described by // The "Response" section of the GraphQL specification. // @@ -195,14 +346,36 @@ function executeImpl( const result = executeOperation(exeContext); if (isPromise(result)) { return result.then( - (data) => buildResponse(data, exeContext.errors), + (data) => { + const initialResult = buildResponse(data, exeContext.errors); + if (exeContext.subsequentPayloads.size > 0) { + return { + initialResult: { + ...initialResult, + hasNext: true, + }, + subsequentResults: yieldSubsequentPayloads(exeContext), + }; + } + return initialResult; + }, (error) => { exeContext.errors.push(error); return buildResponse(null, exeContext.errors); }, ); } - return buildResponse(result, exeContext.errors); + const initialResult = buildResponse(result, exeContext.errors); + if (exeContext.subsequentPayloads.size > 0) { + return { + initialResult: { + ...initialResult, + hasNext: true, + }, + subsequentResults: yieldSubsequentPayloads(exeContext), + }; + } + return initialResult; } catch (error) { exeContext.errors.push(error); return buildResponse(null, exeContext.errors); @@ -215,10 +388,10 @@ function executeImpl( * that all field resolvers are also synchronous. */ export function executeSync(args: ExecutionArgs): ExecutionResult { - const result = execute(args); + const result = experimentalExecuteIncrementally(args); // Assert that the execution was synchronous. - if (isPromise(result)) { + if (isPromise(result) || 'initialResult' in result) { throw new Error('GraphQL execution failed to complete synchronously.'); } @@ -321,6 +494,7 @@ export function buildExecutionContext( fieldResolver: fieldResolver ?? defaultFieldResolver, typeResolver: typeResolver ?? defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver ?? defaultFieldResolver, + subsequentPayloads: new Set(), errors: [], }; } @@ -352,7 +526,7 @@ function executeOperation( ); } - const rootFields = collectFields( + const { fields: rootFields, patches } = collectFields( schema, fragments, variableValues, @@ -360,23 +534,40 @@ function executeOperation( operation.selectionSet, ); const path = undefined; + let result; switch (operation.operation) { case OperationTypeNode.QUERY: - return executeFields(exeContext, rootType, rootValue, path, rootFields); + result = executeFields(exeContext, rootType, rootValue, path, rootFields); + break; case OperationTypeNode.MUTATION: - return executeFieldsSerially( + result = executeFieldsSerially( exeContext, rootType, rootValue, path, rootFields, ); + break; case OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together - return executeFields(exeContext, rootType, rootValue, path, rootFields); + result = executeFields(exeContext, rootType, rootValue, path, rootFields); + } + + for (const patch of patches) { + const { label, fields: patchFields } = patch; + executeDeferredFragment( + exeContext, + rootType, + rootValue, + patchFields, + label, + path, + ); } + + return result; } /** @@ -427,6 +618,7 @@ function executeFields( sourceValue: unknown, path: Path | undefined, fields: Map>, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue> { const results = Object.create(null); let containsPromise = false; @@ -440,6 +632,7 @@ function executeFields( sourceValue, fieldNodes, fieldPath, + asyncPayloadRecord ); if (result !== undefined) { @@ -482,7 +675,9 @@ function executeField( source: unknown, fieldNodes: ReadonlyArray, path: Path, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue { + const errors = asyncPayloadRecord?.errors ?? exeContext.errors; const fieldName = fieldNodes[0].name.value; const fieldDef = exeContext.schema.getField(parentType, fieldName); if (!fieldDef) { @@ -521,7 +716,15 @@ function executeField( let completed; if (isPromise(result)) { completed = result.then((resolved) => - completeValue(exeContext, returnType, fieldNodes, info, path, resolved), + completeValue( + exeContext, + returnType, + fieldNodes, + info, + path, + resolved, + asyncPayloadRecord, + ), ); } else { completed = completeValue( @@ -531,6 +734,7 @@ function executeField( info, path, result, + asyncPayloadRecord, ); } @@ -539,13 +743,17 @@ function executeField( // to take a second callback for the error case. return completed.then(undefined, (rawError) => { const error = locatedError(rawError, fieldNodes, pathToArray(path)); - return handleFieldError(error, returnType, exeContext); + const handledError = handleFieldError(error, returnType, errors); + filterSubsequentPayloads(exeContext, path); + return handledError; }); } return completed; } catch (rawError) { const error = locatedError(rawError, fieldNodes, pathToArray(path)); - return handleFieldError(error, returnType, exeContext); + const handledError = handleFieldError(error, returnType, errors); + filterSubsequentPayloads(exeContext, path); + return handledError; } } @@ -579,7 +787,7 @@ export function buildResolveInfo( function handleFieldError( error: GraphQLError, returnType: GraphQLOutputType, - exeContext: ExecutionContext, + errors: Array, ): null { // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. @@ -589,7 +797,7 @@ function handleFieldError( // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - exeContext.errors.push(error); + errors.push(error); return null; } @@ -621,6 +829,7 @@ function completeValue( info: GraphQLResolveInfo, path: Path, result: unknown, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue { // If result is an Error, throw a located error. if (result instanceof Error) { @@ -637,6 +846,7 @@ function completeValue( info, path, result, + asyncPayloadRecord, ); if (completed === null) { throw new Error( @@ -660,6 +870,7 @@ function completeValue( info, path, result, + asyncPayloadRecord, ); } @@ -679,6 +890,7 @@ function completeValue( info, path, result, + asyncPayloadRecord, ); } @@ -691,6 +903,7 @@ function completeValue( info, path, result, + asyncPayloadRecord, ); } /* c8 ignore next 6 */ @@ -701,6 +914,58 @@ function completeValue( ); } +/** + * Returns an object containing the `@stream` arguments if a field should be + * streamed based on the experimental flag, stream directive present and + * not disabled by the "if" argument. + */ +function getStreamValues( + exeContext: ExecutionContext, + fieldNodes: ReadonlyArray, + path: Path, +): + | undefined + | { + initialCount: number | undefined; + label: string | undefined; + } { + // do not stream inner lists of multi-dimensional lists + if (typeof path.key === 'number') { + return; + } + + // validation only allows equivalent streams on multiple fields, so it is + // safe to only check the first fieldNode for the stream directive + const stream = getDirectiveValues( + GraphQLStreamDirective, + fieldNodes[0], + exeContext.variableValues, + ); + + if (!stream) { + return; + } + + if (stream.if === false) { + return; + } + + invariant( + typeof stream.initialCount === 'number', + 'initialCount must be a number', + ); + + invariant( + stream.initialCount >= 0, + 'initialCount must be a positive integer', + ); + + return { + initialCount: stream.initialCount, + label: typeof stream.label === 'string' ? stream.label : undefined, + }; +} + /** * Complete a async iterator value by completing the result and calling * recursively until all the results are completed. @@ -712,12 +977,35 @@ async function completeAsyncIteratorValue( info: GraphQLResolveInfo, path: Path, iterator: AsyncIterator, + asyncPayloadRecord?: AsyncPayloadRecord, ): Promise> { + const errors = asyncPayloadRecord?.errors ?? exeContext.errors; + const stream = getStreamValues(exeContext, fieldNodes, path); let containsPromise = false; const completedResults = []; let index = 0; // eslint-disable-next-line no-constant-condition while (true) { + if ( + stream && + typeof stream.initialCount === 'number' && + index >= stream.initialCount + ) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + executeStreamIterator( + index, + iterator, + exeContext, + fieldNodes, + info, + itemType, + path, + stream.label, + asyncPayloadRecord, + ); + break; + } + const fieldPath = addPath(path, index, undefined); try { // eslint-disable-next-line no-await-in-loop @@ -735,6 +1023,7 @@ async function completeAsyncIteratorValue( info, fieldPath, value, + asyncPayloadRecord, ); if (isPromise(completedItem)) { containsPromise = true; @@ -747,12 +1036,12 @@ async function completeAsyncIteratorValue( fieldNodes, pathToArray(fieldPath), ); - handleFieldError(error, itemType, exeContext); + handleFieldError(error, itemType, errors); } } catch (rawError) { completedResults.push(null); const error = locatedError(rawError, fieldNodes, pathToArray(fieldPath)); - handleFieldError(error, itemType, exeContext); + handleFieldError(error, itemType, errors); break; } index += 1; @@ -771,8 +1060,10 @@ function completeListValue( info: GraphQLResolveInfo, path: Path, result: unknown, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue> { const itemType = returnType.ofType; + const errors = asyncPayloadRecord?.errors ?? exeContext.errors; if (isAsyncIterable(result)) { const iterator = result[Symbol.asyncIterator](); @@ -784,6 +1075,7 @@ function completeListValue( info, path, iterator, + asyncPayloadRecord, ); } @@ -793,15 +1085,40 @@ function completeListValue( ); } + const stream = getStreamValues(exeContext, fieldNodes, path); + // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. let containsPromise = false; - const completedResults = Array.from(result, (item, index) => { + let previousAsyncPayloadRecord = asyncPayloadRecord; + const completedResults = []; + let index = 0; + for (const item of result) { // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = addPath(path, index, undefined); try { let completedItem; + + if ( + stream && + typeof stream.initialCount === 'number' && + index >= stream.initialCount + ) { + previousAsyncPayloadRecord = executeStreamField( + path, + itemPath, + item, + exeContext, + fieldNodes, + info, + itemType, + stream.label, + previousAsyncPayloadRecord, + ); + index++; + continue; + } if (isPromise(item)) { completedItem = item.then((resolved) => completeValue( @@ -811,6 +1128,7 @@ function completeListValue( info, itemPath, resolved, + asyncPayloadRecord, ), ); } else { @@ -821,6 +1139,7 @@ function completeListValue( info, itemPath, item, + asyncPayloadRecord, ); } @@ -828,21 +1147,29 @@ function completeListValue( containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. - return completedItem.then(undefined, (rawError) => { - const error = locatedError( - rawError, - fieldNodes, - pathToArray(itemPath), - ); - return handleFieldError(error, itemType, exeContext); - }); + completedResults.push( + completedItem.then(undefined, (rawError) => { + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + ); + const handledError = handleFieldError(error, itemType, errors); + filterSubsequentPayloads(exeContext, itemPath); + return handledError; + }), + ); + } else { + completedResults.push(completedItem); } - return completedItem; } catch (rawError) { const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); - return handleFieldError(error, itemType, exeContext); + const handledError = handleFieldError(error, itemType, errors); + filterSubsequentPayloads(exeContext, itemPath); + completedResults.push(handledError); } - }); + index++; + } return containsPromise ? Promise.all(completedResults) : completedResults; } @@ -876,6 +1203,7 @@ function completeAbstractValue( info: GraphQLResolveInfo, path: Path, result: unknown, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue> { const resolveTypeFn = returnType.resolveType ?? exeContext.typeResolver; const contextValue = exeContext.contextValue; @@ -897,6 +1225,7 @@ function completeAbstractValue( info, path, result, + asyncPayloadRecord, ), ); } @@ -915,6 +1244,7 @@ function completeAbstractValue( info, path, result, + asyncPayloadRecord, ); } @@ -983,10 +1313,8 @@ function completeObjectValue( info: GraphQLResolveInfo, path: Path, result: unknown, + asyncPayloadRecord?: AsyncPayloadRecord, ): PromiseOrValue> { - // Collect sub-fields to execute to complete this value. - const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); - // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. @@ -998,12 +1326,13 @@ function completeObjectValue( if (!resolvedIsTypeOf) { throw invalidReturnTypeError(returnType, result, fieldNodes); } - return executeFields( + return collectAndExecuteSubfields( exeContext, returnType, - result, + fieldNodes, path, - subFieldNodes, + result, + asyncPayloadRecord, ); }); } @@ -1013,7 +1342,14 @@ function completeObjectValue( } } - return executeFields(exeContext, returnType, result, path, subFieldNodes); + return collectAndExecuteSubfields( + exeContext, + returnType, + fieldNodes, + path, + result, + asyncPayloadRecord, + ); } function invalidReturnTypeError( @@ -1027,6 +1363,46 @@ function invalidReturnTypeError( ); } +function collectAndExecuteSubfields( + exeContext: ExecutionContext, + returnType: GraphQLObjectType, + fieldNodes: ReadonlyArray, + path: Path, + result: unknown, + asyncPayloadRecord?: AsyncPayloadRecord, +): PromiseOrValue> { + // Collect sub-fields to execute to complete this value. + const { fields: subFieldNodes, patches: subPatches } = collectSubfields( + exeContext, + returnType, + fieldNodes, + ); + + const subFields = executeFields( + exeContext, + returnType, + result, + path, + subFieldNodes, + asyncPayloadRecord, + ); + + for (const subPatch of subPatches) { + const { label, fields: subPatchFieldNodes } = subPatch; + executeDeferredFragment( + exeContext, + returnType, + result, + subPatchFieldNodes, + label, + path, + asyncPayloadRecord, + ); + } + + return subFields; +} + /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -1100,22 +1476,102 @@ export const defaultFieldResolver: GraphQLFieldResolver = * is not an async iterable. * * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. + * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive + * errors and no data will be returned. * - * If the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single + * If the source stream could not be created due to faulty subscription resolver + * logic or underlying systems, the promise will resolve to a single * ExecutionResult containing `errors` and no `data`. * * If the operation succeeded, the promise resolves to an AsyncIterator, which * yields a stream of ExecutionResults representing the response stream. * - * Accepts either an object with named arguments, or individual arguments. + * This function does not support incremental delivery (`@defer` and `@stream`). + * If an operation which would defer or stream data is executed with this + * function, each `InitialIncrementalExecutionResult` and + * `SubsequentIncrementalExecutionResult` in the result stream will be replaced + * with an `ExecutionResult` with a single error stating that defer/stream is + * not supported. Use `experimentalSubscribeIncrementally` if you want to + * support incremental delivery. + * + * Accepts an object with named arguments. */ export function subscribe( args: ExecutionArgs, ): PromiseOrValue< AsyncGenerator | ExecutionResult +> { + const maybePromise = experimentalSubscribeIncrementally(args); + if (isPromise(maybePromise)) { + return maybePromise.then((resultOrIterable) => + isAsyncIterable(resultOrIterable) + ? mapAsyncIterable(resultOrIterable, ensureSingleExecutionResult) + : resultOrIterable, + ); + } + return isAsyncIterable(maybePromise) + ? mapAsyncIterable(maybePromise, ensureSingleExecutionResult) + : maybePromise; +} + +function ensureSingleExecutionResult( + result: + | ExecutionResult + | InitialIncrementalExecutionResult + | SubsequentIncrementalExecutionResult, +): ExecutionResult { + if ('hasNext' in result) { + return { + errors: [new GraphQLError(UNEXPECTED_MULTIPLE_PAYLOADS)], + }; + } + return result; +} + +/** + * Implements the "Subscribe" algorithm described in the GraphQL specification, + * including `@defer` and `@stream` as proposed in + * https://github.com/graphql/graphql-spec/pull/742 + * + * Returns a Promise which resolves to either an AsyncIterator (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive + * errors and no data will be returned. + * + * If the source stream could not be created due to faulty subscription resolver + * logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to an AsyncIterator, which + * yields a stream of result representing the response stream. + * + * Each result may be an ExecutionResult with no `hasNext` (if executing the + * event did not use `@defer` or `@stream`), or an + * `InitialIncrementalExecutionResult` or `SubsequentIncrementalExecutionResult` + * (if executing the event used `@defer` or `@stream`). In the case of + * incremental execution results, each event produces a single + * `InitialIncrementalExecutionResult` followed by one or more + * `SubsequentIncrementalExecutionResult`s; all but the last have `hasNext: true`, + * and the last has `hasNext: false`. There is no interleaving between results + * generated from the same original event. + * + * Accepts an object with named arguments. + */ +export function experimentalSubscribeIncrementally( + args: ExecutionArgs, +): PromiseOrValue< + | AsyncGenerator< + | ExecutionResult + | InitialIncrementalExecutionResult + | SubsequentIncrementalExecutionResult, + void, + void + > + | ExecutionResult > { // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. @@ -1137,11 +1593,37 @@ export function subscribe( return mapSourceToResponse(exeContext, resultOrStream); } +async function* ensureAsyncIterable( + someExecutionResult: + | ExecutionResult + | ExperimentalIncrementalExecutionResults, +): AsyncGenerator< + | ExecutionResult + | InitialIncrementalExecutionResult + | SubsequentIncrementalExecutionResult, + void, + void +> { + if ('initialResult' in someExecutionResult) { + yield someExecutionResult.initialResult; + yield* someExecutionResult.subsequentResults; + } else { + yield someExecutionResult; + } +} + function mapSourceToResponse( exeContext: ExecutionContext, resultOrStream: ExecutionResult | AsyncIterable, ): PromiseOrValue< - AsyncGenerator | ExecutionResult + | AsyncGenerator< + | ExecutionResult + | InitialIncrementalExecutionResult + | SubsequentIncrementalExecutionResult, + void, + void + > + | ExecutionResult > { if (!isAsyncIterable(resultOrStream)) { return resultOrStream; @@ -1153,8 +1635,12 @@ function mapSourceToResponse( // the GraphQL specification. The `execute` function provides the // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the // "ExecuteQuery" algorithm, for which `execute` is also used. - return mapAsyncIterable(resultOrStream, (payload: unknown) => - executeImpl(buildPerEventExecutionContext(exeContext, payload)), + return flattenAsyncIterable( + mapAsyncIterable(resultOrStream, async (payload: unknown) => + ensureAsyncIterable( + await executeImpl(buildPerEventExecutionContext(exeContext, payload)), + ), + ), ); } @@ -1230,7 +1716,7 @@ function executeSubscription( ); } - const rootFields = collectFields( + const { fields: rootFields } = collectFields( schema, fragments, variableValues, @@ -1304,3 +1790,508 @@ function assertEventStream(result: unknown): AsyncIterable { return result; } + +function executeDeferredFragment( + exeContext: ExecutionContext, + parentType: GraphQLObjectType, + sourceValue: unknown, + fields: Map>, + label?: string, + path?: Path, + parentContext?: AsyncPayloadRecord, +): void { + const asyncPayloadRecord = new DeferredFragmentRecord({ + label, + path, + parentContext, + exeContext, + }); + let promiseOrData; + try { + promiseOrData = executeFields( + exeContext, + parentType, + sourceValue, + path, + fields, + asyncPayloadRecord, + ); + + if (isPromise(promiseOrData)) { + promiseOrData = promiseOrData.then(null, (e) => { + asyncPayloadRecord.errors.push(e); + return null; + }); + } + } catch (e) { + asyncPayloadRecord.errors.push(e); + promiseOrData = null; + } + asyncPayloadRecord.addData(promiseOrData); +} + +function executeStreamField( + path: Path, + itemPath: Path, + item: PromiseOrValue, + exeContext: ExecutionContext, + fieldNodes: ReadonlyArray, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, + label?: string, + parentContext?: AsyncPayloadRecord, +): AsyncPayloadRecord { + const asyncPayloadRecord = new StreamRecord({ + label, + path: itemPath, + parentContext, + exeContext, + }); + let completedItem: PromiseOrValue; + try { + try { + if (isPromise(item)) { + completedItem = item.then((resolved) => + completeValue( + exeContext, + itemType, + fieldNodes, + info, + itemPath, + resolved, + asyncPayloadRecord, + ), + ); + } else { + completedItem = completeValue( + exeContext, + itemType, + fieldNodes, + info, + itemPath, + item, + asyncPayloadRecord, + ); + } + + if (isPromise(completedItem)) { + // Note: we don't rely on a `catch` method, but we do expect "thenable" + // to take a second callback for the error case. + completedItem = completedItem.then(undefined, (rawError) => { + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + ); + const handledError = handleFieldError( + error, + itemType, + asyncPayloadRecord.errors, + ); + filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + return handledError; + }); + } + } catch (rawError) { + const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); + completedItem = handleFieldError( + error, + itemType, + asyncPayloadRecord.errors, + ); + filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + } + } catch (error) { + asyncPayloadRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + asyncPayloadRecord.addItems(null); + return asyncPayloadRecord; + } + + let completedItems: PromiseOrValue | null>; + if (isPromise(completedItem)) { + completedItems = completedItem.then( + (value) => [value], + (error) => { + asyncPayloadRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + return null; + }, + ); + } else { + completedItems = [completedItem]; + } + + asyncPayloadRecord.addItems(completedItems); + return asyncPayloadRecord; +} + +async function executeStreamIteratorItem( + iterator: AsyncIterator, + exeContext: ExecutionContext, + fieldNodes: ReadonlyArray, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, + asyncPayloadRecord: StreamRecord, + fieldPath: Path, +): Promise> { + let item; + try { + const { value, done } = await iterator.next(); + if (done) { + asyncPayloadRecord.setIsCompletedIterator(); + return { done, value: undefined }; + } + item = value; + } catch (rawError) { + const error = locatedError(rawError, fieldNodes, pathToArray(fieldPath)); + const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); + filterSubsequentPayloads(exeContext, fieldPath, asyncPayloadRecord); + // don't continue if iterator throws + return { done: true, value }; + } + let completedItem; + try { + completedItem = completeValue( + exeContext, + itemType, + fieldNodes, + info, + fieldPath, + item, + asyncPayloadRecord, + ); + + if (isPromise(completedItem)) { + completedItem = completedItem.then(undefined, (rawError) => { + const error = locatedError( + rawError, + fieldNodes, + pathToArray(fieldPath), + ); + const handledError = handleFieldError( + error, + itemType, + asyncPayloadRecord.errors, + ); + filterSubsequentPayloads(exeContext, fieldPath, asyncPayloadRecord); + return handledError; + }); + } + return { done: false, value: completedItem }; + } catch (rawError) { + const error = locatedError(rawError, fieldNodes, pathToArray(fieldPath)); + const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); + filterSubsequentPayloads(exeContext, fieldPath, asyncPayloadRecord); + return { done: false, value }; + } +} + +async function executeStreamIterator( + initialIndex: number, + iterator: AsyncIterator, + exeContext: ExecutionContext, + fieldNodes: ReadonlyArray, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, + path?: Path, + label?: string, + parentContext?: AsyncPayloadRecord, +): Promise { + let index = initialIndex; + let previousAsyncPayloadRecord = parentContext ?? undefined; + // eslint-disable-next-line no-constant-condition + while (true) { + const fieldPath = addPath(path, index, undefined); + const asyncPayloadRecord = new StreamRecord({ + label, + path: fieldPath, + parentContext: previousAsyncPayloadRecord, + iterator, + exeContext, + }); + + const dataPromise = executeStreamIteratorItem( + iterator, + exeContext, + fieldNodes, + info, + itemType, + asyncPayloadRecord, + fieldPath, + ); + + asyncPayloadRecord.addItems( + dataPromise + .then(({ value }) => value) + .then( + (value) => [value], + (err) => { + asyncPayloadRecord.errors.push(err); + return null; + }, + ), + ); + try { + // eslint-disable-next-line no-await-in-loop + const { done } = await dataPromise; + if (done) { + break; + } + } catch (err) { + // entire stream has errored and bubbled upwards + filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + if (iterator?.return) { + iterator.return().catch(() => { + // ignore errors + }); + } + return; + } + previousAsyncPayloadRecord = asyncPayloadRecord; + index++; + } +} + +function filterSubsequentPayloads( + exeContext: ExecutionContext, + nullPath?: Path, + currentAsyncRecord?: AsyncPayloadRecord, +): void { + const nullPathArray = pathToArray(nullPath); + exeContext.subsequentPayloads.forEach((asyncRecord) => { + if (asyncRecord === currentAsyncRecord) { + // don't remove payload from where error originates + return; + } + for (let i = 0; i < nullPathArray.length; i++) { + if (asyncRecord.path[i] !== nullPathArray[i]) { + // asyncRecord points to a path unaffected by this payload + return; + } + } + // asyncRecord path points to nulled error field + if (isStreamPayload(asyncRecord) && asyncRecord.iterator?.return) { + asyncRecord.iterator.return().catch(() => { + // ignore error + }); + } + exeContext.subsequentPayloads.delete(asyncRecord); + }); +} + +function getCompletedIncrementalResults( + exeContext: ExecutionContext, +): Array { + const incrementalResults: Array = []; + for (const asyncPayloadRecord of exeContext.subsequentPayloads) { + const incrementalResult: IncrementalResult = {}; + if (!asyncPayloadRecord.isCompleted) { + continue; + } + exeContext.subsequentPayloads.delete(asyncPayloadRecord); + if (isStreamPayload(asyncPayloadRecord)) { + const items = asyncPayloadRecord.items; + if (asyncPayloadRecord.isCompletedIterator) { + // async iterable resolver just finished but there may be pending payloads + continue; + } + (incrementalResult as IncrementalStreamResult).items = items; + } else { + const data = asyncPayloadRecord.data; + (incrementalResult as IncrementalDeferResult).data = data ?? null; + } + + incrementalResult.path = asyncPayloadRecord.path; + if (asyncPayloadRecord.label) { + incrementalResult.label = asyncPayloadRecord.label; + } + if (asyncPayloadRecord.errors.length > 0) { + incrementalResult.errors = asyncPayloadRecord.errors; + } + incrementalResults.push(incrementalResult); + } + return incrementalResults; +} + +function yieldSubsequentPayloads( + exeContext: ExecutionContext, +): AsyncGenerator { + let isDone = false; + + async function next(): Promise< + IteratorResult + > { + if (isDone) { + return { value: undefined, done: true }; + } + + await Promise.race( + Array.from(exeContext.subsequentPayloads).map((p) => p.promise), + ); + + if (isDone) { + // a different call to next has exhausted all payloads + return { value: undefined, done: true }; + } + + const incremental = getCompletedIncrementalResults(exeContext); + const hasNext = exeContext.subsequentPayloads.size > 0; + + if (!incremental.length && hasNext) { + return next(); + } + + if (!hasNext) { + isDone = true; + } + + return { + value: incremental.length ? { incremental, hasNext } : { hasNext }, + done: false, + }; + } + + function returnStreamIterators() { + const promises: Array>> = []; + exeContext.subsequentPayloads.forEach((asyncPayloadRecord) => { + if ( + isStreamPayload(asyncPayloadRecord) && + asyncPayloadRecord.iterator?.return + ) { + promises.push(asyncPayloadRecord.iterator.return()); + } + }); + return Promise.all(promises); + } + + return { + [Symbol.asyncIterator]() { + return this; + }, + next, + async return(): Promise< + IteratorResult + > { + await returnStreamIterators(); + isDone = true; + return { value: undefined, done: true }; + }, + async throw( + error?: unknown, + ): Promise> { + await returnStreamIterators(); + isDone = true; + return Promise.reject(error); + }, + }; +} + +class DeferredFragmentRecord { + type: 'defer'; + errors: Array; + label: string | undefined; + path: Array; + promise: Promise; + data: ObjMap | null; + parentContext: AsyncPayloadRecord | undefined; + isCompleted: boolean; + _exeContext: ExecutionContext; + _resolve?: (arg: PromiseOrValue | null>) => void; + constructor(opts: { + label: string | undefined; + path: Path | undefined; + parentContext: AsyncPayloadRecord | undefined; + exeContext: ExecutionContext; + }) { + this.type = 'defer'; + this.label = opts.label; + this.path = pathToArray(opts.path); + this.parentContext = opts.parentContext; + this.errors = []; + this._exeContext = opts.exeContext; + this._exeContext.subsequentPayloads.add(this); + this.isCompleted = false; + this.data = null; + this.promise = new Promise | null>((resolve) => { + this._resolve = (promiseOrValue) => { + resolve(promiseOrValue); + }; + }).then((data) => { + this.data = data; + this.isCompleted = true; + }); + } + + addData(data: PromiseOrValue | null>) { + const parentData = this.parentContext?.promise; + if (parentData) { + this._resolve?.(parentData.then(() => data)); + return; + } + this._resolve?.(data); + } +} + +class StreamRecord { + type: 'stream'; + errors: Array; + label: string | undefined; + path: Array; + items: Array | null; + promise: Promise; + parentContext: AsyncPayloadRecord | undefined; + iterator: AsyncIterator | undefined; + isCompletedIterator?: boolean; + isCompleted: boolean; + _exeContext: ExecutionContext; + _resolve?: (arg: PromiseOrValue | null>) => void; + constructor(opts: { + label: string | undefined; + path: Path | undefined; + iterator?: AsyncIterator; + parentContext: AsyncPayloadRecord | undefined; + exeContext: ExecutionContext; + }) { + this.type = 'stream'; + this.items = null; + this.label = opts.label; + this.path = pathToArray(opts.path); + this.parentContext = opts.parentContext; + this.iterator = opts.iterator; + this.errors = []; + this._exeContext = opts.exeContext; + this._exeContext.subsequentPayloads.add(this); + this.isCompleted = false; + this.items = null; + this.promise = new Promise | null>((resolve) => { + this._resolve = (promiseOrValue) => { + resolve(promiseOrValue); + }; + }).then((items) => { + this.items = items; + this.isCompleted = true; + }); + } + + addItems(items: PromiseOrValue | null>) { + const parentData = this.parentContext?.promise; + if (parentData) { + this._resolve?.(parentData.then(() => items)); + return; + } + this._resolve?.(items); + } + + setIsCompletedIterator() { + this.isCompletedIterator = true; + } +} + +type AsyncPayloadRecord = DeferredFragmentRecord | StreamRecord; + +function isStreamPayload( + asyncPayload: AsyncPayloadRecord, +): asyncPayload is StreamRecord { + return asyncPayload.type === 'stream'; +} diff --git a/src/execution/flattenAsyncIterable.ts b/src/execution/flattenAsyncIterable.ts new file mode 100644 index 0000000000..22bdb02338 --- /dev/null +++ b/src/execution/flattenAsyncIterable.ts @@ -0,0 +1,105 @@ +type AsyncIterableOrGenerator = + | AsyncGenerator + | AsyncIterable; + +/** + * Given an AsyncIterable of AsyncIterables, flatten all yielded results into a + * single AsyncIterable. + */ +export function flattenAsyncIterable( + iterable: AsyncIterableOrGenerator>, +): AsyncGenerator { + // You might think this whole function could be replaced with + // + // async function* flattenAsyncIterable(iterable) { + // for await (const subIterator of iterable) { + // yield* subIterator; + // } + // } + // + // but calling `.return()` on the iterator it returns won't interrupt the `for await`. + + const topIterator = iterable[Symbol.asyncIterator](); + let currentNestedIterator: AsyncIterator | undefined; + let waitForCurrentNestedIterator: Promise | undefined; + let done = false; + + async function next(): Promise> { + if (done) { + return { value: undefined, done: true }; + } + + try { + if (!currentNestedIterator) { + // Somebody else is getting it already. + if (waitForCurrentNestedIterator) { + await waitForCurrentNestedIterator; + return await next(); + } + // Nobody else is getting it. We should! + let resolve: () => void; + waitForCurrentNestedIterator = new Promise((r) => { + resolve = r; + }); + const topIteratorResult = await topIterator.next(); + if (topIteratorResult.done) { + // Given that done only ever transitions from false to true, + // require-atomic-updates is being unnecessarily cautious. + // eslint-disable-next-line require-atomic-updates + done = true; + return await next(); + } + // eslint is making a reasonable point here, but we've explicitly protected + // ourself from the race condition by ensuring that only the single call + // that assigns to waitForCurrentNestedIterator is allowed to assign to + // currentNestedIterator or waitForCurrentNestedIterator. + // eslint-disable-next-line require-atomic-updates + currentNestedIterator = topIteratorResult.value[Symbol.asyncIterator](); + // eslint-disable-next-line require-atomic-updates + waitForCurrentNestedIterator = undefined; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + resolve!(); + return await next(); + } + + const rememberCurrentNestedIterator = currentNestedIterator; + const nestedIteratorResult = await currentNestedIterator.next(); + if (!nestedIteratorResult.done) { + return nestedIteratorResult; + } + + // The nested iterator is done. If it's still the current one, make it not + // current. (If it's not the current one, somebody else has made us move on.) + if (currentNestedIterator === rememberCurrentNestedIterator) { + currentNestedIterator = undefined; + } + return await next(); + } catch (err) { + done = true; + throw err; + } + } + return { + next, + async return() { + done = true; + await Promise.all([ + currentNestedIterator?.return?.(), + topIterator.return?.(), + ]); + return { value: undefined, done: true }; + }, + async throw(error?: unknown): Promise> { + done = true; + await Promise.all([ + currentNestedIterator?.throw?.(error), + topIterator.throw?.(error), + ]); + /* c8 ignore next */ + throw error; + }, + [Symbol.asyncIterator]() { + return this; + }, + }; +} diff --git a/src/execution/index.ts b/src/execution/index.ts index b27a2c291c..46a4688d59 100644 --- a/src/execution/index.ts +++ b/src/execution/index.ts @@ -1,22 +1,35 @@ -export { pathToArray as responsePathAsArray } from '../jsutils/Path'; +export { pathToArray as responsePathAsArray } from '../jsutils/Path.js'; export { createSourceEventStream, execute, + experimentalExecuteIncrementally, executeSync, defaultFieldResolver, defaultTypeResolver, subscribe, -} from './execute'; + experimentalSubscribeIncrementally, +} from './execute.js'; export type { ExecutionArgs, ExecutionResult, + ExperimentalIncrementalExecutionResults, + InitialIncrementalExecutionResult, + SubsequentIncrementalExecutionResult, + IncrementalDeferResult, + IncrementalStreamResult, + IncrementalResult, FormattedExecutionResult, -} from './execute'; + FormattedInitialIncrementalExecutionResult, + FormattedSubsequentIncrementalExecutionResult, + FormattedIncrementalDeferResult, + FormattedIncrementalStreamResult, + FormattedIncrementalResult, +} from './execute.js'; export { getArgumentValues, getVariableValues, getDirectiveValues, -} from './values'; +} from './values.js'; diff --git a/src/execution/mapAsyncIterable.ts b/src/execution/mapAsyncIterable.ts index f61855c8cf..0f6fd78c2d 100644 --- a/src/execution/mapAsyncIterable.ts +++ b/src/execution/mapAsyncIterable.ts @@ -1,4 +1,4 @@ -import type { PromiseOrValue } from '../jsutils/PromiseOrValue'; +import type { PromiseOrValue } from '../jsutils/PromiseOrValue.js'; /** * Given an AsyncIterable and a callback function, return an AsyncIterator diff --git a/src/execution/values.ts b/src/execution/values.ts index 773d484296..bbe3c99c8e 100644 --- a/src/execution/values.ts +++ b/src/execution/values.ts @@ -1,27 +1,27 @@ -import { inspect } from '../jsutils/inspect'; -import { keyMap } from '../jsutils/keyMap'; -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; -import { printPathArray } from '../jsutils/printPathArray'; +import { inspect } from '../jsutils/inspect.js'; +import { keyMap } from '../jsutils/keyMap.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; +import { printPathArray } from '../jsutils/printPathArray.js'; -import { GraphQLError } from '../error/GraphQLError'; +import { GraphQLError } from '../error/GraphQLError.js'; import type { DirectiveNode, FieldNode, VariableDefinitionNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; -import { print } from '../language/printer'; - -import type { GraphQLField } from '../type/definition'; -import { isInputType, isNonNullType } from '../type/definition'; -import type { GraphQLDirective } from '../type/directives'; -import type { GraphQLSchema } from '../type/schema'; - -import { coerceInputValue } from '../utilities/coerceInputValue'; -import { typeFromAST } from '../utilities/typeFromAST'; -import { valueFromAST } from '../utilities/valueFromAST'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; +import { print } from '../language/printer.js'; + +import type { GraphQLField } from '../type/definition.js'; +import { isInputType, isNonNullType } from '../type/definition.js'; +import type { GraphQLDirective } from '../type/directives.js'; +import type { GraphQLSchema } from '../type/schema.js'; + +import { coerceInputValue } from '../utilities/coerceInputValue.js'; +import { typeFromAST } from '../utilities/typeFromAST.js'; +import { valueFromAST } from '../utilities/valueFromAST.js'; type CoercedVariableValues = | { errors: ReadonlyArray; coerced?: never } diff --git a/src/graphql.ts b/src/graphql.ts index ffad9123c1..109bc75d92 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -1,21 +1,21 @@ -import { isPromise } from './jsutils/isPromise'; -import type { Maybe } from './jsutils/Maybe'; -import type { PromiseOrValue } from './jsutils/PromiseOrValue'; +import { isPromise } from './jsutils/isPromise.js'; +import type { Maybe } from './jsutils/Maybe.js'; +import type { PromiseOrValue } from './jsutils/PromiseOrValue.js'; -import { parse } from './language/parser'; -import type { Source } from './language/source'; +import { parse } from './language/parser.js'; +import type { Source } from './language/source.js'; import type { GraphQLFieldResolver, GraphQLTypeResolver, -} from './type/definition'; -import type { GraphQLSchema } from './type/schema'; -import { validateSchema } from './type/validate'; +} from './type/definition.js'; +import type { GraphQLSchema } from './type/schema.js'; +import { validateSchema } from './type/validate.js'; -import { validate } from './validation/validate'; +import { validate } from './validation/validate.js'; -import type { ExecutionResult } from './execution/execute'; -import { execute } from './execution/execute'; +import type { ExecutionResult } from './execution/execute.js'; +import { execute } from './execution/execute.js'; /** * This is the primary entry point function for fulfilling GraphQL operations @@ -26,6 +26,8 @@ import { execute } from './execution/execute'; * may wish to separate the validation and execution phases to a static time * tooling step, and a server runtime step. * + * This function does not support incremental delivery (`@defer` and `@stream`). + * * Accepts either an object with named arguments, or individual arguments: * * schema: diff --git a/src/index.ts b/src/index.ts index b3a06a18cd..5e05627fbe 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,11 +27,11 @@ */ // The GraphQL.js version info. -export { version, versionInfo } from './version'; +export { version, versionInfo } from './version.js'; // The primary entry point into fulfilling a GraphQL request. -export type { GraphQLArgs } from './graphql'; -export { graphql, graphqlSync } from './graphql'; +export type { GraphQLArgs } from './graphql.js'; +export { graphql, graphqlSync } from './graphql.js'; // Create and operate on GraphQL type definitions and schema. export { @@ -62,6 +62,8 @@ export { specifiedDirectives, GraphQLIncludeDirective, GraphQLSkipDirective, + GraphQLDeferDirective, + GraphQLStreamDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, // "Enum" of Type Kinds @@ -136,7 +138,7 @@ export { // Upholds the spec rules about naming. assertName, assertEnumValueName, -} from './type/index'; +} from './type/index.js'; export type { GraphQLType, @@ -196,7 +198,7 @@ export type { GraphQLScalarSerializer, GraphQLScalarValueParser, GraphQLScalarLiteralParser, -} from './type/index'; +} from './type/index.js'; // Parse and operate on GraphQL language source files. export { @@ -237,7 +239,7 @@ export { isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode, -} from './language/index'; +} from './language/index.js'; export type { ParseOptions, @@ -312,11 +314,12 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, -} from './language/index'; +} from './language/index.js'; // Execute GraphQL queries. export { execute, + experimentalExecuteIncrementally, executeSync, defaultFieldResolver, defaultTypeResolver, @@ -325,14 +328,26 @@ export { getVariableValues, getDirectiveValues, subscribe, + experimentalSubscribeIncrementally, createSourceEventStream, -} from './execution/index'; +} from './execution/index.js'; export type { ExecutionArgs, ExecutionResult, + ExperimentalIncrementalExecutionResults, + InitialIncrementalExecutionResult, + SubsequentIncrementalExecutionResult, + IncrementalDeferResult, + IncrementalStreamResult, + IncrementalResult, FormattedExecutionResult, -} from './execution/index'; + FormattedInitialIncrementalExecutionResult, + FormattedSubsequentIncrementalExecutionResult, + FormattedIncrementalDeferResult, + FormattedIncrementalStreamResult, + FormattedIncrementalResult, +} from './execution/index.js'; // Validate GraphQL documents. export { @@ -379,18 +394,18 @@ export { // Custom validation rules NoDeprecatedCustomRule, NoSchemaIntrospectionCustomRule, -} from './validation/index'; +} from './validation/index.js'; -export type { ValidationRule } from './validation/index'; +export type { ValidationRule } from './validation/index.js'; // Create, format, and print GraphQL errors. -export { GraphQLError, syntaxError, locatedError } from './error/index'; +export { GraphQLError, syntaxError, locatedError } from './error/index.js'; export type { GraphQLErrorOptions, GraphQLFormattedError, GraphQLErrorExtensions, -} from './error/index'; +} from './error/index.js'; // Utilities for operating on GraphQL type schema and parsed sources. export { @@ -445,7 +460,7 @@ export { DangerousChangeType, findBreakingChanges, findDangerousChanges, -} from './utilities/index'; +} from './utilities/index.js'; export type { IntrospectionOptions, @@ -474,4 +489,4 @@ export type { BreakingChange, DangerousChange, TypedQueryDocumentNode, -} from './utilities/index'; +} from './utilities/index.js'; diff --git a/src/jsutils/Path.ts b/src/jsutils/Path.ts index 64f6c78358..d223b6e752 100644 --- a/src/jsutils/Path.ts +++ b/src/jsutils/Path.ts @@ -1,4 +1,4 @@ -import type { Maybe } from './Maybe'; +import type { Maybe } from './Maybe.js'; export interface Path { readonly prev: Path | undefined; diff --git a/src/jsutils/__tests__/AccumulatorMap-test.ts b/src/jsutils/__tests__/AccumulatorMap-test.ts index b4360a7951..9b2865398a 100644 --- a/src/jsutils/__tests__/AccumulatorMap-test.ts +++ b/src/jsutils/__tests__/AccumulatorMap-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { AccumulatorMap } from '../AccumulatorMap'; +import { AccumulatorMap } from '../AccumulatorMap.js'; function expectMap(map: Map) { return expect(Object.fromEntries(map)); diff --git a/src/jsutils/__tests__/Path-test.ts b/src/jsutils/__tests__/Path-test.ts index 43bca192c0..0484377db9 100644 --- a/src/jsutils/__tests__/Path-test.ts +++ b/src/jsutils/__tests__/Path-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { addPath, pathToArray } from '../Path'; +import { addPath, pathToArray } from '../Path.js'; describe('Path', () => { it('can create a Path', () => { diff --git a/src/jsutils/__tests__/capitalize-test.ts b/src/jsutils/__tests__/capitalize-test.ts index 48ae886c11..c0d082acfc 100644 --- a/src/jsutils/__tests__/capitalize-test.ts +++ b/src/jsutils/__tests__/capitalize-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { capitalize } from '../capitalize'; +import { capitalize } from '../capitalize.js'; describe('capitalize', () => { it('Converts the first character of string to upper case and the remaining to lower case', () => { diff --git a/src/jsutils/__tests__/didYouMean-test.ts b/src/jsutils/__tests__/didYouMean-test.ts index bc01e18080..1cac761f7d 100644 --- a/src/jsutils/__tests__/didYouMean-test.ts +++ b/src/jsutils/__tests__/didYouMean-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { didYouMean } from '../didYouMean'; +import { didYouMean } from '../didYouMean.js'; describe('didYouMean', () => { it('Does accept an empty list', () => { diff --git a/src/jsutils/__tests__/identityFunc-test.ts b/src/jsutils/__tests__/identityFunc-test.ts index 97cc25eb2f..e49419dbcd 100644 --- a/src/jsutils/__tests__/identityFunc-test.ts +++ b/src/jsutils/__tests__/identityFunc-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../identityFunc'; +import { identityFunc } from '../identityFunc.js'; describe('identityFunc', () => { it('returns the first argument it receives', () => { diff --git a/src/jsutils/__tests__/inspect-test.ts b/src/jsutils/__tests__/inspect-test.ts index d1ac17313a..de74beeb26 100644 --- a/src/jsutils/__tests__/inspect-test.ts +++ b/src/jsutils/__tests__/inspect-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { inspect } from '../inspect'; +import { inspect } from '../inspect.js'; describe('inspect', () => { it('undefined', () => { diff --git a/src/jsutils/__tests__/instanceOf-test.ts b/src/jsutils/__tests__/instanceOf-test.ts index cbd649bfa8..5a54a641e5 100644 --- a/src/jsutils/__tests__/instanceOf-test.ts +++ b/src/jsutils/__tests__/instanceOf-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { instanceOf } from '../instanceOf'; +import { instanceOf } from '../instanceOf.js'; describe('instanceOf', () => { it('do not throw on values without prototype', () => { diff --git a/src/jsutils/__tests__/invariant-test.ts b/src/jsutils/__tests__/invariant-test.ts index 2a438b69b3..830ebe0bb7 100644 --- a/src/jsutils/__tests__/invariant-test.ts +++ b/src/jsutils/__tests__/invariant-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { invariant } from '../invariant'; +import { invariant } from '../invariant.js'; describe('invariant', () => { it('throws on false conditions', () => { diff --git a/src/jsutils/__tests__/isAsyncIterable-test.ts b/src/jsutils/__tests__/isAsyncIterable-test.ts index e62bb53433..3188061043 100644 --- a/src/jsutils/__tests__/isAsyncIterable-test.ts +++ b/src/jsutils/__tests__/isAsyncIterable-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../identityFunc'; -import { isAsyncIterable } from '../isAsyncIterable'; +import { identityFunc } from '../identityFunc.js'; +import { isAsyncIterable } from '../isAsyncIterable.js'; describe('isAsyncIterable', () => { it('should return `true` for AsyncIterable', () => { diff --git a/src/jsutils/__tests__/isIterableObject-test.ts b/src/jsutils/__tests__/isIterableObject-test.ts index c631cb4b80..eedfd25a36 100644 --- a/src/jsutils/__tests__/isIterableObject-test.ts +++ b/src/jsutils/__tests__/isIterableObject-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../identityFunc'; -import { isIterableObject } from '../isIterableObject'; +import { identityFunc } from '../identityFunc.js'; +import { isIterableObject } from '../isIterableObject.js'; describe('isIterableObject', () => { it('should return `true` for collections', () => { diff --git a/src/jsutils/__tests__/isObjectLike-test.ts b/src/jsutils/__tests__/isObjectLike-test.ts index 536ecb5f88..6dffcc7655 100644 --- a/src/jsutils/__tests__/isObjectLike-test.ts +++ b/src/jsutils/__tests__/isObjectLike-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../identityFunc'; -import { isObjectLike } from '../isObjectLike'; +import { identityFunc } from '../identityFunc.js'; +import { isObjectLike } from '../isObjectLike.js'; describe('isObjectLike', () => { it('should return `true` for objects', () => { diff --git a/src/jsutils/__tests__/naturalCompare-test.ts b/src/jsutils/__tests__/naturalCompare-test.ts index 4c5291e579..482b99f4ff 100644 --- a/src/jsutils/__tests__/naturalCompare-test.ts +++ b/src/jsutils/__tests__/naturalCompare-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { naturalCompare } from '../naturalCompare'; +import { naturalCompare } from '../naturalCompare.js'; describe('naturalCompare', () => { it('Handles empty strings', () => { diff --git a/src/jsutils/__tests__/suggestionList-test.ts b/src/jsutils/__tests__/suggestionList-test.ts index 2b90524885..06719d8a1e 100644 --- a/src/jsutils/__tests__/suggestionList-test.ts +++ b/src/jsutils/__tests__/suggestionList-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { suggestionList } from '../suggestionList'; +import { suggestionList } from '../suggestionList.js'; function expectSuggestions(input: string, options: ReadonlyArray) { return expect(suggestionList(input, options)); diff --git a/src/jsutils/__tests__/toObjMap-test.ts b/src/jsutils/__tests__/toObjMap-test.ts index f9136b87b8..a6efb34e48 100644 --- a/src/jsutils/__tests__/toObjMap-test.ts +++ b/src/jsutils/__tests__/toObjMap-test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import type { ObjMapLike } from '../ObjMap'; -import { toObjMap } from '../toObjMap'; +import type { ObjMapLike } from '../ObjMap.js'; +import { toObjMap } from '../toObjMap.js'; // Workaround to make both ESLint happy const __proto__ = '__proto__'; diff --git a/src/jsutils/didYouMean.ts b/src/jsutils/didYouMean.ts index ef1931c7d7..15735bdb7e 100644 --- a/src/jsutils/didYouMean.ts +++ b/src/jsutils/didYouMean.ts @@ -1,4 +1,4 @@ -import { orList } from './formatList'; +import { orList } from './formatList.js'; const MAX_SUGGESTIONS = 5; diff --git a/src/jsutils/formatList.ts b/src/jsutils/formatList.ts index fe3afe53a6..b00dd6591a 100644 --- a/src/jsutils/formatList.ts +++ b/src/jsutils/formatList.ts @@ -1,4 +1,4 @@ -import { invariant } from './invariant'; +import { invariant } from './invariant.js'; /** * Given [ A, B, C ] return 'A, B, or C'. diff --git a/src/jsutils/groupBy.ts b/src/jsutils/groupBy.ts index 60e02ea304..15deeb4e6f 100644 --- a/src/jsutils/groupBy.ts +++ b/src/jsutils/groupBy.ts @@ -1,4 +1,4 @@ -import { AccumulatorMap } from './AccumulatorMap'; +import { AccumulatorMap } from './AccumulatorMap.js'; /** * Groups array items into a Map, given a function to produce grouping key. diff --git a/src/jsutils/instanceOf.ts b/src/jsutils/instanceOf.ts index b917cfc3bf..9c3f80f3ed 100644 --- a/src/jsutils/instanceOf.ts +++ b/src/jsutils/instanceOf.ts @@ -1,4 +1,4 @@ -import { inspect } from './inspect'; +import { inspect } from './inspect.js'; /** * A replacement for instanceof which includes an error warning when multi-realm diff --git a/src/jsutils/keyMap.ts b/src/jsutils/keyMap.ts index 592a98c83d..3b278dd8e9 100644 --- a/src/jsutils/keyMap.ts +++ b/src/jsutils/keyMap.ts @@ -1,4 +1,4 @@ -import type { ObjMap } from './ObjMap'; +import type { ObjMap } from './ObjMap.js'; /** * Creates a keyed JS object from an array, given a function to produce the keys diff --git a/src/jsutils/keyValMap.ts b/src/jsutils/keyValMap.ts index 94d688c2c1..4477df121b 100644 --- a/src/jsutils/keyValMap.ts +++ b/src/jsutils/keyValMap.ts @@ -1,4 +1,4 @@ -import type { ObjMap } from './ObjMap'; +import type { ObjMap } from './ObjMap.js'; /** * Creates a keyed JS object from an array, given a function to produce the keys diff --git a/src/jsutils/mapValue.ts b/src/jsutils/mapValue.ts index 32686a29c1..8f1299586e 100644 --- a/src/jsutils/mapValue.ts +++ b/src/jsutils/mapValue.ts @@ -1,4 +1,4 @@ -import type { ObjMap, ReadOnlyObjMap } from './ObjMap'; +import type { ObjMap, ReadOnlyObjMap } from './ObjMap.js'; /** * Creates an object map with the same keys as `map` and values generated by diff --git a/src/jsutils/promiseForObject.ts b/src/jsutils/promiseForObject.ts index ede94dc803..ff48d9f218 100644 --- a/src/jsutils/promiseForObject.ts +++ b/src/jsutils/promiseForObject.ts @@ -1,4 +1,4 @@ -import type { ObjMap } from './ObjMap'; +import type { ObjMap } from './ObjMap.js'; /** * This function transforms a JS object `ObjMap>` into @@ -7,17 +7,16 @@ import type { ObjMap } from './ObjMap'; * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ -export function promiseForObject( +export async function promiseForObject( object: ObjMap>, ): Promise> { const keys = Object.keys(object); const values = Object.values(object); - return Promise.all(values).then((resolvedValues) => { - const resolvedObject = Object.create(null); - for (let i = 0; i < keys.length; ++i) { - resolvedObject[keys[i]] = resolvedValues[i]; - } - return resolvedObject; - }); + const resolvedValues = await Promise.all(values); + const resolvedObject = Object.create(null); + for (let i = 0; i < keys.length; ++i) { + resolvedObject[keys[i]] = resolvedValues[i]; + } + return resolvedObject; } diff --git a/src/jsutils/promiseReduce.ts b/src/jsutils/promiseReduce.ts index 58db2e85c8..871b9c3cf7 100644 --- a/src/jsutils/promiseReduce.ts +++ b/src/jsutils/promiseReduce.ts @@ -1,5 +1,5 @@ -import { isPromise } from './isPromise'; -import type { PromiseOrValue } from './PromiseOrValue'; +import { isPromise } from './isPromise.js'; +import type { PromiseOrValue } from './PromiseOrValue.js'; /** * Similar to Array.prototype.reduce(), however the reducing callback may return diff --git a/src/jsutils/suggestionList.ts b/src/jsutils/suggestionList.ts index 53ad685c8c..4114ddad39 100644 --- a/src/jsutils/suggestionList.ts +++ b/src/jsutils/suggestionList.ts @@ -1,4 +1,4 @@ -import { naturalCompare } from './naturalCompare'; +import { naturalCompare } from './naturalCompare.js'; /** * Given an invalid input string and a list of valid options, returns a filtered diff --git a/src/jsutils/toError.ts b/src/jsutils/toError.ts index 8d562273d6..d4cb42005d 100644 --- a/src/jsutils/toError.ts +++ b/src/jsutils/toError.ts @@ -1,4 +1,4 @@ -import { inspect } from './inspect'; +import { inspect } from './inspect.js'; /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. diff --git a/src/jsutils/toObjMap.ts b/src/jsutils/toObjMap.ts index 6fe352db23..c7adab7b34 100644 --- a/src/jsutils/toObjMap.ts +++ b/src/jsutils/toObjMap.ts @@ -1,5 +1,5 @@ -import type { Maybe } from './Maybe'; -import type { ReadOnlyObjMap, ReadOnlyObjMapLike } from './ObjMap'; +import type { Maybe } from './Maybe.js'; +import type { ReadOnlyObjMap, ReadOnlyObjMapLike } from './ObjMap.js'; export function toObjMap( obj: Maybe>, diff --git a/src/language/__tests__/blockString-fuzz.ts b/src/language/__tests__/blockString-fuzz.ts index f4aea2cc6b..8707243a6f 100644 --- a/src/language/__tests__/blockString-fuzz.ts +++ b/src/language/__tests__/blockString-fuzz.ts @@ -1,13 +1,13 @@ import { assert } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { genFuzzStrings } from '../../__testUtils__/genFuzzStrings'; -import { inspectStr } from '../../__testUtils__/inspectStr'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { genFuzzStrings } from '../../__testUtils__/genFuzzStrings.js'; +import { inspectStr } from '../../__testUtils__/inspectStr.js'; -import { isPrintableAsBlockString, printBlockString } from '../blockString'; -import { Lexer } from '../lexer'; -import { Source } from '../source'; +import { isPrintableAsBlockString, printBlockString } from '../blockString.js'; +import { Lexer } from '../lexer.js'; +import { Source } from '../source.js'; function lexValue(str: string): string { const lexer = new Lexer(new Source(str)); diff --git a/src/language/__tests__/blockString-test.ts b/src/language/__tests__/blockString-test.ts index 21fa49b00a..93c642b4b2 100644 --- a/src/language/__tests__/blockString-test.ts +++ b/src/language/__tests__/blockString-test.ts @@ -5,7 +5,7 @@ import { dedentBlockStringLines, isPrintableAsBlockString, printBlockString, -} from '../blockString'; +} from '../blockString.js'; function joinLines(...args: ReadonlyArray) { return args.join('\n'); diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index 0f19d86063..1160a703d9 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -1,17 +1,17 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { expectToThrowJSON } from '../../__testUtils__/expectJSON'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { expectToThrowJSON } from '../../__testUtils__/expectJSON.js'; -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { Token } from '../ast'; -import { isPunctuatorTokenKind, Lexer } from '../lexer'; -import { Source } from '../source'; -import { TokenKind } from '../tokenKind'; +import type { Token } from '../ast.js'; +import { isPunctuatorTokenKind, Lexer } from '../lexer.js'; +import { Source } from '../source.js'; +import { TokenKind } from '../tokenKind.js'; function lexOne(str: string) { const lexer = new Lexer(new Source(str)); diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index cb7222048f..7c988a0181 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -1,16 +1,19 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { expectJSON, expectToThrowJSON } from '../../__testUtils__/expectJSON'; -import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery'; - -import { inspect } from '../../jsutils/inspect'; - -import { Kind } from '../kinds'; -import { parse, parseConstValue, parseType, parseValue } from '../parser'; -import { Source } from '../source'; -import { TokenKind } from '../tokenKind'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { + expectJSON, + expectToThrowJSON, +} from '../../__testUtils__/expectJSON.js'; +import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js'; + +import { inspect } from '../../jsutils/inspect.js'; + +import { Kind } from '../kinds.js'; +import { parse, parseConstValue, parseType, parseValue } from '../parser.js'; +import { Source } from '../source.js'; +import { TokenKind } from '../tokenKind.js'; function parseCCN(source: string) { return parse(source, { experimentalClientControlledNullability: true }); diff --git a/src/language/__tests__/predicates-test.ts b/src/language/__tests__/predicates-test.ts index 341a5715db..55e5782648 100644 --- a/src/language/__tests__/predicates-test.ts +++ b/src/language/__tests__/predicates-test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import type { ASTNode } from '../ast'; -import { Kind } from '../kinds'; -import { parseValue } from '../parser'; +import type { ASTNode } from '../ast.js'; +import { Kind } from '../kinds.js'; +import { parseValue } from '../parser.js'; import { isConstValueNode, isDefinitionNode, @@ -16,7 +16,7 @@ import { isTypeSystemDefinitionNode, isTypeSystemExtensionNode, isValueNode, -} from '../predicates'; +} from '../predicates.js'; function filterNodes(predicate: (node: ASTNode) => boolean): Array { return Object.values(Kind).filter( diff --git a/src/language/__tests__/printLocation-test.ts b/src/language/__tests__/printLocation-test.ts index c5eac8cce5..58074fa59c 100644 --- a/src/language/__tests__/printLocation-test.ts +++ b/src/language/__tests__/printLocation-test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { printSourceLocation } from '../printLocation'; -import { Source } from '../source'; +import { printSourceLocation } from '../printLocation.js'; +import { Source } from '../source.js'; describe('printSourceLocation', () => { it('prints minified documents', () => { diff --git a/src/language/__tests__/printString-test.ts b/src/language/__tests__/printString-test.ts index fff1bfeec0..e59b624bd0 100644 --- a/src/language/__tests__/printString-test.ts +++ b/src/language/__tests__/printString-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { printString } from '../printString'; +import { printString } from '../printString.js'; describe('printString', () => { it('prints a simple string', () => { diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 1050164763..0585cae6d9 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent, dedentString } from '../../__testUtils__/dedent'; -import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery'; +import { dedent, dedentString } from '../../__testUtils__/dedent.js'; +import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js'; -import { Kind } from '../kinds'; -import { parse } from '../parser'; -import { print } from '../printer'; +import { Kind } from '../kinds.js'; +import { parse } from '../parser.js'; +import { print } from '../printer.js'; describe('Printer: Query document', () => { it('prints minimal ast', () => { diff --git a/src/language/__tests__/schema-parser-test.ts b/src/language/__tests__/schema-parser-test.ts index cbb337c337..27ac5c1bfb 100644 --- a/src/language/__tests__/schema-parser-test.ts +++ b/src/language/__tests__/schema-parser-test.ts @@ -1,11 +1,14 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { expectJSON, expectToThrowJSON } from '../../__testUtils__/expectJSON'; -import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL'; - -import { parse } from '../parser'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { + expectJSON, + expectToThrowJSON, +} from '../../__testUtils__/expectJSON.js'; +import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL.js'; + +import { parse } from '../parser.js'; function expectSyntaxError(text: string) { return expectToThrowJSON(() => parse(text)); diff --git a/src/language/__tests__/schema-printer-test.ts b/src/language/__tests__/schema-printer-test.ts index 7272b2f2b8..3de9865c2c 100644 --- a/src/language/__tests__/schema-printer-test.ts +++ b/src/language/__tests__/schema-printer-test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL.js'; -import { Kind } from '../kinds'; -import { parse } from '../parser'; -import { print } from '../printer'; +import { Kind } from '../kinds.js'; +import { parse } from '../parser.js'; +import { print } from '../printer.js'; describe('Printer: SDL document', () => { it('prints minimal ast', () => { diff --git a/src/language/__tests__/source-test.ts b/src/language/__tests__/source-test.ts index 1e7d24601c..1d82816c90 100644 --- a/src/language/__tests__/source-test.ts +++ b/src/language/__tests__/source-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { Source } from '../source'; +import { Source } from '../source.js'; describe('Source', () => { it('can be Object.toStringified', () => { diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index a15f3df425..270c948225 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -1,14 +1,14 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery'; - -import type { ASTNode, SelectionSetNode } from '../ast'; -import { isNode } from '../ast'; -import { Kind } from '../kinds'; -import { parse } from '../parser'; -import type { ASTVisitor, ASTVisitorKeyMap } from '../visitor'; -import { BREAK, visit, visitInParallel } from '../visitor'; +import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js'; + +import type { ASTNode, SelectionSetNode } from '../ast.js'; +import { isNode } from '../ast.js'; +import { Kind } from '../kinds.js'; +import { parse } from '../parser.js'; +import type { ASTVisitor, ASTVisitorKeyMap } from '../visitor.js'; +import { BREAK, visit, visitInParallel } from '../visitor.js'; function checkVisitorFnArgs(ast: any, args: any, isEdited: boolean = false) { const [node, key, parent, path, ancestors] = args; diff --git a/src/language/ast.ts b/src/language/ast.ts index 0b47c6a599..22a7cc253c 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -1,6 +1,6 @@ -import type { Kind } from './kinds'; -import type { Source } from './source'; -import type { TokenKind } from './tokenKind'; +import type { Kind } from './kinds.js'; +import type { Source } from './source.js'; +import type { TokenKind } from './tokenKind.js'; /** * Contains a range of UTF-8 character offsets and token references that diff --git a/src/language/blockString.ts b/src/language/blockString.ts index 1c200c183a..667f91831e 100644 --- a/src/language/blockString.ts +++ b/src/language/blockString.ts @@ -1,4 +1,4 @@ -import { isWhiteSpace } from './characterClasses'; +import { isWhiteSpace } from './characterClasses.js'; /** * Produces the value of a block string from its parsed raw value, similar to diff --git a/src/language/index.ts b/src/language/index.ts index 0cb82194d5..fc87a566cc 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -1,25 +1,30 @@ -export { Source } from './source'; +export { Source } from './source.js'; -export { getLocation } from './location'; -export type { SourceLocation } from './location'; +export { getLocation } from './location.js'; +export type { SourceLocation } from './location.js'; -export { printLocation, printSourceLocation } from './printLocation'; +export { printLocation, printSourceLocation } from './printLocation.js'; -export { Kind } from './kinds'; +export { Kind } from './kinds.js'; -export { TokenKind } from './tokenKind'; +export { TokenKind } from './tokenKind.js'; -export { Lexer } from './lexer'; +export { Lexer } from './lexer.js'; -export { parse, parseValue, parseConstValue, parseType } from './parser'; -export type { ParseOptions } from './parser'; +export { parse, parseValue, parseConstValue, parseType } from './parser.js'; +export type { ParseOptions } from './parser.js'; -export { print } from './printer'; +export { print } from './printer.js'; -export { visit, visitInParallel, getEnterLeaveForKind, BREAK } from './visitor'; -export type { ASTVisitor, ASTVisitFn, ASTVisitorKeyMap } from './visitor'; +export { + visit, + visitInParallel, + getEnterLeaveForKind, + BREAK, +} from './visitor.js'; +export type { ASTVisitor, ASTVisitFn, ASTVisitorKeyMap } from './visitor.js'; -export { Location, Token, OperationTypeNode } from './ast'; +export { Location, Token, OperationTypeNode } from './ast.js'; export type { ASTNode, ASTKindToNode, @@ -86,7 +91,7 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, -} from './ast'; +} from './ast.js'; export { isDefinitionNode, @@ -100,6 +105,6 @@ export { isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode, -} from './predicates'; +} from './predicates.js'; -export { DirectiveLocation } from './directiveLocation'; +export { DirectiveLocation } from './directiveLocation.js'; diff --git a/src/language/lexer.ts b/src/language/lexer.ts index c3dc9322fe..c20c879700 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -1,10 +1,10 @@ -import { syntaxError } from '../error/syntaxError'; +import { syntaxError } from '../error/syntaxError.js'; -import { Token } from './ast'; -import { dedentBlockStringLines } from './blockString'; -import { isDigit, isNameContinue, isNameStart } from './characterClasses'; -import type { Source } from './source'; -import { TokenKind } from './tokenKind'; +import { Token } from './ast.js'; +import { dedentBlockStringLines } from './blockString.js'; +import { isDigit, isNameContinue, isNameStart } from './characterClasses.js'; +import type { Source } from './source.js'; +import { TokenKind } from './tokenKind.js'; /** * Given a Source object, creates a Lexer for that source. diff --git a/src/language/location.ts b/src/language/location.ts index 36d97f3cca..105137f8a3 100644 --- a/src/language/location.ts +++ b/src/language/location.ts @@ -1,6 +1,6 @@ -import { invariant } from '../jsutils/invariant'; +import { invariant } from '../jsutils/invariant.js'; -import type { Source } from './source'; +import type { Source } from './source.js'; const LineRegExp = /\r\n|[\n\r]/g; diff --git a/src/language/parser.ts b/src/language/parser.ts index e37f02b763..9eef51e327 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -1,7 +1,7 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { GraphQLError } from '../error/GraphQLError'; -import { syntaxError } from '../error/syntaxError'; +import type { GraphQLError } from '../error/GraphQLError.js'; +import { syntaxError } from '../error/syntaxError.js'; import type { ArgumentNode, @@ -63,13 +63,13 @@ import type { ValueNode, VariableDefinitionNode, VariableNode, -} from './ast'; -import { Location, OperationTypeNode } from './ast'; -import { DirectiveLocation } from './directiveLocation'; -import { Kind } from './kinds'; -import { isPunctuatorTokenKind, Lexer } from './lexer'; -import { isSource, Source } from './source'; -import { TokenKind } from './tokenKind'; +} from './ast.js'; +import { Location, OperationTypeNode } from './ast.js'; +import { DirectiveLocation } from './directiveLocation.js'; +import { Kind } from './kinds.js'; +import { isPunctuatorTokenKind, Lexer } from './lexer.js'; +import { isSource, Source } from './source.js'; +import { TokenKind } from './tokenKind.js'; /** * Configuration options to control parser behavior diff --git a/src/language/predicates.ts b/src/language/predicates.ts index 8a96681e9c..2c1b6a2ef3 100644 --- a/src/language/predicates.ts +++ b/src/language/predicates.ts @@ -11,8 +11,8 @@ import type { TypeSystemDefinitionNode, TypeSystemExtensionNode, ValueNode, -} from './ast'; -import { Kind } from './kinds'; +} from './ast.js'; +import { Kind } from './kinds.js'; export function isDefinitionNode(node: ASTNode): node is DefinitionNode { return ( diff --git a/src/language/printLocation.ts b/src/language/printLocation.ts index 3d44f5cea5..b6f9c78401 100644 --- a/src/language/printLocation.ts +++ b/src/language/printLocation.ts @@ -1,7 +1,7 @@ -import type { Location } from './ast'; -import type { SourceLocation } from './location'; -import { getLocation } from './location'; -import type { Source } from './source'; +import type { Location } from './ast.js'; +import type { SourceLocation } from './location.js'; +import { getLocation } from './location.js'; +import type { Source } from './source.js'; /** * Render a helpful description of the location in the GraphQL Source document. diff --git a/src/language/printer.ts b/src/language/printer.ts index 127e6cc4b8..a07decc11d 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -1,10 +1,10 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { ASTNode } from './ast'; -import { printBlockString } from './blockString'; -import { printString } from './printString'; -import type { ASTReducer } from './visitor'; -import { visit } from './visitor'; +import type { ASTNode } from './ast.js'; +import { printBlockString } from './blockString.js'; +import { printString } from './printString.js'; +import type { ASTReducer } from './visitor.js'; +import { visit } from './visitor.js'; /** * Converts an AST into a string, using one set of reasonable diff --git a/src/language/source.ts b/src/language/source.ts index 49c1567938..eb21547154 100644 --- a/src/language/source.ts +++ b/src/language/source.ts @@ -1,5 +1,5 @@ -import { devAssert } from '../jsutils/devAssert'; -import { instanceOf } from '../jsutils/instanceOf'; +import { devAssert } from '../jsutils/devAssert.js'; +import { instanceOf } from '../jsutils/instanceOf.js'; interface Location { line: number; diff --git a/src/language/visitor.ts b/src/language/visitor.ts index 0d5001f34f..5639fbceed 100644 --- a/src/language/visitor.ts +++ b/src/language/visitor.ts @@ -1,9 +1,9 @@ -import { devAssert } from '../jsutils/devAssert'; -import { inspect } from '../jsutils/inspect'; +import { devAssert } from '../jsutils/devAssert.js'; +import { inspect } from '../jsutils/inspect.js'; -import type { ASTNode } from './ast'; -import { isNode, QueryDocumentKeys } from './ast'; -import { Kind } from './kinds'; +import type { ASTNode } from './ast.js'; +import { isNode, QueryDocumentKeys } from './ast.js'; +import { Kind } from './kinds.js'; /** * A visitor is provided to visit, it contains the collection of diff --git a/src/type/__tests__/assertName-test.ts b/src/type/__tests__/assertName-test.ts index 1a28118812..de3f5d1a13 100644 --- a/src/type/__tests__/assertName-test.ts +++ b/src/type/__tests__/assertName-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { assertEnumValueName, assertName } from '../assertName'; +import { assertEnumValueName, assertName } from '../assertName.js'; describe('assertName', () => { it('passthrough valid name', () => { diff --git a/src/type/__tests__/definition-test.ts b/src/type/__tests__/definition-test.ts index 7e8914449a..6c540256a6 100644 --- a/src/type/__tests__/definition-test.ts +++ b/src/type/__tests__/definition-test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../../jsutils/identityFunc'; -import { inspect } from '../../jsutils/inspect'; +import { identityFunc } from '../../jsutils/identityFunc.js'; +import { inspect } from '../../jsutils/inspect.js'; -import { parseValue } from '../../language/parser'; +import { parseValue } from '../../language/parser.js'; -import type { GraphQLNullableType, GraphQLType } from '../definition'; +import type { GraphQLNullableType, GraphQLType } from '../definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, @@ -16,7 +16,7 @@ import { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../definition'; +} from '../definition.js'; const ScalarType = new GraphQLScalarType({ name: 'Scalar' }); const ObjectType = new GraphQLObjectType({ name: 'Object', fields: {} }); diff --git a/src/type/__tests__/directive-test.ts b/src/type/__tests__/directive-test.ts index 7513282d80..03af5e1fd9 100644 --- a/src/type/__tests__/directive-test.ts +++ b/src/type/__tests__/directive-test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { DirectiveLocation } from '../../language/directiveLocation'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; -import { GraphQLDirective } from '../directives'; -import { GraphQLInt, GraphQLString } from '../scalars'; +import { GraphQLDirective } from '../directives.js'; +import { GraphQLInt, GraphQLString } from '../scalars.js'; describe('Type System: Directive', () => { it('defines a directive with no args', () => { diff --git a/src/type/__tests__/enumType-test.ts b/src/type/__tests__/enumType-test.ts index 35e9f94b00..77f36b4375 100644 --- a/src/type/__tests__/enumType-test.ts +++ b/src/type/__tests__/enumType-test.ts @@ -1,15 +1,15 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { introspectionFromSchema } from '../../utilities/introspectionFromSchema'; +import { introspectionFromSchema } from '../../utilities/introspectionFromSchema.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import { GraphQLEnumType, GraphQLObjectType } from '../definition'; -import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../scalars'; -import { GraphQLSchema } from '../schema'; +import { GraphQLEnumType, GraphQLObjectType } from '../definition.js'; +import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../scalars.js'; +import { GraphQLSchema } from '../schema.js'; const ColorType = new GraphQLEnumType({ name: 'Color', diff --git a/src/type/__tests__/extensions-test.ts b/src/type/__tests__/extensions-test.ts index 156674dc8a..8bfdfb7b76 100644 --- a/src/type/__tests__/extensions-test.ts +++ b/src/type/__tests__/extensions-test.ts @@ -8,9 +8,9 @@ import { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../definition'; -import { GraphQLDirective } from '../directives'; -import { GraphQLSchema } from '../schema'; +} from '../definition.js'; +import { GraphQLDirective } from '../directives.js'; +import { GraphQLSchema } from '../schema.js'; const dummyType = new GraphQLScalarType({ name: 'DummyScalar' }); diff --git a/src/type/__tests__/introspection-test.ts b/src/type/__tests__/introspection-test.ts index df431dafd3..1fa0518dd0 100644 --- a/src/type/__tests__/introspection-test.ts +++ b/src/type/__tests__/introspection-test.ts @@ -1,14 +1,14 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; -import { getIntrospectionQuery } from '../../utilities/getIntrospectionQuery'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; +import { getIntrospectionQuery } from '../../utilities/getIntrospectionQuery.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import type { GraphQLResolveInfo } from '../definition'; +import type { GraphQLResolveInfo } from '../definition.js'; describe('Introspection', () => { it('executes an introspection query', () => { diff --git a/src/type/__tests__/predicate-test.ts b/src/type/__tests__/predicate-test.ts index 9a1692eab8..c1e1fb3059 100644 --- a/src/type/__tests__/predicate-test.ts +++ b/src/type/__tests__/predicate-test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { DirectiveLocation } from '../../language/directiveLocation'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; import type { GraphQLArgument, GraphQLInputField, GraphQLInputType, -} from '../definition'; +} from '../definition.js'; import { assertAbstractType, assertCompositeType, @@ -55,7 +55,7 @@ import { isType, isUnionType, isWrappingType, -} from '../definition'; +} from '../definition.js'; import { assertDirective, GraphQLDeprecatedDirective, @@ -64,7 +64,7 @@ import { GraphQLSkipDirective, isDirective, isSpecifiedDirective, -} from '../directives'; +} from '../directives.js'; import { GraphQLBoolean, GraphQLFloat, @@ -72,8 +72,8 @@ import { GraphQLInt, GraphQLString, isSpecifiedScalarType, -} from '../scalars'; -import { assertSchema, GraphQLSchema, isSchema } from '../schema'; +} from '../scalars.js'; +import { assertSchema, GraphQLSchema, isSchema } from '../schema.js'; const ObjectType = new GraphQLObjectType({ name: 'Object', fields: {} }); const InterfaceType = new GraphQLInterfaceType({ diff --git a/src/type/__tests__/scalars-test.ts b/src/type/__tests__/scalars-test.ts index eda64afa42..45f77523dc 100644 --- a/src/type/__tests__/scalars-test.ts +++ b/src/type/__tests__/scalars-test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parseValue as parseValueToAST } from '../../language/parser'; +import { parseValue as parseValueToAST } from '../../language/parser.js'; import { GraphQLBoolean, @@ -9,7 +9,7 @@ import { GraphQLID, GraphQLInt, GraphQLString, -} from '../scalars'; +} from '../scalars.js'; describe('Type System: Specified scalar types', () => { describe('GraphQLInt', () => { diff --git a/src/type/__tests__/schema-test.ts b/src/type/__tests__/schema-test.ts index 4c30bd4df0..186797d9d5 100644 --- a/src/type/__tests__/schema-test.ts +++ b/src/type/__tests__/schema-test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { DirectiveLocation } from '../../language/directiveLocation'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; -import { printSchema } from '../../utilities/printSchema'; +import { printSchema } from '../../utilities/printSchema.js'; -import type { GraphQLCompositeType } from '../definition'; +import type { GraphQLCompositeType } from '../definition.js'; import { GraphQLInputObjectType, GraphQLInterfaceType, @@ -15,15 +15,15 @@ import { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../definition'; -import { GraphQLDirective } from '../directives'; +} from '../definition.js'; +import { GraphQLDirective } from '../directives.js'; import { SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef, -} from '../introspection'; -import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../scalars'; -import { GraphQLSchema } from '../schema'; +} from '../introspection.js'; +import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../scalars.js'; +import { GraphQLSchema } from '../schema.js'; describe('Type System: Schema', () => { it('Define sample schema', () => { diff --git a/src/type/__tests__/validation-test.ts b/src/type/__tests__/validation-test.ts index af82d30fbb..a147a7e80f 100644 --- a/src/type/__tests__/validation-test.ts +++ b/src/type/__tests__/validation-test.ts @@ -1,16 +1,16 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { DirectiveLocation } from '../../language/directiveLocation'; -import { parse } from '../../language/parser'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; +import { parse } from '../../language/parser.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; -import { extendSchema } from '../../utilities/extendSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; +import { extendSchema } from '../../utilities/extendSchema.js'; import type { GraphQLArgumentConfig, @@ -19,7 +19,7 @@ import type { GraphQLInputType, GraphQLNamedType, GraphQLOutputType, -} from '../definition'; +} from '../definition.js'; import { assertEnumType, assertInputObjectType, @@ -34,11 +34,11 @@ import { GraphQLNonNull, GraphQLObjectType, GraphQLUnionType, -} from '../definition'; -import { assertDirective, GraphQLDirective } from '../directives'; -import { GraphQLString } from '../scalars'; -import { GraphQLSchema } from '../schema'; -import { assertValidSchema, validateSchema } from '../validate'; +} from '../definition.js'; +import { assertDirective, GraphQLDirective } from '../directives.js'; +import { GraphQLString } from '../scalars.js'; +import { GraphQLSchema } from '../schema.js'; +import { assertValidSchema, validateSchema } from '../validate.js'; const SomeSchema = buildSchema(` scalar SomeScalar diff --git a/src/type/assertName.ts b/src/type/assertName.ts index b88a6bf3d0..dbcf73b3bb 100644 --- a/src/type/assertName.ts +++ b/src/type/assertName.ts @@ -1,6 +1,6 @@ -import { GraphQLError } from '../error/GraphQLError'; +import { GraphQLError } from '../error/GraphQLError.js'; -import { isNameContinue, isNameStart } from '../language/characterClasses'; +import { isNameContinue, isNameStart } from '../language/characterClasses.js'; /** * Upholds the spec rules about naming. diff --git a/src/type/definition.ts b/src/type/definition.ts index 6f0b300877..81488efb39 100644 --- a/src/type/definition.ts +++ b/src/type/definition.ts @@ -1,19 +1,19 @@ -import { devAssert } from '../jsutils/devAssert'; -import { didYouMean } from '../jsutils/didYouMean'; -import { identityFunc } from '../jsutils/identityFunc'; -import { inspect } from '../jsutils/inspect'; -import { instanceOf } from '../jsutils/instanceOf'; -import { keyMap } from '../jsutils/keyMap'; -import { keyValMap } from '../jsutils/keyValMap'; -import { mapValue } from '../jsutils/mapValue'; -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; -import type { Path } from '../jsutils/Path'; -import type { PromiseOrValue } from '../jsutils/PromiseOrValue'; -import { suggestionList } from '../jsutils/suggestionList'; -import { toObjMap } from '../jsutils/toObjMap'; - -import { GraphQLError } from '../error/GraphQLError'; +import { devAssert } from '../jsutils/devAssert.js'; +import { didYouMean } from '../jsutils/didYouMean.js'; +import { identityFunc } from '../jsutils/identityFunc.js'; +import { inspect } from '../jsutils/inspect.js'; +import { instanceOf } from '../jsutils/instanceOf.js'; +import { keyMap } from '../jsutils/keyMap.js'; +import { keyValMap } from '../jsutils/keyValMap.js'; +import { mapValue } from '../jsutils/mapValue.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; +import type { Path } from '../jsutils/Path.js'; +import type { PromiseOrValue } from '../jsutils/PromiseOrValue.js'; +import { suggestionList } from '../jsutils/suggestionList.js'; +import { toObjMap } from '../jsutils/toObjMap.js'; + +import { GraphQLError } from '../error/GraphQLError.js'; import type { EnumTypeDefinitionNode, @@ -35,14 +35,14 @@ import type { UnionTypeDefinitionNode, UnionTypeExtensionNode, ValueNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; -import { print } from '../language/printer'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; +import { print } from '../language/printer.js'; -import { valueFromASTUntyped } from '../utilities/valueFromASTUntyped'; +import { valueFromASTUntyped } from '../utilities/valueFromASTUntyped.js'; -import { assertEnumValueName, assertName } from './assertName'; -import type { GraphQLSchema } from './schema'; +import { assertEnumValueName, assertName } from './assertName.js'; +import type { GraphQLSchema } from './schema.js'; // Predicates & Assertions diff --git a/src/type/directives.ts b/src/type/directives.ts index 13f4ad2721..8fd5a6a62e 100644 --- a/src/type/directives.ts +++ b/src/type/directives.ts @@ -1,22 +1,22 @@ -import { inspect } from '../jsutils/inspect'; -import { instanceOf } from '../jsutils/instanceOf'; -import type { Maybe } from '../jsutils/Maybe'; -import { toObjMap } from '../jsutils/toObjMap'; +import { inspect } from '../jsutils/inspect.js'; +import { instanceOf } from '../jsutils/instanceOf.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import { toObjMap } from '../jsutils/toObjMap.js'; -import type { DirectiveDefinitionNode } from '../language/ast'; -import { DirectiveLocation } from '../language/directiveLocation'; +import type { DirectiveDefinitionNode } from '../language/ast.js'; +import { DirectiveLocation } from '../language/directiveLocation.js'; -import { assertName } from './assertName'; +import { assertName } from './assertName.js'; import type { GraphQLArgument, GraphQLFieldConfigArgumentMap, -} from './definition'; +} from './definition.js'; import { argsToArgsConfig, defineArguments, GraphQLNonNull, -} from './definition'; -import { GraphQLBoolean, GraphQLString } from './scalars'; +} from './definition.js'; +import { GraphQLBoolean, GraphQLInt, GraphQLString } from './scalars.js'; /** * Test if the given value is a GraphQL directive. @@ -153,6 +153,56 @@ export const GraphQLSkipDirective: GraphQLDirective = new GraphQLDirective({ }, }); +/** + * Used to conditionally defer fragments. + */ +export const GraphQLDeferDirective = new GraphQLDirective({ + name: 'defer', + description: + 'Directs the executor to defer this fragment when the `if` argument is true or undefined.', + locations: [ + DirectiveLocation.FRAGMENT_SPREAD, + DirectiveLocation.INLINE_FRAGMENT, + ], + args: { + if: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Deferred when true or undefined.', + defaultValue: true, + }, + label: { + type: GraphQLString, + description: 'Unique name', + }, + }, +}); + +/** + * Used to conditionally stream list fields. + */ +export const GraphQLStreamDirective = new GraphQLDirective({ + name: 'stream', + description: + 'Directs the executor to stream plural fields when the `if` argument is true or undefined.', + locations: [DirectiveLocation.FIELD], + args: { + if: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Stream when true or undefined.', + defaultValue: true, + }, + label: { + type: GraphQLString, + description: 'Unique name', + }, + initialCount: { + defaultValue: 0, + type: GraphQLInt, + description: 'Number of items to return immediately', + }, + }, +}); + /** * Constant string used for default reason for a deprecation. */ diff --git a/src/type/index.ts b/src/type/index.ts index 43b867f999..2cf94bdf04 100644 --- a/src/type/index.ts +++ b/src/type/index.ts @@ -1,4 +1,4 @@ -export type { Path as ResponsePath } from '../jsutils/Path'; +export type { Path as ResponsePath } from '../jsutils/Path.js'; export { // Predicate @@ -7,8 +7,8 @@ export { assertSchema, // GraphQL Schema definition GraphQLSchema, -} from './schema'; -export type { GraphQLSchemaConfig, GraphQLSchemaExtensions } from './schema'; +} from './schema.js'; +export type { GraphQLSchemaConfig, GraphQLSchemaExtensions } from './schema.js'; export { resolveObjMapThunk, @@ -64,7 +64,7 @@ export { // Type Wrappers GraphQLList, GraphQLNonNull, -} from './definition'; +} from './definition.js'; export type { GraphQLType, @@ -119,7 +119,7 @@ export type { GraphQLScalarSerializer, GraphQLScalarValueParser, GraphQLScalarLiteralParser, -} from './definition'; +} from './definition.js'; export { // Predicate @@ -133,16 +133,18 @@ export { specifiedDirectives, GraphQLIncludeDirective, GraphQLSkipDirective, + GraphQLDeferDirective, + GraphQLStreamDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, // Constant Deprecation Reason DEFAULT_DEPRECATION_REASON, -} from './directives'; +} from './directives.js'; export type { GraphQLDirectiveConfig, GraphQLDirectiveExtensions, -} from './directives'; +} from './directives.js'; // Common built-in scalar instances. export { @@ -158,7 +160,7 @@ export { // Int boundaries constants GRAPHQL_MAX_INT, GRAPHQL_MIN_INT, -} from './scalars'; +} from './scalars.js'; export { // Predicate @@ -179,10 +181,10 @@ export { SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef, -} from './introspection'; +} from './introspection.js'; // Validate GraphQL schema. -export { validateSchema, assertValidSchema } from './validate'; +export { validateSchema, assertValidSchema } from './validate.js'; // Upholds the spec rules about naming. -export { assertName, assertEnumValueName } from './assertName'; +export { assertName, assertEnumValueName } from './assertName.js'; diff --git a/src/type/introspection.ts b/src/type/introspection.ts index e5fce6f241..aedce3e6a8 100644 --- a/src/type/introspection.ts +++ b/src/type/introspection.ts @@ -1,10 +1,10 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; -import { DirectiveLocation } from '../language/directiveLocation'; -import { print } from '../language/printer'; +import { DirectiveLocation } from '../language/directiveLocation.js'; +import { print } from '../language/printer.js'; -import { astFromValue } from '../utilities/astFromValue'; +import { astFromValue } from '../utilities/astFromValue.js'; import type { GraphQLEnumValue, @@ -13,7 +13,7 @@ import type { GraphQLInputField, GraphQLNamedType, GraphQLType, -} from './definition'; +} from './definition.js'; import { GraphQLEnumType, GraphQLList, @@ -28,10 +28,10 @@ import { isObjectType, isScalarType, isUnionType, -} from './definition'; -import type { GraphQLDirective } from './directives'; -import { GraphQLBoolean, GraphQLString } from './scalars'; -import type { GraphQLSchema } from './schema'; +} from './definition.js'; +import type { GraphQLDirective } from './directives.js'; +import { GraphQLBoolean, GraphQLString } from './scalars.js'; +import type { GraphQLSchema } from './schema.js'; export const __Schema: GraphQLObjectType = new GraphQLObjectType({ name: '__Schema', diff --git a/src/type/scalars.ts b/src/type/scalars.ts index 56e40bc98c..d2c9c9bee2 100644 --- a/src/type/scalars.ts +++ b/src/type/scalars.ts @@ -1,13 +1,13 @@ -import { inspect } from '../jsutils/inspect'; -import { isObjectLike } from '../jsutils/isObjectLike'; +import { inspect } from '../jsutils/inspect.js'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; -import { GraphQLError } from '../error/GraphQLError'; +import { GraphQLError } from '../error/GraphQLError.js'; -import { Kind } from '../language/kinds'; -import { print } from '../language/printer'; +import { Kind } from '../language/kinds.js'; +import { print } from '../language/printer.js'; -import type { GraphQLNamedType } from './definition'; -import { GraphQLScalarType } from './definition'; +import type { GraphQLNamedType } from './definition.js'; +import { GraphQLScalarType } from './definition.js'; /** * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). diff --git a/src/type/schema.ts b/src/type/schema.ts index ab47416bfb..694454fae5 100644 --- a/src/type/schema.ts +++ b/src/type/schema.ts @@ -1,16 +1,16 @@ -import { inspect } from '../jsutils/inspect'; -import { instanceOf } from '../jsutils/instanceOf'; -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; -import { toObjMap } from '../jsutils/toObjMap'; +import { inspect } from '../jsutils/inspect.js'; +import { instanceOf } from '../jsutils/instanceOf.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; +import { toObjMap } from '../jsutils/toObjMap.js'; -import type { GraphQLError } from '../error/GraphQLError'; +import type { GraphQLError } from '../error/GraphQLError.js'; import type { SchemaDefinitionNode, SchemaExtensionNode, -} from '../language/ast'; -import { OperationTypeNode } from '../language/ast'; +} from '../language/ast.js'; +import { OperationTypeNode } from '../language/ast.js'; import type { GraphQLAbstractType, @@ -20,22 +20,22 @@ import type { GraphQLNamedType, GraphQLObjectType, GraphQLType, -} from './definition'; +} from './definition.js'; import { getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, -} from './definition'; -import type { GraphQLDirective } from './directives'; -import { isDirective, specifiedDirectives } from './directives'; +} from './definition.js'; +import type { GraphQLDirective } from './directives.js'; +import { isDirective, specifiedDirectives } from './directives.js'; import { __Schema, SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef, -} from './introspection'; +} from './introspection.js'; /** * Test if the given value is a GraphQL schema. diff --git a/src/type/validate.ts b/src/type/validate.ts index 8c33114432..6753534c69 100644 --- a/src/type/validate.ts +++ b/src/type/validate.ts @@ -1,10 +1,10 @@ -import { AccumulatorMap } from '../jsutils/AccumulatorMap'; -import { capitalize } from '../jsutils/capitalize'; -import { andList } from '../jsutils/formatList'; -import { inspect } from '../jsutils/inspect'; -import type { Maybe } from '../jsutils/Maybe'; +import { AccumulatorMap } from '../jsutils/AccumulatorMap.js'; +import { capitalize } from '../jsutils/capitalize.js'; +import { andList } from '../jsutils/formatList.js'; +import { inspect } from '../jsutils/inspect.js'; +import type { Maybe } from '../jsutils/Maybe.js'; -import { GraphQLError } from '../error/GraphQLError'; +import { GraphQLError } from '../error/GraphQLError.js'; import type { ASTNode, @@ -16,10 +16,10 @@ import type { ObjectTypeExtensionNode, UnionTypeDefinitionNode, UnionTypeExtensionNode, -} from '../language/ast'; -import { OperationTypeNode } from '../language/ast'; +} from '../language/ast.js'; +import { OperationTypeNode } from '../language/ast.js'; -import { isEqualType, isTypeSubTypeOf } from '../utilities/typeComparators'; +import { isEqualType, isTypeSubTypeOf } from '../utilities/typeComparators.js'; import type { GraphQLEnumType, @@ -28,7 +28,7 @@ import type { GraphQLInterfaceType, GraphQLObjectType, GraphQLUnionType, -} from './definition'; +} from './definition.js'; import { isEnumType, isInputObjectType, @@ -41,11 +41,11 @@ import { isRequiredArgument, isRequiredInputField, isUnionType, -} from './definition'; -import { GraphQLDeprecatedDirective, isDirective } from './directives'; -import { isIntrospectionType } from './introspection'; -import type { GraphQLSchema } from './schema'; -import { assertSchema } from './schema'; +} from './definition.js'; +import { GraphQLDeprecatedDirective, isDirective } from './directives.js'; +import { isIntrospectionType } from './introspection.js'; +import type { GraphQLSchema } from './schema.js'; +import { assertSchema } from './schema.js'; /** * Implements the "Type Validation" sub-sections of the specification's diff --git a/src/utilities/TypeInfo.ts b/src/utilities/TypeInfo.ts index aff849ff64..fe8ea1fbab 100644 --- a/src/utilities/TypeInfo.ts +++ b/src/utilities/TypeInfo.ts @@ -1,10 +1,10 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { ASTNode, FieldNode } from '../language/ast'; -import { isNode } from '../language/ast'; -import { Kind } from '../language/kinds'; -import type { ASTVisitor } from '../language/visitor'; -import { getEnterLeaveForKind } from '../language/visitor'; +import type { ASTNode, FieldNode } from '../language/ast.js'; +import { isNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; +import type { ASTVisitor } from '../language/visitor.js'; +import { getEnterLeaveForKind } from '../language/visitor.js'; import type { GraphQLArgument, @@ -15,7 +15,7 @@ import type { GraphQLInputType, GraphQLOutputType, GraphQLType, -} from '../type/definition'; +} from '../type/definition.js'; import { getNamedType, getNullableType, @@ -26,11 +26,11 @@ import { isListType, isObjectType, isOutputType, -} from '../type/definition'; -import type { GraphQLDirective } from '../type/directives'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import type { GraphQLDirective } from '../type/directives.js'; +import type { GraphQLSchema } from '../type/schema.js'; -import { typeFromAST } from './typeFromAST'; +import { typeFromAST } from './typeFromAST.js'; /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index 154ee2516b..971316f8b4 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -1,15 +1,15 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse, parseValue } from '../../language/parser'; -import { print } from '../../language/printer'; -import { visit } from '../../language/visitor'; +import { parse, parseValue } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; +import { visit } from '../../language/visitor.js'; -import { getNamedType, isCompositeType } from '../../type/definition'; -import { GraphQLSchema } from '../../type/schema'; +import { getNamedType, isCompositeType } from '../../type/definition.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../buildASTSchema'; -import { TypeInfo, visitWithTypeInfo } from '../TypeInfo'; +import { buildSchema } from '../buildASTSchema.js'; +import { TypeInfo, visitWithTypeInfo } from '../TypeInfo.js'; const testSchema = buildSchema(` interface Pet { diff --git a/src/utilities/__tests__/astFromValue-test.ts b/src/utilities/__tests__/astFromValue-test.ts index b8f2361bd7..0f9d474256 100644 --- a/src/utilities/__tests__/astFromValue-test.ts +++ b/src/utilities/__tests__/astFromValue-test.ts @@ -7,16 +7,16 @@ import { GraphQLList, GraphQLNonNull, GraphQLScalarType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; +} from '../../type/scalars.js'; -import { astFromValue } from '../astFromValue'; +import { astFromValue } from '../astFromValue.js'; describe('astFromValue', () => { it('converts boolean values to ASTs', () => { diff --git a/src/utilities/__tests__/buildASTSchema-test.ts b/src/utilities/__tests__/buildASTSchema-test.ts index 435abc2d7a..204ceb800c 100644 --- a/src/utilities/__tests__/buildASTSchema-test.ts +++ b/src/utilities/__tests__/buildASTSchema-test.ts @@ -1,14 +1,14 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import type { Maybe } from '../../jsutils/Maybe'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import type { ASTNode } from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import { parse } from '../../language/parser'; -import { print } from '../../language/printer'; +import type { ASTNode } from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import { parse } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; import { assertEnumType, @@ -17,29 +17,29 @@ import { assertObjectType, assertScalarType, assertUnionType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { assertDirective, GraphQLDeprecatedDirective, GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLSpecifiedByDirective, -} from '../../type/directives'; -import { __EnumValue, __Schema } from '../../type/introspection'; +} from '../../type/directives.js'; +import { __EnumValue, __Schema } from '../../type/introspection.js'; import { GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; -import { validateSchema } from '../../type/validate'; +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; +import { validateSchema } from '../../type/validate.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import { buildASTSchema, buildSchema } from '../buildASTSchema'; -import { printSchema, printType } from '../printSchema'; +import { buildASTSchema, buildSchema } from '../buildASTSchema.js'; +import { printSchema, printType } from '../printSchema.js'; /** * This function does a full cycle of going from a string with the contents of diff --git a/src/utilities/__tests__/buildClientSchema-test.ts b/src/utilities/__tests__/buildClientSchema-test.ts index 8c043f0e77..99c9222607 100644 --- a/src/utilities/__tests__/buildClientSchema-test.ts +++ b/src/utilities/__tests__/buildClientSchema-test.ts @@ -1,28 +1,28 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; import { assertEnumType, GraphQLEnumType, GraphQLObjectType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import { buildSchema } from '../buildASTSchema'; -import { buildClientSchema } from '../buildClientSchema'; -import { introspectionFromSchema } from '../introspectionFromSchema'; -import { printSchema } from '../printSchema'; +import { buildSchema } from '../buildASTSchema.js'; +import { buildClientSchema } from '../buildClientSchema.js'; +import { introspectionFromSchema } from '../introspectionFromSchema.js'; +import { printSchema } from '../printSchema.js'; /** * This function does a full cycle of going from a string with the contents of diff --git a/src/utilities/__tests__/coerceInputValue-test.ts b/src/utilities/__tests__/coerceInputValue-test.ts index ed72268ef9..5e0199fead 100644 --- a/src/utilities/__tests__/coerceInputValue-test.ts +++ b/src/utilities/__tests__/coerceInputValue-test.ts @@ -1,17 +1,17 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import type { GraphQLInputType } from '../../type/definition'; +import type { GraphQLInputType } from '../../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLScalarType, -} from '../../type/definition'; -import { GraphQLInt } from '../../type/scalars'; +} from '../../type/definition.js'; +import { GraphQLInt } from '../../type/scalars.js'; -import { coerceInputValue } from '../coerceInputValue'; +import { coerceInputValue } from '../coerceInputValue.js'; interface CoerceResult { value: unknown; diff --git a/src/utilities/__tests__/concatAST-test.ts b/src/utilities/__tests__/concatAST-test.ts index 622abd6b38..95d9a59e08 100644 --- a/src/utilities/__tests__/concatAST-test.ts +++ b/src/utilities/__tests__/concatAST-test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { parse } from '../../language/parser'; -import { print } from '../../language/printer'; -import { Source } from '../../language/source'; +import { parse } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; +import { Source } from '../../language/source.js'; -import { concatAST } from '../concatAST'; +import { concatAST } from '../concatAST.js'; describe('concatAST', () => { it('concatenates two ASTs together', () => { diff --git a/src/utilities/__tests__/extendSchema-test.ts b/src/utilities/__tests__/extendSchema-test.ts index 66d8a00bc2..c6bc30ed4b 100644 --- a/src/utilities/__tests__/extendSchema-test.ts +++ b/src/utilities/__tests__/extendSchema-test.ts @@ -1,13 +1,13 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import type { Maybe } from '../../jsutils/Maybe'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import type { ASTNode } from '../../language/ast'; -import { parse } from '../../language/parser'; -import { print } from '../../language/printer'; +import type { ASTNode } from '../../language/ast.js'; +import { parse } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; import { assertEnumType, @@ -16,24 +16,24 @@ import { assertObjectType, assertScalarType, assertUnionType, -} from '../../type/definition'; -import { assertDirective, specifiedDirectives } from '../../type/directives'; +} from '../../type/definition.js'; +import { assertDirective, specifiedDirectives } from '../../type/directives.js'; import { GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; -import { validateSchema } from '../../type/validate'; +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; +import { validateSchema } from '../../type/validate.js'; -import { graphqlSync } from '../../graphql'; +import { graphqlSync } from '../../graphql.js'; -import { buildSchema } from '../buildASTSchema'; -import { concatAST } from '../concatAST'; -import { extendSchema } from '../extendSchema'; -import { printSchema } from '../printSchema'; +import { buildSchema } from '../buildASTSchema.js'; +import { concatAST } from '../concatAST.js'; +import { extendSchema } from '../extendSchema.js'; +import { printSchema } from '../printSchema.js'; function expectExtensionASTNodes(obj: { readonly extensionASTNodes: ReadonlyArray; diff --git a/src/utilities/__tests__/findBreakingChanges-test.ts b/src/utilities/__tests__/findBreakingChanges-test.ts index 6c26e24ad0..dbd19cb893 100644 --- a/src/utilities/__tests__/findBreakingChanges-test.ts +++ b/src/utilities/__tests__/findBreakingChanges-test.ts @@ -6,16 +6,16 @@ import { GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLSpecifiedByDirective, -} from '../../type/directives'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/directives.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../buildASTSchema'; +import { buildSchema } from '../buildASTSchema.js'; import { BreakingChangeType, DangerousChangeType, findBreakingChanges, findDangerousChanges, -} from '../findBreakingChanges'; +} from '../findBreakingChanges.js'; describe('findBreakingChanges', () => { it('should detect if a type was removed or not', () => { diff --git a/src/utilities/__tests__/getIntrospectionQuery-test.ts b/src/utilities/__tests__/getIntrospectionQuery-test.ts index e2f5595b3c..62f64c968e 100644 --- a/src/utilities/__tests__/getIntrospectionQuery-test.ts +++ b/src/utilities/__tests__/getIntrospectionQuery-test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { validate } from '../../validation/validate'; +import { validate } from '../../validation/validate.js'; -import { buildSchema } from '../buildASTSchema'; -import type { IntrospectionOptions } from '../getIntrospectionQuery'; -import { getIntrospectionQuery } from '../getIntrospectionQuery'; +import { buildSchema } from '../buildASTSchema.js'; +import type { IntrospectionOptions } from '../getIntrospectionQuery.js'; +import { getIntrospectionQuery } from '../getIntrospectionQuery.js'; const dummySchema = buildSchema(` type Query { diff --git a/src/utilities/__tests__/getOperationAST-test.ts b/src/utilities/__tests__/getOperationAST-test.ts index 029dd7706e..69e9df96de 100644 --- a/src/utilities/__tests__/getOperationAST-test.ts +++ b/src/utilities/__tests__/getOperationAST-test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { getOperationAST } from '../getOperationAST'; +import { getOperationAST } from '../getOperationAST.js'; describe('getOperationAST', () => { it('Gets an operation from a simple document', () => { diff --git a/src/utilities/__tests__/introspectionFromSchema-test.ts b/src/utilities/__tests__/introspectionFromSchema-test.ts index 2ba66348d3..15ba9bdcb5 100644 --- a/src/utilities/__tests__/introspectionFromSchema-test.ts +++ b/src/utilities/__tests__/introspectionFromSchema-test.ts @@ -1,16 +1,16 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { GraphQLObjectType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLObjectType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { buildClientSchema } from '../buildClientSchema'; -import type { IntrospectionQuery } from '../getIntrospectionQuery'; -import { introspectionFromSchema } from '../introspectionFromSchema'; -import { printSchema } from '../printSchema'; +import { buildClientSchema } from '../buildClientSchema.js'; +import type { IntrospectionQuery } from '../getIntrospectionQuery.js'; +import { introspectionFromSchema } from '../introspectionFromSchema.js'; +import { printSchema } from '../printSchema.js'; function introspectionToSDL(introspection: IntrospectionQuery): string { return printSchema(buildClientSchema(introspection)); diff --git a/src/utilities/__tests__/lexicographicSortSchema-test.ts b/src/utilities/__tests__/lexicographicSortSchema-test.ts index bce12e3ac5..d43d81f30c 100644 --- a/src/utilities/__tests__/lexicographicSortSchema-test.ts +++ b/src/utilities/__tests__/lexicographicSortSchema-test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { buildSchema } from '../buildASTSchema'; -import { lexicographicSortSchema } from '../lexicographicSortSchema'; -import { printSchema } from '../printSchema'; +import { buildSchema } from '../buildASTSchema.js'; +import { lexicographicSortSchema } from '../lexicographicSortSchema.js'; +import { printSchema } from '../printSchema.js'; function sortSDL(sdl: string): string { const schema = buildSchema(sdl); diff --git a/src/utilities/__tests__/printSchema-test.ts b/src/utilities/__tests__/printSchema-test.ts index d09153a2e6..1608cfc644 100644 --- a/src/utilities/__tests__/printSchema-test.ts +++ b/src/utilities/__tests__/printSchema-test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent, dedentString } from '../../__testUtils__/dedent'; +import { dedent, dedentString } from '../../__testUtils__/dedent.js'; -import { DirectiveLocation } from '../../language/directiveLocation'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; -import type { GraphQLFieldConfig } from '../../type/definition'; +import type { GraphQLFieldConfig } from '../../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, @@ -15,13 +15,17 @@ import { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../../type/definition'; -import { GraphQLDirective } from '../../type/directives'; -import { GraphQLBoolean, GraphQLInt, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; - -import { buildSchema } from '../buildASTSchema'; -import { printIntrospectionSchema, printSchema } from '../printSchema'; +} from '../../type/definition.js'; +import { GraphQLDirective } from '../../type/directives.js'; +import { + GraphQLBoolean, + GraphQLInt, + GraphQLString, +} from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; + +import { buildSchema } from '../buildASTSchema.js'; +import { printIntrospectionSchema, printSchema } from '../printSchema.js'; function expectPrintedSchema(schema: GraphQLSchema) { const schemaText = printSchema(schema); diff --git a/src/utilities/__tests__/separateOperations-test.ts b/src/utilities/__tests__/separateOperations-test.ts index 2f14bae9ac..4604f005ee 100644 --- a/src/utilities/__tests__/separateOperations-test.ts +++ b/src/utilities/__tests__/separateOperations-test.ts @@ -1,14 +1,14 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; +import { dedent } from '../../__testUtils__/dedent.js'; -import { mapValue } from '../../jsutils/mapValue'; +import { mapValue } from '../../jsutils/mapValue.js'; -import { parse } from '../../language/parser'; -import { print } from '../../language/printer'; +import { parse } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; -import { separateOperations } from '../separateOperations'; +import { separateOperations } from '../separateOperations.js'; describe('separateOperations', () => { it('separates one AST into multiple, maintaining document order', () => { diff --git a/src/utilities/__tests__/sortValueNode-test.ts b/src/utilities/__tests__/sortValueNode-test.ts index c55a9be912..91454bc6ac 100644 --- a/src/utilities/__tests__/sortValueNode-test.ts +++ b/src/utilities/__tests__/sortValueNode-test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parseValue } from '../../language/parser'; -import { print } from '../../language/printer'; +import { parseValue } from '../../language/parser.js'; +import { print } from '../../language/printer.js'; -import { sortValueNode } from '../sortValueNode'; +import { sortValueNode } from '../sortValueNode.js'; describe('sortValueNode', () => { function expectSortedValue(source: string) { diff --git a/src/utilities/__tests__/stripIgnoredCharacters-fuzz.ts b/src/utilities/__tests__/stripIgnoredCharacters-fuzz.ts index 36ef6604d6..bc4f2a9f3d 100644 --- a/src/utilities/__tests__/stripIgnoredCharacters-fuzz.ts +++ b/src/utilities/__tests__/stripIgnoredCharacters-fuzz.ts @@ -1,14 +1,14 @@ import { assert } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { genFuzzStrings } from '../../__testUtils__/genFuzzStrings'; -import { inspectStr } from '../../__testUtils__/inspectStr'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { genFuzzStrings } from '../../__testUtils__/genFuzzStrings.js'; +import { inspectStr } from '../../__testUtils__/inspectStr.js'; -import { Lexer } from '../../language/lexer'; -import { Source } from '../../language/source'; +import { Lexer } from '../../language/lexer.js'; +import { Source } from '../../language/source.js'; -import { stripIgnoredCharacters } from '../stripIgnoredCharacters'; +import { stripIgnoredCharacters } from '../stripIgnoredCharacters.js'; const ignoredTokens = [ // UnicodeBOM :: diff --git a/src/utilities/__tests__/stripIgnoredCharacters-test.ts b/src/utilities/__tests__/stripIgnoredCharacters-test.ts index a6c8bc414c..509f76ee3c 100644 --- a/src/utilities/__tests__/stripIgnoredCharacters-test.ts +++ b/src/utilities/__tests__/stripIgnoredCharacters-test.ts @@ -1,17 +1,17 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { dedent } from '../../__testUtils__/dedent'; -import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery'; -import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL'; +import { dedent } from '../../__testUtils__/dedent.js'; +import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js'; +import { kitchenSinkSDL } from '../../__testUtils__/kitchenSinkSDL.js'; -import type { Maybe } from '../../jsutils/Maybe'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import { Lexer } from '../../language/lexer'; -import { parse } from '../../language/parser'; -import { Source } from '../../language/source'; +import { Lexer } from '../../language/lexer.js'; +import { parse } from '../../language/parser.js'; +import { Source } from '../../language/source.js'; -import { stripIgnoredCharacters } from '../stripIgnoredCharacters'; +import { stripIgnoredCharacters } from '../stripIgnoredCharacters.js'; function lexValue(str: string): Maybe { const lexer = new Lexer(new Source(str)); diff --git a/src/utilities/__tests__/typeComparators-test.ts b/src/utilities/__tests__/typeComparators-test.ts index f2709bf740..571f5aa730 100644 --- a/src/utilities/__tests__/typeComparators-test.ts +++ b/src/utilities/__tests__/typeComparators-test.ts @@ -1,18 +1,18 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import type { GraphQLFieldConfigMap } from '../../type/definition'; +import type { GraphQLFieldConfigMap } from '../../type/definition.js'; import { GraphQLInterfaceType, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLUnionType, -} from '../../type/definition'; -import { GraphQLFloat, GraphQLInt, GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import { GraphQLFloat, GraphQLInt, GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { isEqualType, isTypeSubTypeOf } from '../typeComparators'; +import { isEqualType, isTypeSubTypeOf } from '../typeComparators.js'; describe('typeComparators', () => { describe('isEqualType', () => { diff --git a/src/utilities/__tests__/valueFromAST-test.ts b/src/utilities/__tests__/valueFromAST-test.ts index 73d0be49d9..d0a8380d13 100644 --- a/src/utilities/__tests__/valueFromAST-test.ts +++ b/src/utilities/__tests__/valueFromAST-test.ts @@ -1,28 +1,28 @@ import { assert, expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../../jsutils/identityFunc'; -import type { ObjMap } from '../../jsutils/ObjMap'; +import { identityFunc } from '../../jsutils/identityFunc.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { parseValue } from '../../language/parser'; +import { parseValue } from '../../language/parser.js'; -import type { GraphQLInputType } from '../../type/definition'; +import type { GraphQLInputType } from '../../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLScalarType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { GraphQLBoolean, GraphQLFloat, GraphQLID, GraphQLInt, GraphQLString, -} from '../../type/scalars'; +} from '../../type/scalars.js'; -import { valueFromAST } from '../valueFromAST'; +import { valueFromAST } from '../valueFromAST.js'; describe('valueFromAST', () => { function expectValueFrom( diff --git a/src/utilities/__tests__/valueFromASTUntyped-test.ts b/src/utilities/__tests__/valueFromASTUntyped-test.ts index 9ad004c42e..90b9260408 100644 --- a/src/utilities/__tests__/valueFromASTUntyped-test.ts +++ b/src/utilities/__tests__/valueFromASTUntyped-test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import type { Maybe } from '../../jsutils/Maybe'; -import type { ObjMap } from '../../jsutils/ObjMap'; +import type { Maybe } from '../../jsutils/Maybe.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { parseValue } from '../../language/parser'; +import { parseValue } from '../../language/parser.js'; -import { valueFromASTUntyped } from '../valueFromASTUntyped'; +import { valueFromASTUntyped } from '../valueFromASTUntyped.js'; describe('valueFromASTUntyped', () => { function expectValueFrom( diff --git a/src/utilities/astFromValue.ts b/src/utilities/astFromValue.ts index 1a880449c8..e1d994a8ee 100644 --- a/src/utilities/astFromValue.ts +++ b/src/utilities/astFromValue.ts @@ -1,21 +1,21 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { isIterableObject } from '../jsutils/isIterableObject'; -import { isObjectLike } from '../jsutils/isObjectLike'; -import type { Maybe } from '../jsutils/Maybe'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { isIterableObject } from '../jsutils/isIterableObject.js'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { ObjectFieldNode, ValueNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { ObjectFieldNode, ValueNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; -import type { GraphQLInputType } from '../type/definition'; +import type { GraphQLInputType } from '../type/definition.js'; import { isEnumType, isInputObjectType, isLeafType, isListType, isNonNullType, -} from '../type/definition'; -import { GraphQLID } from '../type/scalars'; +} from '../type/definition.js'; +import { GraphQLID } from '../type/scalars.js'; /** * Produces a GraphQL Value AST given a JavaScript object. diff --git a/src/utilities/buildASTSchema.ts b/src/utilities/buildASTSchema.ts index cc7271409e..09fd7cd7dd 100644 --- a/src/utilities/buildASTSchema.ts +++ b/src/utilities/buildASTSchema.ts @@ -1,15 +1,15 @@ -import type { DocumentNode } from '../language/ast'; -import type { ParseOptions } from '../language/parser'; -import { parse } from '../language/parser'; -import type { Source } from '../language/source'; +import type { DocumentNode } from '../language/ast.js'; +import type { ParseOptions } from '../language/parser.js'; +import { parse } from '../language/parser.js'; +import type { Source } from '../language/source.js'; -import { specifiedDirectives } from '../type/directives'; -import type { GraphQLSchemaValidationOptions } from '../type/schema'; -import { GraphQLSchema } from '../type/schema'; +import { specifiedDirectives } from '../type/directives.js'; +import type { GraphQLSchemaValidationOptions } from '../type/schema.js'; +import { GraphQLSchema } from '../type/schema.js'; -import { assertValidSDL } from '../validation/validate'; +import { assertValidSDL } from '../validation/validate.js'; -import { extendSchemaImpl } from './extendSchema'; +import { extendSchemaImpl } from './extendSchema.js'; export interface BuildSchemaOptions extends GraphQLSchemaValidationOptions { /** diff --git a/src/utilities/buildClientSchema.ts b/src/utilities/buildClientSchema.ts index 8418c6ce51..0cae3398f2 100644 --- a/src/utilities/buildClientSchema.ts +++ b/src/utilities/buildClientSchema.ts @@ -1,16 +1,16 @@ -import { devAssert } from '../jsutils/devAssert'; -import { inspect } from '../jsutils/inspect'; -import { isObjectLike } from '../jsutils/isObjectLike'; -import { keyValMap } from '../jsutils/keyValMap'; +import { devAssert } from '../jsutils/devAssert.js'; +import { inspect } from '../jsutils/inspect.js'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import { keyValMap } from '../jsutils/keyValMap.js'; -import { parseValue } from '../language/parser'; +import { parseValue } from '../language/parser.js'; import type { GraphQLFieldConfig, GraphQLFieldConfigMap, GraphQLNamedType, GraphQLType, -} from '../type/definition'; +} from '../type/definition.js'; import { assertInterfaceType, assertNullableType, @@ -25,12 +25,12 @@ import { GraphQLUnionType, isInputType, isOutputType, -} from '../type/definition'; -import { GraphQLDirective } from '../type/directives'; -import { introspectionTypes, TypeKind } from '../type/introspection'; -import { specifiedScalarTypes } from '../type/scalars'; -import type { GraphQLSchemaValidationOptions } from '../type/schema'; -import { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import { GraphQLDirective } from '../type/directives.js'; +import { introspectionTypes, TypeKind } from '../type/introspection.js'; +import { specifiedScalarTypes } from '../type/scalars.js'; +import type { GraphQLSchemaValidationOptions } from '../type/schema.js'; +import { GraphQLSchema } from '../type/schema.js'; import type { IntrospectionDirective, @@ -46,8 +46,8 @@ import type { IntrospectionType, IntrospectionTypeRef, IntrospectionUnionType, -} from './getIntrospectionQuery'; -import { valueFromAST } from './valueFromAST'; +} from './getIntrospectionQuery.js'; +import { valueFromAST } from './valueFromAST.js'; /** * Build a GraphQLSchema for use by client tools. diff --git a/src/utilities/coerceInputValue.ts b/src/utilities/coerceInputValue.ts index 6662fdeadc..d1decf86a1 100644 --- a/src/utilities/coerceInputValue.ts +++ b/src/utilities/coerceInputValue.ts @@ -1,22 +1,22 @@ -import { didYouMean } from '../jsutils/didYouMean'; -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { isIterableObject } from '../jsutils/isIterableObject'; -import { isObjectLike } from '../jsutils/isObjectLike'; -import type { Path } from '../jsutils/Path'; -import { addPath, pathToArray } from '../jsutils/Path'; -import { printPathArray } from '../jsutils/printPathArray'; -import { suggestionList } from '../jsutils/suggestionList'; - -import { GraphQLError } from '../error/GraphQLError'; - -import type { GraphQLInputType } from '../type/definition'; +import { didYouMean } from '../jsutils/didYouMean.js'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { isIterableObject } from '../jsutils/isIterableObject.js'; +import { isObjectLike } from '../jsutils/isObjectLike.js'; +import type { Path } from '../jsutils/Path.js'; +import { addPath, pathToArray } from '../jsutils/Path.js'; +import { printPathArray } from '../jsutils/printPathArray.js'; +import { suggestionList } from '../jsutils/suggestionList.js'; + +import { GraphQLError } from '../error/GraphQLError.js'; + +import type { GraphQLInputType } from '../type/definition.js'; import { isInputObjectType, isLeafType, isListType, isNonNullType, -} from '../type/definition'; +} from '../type/definition.js'; type OnErrorCB = ( path: ReadonlyArray, diff --git a/src/utilities/concatAST.ts b/src/utilities/concatAST.ts index 33062f610e..843c1a9075 100644 --- a/src/utilities/concatAST.ts +++ b/src/utilities/concatAST.ts @@ -1,5 +1,5 @@ -import type { DefinitionNode, DocumentNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { DefinitionNode, DocumentNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; /** * Provided a collection of ASTs, presumably each from different files, diff --git a/src/utilities/extendSchema.ts b/src/utilities/extendSchema.ts index d5ccdf3a6b..9ffce731b3 100644 --- a/src/utilities/extendSchema.ts +++ b/src/utilities/extendSchema.ts @@ -1,9 +1,9 @@ -import { AccumulatorMap } from '../jsutils/AccumulatorMap'; -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { keyMap } from '../jsutils/keyMap'; -import { mapValue } from '../jsutils/mapValue'; -import type { Maybe } from '../jsutils/Maybe'; +import { AccumulatorMap } from '../jsutils/AccumulatorMap.js'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { keyMap } from '../jsutils/keyMap.js'; +import { mapValue } from '../jsutils/mapValue.js'; +import type { Maybe } from '../jsutils/Maybe.js'; import type { DirectiveDefinitionNode, @@ -28,8 +28,8 @@ import type { TypeNode, UnionTypeDefinitionNode, UnionTypeExtensionNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; import type { GraphQLArgumentConfig, @@ -40,7 +40,7 @@ import type { GraphQLInputFieldConfigMap, GraphQLNamedType, GraphQLType, -} from '../type/definition'; +} from '../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, @@ -58,26 +58,32 @@ import { isObjectType, isScalarType, isUnionType, -} from '../type/definition'; +} from '../type/definition.js'; import { GraphQLDeprecatedDirective, GraphQLDirective, GraphQLSpecifiedByDirective, isSpecifiedDirective, -} from '../type/directives'; -import { introspectionTypes, isIntrospectionType } from '../type/introspection'; -import { isSpecifiedScalarType, specifiedScalarTypes } from '../type/scalars'; +} from '../type/directives.js'; +import { + introspectionTypes, + isIntrospectionType, +} from '../type/introspection.js'; +import { + isSpecifiedScalarType, + specifiedScalarTypes, +} from '../type/scalars.js'; import type { GraphQLSchemaNormalizedConfig, GraphQLSchemaValidationOptions, -} from '../type/schema'; -import { assertSchema, GraphQLSchema } from '../type/schema'; +} from '../type/schema.js'; +import { assertSchema, GraphQLSchema } from '../type/schema.js'; -import { assertValidSDLExtension } from '../validation/validate'; +import { assertValidSDLExtension } from '../validation/validate.js'; -import { getDirectiveValues } from '../execution/values'; +import { getDirectiveValues } from '../execution/values.js'; -import { valueFromAST } from './valueFromAST'; +import { valueFromAST } from './valueFromAST.js'; interface Options extends GraphQLSchemaValidationOptions { /** diff --git a/src/utilities/findBreakingChanges.ts b/src/utilities/findBreakingChanges.ts index 0bf0d453b4..793d29bc83 100644 --- a/src/utilities/findBreakingChanges.ts +++ b/src/utilities/findBreakingChanges.ts @@ -1,8 +1,8 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { keyMap } from '../jsutils/keyMap'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { keyMap } from '../jsutils/keyMap.js'; -import { print } from '../language/printer'; +import { print } from '../language/printer.js'; import type { GraphQLEnumType, @@ -14,7 +14,7 @@ import type { GraphQLObjectType, GraphQLType, GraphQLUnionType, -} from '../type/definition'; +} from '../type/definition.js'; import { isEnumType, isInputObjectType, @@ -27,12 +27,12 @@ import { isRequiredInputField, isScalarType, isUnionType, -} from '../type/definition'; -import { isSpecifiedScalarType } from '../type/scalars'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import { isSpecifiedScalarType } from '../type/scalars.js'; +import type { GraphQLSchema } from '../type/schema.js'; -import { astFromValue } from './astFromValue'; -import { sortValueNode } from './sortValueNode'; +import { astFromValue } from './astFromValue.js'; +import { sortValueNode } from './sortValueNode.js'; export enum BreakingChangeType { TYPE_REMOVED = 'TYPE_REMOVED', diff --git a/src/utilities/getIntrospectionQuery.ts b/src/utilities/getIntrospectionQuery.ts index c21fe9a1bb..12c2aa6404 100644 --- a/src/utilities/getIntrospectionQuery.ts +++ b/src/utilities/getIntrospectionQuery.ts @@ -1,6 +1,6 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { DirectiveLocation } from '../language/directiveLocation'; +import type { DirectiveLocation } from '../language/directiveLocation.js'; export interface IntrospectionOptions { /** diff --git a/src/utilities/getOperationAST.ts b/src/utilities/getOperationAST.ts index 8decf943f6..a8bb2a1984 100644 --- a/src/utilities/getOperationAST.ts +++ b/src/utilities/getOperationAST.ts @@ -1,7 +1,7 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import type { DocumentNode, OperationDefinitionNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { DocumentNode, OperationDefinitionNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; /** * Returns an operation AST given a document AST and optionally an operation diff --git a/src/utilities/index.ts b/src/utilities/index.ts index d3ccffc917..a29f667671 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -1,5 +1,5 @@ // Produce the GraphQL query recommended for a full schema introspection. -export { getIntrospectionQuery } from './getIntrospectionQuery'; +export { getIntrospectionQuery } from './getIntrospectionQuery.js'; export type { IntrospectionOptions, @@ -24,67 +24,67 @@ export type { IntrospectionInputValue, IntrospectionEnumValue, IntrospectionDirective, -} from './getIntrospectionQuery'; +} from './getIntrospectionQuery.js'; // Gets the target Operation from a Document. -export { getOperationAST } from './getOperationAST'; +export { getOperationAST } from './getOperationAST.js'; // Convert a GraphQLSchema to an IntrospectionQuery. -export { introspectionFromSchema } from './introspectionFromSchema'; +export { introspectionFromSchema } from './introspectionFromSchema.js'; // Build a GraphQLSchema from an introspection result. -export { buildClientSchema } from './buildClientSchema'; +export { buildClientSchema } from './buildClientSchema.js'; // Build a GraphQLSchema from GraphQL Schema language. -export { buildASTSchema, buildSchema } from './buildASTSchema'; -export type { BuildSchemaOptions } from './buildASTSchema'; +export { buildASTSchema, buildSchema } from './buildASTSchema.js'; +export type { BuildSchemaOptions } from './buildASTSchema.js'; // Extends an existing GraphQLSchema from a parsed GraphQL Schema language AST. -export { extendSchema } from './extendSchema'; +export { extendSchema } from './extendSchema.js'; // Sort a GraphQLSchema. -export { lexicographicSortSchema } from './lexicographicSortSchema'; +export { lexicographicSortSchema } from './lexicographicSortSchema.js'; // Print a GraphQLSchema to GraphQL Schema language. export { printSchema, printType, printIntrospectionSchema, -} from './printSchema'; +} from './printSchema.js'; // Create a GraphQLType from a GraphQL language AST. -export { typeFromAST } from './typeFromAST'; +export { typeFromAST } from './typeFromAST.js'; // Create a JavaScript value from a GraphQL language AST with a type. -export { valueFromAST } from './valueFromAST'; +export { valueFromAST } from './valueFromAST.js'; // Create a JavaScript value from a GraphQL language AST without a type. -export { valueFromASTUntyped } from './valueFromASTUntyped'; +export { valueFromASTUntyped } from './valueFromASTUntyped.js'; // Create a GraphQL language AST from a JavaScript value. -export { astFromValue } from './astFromValue'; +export { astFromValue } from './astFromValue.js'; // A helper to use within recursive-descent visitors which need to be aware of the GraphQL type system. -export { TypeInfo, visitWithTypeInfo } from './TypeInfo'; +export { TypeInfo, visitWithTypeInfo } from './TypeInfo.js'; // Coerces a JavaScript value to a GraphQL type, or produces errors. -export { coerceInputValue } from './coerceInputValue'; +export { coerceInputValue } from './coerceInputValue.js'; // Concatenates multiple AST together. -export { concatAST } from './concatAST'; +export { concatAST } from './concatAST.js'; // Separates an AST into an AST per Operation. -export { separateOperations } from './separateOperations'; +export { separateOperations } from './separateOperations.js'; // Strips characters that are not significant to the validity or execution of a GraphQL document. -export { stripIgnoredCharacters } from './stripIgnoredCharacters'; +export { stripIgnoredCharacters } from './stripIgnoredCharacters.js'; // Comparators for types export { isEqualType, isTypeSubTypeOf, doTypesOverlap, -} from './typeComparators'; +} from './typeComparators.js'; // Compares two GraphQLSchemas and detects breaking changes. export { @@ -92,8 +92,8 @@ export { DangerousChangeType, findBreakingChanges, findDangerousChanges, -} from './findBreakingChanges'; -export type { BreakingChange, DangerousChange } from './findBreakingChanges'; +} from './findBreakingChanges.js'; +export type { BreakingChange, DangerousChange } from './findBreakingChanges.js'; // Wrapper type that contains DocumentNode and types that can be deduced from it. -export type { TypedQueryDocumentNode } from './typedQueryDocumentNode'; +export type { TypedQueryDocumentNode } from './typedQueryDocumentNode.js'; diff --git a/src/utilities/introspectionFromSchema.ts b/src/utilities/introspectionFromSchema.ts index 78c1b30244..041a0ce489 100644 --- a/src/utilities/introspectionFromSchema.ts +++ b/src/utilities/introspectionFromSchema.ts @@ -1,16 +1,16 @@ -import { invariant } from '../jsutils/invariant'; +import { invariant } from '../jsutils/invariant.js'; -import { parse } from '../language/parser'; +import { parse } from '../language/parser.js'; -import type { GraphQLSchema } from '../type/schema'; +import type { GraphQLSchema } from '../type/schema.js'; -import { executeSync } from '../execution/execute'; +import { executeSync } from '../execution/execute.js'; import type { IntrospectionOptions, IntrospectionQuery, -} from './getIntrospectionQuery'; -import { getIntrospectionQuery } from './getIntrospectionQuery'; +} from './getIntrospectionQuery.js'; +import { getIntrospectionQuery } from './getIntrospectionQuery.js'; /** * Build an IntrospectionQuery from a GraphQLSchema diff --git a/src/utilities/lexicographicSortSchema.ts b/src/utilities/lexicographicSortSchema.ts index 26b6908c9f..4675185a4e 100644 --- a/src/utilities/lexicographicSortSchema.ts +++ b/src/utilities/lexicographicSortSchema.ts @@ -1,9 +1,9 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { keyValMap } from '../jsutils/keyValMap'; -import type { Maybe } from '../jsutils/Maybe'; -import { naturalCompare } from '../jsutils/naturalCompare'; -import type { ObjMap } from '../jsutils/ObjMap'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { keyValMap } from '../jsutils/keyValMap.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import { naturalCompare } from '../jsutils/naturalCompare.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; import type { GraphQLFieldConfigArgumentMap, @@ -11,7 +11,7 @@ import type { GraphQLInputFieldConfigMap, GraphQLNamedType, GraphQLType, -} from '../type/definition'; +} from '../type/definition.js'; import { GraphQLEnumType, GraphQLInputObjectType, @@ -28,10 +28,10 @@ import { isObjectType, isScalarType, isUnionType, -} from '../type/definition'; -import { GraphQLDirective } from '../type/directives'; -import { isIntrospectionType } from '../type/introspection'; -import { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import { GraphQLDirective } from '../type/directives.js'; +import { isIntrospectionType } from '../type/introspection.js'; +import { GraphQLSchema } from '../type/schema.js'; /** * Sort GraphQLSchema. diff --git a/src/utilities/printSchema.ts b/src/utilities/printSchema.ts index 83859feee8..527cf4be17 100644 --- a/src/utilities/printSchema.ts +++ b/src/utilities/printSchema.ts @@ -1,10 +1,10 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import type { Maybe } from '../jsutils/Maybe'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import type { Maybe } from '../jsutils/Maybe.js'; -import { isPrintableAsBlockString } from '../language/blockString'; -import { Kind } from '../language/kinds'; -import { print } from '../language/printer'; +import { isPrintableAsBlockString } from '../language/blockString.js'; +import { Kind } from '../language/kinds.js'; +import { print } from '../language/printer.js'; import type { GraphQLArgument, @@ -16,7 +16,7 @@ import type { GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, -} from '../type/definition'; +} from '../type/definition.js'; import { isEnumType, isInputObjectType, @@ -24,17 +24,17 @@ import { isObjectType, isScalarType, isUnionType, -} from '../type/definition'; -import type { GraphQLDirective } from '../type/directives'; +} from '../type/definition.js'; +import type { GraphQLDirective } from '../type/directives.js'; import { DEFAULT_DEPRECATION_REASON, isSpecifiedDirective, -} from '../type/directives'; -import { isIntrospectionType } from '../type/introspection'; -import { isSpecifiedScalarType } from '../type/scalars'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/directives.js'; +import { isIntrospectionType } from '../type/introspection.js'; +import { isSpecifiedScalarType } from '../type/scalars.js'; +import type { GraphQLSchema } from '../type/schema.js'; -import { astFromValue } from './astFromValue'; +import { astFromValue } from './astFromValue.js'; export function printSchema(schema: GraphQLSchema): string { return printFilteredSchema( diff --git a/src/utilities/separateOperations.ts b/src/utilities/separateOperations.ts index 84a8b774f9..3a7f78bc07 100644 --- a/src/utilities/separateOperations.ts +++ b/src/utilities/separateOperations.ts @@ -1,12 +1,12 @@ -import type { ObjMap } from '../jsutils/ObjMap'; +import type { ObjMap } from '../jsutils/ObjMap.js'; import type { DocumentNode, OperationDefinitionNode, SelectionSetNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; -import { visit } from '../language/visitor'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; +import { visit } from '../language/visitor.js'; /** * separateOperations accepts a single AST document which may contain many diff --git a/src/utilities/sortValueNode.ts b/src/utilities/sortValueNode.ts index 6050c9a907..e89a05f9e1 100644 --- a/src/utilities/sortValueNode.ts +++ b/src/utilities/sortValueNode.ts @@ -1,7 +1,7 @@ -import { naturalCompare } from '../jsutils/naturalCompare'; +import { naturalCompare } from '../jsutils/naturalCompare.js'; -import type { ObjectFieldNode, ValueNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { ObjectFieldNode, ValueNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; /** * Sort ValueNode. diff --git a/src/utilities/stripIgnoredCharacters.ts b/src/utilities/stripIgnoredCharacters.ts index 5eb5c9800c..8c0acf1522 100644 --- a/src/utilities/stripIgnoredCharacters.ts +++ b/src/utilities/stripIgnoredCharacters.ts @@ -1,7 +1,7 @@ -import { printBlockString } from '../language/blockString'; -import { isPunctuatorTokenKind, Lexer } from '../language/lexer'; -import { isSource, Source } from '../language/source'; -import { TokenKind } from '../language/tokenKind'; +import { printBlockString } from '../language/blockString.js'; +import { isPunctuatorTokenKind, Lexer } from '../language/lexer.js'; +import { isSource, Source } from '../language/source.js'; +import { TokenKind } from '../language/tokenKind.js'; /** * Strips characters that are not significant to the validity or execution diff --git a/src/utilities/typeComparators.ts b/src/utilities/typeComparators.ts index 287be40bfe..c0fd9ee6f0 100644 --- a/src/utilities/typeComparators.ts +++ b/src/utilities/typeComparators.ts @@ -1,12 +1,12 @@ -import type { GraphQLCompositeType, GraphQLType } from '../type/definition'; +import type { GraphQLCompositeType, GraphQLType } from '../type/definition.js'; import { isAbstractType, isInterfaceType, isListType, isNonNullType, isObjectType, -} from '../type/definition'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import type { GraphQLSchema } from '../type/schema.js'; /** * Provided two types, return true if the types are equal (invariant). diff --git a/src/utilities/typeFromAST.ts b/src/utilities/typeFromAST.ts index 7510df1046..c072301b39 100644 --- a/src/utilities/typeFromAST.ts +++ b/src/utilities/typeFromAST.ts @@ -3,12 +3,12 @@ import type { NamedTypeNode, NonNullTypeNode, TypeNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; -import type { GraphQLNamedType, GraphQLType } from '../type/definition'; -import { GraphQLList, GraphQLNonNull } from '../type/definition'; -import type { GraphQLSchema } from '../type/schema'; +import type { GraphQLNamedType, GraphQLType } from '../type/definition.js'; +import { GraphQLList, GraphQLNonNull } from '../type/definition.js'; +import type { GraphQLSchema } from '../type/schema.js'; /** * Given a Schema and an AST node describing a type, return a GraphQLType diff --git a/src/utilities/typedQueryDocumentNode.ts b/src/utilities/typedQueryDocumentNode.ts index 1bd5cf0825..8fd8cbe708 100644 --- a/src/utilities/typedQueryDocumentNode.ts +++ b/src/utilities/typedQueryDocumentNode.ts @@ -1,4 +1,7 @@ -import type { DocumentNode, ExecutableDefinitionNode } from '../language/ast'; +import type { + DocumentNode, + ExecutableDefinitionNode, +} from '../language/ast.js'; /** * Wrapper type that contains DocumentNode and types that can be deduced from it. */ diff --git a/src/utilities/valueFromAST.ts b/src/utilities/valueFromAST.ts index 4f0cee6b29..18981712f4 100644 --- a/src/utilities/valueFromAST.ts +++ b/src/utilities/valueFromAST.ts @@ -1,19 +1,19 @@ -import { inspect } from '../jsutils/inspect'; -import { invariant } from '../jsutils/invariant'; -import { keyMap } from '../jsutils/keyMap'; -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; +import { inspect } from '../jsutils/inspect.js'; +import { invariant } from '../jsutils/invariant.js'; +import { keyMap } from '../jsutils/keyMap.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; -import type { ValueNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { ValueNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; -import type { GraphQLInputType } from '../type/definition'; +import type { GraphQLInputType } from '../type/definition.js'; import { isInputObjectType, isLeafType, isListType, isNonNullType, -} from '../type/definition'; +} from '../type/definition.js'; /** * Produces a JavaScript value given a GraphQL Value AST. diff --git a/src/utilities/valueFromASTUntyped.ts b/src/utilities/valueFromASTUntyped.ts index 05540da3a4..87af11a9a3 100644 --- a/src/utilities/valueFromASTUntyped.ts +++ b/src/utilities/valueFromASTUntyped.ts @@ -1,9 +1,9 @@ -import { keyValMap } from '../jsutils/keyValMap'; -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; +import { keyValMap } from '../jsutils/keyValMap.js'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; -import type { ValueNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { ValueNode } from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; /** * Produces a JavaScript value given a GraphQL Value AST. diff --git a/src/validation/ValidationContext.ts b/src/validation/ValidationContext.ts index fa6e83aff2..b0c5524fa7 100644 --- a/src/validation/ValidationContext.ts +++ b/src/validation/ValidationContext.ts @@ -1,7 +1,7 @@ -import type { Maybe } from '../jsutils/Maybe'; -import type { ObjMap } from '../jsutils/ObjMap'; +import type { Maybe } from '../jsutils/Maybe.js'; +import type { ObjMap } from '../jsutils/ObjMap.js'; -import type { GraphQLError } from '../error/GraphQLError'; +import type { GraphQLError } from '../error/GraphQLError.js'; import type { DocumentNode, @@ -10,10 +10,10 @@ import type { OperationDefinitionNode, SelectionSetNode, VariableNode, -} from '../language/ast'; -import { Kind } from '../language/kinds'; -import type { ASTVisitor } from '../language/visitor'; -import { visit } from '../language/visitor'; +} from '../language/ast.js'; +import { Kind } from '../language/kinds.js'; +import type { ASTVisitor } from '../language/visitor.js'; +import { visit } from '../language/visitor.js'; import type { GraphQLArgument, @@ -22,11 +22,11 @@ import type { GraphQLField, GraphQLInputType, GraphQLOutputType, -} from '../type/definition'; -import type { GraphQLDirective } from '../type/directives'; -import type { GraphQLSchema } from '../type/schema'; +} from '../type/definition.js'; +import type { GraphQLDirective } from '../type/directives.js'; +import type { GraphQLSchema } from '../type/schema.js'; -import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo'; +import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo.js'; type NodeWithSelectionSet = OperationDefinitionNode | FragmentDefinitionNode; interface VariableUsage { diff --git a/src/validation/__tests__/DeferStreamDirectiveLabelRule-test.ts b/src/validation/__tests__/DeferStreamDirectiveLabelRule-test.ts new file mode 100644 index 0000000000..a5ffd1cfa9 --- /dev/null +++ b/src/validation/__tests__/DeferStreamDirectiveLabelRule-test.ts @@ -0,0 +1,171 @@ +import { describe, it } from 'mocha'; + +import { DeferStreamDirectiveLabelRule } from '../rules/DeferStreamDirectiveLabelRule.js'; + +import { expectValidationErrors } from './harness.js'; + +function expectErrors(queryStr: string) { + return expectValidationErrors(DeferStreamDirectiveLabelRule, queryStr); +} + +function expectValid(queryStr: string) { + expectErrors(queryStr).toDeepEqual([]); +} + +describe('Validate: Defer/Stream directive on root field', () => { + it('Defer fragments with no label', () => { + expectValid(` + { + dog { + ...dogFragmentA @defer + ...dogFragmentB @defer + } + } + fragment dogFragmentA on Dog { + name + } + fragment dogFragmentB on Dog { + nickname + } + `); + }); + + it('Defer fragments, one with label, one without', () => { + expectValid(` + { + dog { + ...dogFragmentA @defer(label: "fragA") + ...dogFragmentB @defer + } + } + fragment dogFragmentA on Dog { + name + } + fragment dogFragmentB on Dog { + nickname + } + `); + }); + + it('Defer fragment with variable label', () => { + expectErrors(` + query($label: String) { + dog { + ...dogFragmentA @defer(label: $label) + ...dogFragmentB @defer(label: "fragA") + } + } + fragment dogFragmentA on Dog { + name + } + fragment dogFragmentB on Dog { + nickname + } + `).toDeepEqual([ + { + message: 'Directive "defer"\'s label argument must be a static string.', + locations: [{ line: 4, column: 25 }], + }, + ]); + }); + + it('Defer fragments with different labels', () => { + expectValid(` + { + dog { + ...dogFragmentA @defer(label: "fragB") + ...dogFragmentB @defer(label: "fragA") + } + } + fragment dogFragmentA on Dog { + name + } + fragment dogFragmentB on Dog { + nickname + } + `); + }); + it('Defer fragments with same label', () => { + expectErrors(` + { + dog { + ...dogFragmentA @defer(label: "fragA") + ...dogFragmentB @defer(label: "fragA") + } + } + fragment dogFragmentA on Dog { + name + } + fragment dogFragmentB on Dog { + nickname + } + `).toDeepEqual([ + { + message: 'Defer/Stream directive label argument must be unique.', + locations: [ + { line: 4, column: 25 }, + { line: 5, column: 25 }, + ], + }, + ]); + }); + it('Defer and stream with no label', () => { + expectValid(` + { + dog { + ...dogFragment @defer + } + pets @stream(initialCount: 0) @stream { + name + } + } + fragment dogFragment on Dog { + name + } + `); + }); + it('Stream with variable label', () => { + expectErrors(` + query ($label: String!) { + dog { + ...dogFragment @defer + } + pets @stream(initialCount: 0) @stream(label: $label) { + name + } + } + fragment dogFragment on Dog { + name + } + `).toDeepEqual([ + { + message: + 'Directive "stream"\'s label argument must be a static string.', + locations: [{ line: 6, column: 39 }], + }, + ]); + }); + it('Defer and stream with the same label', () => { + expectErrors(` + { + dog { + ...dogFragment @defer(label: "MyLabel") + } + pets @stream(initialCount: 0) @stream(label: "MyLabel") { + name + } + } + fragment dogFragment on Dog { + name + } + `).toDeepEqual([ + { + message: 'Defer/Stream directive label argument must be unique.', + locations: [ + { line: 4, column: 26 }, + { line: 6, column: 39 }, + ], + }, + ]); + }); +}); diff --git a/src/validation/__tests__/DeferStreamDirectiveOnRootFieldRule-test.ts b/src/validation/__tests__/DeferStreamDirectiveOnRootFieldRule-test.ts new file mode 100644 index 0000000000..b8161df40e --- /dev/null +++ b/src/validation/__tests__/DeferStreamDirectiveOnRootFieldRule-test.ts @@ -0,0 +1,258 @@ +import { describe, it } from 'mocha'; + +import { buildSchema } from '../../utilities/buildASTSchema.js'; + +import { DeferStreamDirectiveOnRootFieldRule } from '../rules/DeferStreamDirectiveOnRootFieldRule.js'; + +import { expectValidationErrorsWithSchema } from './harness.js'; + +function expectErrors(queryStr: string) { + return expectValidationErrorsWithSchema( + schema, + DeferStreamDirectiveOnRootFieldRule, + queryStr, + ); +} + +function expectValid(queryStr: string) { + expectErrors(queryStr).toDeepEqual([]); +} + +const schema = buildSchema(` + type Message { + body: String + sender: String + } + + type SubscriptionRoot { + subscriptionField: Message + subscriptionListField: [Message] + } + + type MutationRoot { + mutationField: Message + mutationListField: [Message] + } + + type QueryRoot { + message: Message + messages: [Message] + } + + schema { + query: QueryRoot + mutation: MutationRoot + subscription: SubscriptionRoot + } +`); + +describe('Validate: Defer/Stream directive on root field', () => { + it('Defer fragment spread on root query field', () => { + expectValid(` + { + ...rootQueryFragment @defer + } + fragment rootQueryFragment on QueryRoot { + message { + body + } + } + `); + }); + + it('Defer inline fragment spread on root query field', () => { + expectValid(` + { + ... @defer { + message { + body + } + } + } + `); + }); + + it('Defer fragment spread on root mutation field', () => { + expectErrors(` + mutation { + ...rootFragment @defer + } + fragment rootFragment on MutationRoot { + mutationField { + body + } + } + `).toDeepEqual([ + { + message: + 'Defer directive cannot be used on root mutation type "MutationRoot".', + locations: [{ line: 3, column: 25 }], + }, + ]); + }); + it('Defer inline fragment spread on root mutation field', () => { + expectErrors(` + mutation { + ... @defer { + mutationField { + body + } + } + } + `).toDeepEqual([ + { + message: + 'Defer directive cannot be used on root mutation type "MutationRoot".', + locations: [{ line: 3, column: 13 }], + }, + ]); + }); + + it('Defer fragment spread on nested mutation field', () => { + expectValid(` + mutation { + mutationField { + ... @defer { + body + } + } + } + `); + }); + + it('Defer fragment spread on root subscription field', () => { + expectErrors(` + subscription { + ...rootFragment @defer + } + fragment rootFragment on SubscriptionRoot { + subscriptionField { + body + } + } + `).toDeepEqual([ + { + message: + 'Defer directive cannot be used on root subscription type "SubscriptionRoot".', + locations: [{ line: 3, column: 25 }], + }, + ]); + }); + it('Defer inline fragment spread on root subscription field', () => { + expectErrors(` + subscription { + ... @defer { + subscriptionField { + body + } + } + } + `).toDeepEqual([ + { + message: + 'Defer directive cannot be used on root subscription type "SubscriptionRoot".', + locations: [{ line: 3, column: 13 }], + }, + ]); + }); + + it('Defer fragment spread on nested subscription field', () => { + expectValid(` + subscription { + subscriptionField { + ...nestedFragment + } + } + fragment nestedFragment on Message { + body + } + `); + }); + it('Stream field on root query field', () => { + expectValid(` + { + messages @stream { + name + } + } + `); + }); + it('Stream field on fragment on root query field', () => { + expectValid(` + { + ...rootFragment + } + fragment rootFragment on QueryType { + messages @stream { + name + } + } + `); + }); + it('Stream field on root mutation field', () => { + expectErrors(` + mutation { + mutationListField @stream { + name + } + } + `).toDeepEqual([ + { + message: + 'Stream directive cannot be used on root mutation type "MutationRoot".', + locations: [{ line: 3, column: 27 }], + }, + ]); + }); + it('Stream field on fragment on root mutation field', () => { + expectErrors(` + mutation { + ...rootFragment + } + fragment rootFragment on MutationRoot { + mutationListField @stream { + name + } + } + `).toDeepEqual([ + { + message: + 'Stream directive cannot be used on root mutation type "MutationRoot".', + locations: [{ line: 6, column: 27 }], + }, + ]); + }); + it('Stream field on root subscription field', () => { + expectErrors(` + subscription { + subscriptionListField @stream { + name + } + } + `).toDeepEqual([ + { + message: + 'Stream directive cannot be used on root subscription type "SubscriptionRoot".', + locations: [{ line: 3, column: 31 }], + }, + ]); + }); + it('Stream field on fragment on root subscription field', () => { + expectErrors(` + subscription { + ...rootFragment + } + fragment rootFragment on SubscriptionRoot { + subscriptionListField @stream { + name + } + } + `).toDeepEqual([ + { + message: + 'Stream directive cannot be used on root subscription type "SubscriptionRoot".', + locations: [{ line: 6, column: 31 }], + }, + ]); + }); +}); diff --git a/src/validation/__tests__/ExecutableDefinitionsRule-test.ts b/src/validation/__tests__/ExecutableDefinitionsRule-test.ts index ec3a1afe25..88aaaefb70 100644 --- a/src/validation/__tests__/ExecutableDefinitionsRule-test.ts +++ b/src/validation/__tests__/ExecutableDefinitionsRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { ExecutableDefinitionsRule } from '../rules/ExecutableDefinitionsRule'; +import { ExecutableDefinitionsRule } from '../rules/ExecutableDefinitionsRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(ExecutableDefinitionsRule, queryStr); diff --git a/src/validation/__tests__/FieldsOnCorrectTypeRule-test.ts b/src/validation/__tests__/FieldsOnCorrectTypeRule-test.ts index 70473fa685..1c7fbc0351 100644 --- a/src/validation/__tests__/FieldsOnCorrectTypeRule-test.ts +++ b/src/validation/__tests__/FieldsOnCorrectTypeRule-test.ts @@ -1,16 +1,16 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { FieldsOnCorrectTypeRule } from '../rules/FieldsOnCorrectTypeRule'; -import { validate } from '../validate'; +import { FieldsOnCorrectTypeRule } from '../rules/FieldsOnCorrectTypeRule.js'; +import { validate } from '../validate.js'; -import { expectValidationErrorsWithSchema } from './harness'; +import { expectValidationErrorsWithSchema } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( diff --git a/src/validation/__tests__/FragmentsOnCompositeTypesRule-test.ts b/src/validation/__tests__/FragmentsOnCompositeTypesRule-test.ts index dc1ed40796..849b662866 100644 --- a/src/validation/__tests__/FragmentsOnCompositeTypesRule-test.ts +++ b/src/validation/__tests__/FragmentsOnCompositeTypesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { FragmentsOnCompositeTypesRule } from '../rules/FragmentsOnCompositeTypesRule'; +import { FragmentsOnCompositeTypesRule } from '../rules/FragmentsOnCompositeTypesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(FragmentsOnCompositeTypesRule, queryStr); diff --git a/src/validation/__tests__/KnownArgumentNamesRule-test.ts b/src/validation/__tests__/KnownArgumentNamesRule-test.ts index 4ce5fd190f..0fcffeca2c 100644 --- a/src/validation/__tests__/KnownArgumentNamesRule-test.ts +++ b/src/validation/__tests__/KnownArgumentNamesRule-test.ts @@ -1,15 +1,18 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; import { KnownArgumentNamesOnDirectivesRule, KnownArgumentNamesRule, -} from '../rules/KnownArgumentNamesRule'; +} from '../rules/KnownArgumentNamesRule.js'; -import { expectSDLValidationErrors, expectValidationErrors } from './harness'; +import { + expectSDLValidationErrors, + expectValidationErrors, +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(KnownArgumentNamesRule, queryStr); diff --git a/src/validation/__tests__/KnownDirectivesRule-test.ts b/src/validation/__tests__/KnownDirectivesRule-test.ts index 4cb6e225c1..a3bbc198da 100644 --- a/src/validation/__tests__/KnownDirectivesRule-test.ts +++ b/src/validation/__tests__/KnownDirectivesRule-test.ts @@ -1,15 +1,15 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { KnownDirectivesRule } from '../rules/KnownDirectivesRule'; +import { KnownDirectivesRule } from '../rules/KnownDirectivesRule.js'; import { expectSDLValidationErrors, expectValidationErrorsWithSchema, -} from './harness'; +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( diff --git a/src/validation/__tests__/KnownFragmentNamesRule-test.ts b/src/validation/__tests__/KnownFragmentNamesRule-test.ts index c425767806..ad0158bdda 100644 --- a/src/validation/__tests__/KnownFragmentNamesRule-test.ts +++ b/src/validation/__tests__/KnownFragmentNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { KnownFragmentNamesRule } from '../rules/KnownFragmentNamesRule'; +import { KnownFragmentNamesRule } from '../rules/KnownFragmentNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(KnownFragmentNamesRule, queryStr); diff --git a/src/validation/__tests__/KnownTypeNamesRule-test.ts b/src/validation/__tests__/KnownTypeNamesRule-test.ts index 34f0ca71e5..0440c094d0 100644 --- a/src/validation/__tests__/KnownTypeNamesRule-test.ts +++ b/src/validation/__tests__/KnownTypeNamesRule-test.ts @@ -1,16 +1,16 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { KnownTypeNamesRule } from '../rules/KnownTypeNamesRule'; +import { KnownTypeNamesRule } from '../rules/KnownTypeNamesRule.js'; import { expectSDLValidationErrors, expectValidationErrors, expectValidationErrorsWithSchema, -} from './harness'; +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(KnownTypeNamesRule, queryStr); diff --git a/src/validation/__tests__/LoneAnonymousOperationRule-test.ts b/src/validation/__tests__/LoneAnonymousOperationRule-test.ts index a50ef1bdf0..f60750b534 100644 --- a/src/validation/__tests__/LoneAnonymousOperationRule-test.ts +++ b/src/validation/__tests__/LoneAnonymousOperationRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { LoneAnonymousOperationRule } from '../rules/LoneAnonymousOperationRule'; +import { LoneAnonymousOperationRule } from '../rules/LoneAnonymousOperationRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(LoneAnonymousOperationRule, queryStr); diff --git a/src/validation/__tests__/LoneSchemaDefinitionRule-test.ts b/src/validation/__tests__/LoneSchemaDefinitionRule-test.ts index 3f2ea895af..5cd815f24f 100644 --- a/src/validation/__tests__/LoneSchemaDefinitionRule-test.ts +++ b/src/validation/__tests__/LoneSchemaDefinitionRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { LoneSchemaDefinitionRule } from '../rules/LoneSchemaDefinitionRule'; +import { LoneSchemaDefinitionRule } from '../rules/LoneSchemaDefinitionRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, LoneSchemaDefinitionRule, sdlStr); diff --git a/src/validation/__tests__/NoDeprecatedCustomRule-test.ts b/src/validation/__tests__/NoDeprecatedCustomRule-test.ts index 512edb27dd..96823684fc 100644 --- a/src/validation/__tests__/NoDeprecatedCustomRule-test.ts +++ b/src/validation/__tests__/NoDeprecatedCustomRule-test.ts @@ -1,10 +1,10 @@ import { describe, it } from 'mocha'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { NoDeprecatedCustomRule } from '../rules/custom/NoDeprecatedCustomRule'; +import { NoDeprecatedCustomRule } from '../rules/custom/NoDeprecatedCustomRule.js'; -import { expectValidationErrorsWithSchema } from './harness'; +import { expectValidationErrorsWithSchema } from './harness.js'; function buildAssertion(sdlStr: string) { const schema = buildSchema(sdlStr); diff --git a/src/validation/__tests__/NoFragmentCyclesRule-test.ts b/src/validation/__tests__/NoFragmentCyclesRule-test.ts index 08ac4cb4a9..69f951c572 100644 --- a/src/validation/__tests__/NoFragmentCyclesRule-test.ts +++ b/src/validation/__tests__/NoFragmentCyclesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { NoFragmentCyclesRule } from '../rules/NoFragmentCyclesRule'; +import { NoFragmentCyclesRule } from '../rules/NoFragmentCyclesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(NoFragmentCyclesRule, queryStr); diff --git a/src/validation/__tests__/NoSchemaIntrospectionCustomRule-test.ts b/src/validation/__tests__/NoSchemaIntrospectionCustomRule-test.ts index cd681a7e68..292aee27f3 100644 --- a/src/validation/__tests__/NoSchemaIntrospectionCustomRule-test.ts +++ b/src/validation/__tests__/NoSchemaIntrospectionCustomRule-test.ts @@ -1,10 +1,10 @@ import { describe, it } from 'mocha'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { NoSchemaIntrospectionCustomRule } from '../rules/custom/NoSchemaIntrospectionCustomRule'; +import { NoSchemaIntrospectionCustomRule } from '../rules/custom/NoSchemaIntrospectionCustomRule.js'; -import { expectValidationErrorsWithSchema } from './harness'; +import { expectValidationErrorsWithSchema } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( diff --git a/src/validation/__tests__/NoUndefinedVariablesRule-test.ts b/src/validation/__tests__/NoUndefinedVariablesRule-test.ts index e027d4a49b..c6ed758cad 100644 --- a/src/validation/__tests__/NoUndefinedVariablesRule-test.ts +++ b/src/validation/__tests__/NoUndefinedVariablesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { NoUndefinedVariablesRule } from '../rules/NoUndefinedVariablesRule'; +import { NoUndefinedVariablesRule } from '../rules/NoUndefinedVariablesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(NoUndefinedVariablesRule, queryStr); diff --git a/src/validation/__tests__/NoUnusedFragmentsRule-test.ts b/src/validation/__tests__/NoUnusedFragmentsRule-test.ts index abeee19e9f..d20f99ea70 100644 --- a/src/validation/__tests__/NoUnusedFragmentsRule-test.ts +++ b/src/validation/__tests__/NoUnusedFragmentsRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { NoUnusedFragmentsRule } from '../rules/NoUnusedFragmentsRule'; +import { NoUnusedFragmentsRule } from '../rules/NoUnusedFragmentsRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(NoUnusedFragmentsRule, queryStr); diff --git a/src/validation/__tests__/NoUnusedVariablesRule-test.ts b/src/validation/__tests__/NoUnusedVariablesRule-test.ts index 6be63cd23d..47dac39c99 100644 --- a/src/validation/__tests__/NoUnusedVariablesRule-test.ts +++ b/src/validation/__tests__/NoUnusedVariablesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { NoUnusedVariablesRule } from '../rules/NoUnusedVariablesRule'; +import { NoUnusedVariablesRule } from '../rules/NoUnusedVariablesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(NoUnusedVariablesRule, queryStr); diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 46cf014e46..52c2deb1a0 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -1,15 +1,15 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { OverlappingFieldsCanBeMergedRule } from '../rules/OverlappingFieldsCanBeMergedRule'; +import { OverlappingFieldsCanBeMergedRule } from '../rules/OverlappingFieldsCanBeMergedRule.js'; import { expectValidationErrors, expectValidationErrorsWithSchema, -} from './harness'; +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(OverlappingFieldsCanBeMergedRule, queryStr); @@ -98,6 +98,114 @@ describe('Validate: Overlapping fields can be merged', () => { `); }); + it('Same stream directives supported', () => { + expectValid(` + fragment differentDirectivesWithDifferentAliases on Dog { + name @stream(label: "streamLabel", initialCount: 1) + name @stream(label: "streamLabel", initialCount: 1) + } + `); + }); + + it('different stream directive label', () => { + expectErrors(` + fragment conflictingArgs on Dog { + name @stream(label: "streamLabel", initialCount: 1) + name @stream(label: "anotherLabel", initialCount: 1) + } + `).toDeepEqual([ + { + message: + 'Fields "name" conflict because they have differing stream directives. Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + + it('different stream directive initialCount', () => { + expectErrors(` + fragment conflictingArgs on Dog { + name @stream(label: "streamLabel", initialCount: 1) + name @stream(label: "streamLabel", initialCount: 2) + } + `).toDeepEqual([ + { + message: + 'Fields "name" conflict because they have differing stream directives. Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + + it('different stream directive first missing args', () => { + expectErrors(` + fragment conflictingArgs on Dog { + name @stream + name @stream(label: "streamLabel", initialCount: 1) + } + `).toDeepEqual([ + { + message: + 'Fields "name" conflict because they have differing stream directives. Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + + it('different stream directive second missing args', () => { + expectErrors(` + fragment conflictingArgs on Dog { + name @stream(label: "streamLabel", initialCount: 1) + name @stream + } + `).toDeepEqual([ + { + message: + 'Fields "name" conflict because they have differing stream directives. Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + + it('mix of stream and no stream', () => { + expectErrors(` + fragment conflictingArgs on Dog { + name @stream + name + } + `).toDeepEqual([ + { + message: + 'Fields "name" conflict because they have differing stream directives. Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + + it('different stream directive both missing args', () => { + expectValid(` + fragment conflictingArgs on Dog { + name @stream + name @stream + } + `); + }); + it('Same aliases with different field targets', () => { expectErrors(` fragment sameAliasesWithDifferentFieldTargets on Dog { diff --git a/src/validation/__tests__/PossibleFragmentSpreadsRule-test.ts b/src/validation/__tests__/PossibleFragmentSpreadsRule-test.ts index 3e52f234b5..bd3bb63c61 100644 --- a/src/validation/__tests__/PossibleFragmentSpreadsRule-test.ts +++ b/src/validation/__tests__/PossibleFragmentSpreadsRule-test.ts @@ -1,10 +1,10 @@ import { describe, it } from 'mocha'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { PossibleFragmentSpreadsRule } from '../rules/PossibleFragmentSpreadsRule'; +import { PossibleFragmentSpreadsRule } from '../rules/PossibleFragmentSpreadsRule.js'; -import { expectValidationErrorsWithSchema } from './harness'; +import { expectValidationErrorsWithSchema } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( diff --git a/src/validation/__tests__/PossibleTypeExtensionsRule-test.ts b/src/validation/__tests__/PossibleTypeExtensionsRule-test.ts index e29c097bdb..4ae21294ba 100644 --- a/src/validation/__tests__/PossibleTypeExtensionsRule-test.ts +++ b/src/validation/__tests__/PossibleTypeExtensionsRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { PossibleTypeExtensionsRule } from '../rules/PossibleTypeExtensionsRule'; +import { PossibleTypeExtensionsRule } from '../rules/PossibleTypeExtensionsRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, PossibleTypeExtensionsRule, sdlStr); diff --git a/src/validation/__tests__/ProvidedRequiredArgumentsRule-test.ts b/src/validation/__tests__/ProvidedRequiredArgumentsRule-test.ts index 23a272572c..6f0d223c15 100644 --- a/src/validation/__tests__/ProvidedRequiredArgumentsRule-test.ts +++ b/src/validation/__tests__/ProvidedRequiredArgumentsRule-test.ts @@ -1,15 +1,18 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; import { ProvidedRequiredArgumentsOnDirectivesRule, ProvidedRequiredArgumentsRule, -} from '../rules/ProvidedRequiredArgumentsRule'; +} from '../rules/ProvidedRequiredArgumentsRule.js'; -import { expectSDLValidationErrors, expectValidationErrors } from './harness'; +import { + expectSDLValidationErrors, + expectValidationErrors, +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(ProvidedRequiredArgumentsRule, queryStr); diff --git a/src/validation/__tests__/ScalarLeafsRule-test.ts b/src/validation/__tests__/ScalarLeafsRule-test.ts index b10cf01e18..fd000b92c9 100644 --- a/src/validation/__tests__/ScalarLeafsRule-test.ts +++ b/src/validation/__tests__/ScalarLeafsRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { ScalarLeafsRule } from '../rules/ScalarLeafsRule'; +import { ScalarLeafsRule } from '../rules/ScalarLeafsRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(ScalarLeafsRule, queryStr); diff --git a/src/validation/__tests__/SingleFieldSubscriptionsRule-test.ts b/src/validation/__tests__/SingleFieldSubscriptionsRule-test.ts index e0d3789299..7e0a227d07 100644 --- a/src/validation/__tests__/SingleFieldSubscriptionsRule-test.ts +++ b/src/validation/__tests__/SingleFieldSubscriptionsRule-test.ts @@ -1,10 +1,10 @@ import { describe, it } from 'mocha'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { SingleFieldSubscriptionsRule } from '../rules/SingleFieldSubscriptionsRule'; +import { SingleFieldSubscriptionsRule } from '../rules/SingleFieldSubscriptionsRule.js'; -import { expectValidationErrorsWithSchema } from './harness'; +import { expectValidationErrorsWithSchema } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( diff --git a/src/validation/__tests__/StreamDirectiveOnListFieldRule-test.ts b/src/validation/__tests__/StreamDirectiveOnListFieldRule-test.ts new file mode 100644 index 0000000000..a35c31232d --- /dev/null +++ b/src/validation/__tests__/StreamDirectiveOnListFieldRule-test.ts @@ -0,0 +1,79 @@ +import { describe, it } from 'mocha'; + +import { StreamDirectiveOnListFieldRule } from '../rules/StreamDirectiveOnListFieldRule.js'; + +import { expectValidationErrors } from './harness.js'; + +function expectErrors(queryStr: string) { + return expectValidationErrors(StreamDirectiveOnListFieldRule, queryStr); +} + +function expectValid(queryStr: string) { + expectErrors(queryStr).toDeepEqual([]); +} + +describe('Validate: Stream directive on list field', () => { + it('Stream on list field', () => { + expectValid(` + fragment objectFieldSelection on Human { + pets @stream(initialCount: 0) { + name + } + } + `); + }); + + it('Stream on non-null list field', () => { + expectValid(` + fragment objectFieldSelection on Human { + relatives @stream(initialCount: 0) { + name + } + } + `); + }); + + it("Doesn't validate other directives on list fields", () => { + expectValid(` + fragment objectFieldSelection on Human { + pets @include(if: true) { + name + } + } + `); + }); + + it("Doesn't validate other directives on non-list fields", () => { + expectValid(` + fragment objectFieldSelection on Human { + pets { + name @include(if: true) + } + } + `); + }); + + it("Doesn't validate misplaced stream directives", () => { + expectValid(` + fragment objectFieldSelection on Human { + ... @stream(initialCount: 0) { + name + } + } + `); + }); + + it('reports errors when stream is used on non-list field', () => { + expectErrors(` + fragment objectFieldSelection on Human { + name @stream(initialCount: 0) + } + `).toDeepEqual([ + { + message: + 'Stream directive cannot be used on non-list field "name" on type "Human".', + locations: [{ line: 3, column: 14 }], + }, + ]); + }); +}); diff --git a/src/validation/__tests__/UniqueArgumentDefinitionNamesRule-test.ts b/src/validation/__tests__/UniqueArgumentDefinitionNamesRule-test.ts index cf63202b52..96855e268f 100644 --- a/src/validation/__tests__/UniqueArgumentDefinitionNamesRule-test.ts +++ b/src/validation/__tests__/UniqueArgumentDefinitionNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueArgumentDefinitionNamesRule } from '../rules/UniqueArgumentDefinitionNamesRule'; +import { UniqueArgumentDefinitionNamesRule } from '../rules/UniqueArgumentDefinitionNamesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string) { return expectSDLValidationErrors( diff --git a/src/validation/__tests__/UniqueArgumentNamesRule-test.ts b/src/validation/__tests__/UniqueArgumentNamesRule-test.ts index f5709e321a..8a08f98468 100644 --- a/src/validation/__tests__/UniqueArgumentNamesRule-test.ts +++ b/src/validation/__tests__/UniqueArgumentNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueArgumentNamesRule } from '../rules/UniqueArgumentNamesRule'; +import { UniqueArgumentNamesRule } from '../rules/UniqueArgumentNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(UniqueArgumentNamesRule, queryStr); diff --git a/src/validation/__tests__/UniqueDirectiveNamesRule-test.ts b/src/validation/__tests__/UniqueDirectiveNamesRule-test.ts index a632af286a..97cc1a1a6c 100644 --- a/src/validation/__tests__/UniqueDirectiveNamesRule-test.ts +++ b/src/validation/__tests__/UniqueDirectiveNamesRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { UniqueDirectiveNamesRule } from '../rules/UniqueDirectiveNamesRule'; +import { UniqueDirectiveNamesRule } from '../rules/UniqueDirectiveNamesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, UniqueDirectiveNamesRule, sdlStr); diff --git a/src/validation/__tests__/UniqueDirectivesPerLocationRule-test.ts b/src/validation/__tests__/UniqueDirectivesPerLocationRule-test.ts index d57a3df684..fd67ff8719 100644 --- a/src/validation/__tests__/UniqueDirectivesPerLocationRule-test.ts +++ b/src/validation/__tests__/UniqueDirectivesPerLocationRule-test.ts @@ -1,18 +1,18 @@ import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { extendSchema } from '../../utilities/extendSchema'; +import { extendSchema } from '../../utilities/extendSchema.js'; -import { UniqueDirectivesPerLocationRule } from '../rules/UniqueDirectivesPerLocationRule'; +import { UniqueDirectivesPerLocationRule } from '../rules/UniqueDirectivesPerLocationRule.js'; import { expectSDLValidationErrors, expectValidationErrorsWithSchema, testSchema, -} from './harness'; +} from './harness.js'; const extensionSDL = ` directive @directive on FIELD | FRAGMENT_DEFINITION diff --git a/src/validation/__tests__/UniqueEnumValueNamesRule-test.ts b/src/validation/__tests__/UniqueEnumValueNamesRule-test.ts index 17a71a6e90..ebd31557c7 100644 --- a/src/validation/__tests__/UniqueEnumValueNamesRule-test.ts +++ b/src/validation/__tests__/UniqueEnumValueNamesRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { UniqueEnumValueNamesRule } from '../rules/UniqueEnumValueNamesRule'; +import { UniqueEnumValueNamesRule } from '../rules/UniqueEnumValueNamesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, UniqueEnumValueNamesRule, sdlStr); diff --git a/src/validation/__tests__/UniqueFieldDefinitionNamesRule-test.ts b/src/validation/__tests__/UniqueFieldDefinitionNamesRule-test.ts index 441e85d31a..2c80b4c5d6 100644 --- a/src/validation/__tests__/UniqueFieldDefinitionNamesRule-test.ts +++ b/src/validation/__tests__/UniqueFieldDefinitionNamesRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { UniqueFieldDefinitionNamesRule } from '../rules/UniqueFieldDefinitionNamesRule'; +import { UniqueFieldDefinitionNamesRule } from '../rules/UniqueFieldDefinitionNamesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors( diff --git a/src/validation/__tests__/UniqueFragmentNamesRule-test.ts b/src/validation/__tests__/UniqueFragmentNamesRule-test.ts index 2a693a6781..30b0f5f489 100644 --- a/src/validation/__tests__/UniqueFragmentNamesRule-test.ts +++ b/src/validation/__tests__/UniqueFragmentNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueFragmentNamesRule } from '../rules/UniqueFragmentNamesRule'; +import { UniqueFragmentNamesRule } from '../rules/UniqueFragmentNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(UniqueFragmentNamesRule, queryStr); diff --git a/src/validation/__tests__/UniqueInputFieldNamesRule-test.ts b/src/validation/__tests__/UniqueInputFieldNamesRule-test.ts index 33e4a2db01..3dc56fffee 100644 --- a/src/validation/__tests__/UniqueInputFieldNamesRule-test.ts +++ b/src/validation/__tests__/UniqueInputFieldNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueInputFieldNamesRule } from '../rules/UniqueInputFieldNamesRule'; +import { UniqueInputFieldNamesRule } from '../rules/UniqueInputFieldNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(UniqueInputFieldNamesRule, queryStr); diff --git a/src/validation/__tests__/UniqueOperationNamesRule-test.ts b/src/validation/__tests__/UniqueOperationNamesRule-test.ts index f84abda63e..ef24487a63 100644 --- a/src/validation/__tests__/UniqueOperationNamesRule-test.ts +++ b/src/validation/__tests__/UniqueOperationNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueOperationNamesRule } from '../rules/UniqueOperationNamesRule'; +import { UniqueOperationNamesRule } from '../rules/UniqueOperationNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(UniqueOperationNamesRule, queryStr); diff --git a/src/validation/__tests__/UniqueOperationTypesRule-test.ts b/src/validation/__tests__/UniqueOperationTypesRule-test.ts index 61e819b022..65265b92e1 100644 --- a/src/validation/__tests__/UniqueOperationTypesRule-test.ts +++ b/src/validation/__tests__/UniqueOperationTypesRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { UniqueOperationTypesRule } from '../rules/UniqueOperationTypesRule'; +import { UniqueOperationTypesRule } from '../rules/UniqueOperationTypesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, UniqueOperationTypesRule, sdlStr); diff --git a/src/validation/__tests__/UniqueTypeNamesRule-test.ts b/src/validation/__tests__/UniqueTypeNamesRule-test.ts index 5478467dec..b45b66bf2a 100644 --- a/src/validation/__tests__/UniqueTypeNamesRule-test.ts +++ b/src/validation/__tests__/UniqueTypeNamesRule-test.ts @@ -1,12 +1,12 @@ import { describe, it } from 'mocha'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { UniqueTypeNamesRule } from '../rules/UniqueTypeNamesRule'; +import { UniqueTypeNamesRule } from '../rules/UniqueTypeNamesRule.js'; -import { expectSDLValidationErrors } from './harness'; +import { expectSDLValidationErrors } from './harness.js'; function expectSDLErrors(sdlStr: string, schema?: GraphQLSchema) { return expectSDLValidationErrors(schema, UniqueTypeNamesRule, sdlStr); diff --git a/src/validation/__tests__/UniqueVariableNamesRule-test.ts b/src/validation/__tests__/UniqueVariableNamesRule-test.ts index 9d51b62170..f23c778320 100644 --- a/src/validation/__tests__/UniqueVariableNamesRule-test.ts +++ b/src/validation/__tests__/UniqueVariableNamesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { UniqueVariableNamesRule } from '../rules/UniqueVariableNamesRule'; +import { UniqueVariableNamesRule } from '../rules/UniqueVariableNamesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(UniqueVariableNamesRule, queryStr); diff --git a/src/validation/__tests__/ValidationContext-test.ts b/src/validation/__tests__/ValidationContext-test.ts index 159aa30549..ac1a5442b4 100644 --- a/src/validation/__tests__/ValidationContext-test.ts +++ b/src/validation/__tests__/ValidationContext-test.ts @@ -1,19 +1,19 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { identityFunc } from '../../jsutils/identityFunc'; +import { identityFunc } from '../../jsutils/identityFunc.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLSchema } from '../../type/schema.js'; -import { TypeInfo } from '../../utilities/TypeInfo'; +import { TypeInfo } from '../../utilities/TypeInfo.js'; import { ASTValidationContext, SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; describe('ValidationContext', () => { it('can be Object.toStringified', () => { diff --git a/src/validation/__tests__/ValuesOfCorrectTypeRule-test.ts b/src/validation/__tests__/ValuesOfCorrectTypeRule-test.ts index 76b03035da..f0b7dfa57e 100644 --- a/src/validation/__tests__/ValuesOfCorrectTypeRule-test.ts +++ b/src/validation/__tests__/ValuesOfCorrectTypeRule-test.ts @@ -1,23 +1,23 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import { GraphQLObjectType, GraphQLScalarType } from '../../type/definition'; -import { GraphQLString } from '../../type/scalars'; -import { GraphQLSchema } from '../../type/schema'; +import { GraphQLObjectType, GraphQLScalarType } from '../../type/definition.js'; +import { GraphQLString } from '../../type/scalars.js'; +import { GraphQLSchema } from '../../type/schema.js'; -import { ValuesOfCorrectTypeRule } from '../rules/ValuesOfCorrectTypeRule'; -import { validate } from '../validate'; +import { ValuesOfCorrectTypeRule } from '../rules/ValuesOfCorrectTypeRule.js'; +import { validate } from '../validate.js'; import { expectValidationErrors, expectValidationErrorsWithSchema, -} from './harness'; +} from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(ValuesOfCorrectTypeRule, queryStr); diff --git a/src/validation/__tests__/VariablesAreInputTypesRule-test.ts b/src/validation/__tests__/VariablesAreInputTypesRule-test.ts index 7b754fd76f..8027a35826 100644 --- a/src/validation/__tests__/VariablesAreInputTypesRule-test.ts +++ b/src/validation/__tests__/VariablesAreInputTypesRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { VariablesAreInputTypesRule } from '../rules/VariablesAreInputTypesRule'; +import { VariablesAreInputTypesRule } from '../rules/VariablesAreInputTypesRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(VariablesAreInputTypesRule, queryStr); diff --git a/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts b/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts index 090f1680c4..16467741bb 100644 --- a/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts +++ b/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha'; -import { VariablesInAllowedPositionRule } from '../rules/VariablesInAllowedPositionRule'; +import { VariablesInAllowedPositionRule } from '../rules/VariablesInAllowedPositionRule.js'; -import { expectValidationErrors } from './harness'; +import { expectValidationErrors } from './harness.js'; function expectErrors(queryStr: string) { return expectValidationErrors(VariablesInAllowedPositionRule, queryStr); diff --git a/src/validation/__tests__/harness.ts b/src/validation/__tests__/harness.ts index 661256c56d..682932d897 100644 --- a/src/validation/__tests__/harness.ts +++ b/src/validation/__tests__/harness.ts @@ -1,15 +1,18 @@ -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import type { Maybe } from '../../jsutils/Maybe'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import { parse } from '../../language/parser'; +import { parse } from '../../language/parser.js'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; -import { validate, validateSDL } from '../validate'; -import type { SDLValidationRule, ValidationRule } from '../ValidationContext'; +import { validate, validateSDL } from '../validate.js'; +import type { + SDLValidationRule, + ValidationRule, +} from '../ValidationContext.js'; export const testSchema: GraphQLSchema = buildSchema(` interface Mammal { @@ -58,7 +61,7 @@ export const testSchema: GraphQLSchema = buildSchema(` type Human { name(surname: Boolean): String pets: [Pet] - relatives: [Human] + relatives: [Human]! } enum FurColor { diff --git a/src/validation/__tests__/validation-test.ts b/src/validation/__tests__/validation-test.ts index 45e2307a91..19cb3b178a 100644 --- a/src/validation/__tests__/validation-test.ts +++ b/src/validation/__tests__/validation-test.ts @@ -1,20 +1,20 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { expectJSON } from '../../__testUtils__/expectJSON'; +import { expectJSON } from '../../__testUtils__/expectJSON.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { DirectiveNode } from '../../language/ast'; -import { parse } from '../../language/parser'; +import type { DirectiveNode } from '../../language/ast.js'; +import { parse } from '../../language/parser.js'; -import { buildSchema } from '../../utilities/buildASTSchema'; -import { TypeInfo } from '../../utilities/TypeInfo'; +import { buildSchema } from '../../utilities/buildASTSchema.js'; +import { TypeInfo } from '../../utilities/TypeInfo.js'; -import { validate } from '../validate'; -import type { ValidationContext } from '../ValidationContext'; +import { validate } from '../validate.js'; +import type { ValidationContext } from '../ValidationContext.js'; -import { testSchema } from './harness'; +import { testSchema } from './harness.js'; describe('Validate: Supports full validation', () => { it('validates queries', () => { diff --git a/src/validation/index.ts b/src/validation/index.ts index 58cc012ee8..8ddbf379ba 100644 --- a/src/validation/index.ts +++ b/src/validation/index.ts @@ -1,99 +1,108 @@ -export { validate } from './validate'; +export { validate } from './validate.js'; -export { ValidationContext } from './ValidationContext'; -export type { ValidationRule } from './ValidationContext'; +export { ValidationContext } from './ValidationContext.js'; +export type { ValidationRule } from './ValidationContext.js'; // All validation rules in the GraphQL Specification. -export { specifiedRules } from './specifiedRules'; +export { specifiedRules } from './specifiedRules.js'; + +// Spec Section: "Defer And Stream Directive Labels Are Unique" +export { DeferStreamDirectiveLabelRule } from './rules/DeferStreamDirectiveLabelRule.js'; + +// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" +export { DeferStreamDirectiveOnRootFieldRule } from './rules/DeferStreamDirectiveOnRootFieldRule.js'; // Spec Section: "Executable Definitions" -export { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule'; +export { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule.js'; // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" -export { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule'; +export { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule.js'; // Spec Section: "Fragments on Composite Types" -export { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule'; +export { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule.js'; // Spec Section: "Argument Names" -export { KnownArgumentNamesRule } from './rules/KnownArgumentNamesRule'; +export { KnownArgumentNamesRule } from './rules/KnownArgumentNamesRule.js'; // Spec Section: "Directives Are Defined" -export { KnownDirectivesRule } from './rules/KnownDirectivesRule'; +export { KnownDirectivesRule } from './rules/KnownDirectivesRule.js'; // Spec Section: "Fragment spread target defined" -export { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule'; +export { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule.js'; // Spec Section: "Fragment Spread Type Existence" -export { KnownTypeNamesRule } from './rules/KnownTypeNamesRule'; +export { KnownTypeNamesRule } from './rules/KnownTypeNamesRule.js'; // Spec Section: "Lone Anonymous Operation" -export { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule'; +export { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule.js'; // Spec Section: "Fragments must not form cycles" -export { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule'; +export { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule.js'; // Spec Section: "All Variable Used Defined" -export { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule'; +export { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule.js'; // Spec Section: "Fragments must be used" -export { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule'; +export { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule.js'; // Spec Section: "All Variables Used" -export { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule'; +export { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule.js'; // Spec Section: "Field Selection Merging" -export { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule'; +export { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule.js'; // Spec Section: "Fragment spread is possible" -export { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule'; +export { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule.js'; // Spec Section: "Argument Optionality" -export { ProvidedRequiredArgumentsRule } from './rules/ProvidedRequiredArgumentsRule'; +export { ProvidedRequiredArgumentsRule } from './rules/ProvidedRequiredArgumentsRule.js'; // Spec Section: "Leaf Field Selections" -export { ScalarLeafsRule } from './rules/ScalarLeafsRule'; +export { ScalarLeafsRule } from './rules/ScalarLeafsRule.js'; // Spec Section: "Subscriptions with Single Root Field" -export { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule'; +export { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule.js'; + +// Spec Section: "Stream Directives Are Used On List Fields" +export { StreamDirectiveOnListFieldRule } from './rules/StreamDirectiveOnListFieldRule.js'; // Spec Section: "Argument Uniqueness" -export { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule'; +export { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule.js'; // Spec Section: "Directives Are Unique Per Location" -export { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule'; +export { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule.js'; // Spec Section: "Fragment Name Uniqueness" -export { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule'; +export { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule.js'; // Spec Section: "Input Object Field Uniqueness" -export { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule'; +export { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule.js'; // Spec Section: "Operation Name Uniqueness" -export { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule'; +export { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule.js'; // Spec Section: "Variable Uniqueness" -export { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule'; +export { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule.js'; // Spec Section: "Values Type Correctness" -export { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule'; +export { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule.js'; // Spec Section: "Variables are Input Types" -export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule'; +export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule.js'; // Spec Section: "All Variable Usages Are Allowed" -export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule'; +export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule.js'; // SDL-specific validation rules -export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule'; -export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule'; -export { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule'; -export { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule'; -export { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule'; -export { UniqueArgumentDefinitionNamesRule } from './rules/UniqueArgumentDefinitionNamesRule'; -export { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule'; -export { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule'; +export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule.js'; +export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule.js'; +export { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule.js'; +export { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule.js'; +export { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule.js'; +export { UniqueArgumentDefinitionNamesRule } from './rules/UniqueArgumentDefinitionNamesRule.js'; +export { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule.js'; +export { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule.js'; // Optional rules not defined by the GraphQL Specification -export { NoDeprecatedCustomRule } from './rules/custom/NoDeprecatedCustomRule'; -export { NoSchemaIntrospectionCustomRule } from './rules/custom/NoSchemaIntrospectionCustomRule'; +export { NoDeprecatedCustomRule } from './rules/custom/NoDeprecatedCustomRule.js'; +export { NoSchemaIntrospectionCustomRule } from './rules/custom/NoSchemaIntrospectionCustomRule.js'; diff --git a/src/validation/rules/DeferStreamDirectiveLabelRule.ts b/src/validation/rules/DeferStreamDirectiveLabelRule.ts new file mode 100644 index 0000000000..616844b946 --- /dev/null +++ b/src/validation/rules/DeferStreamDirectiveLabelRule.ts @@ -0,0 +1,55 @@ +import { GraphQLError } from '../../error/GraphQLError.js'; + +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; + +import { + GraphQLDeferDirective, + GraphQLStreamDirective, +} from '../../type/directives.js'; + +import type { ValidationContext } from '../ValidationContext.js'; + +/** + * Stream directive on list field + * + * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. + */ +export function DeferStreamDirectiveLabelRule( + context: ValidationContext, +): ASTVisitor { + const knownLabels = Object.create(null); + return { + Directive(node) { + if ( + node.name.value === GraphQLDeferDirective.name || + node.name.value === GraphQLStreamDirective.name + ) { + const labelArgument = node.arguments?.find( + (arg) => arg.name.value === 'label', + ); + const labelValue = labelArgument?.value; + if (!labelValue) { + return; + } + if (labelValue.kind !== Kind.STRING) { + context.reportError( + new GraphQLError( + `Directive "${node.name.value}"'s label argument must be a static string.`, + { nodes: node }, + ), + ); + } else if (knownLabels[labelValue.value]) { + context.reportError( + new GraphQLError( + 'Defer/Stream directive label argument must be unique.', + { nodes: [knownLabels[labelValue.value], node] }, + ), + ); + } else { + knownLabels[labelValue.value] = node; + } + } + }, + }; +} diff --git a/src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts b/src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts new file mode 100644 index 0000000000..e69220f4bb --- /dev/null +++ b/src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts @@ -0,0 +1,63 @@ +import { GraphQLError } from '../../error/GraphQLError.js'; + +import type { ASTVisitor } from '../../language/visitor.js'; + +import { + GraphQLDeferDirective, + GraphQLStreamDirective, +} from '../../type/directives.js'; + +import type { ValidationContext } from '../ValidationContext.js'; + +/** + * Stream directive on list field + * + * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. + */ +export function DeferStreamDirectiveOnRootFieldRule( + context: ValidationContext, +): ASTVisitor { + return { + Directive(node) { + const mutationType = context.getSchema().getMutationType(); + const subscriptionType = context.getSchema().getSubscriptionType(); + const parentType = context.getParentType(); + if (parentType && node.name.value === GraphQLDeferDirective.name) { + if (mutationType && parentType === mutationType) { + context.reportError( + new GraphQLError( + `Defer directive cannot be used on root mutation type "${parentType.name}".`, + { nodes: node }, + ), + ); + } + if (subscriptionType && parentType === subscriptionType) { + context.reportError( + new GraphQLError( + `Defer directive cannot be used on root subscription type "${parentType.name}".`, + { nodes: node }, + ), + ); + } + } + if (parentType && node.name.value === GraphQLStreamDirective.name) { + if (mutationType && parentType === mutationType) { + context.reportError( + new GraphQLError( + `Stream directive cannot be used on root mutation type "${parentType.name}".`, + { nodes: node }, + ), + ); + } + if (subscriptionType && parentType === subscriptionType) { + context.reportError( + new GraphQLError( + `Stream directive cannot be used on root subscription type "${parentType.name}".`, + { nodes: node }, + ), + ); + } + } + }, + }; +} diff --git a/src/validation/rules/ExecutableDefinitionsRule.ts b/src/validation/rules/ExecutableDefinitionsRule.ts index 8f82a6797b..ef246458bf 100644 --- a/src/validation/rules/ExecutableDefinitionsRule.ts +++ b/src/validation/rules/ExecutableDefinitionsRule.ts @@ -1,10 +1,10 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import { Kind } from '../../language/kinds'; -import { isExecutableDefinitionNode } from '../../language/predicates'; -import type { ASTVisitor } from '../../language/visitor'; +import { Kind } from '../../language/kinds.js'; +import { isExecutableDefinitionNode } from '../../language/predicates.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Executable definitions diff --git a/src/validation/rules/FieldsOnCorrectTypeRule.ts b/src/validation/rules/FieldsOnCorrectTypeRule.ts index 26f6042faf..a9bb26a827 100644 --- a/src/validation/rules/FieldsOnCorrectTypeRule.ts +++ b/src/validation/rules/FieldsOnCorrectTypeRule.ts @@ -1,25 +1,25 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { naturalCompare } from '../../jsutils/naturalCompare'; -import { suggestionList } from '../../jsutils/suggestionList'; +import { didYouMean } from '../../jsutils/didYouMean.js'; +import { naturalCompare } from '../../jsutils/naturalCompare.js'; +import { suggestionList } from '../../jsutils/suggestionList.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { FieldNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { FieldNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; import type { GraphQLInterfaceType, GraphQLObjectType, GraphQLOutputType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { isAbstractType, isInterfaceType, isObjectType, -} from '../../type/definition'; -import type { GraphQLSchema } from '../../type/schema'; +} from '../../type/definition.js'; +import type { GraphQLSchema } from '../../type/schema.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Fields on correct type diff --git a/src/validation/rules/FragmentsOnCompositeTypesRule.ts b/src/validation/rules/FragmentsOnCompositeTypesRule.ts index fb71f63836..b8b61877e4 100644 --- a/src/validation/rules/FragmentsOnCompositeTypesRule.ts +++ b/src/validation/rules/FragmentsOnCompositeTypesRule.ts @@ -1,13 +1,13 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import { print } from '../../language/printer'; -import type { ASTVisitor } from '../../language/visitor'; +import { print } from '../../language/printer.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { isCompositeType } from '../../type/definition'; +import { isCompositeType } from '../../type/definition.js'; -import { typeFromAST } from '../../utilities/typeFromAST'; +import { typeFromAST } from '../../utilities/typeFromAST.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Fragments on composite type diff --git a/src/validation/rules/KnownArgumentNamesRule.ts b/src/validation/rules/KnownArgumentNamesRule.ts index 332b21c1ca..d2668d40ef 100644 --- a/src/validation/rules/KnownArgumentNamesRule.ts +++ b/src/validation/rules/KnownArgumentNamesRule.ts @@ -1,17 +1,17 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { suggestionList } from '../../jsutils/suggestionList'; +import { didYouMean } from '../../jsutils/didYouMean.js'; +import { suggestionList } from '../../jsutils/suggestionList.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import { Kind } from '../../language/kinds'; -import type { ASTVisitor } from '../../language/visitor'; +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { specifiedDirectives } from '../../type/directives'; +import { specifiedDirectives } from '../../type/directives.js'; import type { SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; /** * Known argument names diff --git a/src/validation/rules/KnownDirectivesRule.ts b/src/validation/rules/KnownDirectivesRule.ts index 1c7b822388..57641b91e7 100644 --- a/src/validation/rules/KnownDirectivesRule.ts +++ b/src/validation/rules/KnownDirectivesRule.ts @@ -1,20 +1,20 @@ -import { inspect } from '../../jsutils/inspect'; -import { invariant } from '../../jsutils/invariant'; +import { inspect } from '../../jsutils/inspect.js'; +import { invariant } from '../../jsutils/invariant.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTNode } from '../../language/ast'; -import { OperationTypeNode } from '../../language/ast'; -import { DirectiveLocation } from '../../language/directiveLocation'; -import { Kind } from '../../language/kinds'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTNode } from '../../language/ast.js'; +import { OperationTypeNode } from '../../language/ast.js'; +import { DirectiveLocation } from '../../language/directiveLocation.js'; +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { specifiedDirectives } from '../../type/directives'; +import { specifiedDirectives } from '../../type/directives.js'; import type { SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; /** * Known directives diff --git a/src/validation/rules/KnownFragmentNamesRule.ts b/src/validation/rules/KnownFragmentNamesRule.ts index c37403f752..91b30e7d2c 100644 --- a/src/validation/rules/KnownFragmentNamesRule.ts +++ b/src/validation/rules/KnownFragmentNamesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Known fragment names diff --git a/src/validation/rules/KnownTypeNamesRule.ts b/src/validation/rules/KnownTypeNamesRule.ts index 72406763f3..789e93eac1 100644 --- a/src/validation/rules/KnownTypeNamesRule.ts +++ b/src/validation/rules/KnownTypeNamesRule.ts @@ -1,23 +1,23 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { suggestionList } from '../../jsutils/suggestionList'; +import { didYouMean } from '../../jsutils/didYouMean.js'; +import { suggestionList } from '../../jsutils/suggestionList.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTNode } from '../../language/ast'; +import type { ASTNode } from '../../language/ast.js'; import { isTypeDefinitionNode, isTypeSystemDefinitionNode, isTypeSystemExtensionNode, -} from '../../language/predicates'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/predicates.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { introspectionTypes } from '../../type/introspection'; -import { specifiedScalarTypes } from '../../type/scalars'; +import { introspectionTypes } from '../../type/introspection.js'; +import { specifiedScalarTypes } from '../../type/scalars.js'; import type { SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; /** * Known type names diff --git a/src/validation/rules/LoneAnonymousOperationRule.ts b/src/validation/rules/LoneAnonymousOperationRule.ts index 291a494c76..cd04a2968d 100644 --- a/src/validation/rules/LoneAnonymousOperationRule.ts +++ b/src/validation/rules/LoneAnonymousOperationRule.ts @@ -1,9 +1,9 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import { Kind } from '../../language/kinds'; -import type { ASTVisitor } from '../../language/visitor'; +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Lone anonymous operation diff --git a/src/validation/rules/LoneSchemaDefinitionRule.ts b/src/validation/rules/LoneSchemaDefinitionRule.ts index 4eeb8cdcba..8c0262ab39 100644 --- a/src/validation/rules/LoneSchemaDefinitionRule.ts +++ b/src/validation/rules/LoneSchemaDefinitionRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Lone Schema definition diff --git a/src/validation/rules/NoFragmentCyclesRule.ts b/src/validation/rules/NoFragmentCyclesRule.ts index 9ca425e00a..aed9a86178 100644 --- a/src/validation/rules/NoFragmentCyclesRule.ts +++ b/src/validation/rules/NoFragmentCyclesRule.ts @@ -1,14 +1,14 @@ -import type { ObjMap } from '../../jsutils/ObjMap'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { FragmentDefinitionNode, FragmentSpreadNode, -} from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * No fragment cycles diff --git a/src/validation/rules/NoUndefinedVariablesRule.ts b/src/validation/rules/NoUndefinedVariablesRule.ts index 77d2fe1804..d1672ecd0b 100644 --- a/src/validation/rules/NoUndefinedVariablesRule.ts +++ b/src/validation/rules/NoUndefinedVariablesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * No undefined variables diff --git a/src/validation/rules/NoUnusedFragmentsRule.ts b/src/validation/rules/NoUnusedFragmentsRule.ts index 928b4eb65b..034cd3fa5f 100644 --- a/src/validation/rules/NoUnusedFragmentsRule.ts +++ b/src/validation/rules/NoUnusedFragmentsRule.ts @@ -1,9 +1,9 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { FragmentDefinitionNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { FragmentDefinitionNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * No unused fragments diff --git a/src/validation/rules/NoUnusedVariablesRule.ts b/src/validation/rules/NoUnusedVariablesRule.ts index 665c348db1..7a0660cce0 100644 --- a/src/validation/rules/NoUnusedVariablesRule.ts +++ b/src/validation/rules/NoUnusedVariablesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * No unused variables diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 341f768ebe..e2444047c6 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -1,24 +1,25 @@ -import { inspect } from '../../jsutils/inspect'; -import type { Maybe } from '../../jsutils/Maybe'; -import type { ObjMap } from '../../jsutils/ObjMap'; +import { inspect } from '../../jsutils/inspect.js'; +import type { Maybe } from '../../jsutils/Maybe.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { + DirectiveNode, FieldNode, FragmentDefinitionNode, ObjectValueNode, SelectionSetNode, -} from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import { print } from '../../language/printer'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import { print } from '../../language/printer.js'; +import type { ASTVisitor } from '../../language/visitor.js'; import type { GraphQLField, GraphQLNamedType, GraphQLOutputType, -} from '../../type/definition'; +} from '../../type/definition.js'; import { getNamedType, isInterfaceType, @@ -26,12 +27,12 @@ import { isListType, isNonNullType, isObjectType, -} from '../../type/definition'; +} from '../../type/definition.js'; -import { sortValueNode } from '../../utilities/sortValueNode'; -import { typeFromAST } from '../../utilities/typeFromAST'; +import { sortValueNode } from '../../utilities/sortValueNode.js'; +import { typeFromAST } from '../../utilities/typeFromAST.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /* eslint-disable max-params */ // This file contains a lot of such errors but we plan to refactor it anyway @@ -601,6 +602,17 @@ function findConflict( } } + // FIXME https://github.com/graphql/graphql-js/issues/2203 + const directives1 = /* c8 ignore next */ node1.directives ?? []; + const directives2 = /* c8 ignore next */ node2.directives ?? []; + if (!sameStreams(directives1, directives2)) { + return [ + [responseName, 'they have differing stream directives'], + [node1], + [node2], + ]; + } + // The return type for each field. const type1 = def1?.type; const type2 = def2?.type; @@ -638,7 +650,7 @@ function findConflict( } } -function stringifyArguments(fieldNode: FieldNode): string { +function stringifyArguments(fieldNode: FieldNode | DirectiveNode): string { // FIXME https://github.com/graphql/graphql-js/issues/2203 const args = /* c8 ignore next */ fieldNode.arguments ?? []; @@ -653,6 +665,29 @@ function stringifyArguments(fieldNode: FieldNode): string { return print(sortValueNode(inputObjectWithArgs)); } +function getStreamDirective( + directives: ReadonlyArray, +): DirectiveNode | undefined { + return directives.find((directive) => directive.name.value === 'stream'); +} + +function sameStreams( + directives1: ReadonlyArray, + directives2: ReadonlyArray, +): boolean { + const stream1 = getStreamDirective(directives1); + const stream2 = getStreamDirective(directives2); + if (!stream1 && !stream2) { + // both fields do not have streams + return true; + } else if (stream1 && stream2) { + // check if both fields have equivalent streams + return stringifyArguments(stream1) === stringifyArguments(stream2); + } + // fields have a mix of stream and no stream + return false; +} + // Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. diff --git a/src/validation/rules/PossibleFragmentSpreadsRule.ts b/src/validation/rules/PossibleFragmentSpreadsRule.ts index fe738e5559..e486025984 100644 --- a/src/validation/rules/PossibleFragmentSpreadsRule.ts +++ b/src/validation/rules/PossibleFragmentSpreadsRule.ts @@ -1,17 +1,17 @@ -import { inspect } from '../../jsutils/inspect'; -import type { Maybe } from '../../jsutils/Maybe'; +import { inspect } from '../../jsutils/inspect.js'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { GraphQLCompositeType } from '../../type/definition'; -import { isCompositeType } from '../../type/definition'; +import type { GraphQLCompositeType } from '../../type/definition.js'; +import { isCompositeType } from '../../type/definition.js'; -import { doTypesOverlap } from '../../utilities/typeComparators'; -import { typeFromAST } from '../../utilities/typeFromAST'; +import { doTypesOverlap } from '../../utilities/typeComparators.js'; +import { typeFromAST } from '../../utilities/typeFromAST.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Possible fragment spread diff --git a/src/validation/rules/PossibleTypeExtensionsRule.ts b/src/validation/rules/PossibleTypeExtensionsRule.ts index f14019bcb2..dfc7889895 100644 --- a/src/validation/rules/PossibleTypeExtensionsRule.ts +++ b/src/validation/rules/PossibleTypeExtensionsRule.ts @@ -1,17 +1,17 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { inspect } from '../../jsutils/inspect'; -import { invariant } from '../../jsutils/invariant'; -import type { ObjMap } from '../../jsutils/ObjMap'; -import { suggestionList } from '../../jsutils/suggestionList'; +import { didYouMean } from '../../jsutils/didYouMean.js'; +import { inspect } from '../../jsutils/inspect.js'; +import { invariant } from '../../jsutils/invariant.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; +import { suggestionList } from '../../jsutils/suggestionList.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { DefinitionNode, TypeExtensionNode } from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import { isTypeDefinitionNode } from '../../language/predicates'; -import type { ASTVisitor } from '../../language/visitor'; +import type { DefinitionNode, TypeExtensionNode } from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import { isTypeDefinitionNode } from '../../language/predicates.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { GraphQLNamedType } from '../../type/definition'; +import type { GraphQLNamedType } from '../../type/definition.js'; import { isEnumType, isInputObjectType, @@ -19,9 +19,9 @@ import { isObjectType, isScalarType, isUnionType, -} from '../../type/definition'; +} from '../../type/definition.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Possible type extension diff --git a/src/validation/rules/ProvidedRequiredArgumentsRule.ts b/src/validation/rules/ProvidedRequiredArgumentsRule.ts index b111dcee1b..350264496f 100644 --- a/src/validation/rules/ProvidedRequiredArgumentsRule.ts +++ b/src/validation/rules/ProvidedRequiredArgumentsRule.ts @@ -1,22 +1,22 @@ -import { inspect } from '../../jsutils/inspect'; -import { keyMap } from '../../jsutils/keyMap'; -import type { ObjMap } from '../../jsutils/ObjMap'; +import { inspect } from '../../jsutils/inspect.js'; +import { keyMap } from '../../jsutils/keyMap.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { InputValueDefinitionNode } from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import { print } from '../../language/printer'; -import type { ASTVisitor } from '../../language/visitor'; +import type { InputValueDefinitionNode } from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import { print } from '../../language/printer.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { GraphQLArgument } from '../../type/definition'; -import { isRequiredArgument, isType } from '../../type/definition'; -import { specifiedDirectives } from '../../type/directives'; +import type { GraphQLArgument } from '../../type/definition.js'; +import { isRequiredArgument, isType } from '../../type/definition.js'; +import { specifiedDirectives } from '../../type/directives.js'; import type { SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; /** * Provided required arguments diff --git a/src/validation/rules/ScalarLeafsRule.ts b/src/validation/rules/ScalarLeafsRule.ts index fb573d47e0..7e9014932c 100644 --- a/src/validation/rules/ScalarLeafsRule.ts +++ b/src/validation/rules/ScalarLeafsRule.ts @@ -1,13 +1,13 @@ -import { inspect } from '../../jsutils/inspect'; +import { inspect } from '../../jsutils/inspect.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { FieldNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { FieldNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { getNamedType, isLeafType } from '../../type/definition'; +import { getNamedType, isLeafType } from '../../type/definition.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Scalar leafs diff --git a/src/validation/rules/SingleFieldSubscriptionsRule.ts b/src/validation/rules/SingleFieldSubscriptionsRule.ts index 01fdc9f966..bc9f639d9e 100644 --- a/src/validation/rules/SingleFieldSubscriptionsRule.ts +++ b/src/validation/rules/SingleFieldSubscriptionsRule.ts @@ -1,17 +1,17 @@ -import type { ObjMap } from '../../jsutils/ObjMap'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { FragmentDefinitionNode, OperationDefinitionNode, -} from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { collectFields } from '../../execution/collectFields'; +import { collectFields } from '../../execution/collectFields.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Subscriptions must only include a non-introspection field. @@ -41,7 +41,7 @@ export function SingleFieldSubscriptionsRule( fragments[definition.name.value] = definition; } } - const fields = collectFields( + const { fields } = collectFields( schema, fragments, variableValues, diff --git a/src/validation/rules/StreamDirectiveOnListFieldRule.ts b/src/validation/rules/StreamDirectiveOnListFieldRule.ts new file mode 100644 index 0000000000..e9bcac5fa5 --- /dev/null +++ b/src/validation/rules/StreamDirectiveOnListFieldRule.ts @@ -0,0 +1,41 @@ +import { GraphQLError } from '../../error/GraphQLError.js'; + +import type { DirectiveNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; + +import { isListType, isWrappingType } from '../../type/definition.js'; +import { GraphQLStreamDirective } from '../../type/directives.js'; + +import type { ValidationContext } from '../ValidationContext.js'; + +/** + * Stream directive on list field + * + * A GraphQL document is only valid if stream directives are used on list fields. + */ +export function StreamDirectiveOnListFieldRule( + context: ValidationContext, +): ASTVisitor { + return { + Directive(node: DirectiveNode) { + const fieldDef = context.getFieldDef(); + const parentType = context.getParentType(); + if ( + fieldDef && + parentType && + node.name.value === GraphQLStreamDirective.name && + !( + isListType(fieldDef.type) || + (isWrappingType(fieldDef.type) && isListType(fieldDef.type.ofType)) + ) + ) { + context.reportError( + new GraphQLError( + `Stream directive cannot be used on non-list field "${fieldDef.name}" on type "${parentType.name}".`, + { nodes: node }, + ), + ); + } + }, + }; +} diff --git a/src/validation/rules/UniqueArgumentDefinitionNamesRule.ts b/src/validation/rules/UniqueArgumentDefinitionNamesRule.ts index 8d5c9b9e22..9904477bc6 100644 --- a/src/validation/rules/UniqueArgumentDefinitionNamesRule.ts +++ b/src/validation/rules/UniqueArgumentDefinitionNamesRule.ts @@ -1,15 +1,15 @@ -import { groupBy } from '../../jsutils/groupBy'; +import { groupBy } from '../../jsutils/groupBy.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { FieldDefinitionNode, InputValueDefinitionNode, NameNode, -} from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique argument definition names diff --git a/src/validation/rules/UniqueArgumentNamesRule.ts b/src/validation/rules/UniqueArgumentNamesRule.ts index 7738a3e486..2baba71c21 100644 --- a/src/validation/rules/UniqueArgumentNamesRule.ts +++ b/src/validation/rules/UniqueArgumentNamesRule.ts @@ -1,11 +1,11 @@ -import { groupBy } from '../../jsutils/groupBy'; +import { groupBy } from '../../jsutils/groupBy.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ArgumentNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ArgumentNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Unique argument names diff --git a/src/validation/rules/UniqueDirectiveNamesRule.ts b/src/validation/rules/UniqueDirectiveNamesRule.ts index ade517ddce..9c845ffe8e 100644 --- a/src/validation/rules/UniqueDirectiveNamesRule.ts +++ b/src/validation/rules/UniqueDirectiveNamesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique directive names diff --git a/src/validation/rules/UniqueDirectivesPerLocationRule.ts b/src/validation/rules/UniqueDirectivesPerLocationRule.ts index a4fc54690a..5b62c651c4 100644 --- a/src/validation/rules/UniqueDirectivesPerLocationRule.ts +++ b/src/validation/rules/UniqueDirectivesPerLocationRule.ts @@ -1,18 +1,18 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import { Kind } from '../../language/kinds'; +import { Kind } from '../../language/kinds.js'; import { isTypeDefinitionNode, isTypeExtensionNode, -} from '../../language/predicates'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/predicates.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { specifiedDirectives } from '../../type/directives'; +import { specifiedDirectives } from '../../type/directives.js'; import type { SDLValidationContext, ValidationContext, -} from '../ValidationContext'; +} from '../ValidationContext.js'; /** * Unique directive names per location diff --git a/src/validation/rules/UniqueEnumValueNamesRule.ts b/src/validation/rules/UniqueEnumValueNamesRule.ts index 2bdf8749a2..00a1d6a63f 100644 --- a/src/validation/rules/UniqueEnumValueNamesRule.ts +++ b/src/validation/rules/UniqueEnumValueNamesRule.ts @@ -1,14 +1,14 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { EnumTypeDefinitionNode, EnumTypeExtensionNode, -} from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { isEnumType } from '../../type/definition'; +import { isEnumType } from '../../type/definition.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique enum value names diff --git a/src/validation/rules/UniqueFieldDefinitionNamesRule.ts b/src/validation/rules/UniqueFieldDefinitionNamesRule.ts index a97b6c1701..96d88a4afa 100644 --- a/src/validation/rules/UniqueFieldDefinitionNamesRule.ts +++ b/src/validation/rules/UniqueFieldDefinitionNamesRule.ts @@ -1,20 +1,20 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { FieldDefinitionNode, InputValueDefinitionNode, NameNode, -} from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { GraphQLNamedType } from '../../type/definition'; +import type { GraphQLNamedType } from '../../type/definition.js'; import { isInputObjectType, isInterfaceType, isObjectType, -} from '../../type/definition'; +} from '../../type/definition.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique field definition names diff --git a/src/validation/rules/UniqueFragmentNamesRule.ts b/src/validation/rules/UniqueFragmentNamesRule.ts index 3b4311e9c8..db59b47396 100644 --- a/src/validation/rules/UniqueFragmentNamesRule.ts +++ b/src/validation/rules/UniqueFragmentNamesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Unique fragment names diff --git a/src/validation/rules/UniqueInputFieldNamesRule.ts b/src/validation/rules/UniqueInputFieldNamesRule.ts index 9824deb53f..7344e9439b 100644 --- a/src/validation/rules/UniqueInputFieldNamesRule.ts +++ b/src/validation/rules/UniqueInputFieldNamesRule.ts @@ -1,12 +1,12 @@ -import { invariant } from '../../jsutils/invariant'; -import type { ObjMap } from '../../jsutils/ObjMap'; +import { invariant } from '../../jsutils/invariant.js'; +import type { ObjMap } from '../../jsutils/ObjMap.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { NameNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { NameNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Unique input field names diff --git a/src/validation/rules/UniqueOperationNamesRule.ts b/src/validation/rules/UniqueOperationNamesRule.ts index 6df98be8c7..eb1580423e 100644 --- a/src/validation/rules/UniqueOperationNamesRule.ts +++ b/src/validation/rules/UniqueOperationNamesRule.ts @@ -1,8 +1,8 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Unique operation names diff --git a/src/validation/rules/UniqueOperationTypesRule.ts b/src/validation/rules/UniqueOperationTypesRule.ts index f8ac6871ec..40fa71d11e 100644 --- a/src/validation/rules/UniqueOperationTypesRule.ts +++ b/src/validation/rules/UniqueOperationTypesRule.ts @@ -1,12 +1,12 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; import type { SchemaDefinitionNode, SchemaExtensionNode, -} from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +} from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique operation types diff --git a/src/validation/rules/UniqueTypeNamesRule.ts b/src/validation/rules/UniqueTypeNamesRule.ts index a1f6588b11..272681835d 100644 --- a/src/validation/rules/UniqueTypeNamesRule.ts +++ b/src/validation/rules/UniqueTypeNamesRule.ts @@ -1,9 +1,9 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { TypeDefinitionNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { TypeDefinitionNode } from '../../language/ast.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { SDLValidationContext } from '../ValidationContext'; +import type { SDLValidationContext } from '../ValidationContext.js'; /** * Unique type names diff --git a/src/validation/rules/UniqueVariableNamesRule.ts b/src/validation/rules/UniqueVariableNamesRule.ts index 3c9f76d885..8c067263fd 100644 --- a/src/validation/rules/UniqueVariableNamesRule.ts +++ b/src/validation/rules/UniqueVariableNamesRule.ts @@ -1,10 +1,10 @@ -import { groupBy } from '../../jsutils/groupBy'; +import { groupBy } from '../../jsutils/groupBy.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { ASTValidationContext } from '../ValidationContext'; +import type { ASTValidationContext } from '../ValidationContext.js'; /** * Unique variable names diff --git a/src/validation/rules/ValuesOfCorrectTypeRule.ts b/src/validation/rules/ValuesOfCorrectTypeRule.ts index 5d81a3833a..cddc5ed979 100644 --- a/src/validation/rules/ValuesOfCorrectTypeRule.ts +++ b/src/validation/rules/ValuesOfCorrectTypeRule.ts @@ -1,13 +1,13 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { inspect } from '../../jsutils/inspect'; -import { keyMap } from '../../jsutils/keyMap'; -import { suggestionList } from '../../jsutils/suggestionList'; +import { didYouMean } from '../../jsutils/didYouMean.js'; +import { inspect } from '../../jsutils/inspect.js'; +import { keyMap } from '../../jsutils/keyMap.js'; +import { suggestionList } from '../../jsutils/suggestionList.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ValueNode } from '../../language/ast'; -import { print } from '../../language/printer'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ValueNode } from '../../language/ast.js'; +import { print } from '../../language/printer.js'; +import type { ASTVisitor } from '../../language/visitor.js'; import { getNamedType, @@ -17,9 +17,9 @@ import { isListType, isNonNullType, isRequiredInputField, -} from '../../type/definition'; +} from '../../type/definition.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Value literals of correct type diff --git a/src/validation/rules/VariablesAreInputTypesRule.ts b/src/validation/rules/VariablesAreInputTypesRule.ts index 58d535ce81..019f3e762c 100644 --- a/src/validation/rules/VariablesAreInputTypesRule.ts +++ b/src/validation/rules/VariablesAreInputTypesRule.ts @@ -1,14 +1,14 @@ -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { VariableDefinitionNode } from '../../language/ast'; -import { print } from '../../language/printer'; -import type { ASTVisitor } from '../../language/visitor'; +import type { VariableDefinitionNode } from '../../language/ast.js'; +import { print } from '../../language/printer.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import { isInputType } from '../../type/definition'; +import { isInputType } from '../../type/definition.js'; -import { typeFromAST } from '../../utilities/typeFromAST'; +import { typeFromAST } from '../../utilities/typeFromAST.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Variables are input types diff --git a/src/validation/rules/VariablesInAllowedPositionRule.ts b/src/validation/rules/VariablesInAllowedPositionRule.ts index a0b7e991a6..4039540eba 100644 --- a/src/validation/rules/VariablesInAllowedPositionRule.ts +++ b/src/validation/rules/VariablesInAllowedPositionRule.ts @@ -1,20 +1,20 @@ -import { inspect } from '../../jsutils/inspect'; -import type { Maybe } from '../../jsutils/Maybe'; +import { inspect } from '../../jsutils/inspect.js'; +import type { Maybe } from '../../jsutils/Maybe.js'; -import { GraphQLError } from '../../error/GraphQLError'; +import { GraphQLError } from '../../error/GraphQLError.js'; -import type { ValueNode } from '../../language/ast'; -import { Kind } from '../../language/kinds'; -import type { ASTVisitor } from '../../language/visitor'; +import type { ValueNode } from '../../language/ast.js'; +import { Kind } from '../../language/kinds.js'; +import type { ASTVisitor } from '../../language/visitor.js'; -import type { GraphQLType } from '../../type/definition'; -import { isNonNullType } from '../../type/definition'; -import type { GraphQLSchema } from '../../type/schema'; +import type { GraphQLType } from '../../type/definition.js'; +import { isNonNullType } from '../../type/definition.js'; +import type { GraphQLSchema } from '../../type/schema.js'; -import { isTypeSubTypeOf } from '../../utilities/typeComparators'; -import { typeFromAST } from '../../utilities/typeFromAST'; +import { isTypeSubTypeOf } from '../../utilities/typeComparators.js'; +import { typeFromAST } from '../../utilities/typeFromAST.js'; -import type { ValidationContext } from '../ValidationContext'; +import type { ValidationContext } from '../ValidationContext.js'; /** * Variables in allowed position diff --git a/src/validation/rules/custom/NoDeprecatedCustomRule.ts b/src/validation/rules/custom/NoDeprecatedCustomRule.ts index e06ac2e789..375373eb1d 100644 --- a/src/validation/rules/custom/NoDeprecatedCustomRule.ts +++ b/src/validation/rules/custom/NoDeprecatedCustomRule.ts @@ -1,12 +1,12 @@ -import { invariant } from '../../../jsutils/invariant'; +import { invariant } from '../../../jsutils/invariant.js'; -import { GraphQLError } from '../../../error/GraphQLError'; +import { GraphQLError } from '../../../error/GraphQLError.js'; -import type { ASTVisitor } from '../../../language/visitor'; +import type { ASTVisitor } from '../../../language/visitor.js'; -import { getNamedType, isInputObjectType } from '../../../type/definition'; +import { getNamedType, isInputObjectType } from '../../../type/definition.js'; -import type { ValidationContext } from '../../ValidationContext'; +import type { ValidationContext } from '../../ValidationContext.js'; /** * No deprecated diff --git a/src/validation/rules/custom/NoSchemaIntrospectionCustomRule.ts b/src/validation/rules/custom/NoSchemaIntrospectionCustomRule.ts index 257d58d723..6d2748b762 100644 --- a/src/validation/rules/custom/NoSchemaIntrospectionCustomRule.ts +++ b/src/validation/rules/custom/NoSchemaIntrospectionCustomRule.ts @@ -1,12 +1,12 @@ -import { GraphQLError } from '../../../error/GraphQLError'; +import { GraphQLError } from '../../../error/GraphQLError.js'; -import type { FieldNode } from '../../../language/ast'; -import type { ASTVisitor } from '../../../language/visitor'; +import type { FieldNode } from '../../../language/ast.js'; +import type { ASTVisitor } from '../../../language/visitor.js'; -import { getNamedType } from '../../../type/definition'; -import { isIntrospectionType } from '../../../type/introspection'; +import { getNamedType } from '../../../type/definition.js'; +import { isIntrospectionType } from '../../../type/introspection.js'; -import type { ValidationContext } from '../../ValidationContext'; +import type { ValidationContext } from '../../ValidationContext.js'; /** * Prohibit introspection queries diff --git a/src/validation/specifiedRules.ts b/src/validation/specifiedRules.ts index 16e555db8a..ba4e70d901 100644 --- a/src/validation/specifiedRules.ts +++ b/src/validation/specifiedRules.ts @@ -1,71 +1,77 @@ +// Spec Section: "Defer And Stream Directive Labels Are Unique" +import { DeferStreamDirectiveLabelRule } from './rules/DeferStreamDirectiveLabelRule.js'; +// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" +import { DeferStreamDirectiveOnRootFieldRule } from './rules/DeferStreamDirectiveOnRootFieldRule.js'; // Spec Section: "Executable Definitions" -import { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule'; +import { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule.js'; // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" -import { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule'; +import { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule.js'; // Spec Section: "Fragments on Composite Types" -import { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule'; +import { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule.js'; // Spec Section: "Argument Names" import { KnownArgumentNamesOnDirectivesRule, KnownArgumentNamesRule, -} from './rules/KnownArgumentNamesRule'; +} from './rules/KnownArgumentNamesRule.js'; // Spec Section: "Directives Are Defined" -import { KnownDirectivesRule } from './rules/KnownDirectivesRule'; +import { KnownDirectivesRule } from './rules/KnownDirectivesRule.js'; // Spec Section: "Fragment spread target defined" -import { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule'; +import { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule.js'; // Spec Section: "Fragment Spread Type Existence" -import { KnownTypeNamesRule } from './rules/KnownTypeNamesRule'; +import { KnownTypeNamesRule } from './rules/KnownTypeNamesRule.js'; // Spec Section: "Lone Anonymous Operation" -import { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule'; +import { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule.js'; // SDL-specific validation rules -import { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule'; +import { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule.js'; // Spec Section: "Fragments must not form cycles" -import { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule'; +import { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule.js'; // Spec Section: "All Variable Used Defined" -import { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule'; +import { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule.js'; // Spec Section: "Fragments must be used" -import { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule'; +import { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule.js'; // Spec Section: "All Variables Used" -import { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule'; +import { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule.js'; // Spec Section: "Field Selection Merging" -import { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule'; +import { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule.js'; // Spec Section: "Fragment spread is possible" -import { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule'; -import { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule'; +import { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule.js'; +import { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule.js'; // Spec Section: "Argument Optionality" import { ProvidedRequiredArgumentsOnDirectivesRule, ProvidedRequiredArgumentsRule, -} from './rules/ProvidedRequiredArgumentsRule'; +} from './rules/ProvidedRequiredArgumentsRule.js'; // Spec Section: "Leaf Field Selections" -import { ScalarLeafsRule } from './rules/ScalarLeafsRule'; +import { ScalarLeafsRule } from './rules/ScalarLeafsRule.js'; // Spec Section: "Subscriptions with Single Root Field" -import { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule'; -import { UniqueArgumentDefinitionNamesRule } from './rules/UniqueArgumentDefinitionNamesRule'; +import { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule.js'; +// Spec Section: "Stream Directives Are Used On List Fields" +import { StreamDirectiveOnListFieldRule } from './rules/StreamDirectiveOnListFieldRule.js'; +import { UniqueArgumentDefinitionNamesRule } from './rules/UniqueArgumentDefinitionNamesRule.js'; // Spec Section: "Argument Uniqueness" -import { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule'; -import { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule'; +import { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule.js'; +import { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule.js'; // Spec Section: "Directives Are Unique Per Location" -import { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule'; -import { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule'; -import { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule'; +import { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule.js'; +import { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule.js'; +import { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule.js'; // Spec Section: "Fragment Name Uniqueness" -import { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule'; +import { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule.js'; // Spec Section: "Input Object Field Uniqueness" -import { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule'; +import { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule.js'; // Spec Section: "Operation Name Uniqueness" -import { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule'; -import { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule'; -import { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule'; +import { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule.js'; +import { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule.js'; +import { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule.js'; // Spec Section: "Variable Uniqueness" -import { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule'; +import { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule.js'; // Spec Section: "Value Type Correctness" -import { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule'; +import { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule.js'; // Spec Section: "Variables are Input Types" -import { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule'; +import { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule.js'; // Spec Section: "All Variable Usages Are Allowed" -import { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule'; -import type { SDLValidationRule, ValidationRule } from './ValidationContext'; +import { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule.js'; +import type { SDLValidationRule, ValidationRule } from './ValidationContext.js'; /** * This set includes all validation rules defined by the GraphQL spec. @@ -93,6 +99,9 @@ export const specifiedRules: ReadonlyArray = Object.freeze([ NoUnusedVariablesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, + DeferStreamDirectiveOnRootFieldRule, + DeferStreamDirectiveLabelRule, + StreamDirectiveOnListFieldRule, KnownArgumentNamesRule, UniqueArgumentNamesRule, ValuesOfCorrectTypeRule, diff --git a/src/validation/validate.ts b/src/validation/validate.ts index 9572e3dc96..93da49be78 100644 --- a/src/validation/validate.ts +++ b/src/validation/validate.ts @@ -1,18 +1,21 @@ -import type { Maybe } from '../jsutils/Maybe'; +import type { Maybe } from '../jsutils/Maybe.js'; -import { GraphQLError } from '../error/GraphQLError'; +import { GraphQLError } from '../error/GraphQLError.js'; -import type { DocumentNode } from '../language/ast'; -import { visit, visitInParallel } from '../language/visitor'; +import type { DocumentNode } from '../language/ast.js'; +import { visit, visitInParallel } from '../language/visitor.js'; -import type { GraphQLSchema } from '../type/schema'; -import { assertValidSchema } from '../type/validate'; +import type { GraphQLSchema } from '../type/schema.js'; +import { assertValidSchema } from '../type/validate.js'; -import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo'; +import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo.js'; -import { specifiedRules, specifiedSDLRules } from './specifiedRules'; -import type { SDLValidationRule, ValidationRule } from './ValidationContext'; -import { SDLValidationContext, ValidationContext } from './ValidationContext'; +import { specifiedRules, specifiedSDLRules } from './specifiedRules.js'; +import type { SDLValidationRule, ValidationRule } from './ValidationContext.js'; +import { + SDLValidationContext, + ValidationContext, +} from './ValidationContext.js'; /** * Implements the "Validation" section of the spec. diff --git a/tsconfig.json b/tsconfig.json index 271946ed63..3a003277d3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "dom" // Workaround for missing web-compatible globals in `@types/node` ], "target": "es2020", - "module": "commonjs", + "module": "es2022", "moduleResolution": "node", "noEmit": true, "isolatedModules": true, @@ -32,6 +32,10 @@ "noPropertyAccessFromIndexSignature": false, // TODO consider "noUncheckedIndexedAccess": false, // FIXME "noUnusedLocals": true, - "noUnusedParameters": true + "noUnusedParameters": true, + "allowSyntheticDefaultImports": true + }, + "ts-node": { + "esm": true } } diff --git a/website/docs/tutorials/defer-stream.md b/website/docs/tutorials/defer-stream.md new file mode 100644 index 0000000000..7f1c9ceb95 --- /dev/null +++ b/website/docs/tutorials/defer-stream.md @@ -0,0 +1,31 @@ +--- +title: Enabling Defer & Stream +sidebar_label: Enabling Defer & Stream +--- + +The `@defer` and `@stream` directives are not enabled by default. In order to use these directives, you must add them to your GraphQL Schema and use the `experimentalExecuteIncrementally` function instead of `execute`. + +```js +import { + GraphQLSchema, + GraphQLDeferDirective, + GraphQLStreamDirective, + specifiedDirectives, +} from 'graphql'; + +const schema = new GraphQLSchema({ + query, + directives: [ + ...specifiedDirectives, + GraphQLDeferDirective, + GraphQLStreamDirective, + ], +}); + +const result = experimentalExecuteIncrementally({ + schema, + document, +}); +``` + +If the `directives` option is passed to `GraphQLSchema`, the default directives will not be included. `specifiedDirectives` must be passed to ensure all standard directives are added in addition to `defer` & `stream`. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.cjs similarity index 98% rename from website/docusaurus.config.js rename to website/docusaurus.config.cjs index bf3000c56a..44973c8ff1 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.cjs @@ -23,7 +23,7 @@ module.exports = { /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { - sidebarPath: require.resolve('./sidebars.js'), + sidebarPath: require.resolve('./sidebars.cjs'), editUrl: 'https://github.com/graphql/graphql-js/edit/main/website/docs/', }, diff --git a/website/sidebars.js b/website/sidebars.cjs similarity index 94% rename from website/sidebars.js rename to website/sidebars.cjs index 79fe5e9d8b..5201b4fd95 100644 --- a/website/sidebars.js +++ b/website/sidebars.cjs @@ -16,5 +16,6 @@ module.exports = { items: ['tutorials/constructing-types'], }, 'tutorials/express-graphql', + 'tutorials/defer-stream', ], };