diff --git a/.changeset/@graphql-tools_utils-6243-dependencies.md b/.changeset/@graphql-tools_utils-6243-dependencies.md new file mode 100644 index 00000000000..86f4f7baafe --- /dev/null +++ b/.changeset/@graphql-tools_utils-6243-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/utils": patch +--- +dependencies updates: + - Added dependency [`dlv@^1.1.3` โ†—๏ธŽ](https://www.npmjs.com/package/dlv/v/1.1.3) (to `dependencies`) diff --git a/.changeset/@graphql-tools_utils-6790-dependencies.md b/.changeset/@graphql-tools_utils-6790-dependencies.md new file mode 100644 index 00000000000..86f4f7baafe --- /dev/null +++ b/.changeset/@graphql-tools_utils-6790-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/utils": patch +--- +dependencies updates: + - Added dependency [`dlv@^1.1.3` โ†—๏ธŽ](https://www.npmjs.com/package/dlv/v/1.1.3) (to `dependencies`) diff --git a/.changeset/chatty-dryers-breathe.md b/.changeset/chatty-dryers-breathe.md new file mode 100644 index 00000000000..0d5bc6ebf91 --- /dev/null +++ b/.changeset/chatty-dryers-breathe.md @@ -0,0 +1,5 @@ +--- +'@graphql-tools/utils': minor +--- + +Add helper function `memoize3of4` for memoizing values. diff --git a/.changeset/fifty-bobcats-jog.md b/.changeset/fifty-bobcats-jog.md new file mode 100644 index 00000000000..72afdc77327 --- /dev/null +++ b/.changeset/fifty-bobcats-jog.md @@ -0,0 +1,43 @@ +--- +'@graphql-tools/executor': major +--- + +Support the new non-duplicating Incremental Delivery format. + +GraphQL Incremental Delivery is moving to a [new response format without duplication](https://github.com/graphql/defer-stream-wg/discussions/69). + +This PR updates the executor within graphql-tools to avoid any duplication of fields as per the new format, a BREAKING CHANGE, (released in graphql-js `v17.0.0-alpha.3`). The original version of incremental delivery was released in graphql-js `v17.0.0-alpha.2`. + +The new format also includes new `pending` and `completed` entries where the `pending` entries assign `ids` to `defer` and `stream` entries, and the `completed` entries are sent as deferred fragments or streams complete. In the new format, the `path` and `label` are only sent along with the `id` within the `pending` entries. Also, incremental errors (i.e. errors that bubble up to a position that has already been sent) are sent within the `errors` field on `completed` entries, rather than as `incremental` entries with `data` or `items` set to `null`. The missing `path` and `label` fields and different mechanism for reporting incremental errors are also a BREAKING CHANGE. + +Along with the new format, the GraphQL Working Group has also decided to disable incremental delivery support for subscriptions (1) to gather more information about use cases and (2) explore how to interleaving the incremental response streams generated from different source events into one overall subscription response stream. This is also a BREAKING CHANGE. + +Library users can explicitly opt in to the older format by call `execute` with the following option: + +```ts +import {execute, IncrementalDeliveryPresetLegacy} from 'graphql' + +const result = await execute({ + ..., + incrementalPreset: IncrementalDeliveryPresetLegacy, +}); +``` + +The default value for `incrementalPreset` when omitted is `IncrementalDeliveryPreset2023_06_22`, which enables the new behaviors described above. The new behaviors can also be disabled granularly as follows: + +```ts +import {execute, IncrementalDeliveryPreset2023_06_22} from 'graphql' + +const result = await execute({ + ..., + incrementalPreset: { + ...IncrementalDeliveryPreset2023_06_22, + allowSubscription: true + } +}); +``` + +Setting `deferWithoutDuplication` to `false` will re-enable deduplication according to the older format. +Setting `useIncrementalNotifications` to `false` will (1) omit the `pending` entries, (2) send `path` and `label` on every `incremental` entry, (3) omit `completed` entries, and (4) send incremental errors within `incremental` entries along with a `data` or `items` field set to `null`. +Setting `allowSubscription` to `false` will re-enable the use of incremental delivery with subscriptions. +``` diff --git a/.changeset/mean-parents-do.md b/.changeset/mean-parents-do.md new file mode 100644 index 00000000000..f1c204b1207 --- /dev/null +++ b/.changeset/mean-parents-do.md @@ -0,0 +1,15 @@ +--- +'@graphql-tools/utils': minor +--- + +Support the new incremental protocol for `mergeIncrementalResult`. + +The `mergeIncrementalResult` function can now merge the [new response format without duplication](https://github.com/graphql/defer-stream-wg/discussions/69). + +```ts +const executionResult = { data: { user: { name: 'John' } }, pending: [{ id: '0', path: [] }] }; +const incrementalResult = { incremental: [{ id: '0', data: { user: { age: 42 } } }] }; + +console.log(mergeIncrementalResult({ incrementalResult, executionResult })); +// logs: { user: { age: 42, name: 'John' } } +``` diff --git a/.changeset/thirty-bees-know.md b/.changeset/thirty-bees-know.md new file mode 100644 index 00000000000..214dc8d7ef0 --- /dev/null +++ b/.changeset/thirty-bees-know.md @@ -0,0 +1,7 @@ +--- +'@graphql-tools/utils': minor +--- + +Add new incremental delivery fields to the `ExecutionResult` type. + +The `id`, `subPath`, `pending` and `completed` properties specified by [in the following proposal](https://github.com/graphql/defer-stream-wg/discussions/69) are now defined within `ExecutionResult`. diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 4183270a787..fc4f4c1c286 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -102,6 +102,7 @@ module.exports = { 'prefer-rest-params': 'off', 'no-throw-literal': 'off', 'promise/param-names': 'off', + camelcase: ['error', { allow: ['IncrementalDeliveryPreset2023_06_22'] }], }, }, { diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 1b833ae6ede..00000000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Benchmark - -env: - NODE_NO_WARNINGS: true - CI: true - -on: - pull_request: - workflow_dispatch: - -jobs: - federation-benchmark: - name: Federation Benchmark with ${{matrix.products_size}} Products - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - products_size: [3, 10, 50, 100, 1000] - steps: - - name: Checkout Master - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Setup env - uses: the-guild-org/shared-config/setup@main - with: - nodeVersion: 18 - - - name: Build packages - run: yarn build - - name: Setup K6 - run: | - wget https://github.com/grafana/k6/releases/download/v0.37.0/k6-v0.37.0-linux-amd64.deb - sudo apt-get update - sudo apt-get install ./k6-v0.37.0-linux-amd64.deb - - name: GraphQL API - working-directory: ./benchmark/federation - run: | - yarn start & - yarn wait-on tcp:3000 - env: - PRODUCTS_SIZE: ${{matrix.products_size}} - - name: Federation - run: k6 -e ENDPOINT=federation run --out json=federation.json benchmark/federation/k6.js - - name: Stitching - uses: nick-fields/retry@v3 - with: - timeout_minutes: 10 - max_attempts: 3 - command: - k6 -e ENDPOINT=stitching -e PRODUCTS_SIZE=${{matrix.products_size}} -e GITHUB_PR=${{ - github.event.number }} -e GITHUB_SHA=${{ github.sha }} -e - GITHUB_TOKEN=${{secrets.GITHUB_TOKEN}} run --out json=stitching.json - benchmark/federation/k6.js - - name: Monolith - run: k6 -e ENDPOINT=monolith run --out json=monolith.json benchmark/federation/k6.js - - name: Compare - run: - node benchmark/compare monolith:monolith.json federation:federation.json - stitching:stitching.json diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 87a5eb33c8b..3dda7def11b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -4,6 +4,9 @@ on: branches: - master +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + jobs: dependencies: uses: the-guild-org/shared-config/.github/workflows/changesets-dependencies.yaml@main @@ -20,7 +23,7 @@ jobs: with: npmTag: alpha buildScript: build - nodeVersion: 18 + nodeVersion: 22 secrets: githubToken: ${{ secrets.GUILD_BOT_TOKEN }} npmToken: ${{ secrets.NODE_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8ec63bc9d1..c8fa7a84a2b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,9 @@ on: branches: - master +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + jobs: stable: permissions: @@ -12,7 +15,7 @@ jobs: uses: the-guild-org/shared-config/.github/workflows/release-stable.yml@main with: releaseScript: release - nodeVersion: 18 + nodeVersion: 22 secrets: githubToken: ${{ secrets.GUILD_BOT_TOKEN }} npmToken: ${{ secrets.NODE_AUTH_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 972844e61fe..e48ab18e716 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,6 +5,10 @@ env: NODE_OPTIONS: '--max-old-space-size=8192' CI: true +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + on: push: branches: @@ -12,8 +16,8 @@ on: pull_request: jobs: - prettier-check: - name: ๐Ÿงน Prettier Check + typecheck-15: + name: Type Check on GraphQL v15 runs-on: ubuntu-latest steps: - name: Checkout Master @@ -22,44 +26,32 @@ jobs: - name: Setup env uses: the-guild-org/shared-config/setup@main with: - nodeVersion: 18 - - - name: Prettier Check - run: yarn prettier:check - lint: - name: Lint - uses: the-guild-org/shared-config/.github/workflows/lint.yml@main - with: - script: yarn ci:lint - secrets: - githubToken: ${{ secrets.GITHUB_TOKEN }} + nodeVersion: 22 - build: - name: Type Check on GraphQL v${{matrix.graphql_version}} + - name: Use GraphQL v15 + run: node ./scripts/match-graphql.js 15 + - name: Install Dependencies using Yarn + run: yarn install --ignore-engines && git checkout yarn.lock + - name: Type Check + run: yarn ts:check + check: + name: Full Check on GraphQL v16 runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - graphql_version: - - 15 - - 16 - - '17.0.0-alpha.1' steps: - name: Checkout Master uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Setup env uses: the-guild-org/shared-config/setup@main with: - nodeVersion: 18 - - - name: Use GraphQL v${{matrix.graphql_version}} - run: node ./scripts/match-graphql.js ${{matrix.graphql_version}} - - name: Install Dependencies using Yarn - run: yarn install --ignore-engines && git checkout yarn.lock - - name: Type Check - run: yarn ts:check - + nodeVersion: 22 + - name: Prettier + run: yarn prettier:check + - name: Lint + run: yarn lint + - name: Build + run: yarn build + - name: Test ESM and CJS integrity + run: yarn bob check test: name: Unit Test on Node ${{matrix.node-version}} (${{matrix.os}}) and GraphQL @@ -69,11 +61,10 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] # remove windows to speed up the tests - node-version: [18, 20, 22] + node-version: [18, 20, 22, 23] graphql_version: - 15 - 16 - - '17.0.0-alpha.1' include: - node-version: 18 os: windows-latest @@ -100,110 +91,13 @@ jobs: hashFiles('yarn.lock') }} restore-keys: | ${{ runner.os }}-${{matrix.node-version}}-${{matrix.graphql_version}}-jest- - - name: Test - if: ${{ matrix.node-version >= 20 }} + - name: Build + run: yarn build + - name: Unit Tests run: yarn test --ci - - name: Test - if: ${{ matrix.node-version < 20 }} + - name: Leak Tests uses: nick-fields/retry@v3 with: timeout_minutes: 10 max_attempts: 5 command: yarn test:leaks --ci - - trackback: - name: trackback rc dependencies - needs: test - if: ${{ always() }}} - runs-on: ubuntu-latest - steps: - - uses: the-guild-org/shared-config/release-trackback@main - with: - token: ${{ secrets.GITHUB_TOKEN }} - relevantPackages: | - @whatwg-node/* - - test_esm: - name: ESM Test - runs-on: ubuntu-latest - steps: - - name: Checkout Master - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Setup env - uses: the-guild-org/shared-config/setup@main - with: - nodeVersion: 18 - - - name: Build Packages - run: yarn build - - name: Test ESM and CJS integrity - run: yarn bob check - test_browser: - name: Browser Test - runs-on: ubuntu-latest - steps: - - name: Checkout Master - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Setup env - uses: the-guild-org/shared-config/setup@main - with: - nodeVersion: 22 - - name: Setup Chrome - uses: browser-actions/setup-chrome@v1 - - name: Build Packages - run: yarn build - - name: Test - uses: nick-fields/retry@v3 - with: - timeout_minutes: 10 - max_attempts: 5 - command: TEST_BROWSER=true yarn jest --no-watchman --ci browser - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ['javascript'] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # โ„น๏ธ Command-line programs to run using the OS shell. - # ๐Ÿ“š https://git.io/JvXDl - - # โœ๏ธ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index e606d63139f..183cf0550d3 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -6,6 +6,9 @@ on: - master pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + jobs: deployment: runs-on: ubuntu-latest @@ -21,7 +24,7 @@ jobs: - uses: the-guild-org/shared-config/setup@main name: setup env with: - nodeVersion: 18 + nodeVersion: 22 packageManager: yarn - uses: the-guild-org/shared-config/website-cf@main diff --git a/.husky/pre-commit b/.husky/pre-commit index d2ae35e84b0..37236231717 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - yarn lint-staged diff --git a/benchmark/compare.js b/benchmark/compare.js deleted file mode 100644 index 939052cb27d..00000000000 --- a/benchmark/compare.js +++ /dev/null @@ -1,39 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -let [, , ...rawPointers] = process.argv; - -function createReport(pointer) { - const [name, file] = pointer.split(':'); - - const lines = fs.readFileSync(path.join(process.cwd(), file), 'utf-8').split('\n'); - - let sum = 0; - let count = 0; - - for (let line of lines) { - if (line.trim().length) { - const metric = JSON.parse(line); - - if ( - metric.type === 'Point' && - metric.metric === 'http_req_duration' && - metric.data.tags.status === '200' - ) { - count++; - sum += metric.data.value; - } - } - } - - return { - name, - file, - avg: sum / count, - }; -} - -const pointers = rawPointers.map(createReport); - -const stats = pointers.map(pointer => `${pointer.name}: ${pointer.avg.toFixed(2)} ms`).join('\n'); - -console.log(stats); diff --git a/benchmark/federation/.gitignore b/benchmark/federation/.gitignore deleted file mode 100644 index c624904298c..00000000000 --- a/benchmark/federation/.gitignore +++ /dev/null @@ -1,55 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# environment variables -.env - -yarn.lock diff --git a/benchmark/federation/CHANGELOG.md b/benchmark/federation/CHANGELOG.md deleted file mode 100644 index e48d1798c1d..00000000000 --- a/benchmark/federation/CHANGELOG.md +++ /dev/null @@ -1,1421 +0,0 @@ -# federation-benchmark - -## 0.0.175 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/federation@2.2.27 - - @graphql-tools/stitch@9.3.4 - -## 0.0.174 - -### Patch Changes - -- Updated dependencies - [[`d06afe3`](https://github.com/ardatan/graphql-tools/commit/d06afe3065edb15f4c58c1c155a230d8d542669f)]: - - @graphql-tools/federation@2.2.26 - -## 0.0.173 - -### Patch Changes - -- Updated dependencies - [[`342e044`](https://github.com/ardatan/graphql-tools/commit/342e044c7da74aaf5df6a90ce68973c525c9aa10)]: - - @graphql-tools/federation@2.2.25 - - @graphql-tools/stitch@9.3.3 - -## 0.0.172 - -### Patch Changes - -- Updated dependencies - [[`e9906eb`](https://github.com/ardatan/graphql-tools/commit/e9906eb311132ab902720e75bc787228d67c0e34)]: - - @graphql-tools/federation@2.2.24 - - @graphql-tools/stitch@9.3.2 - -## 0.0.171 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/federation@2.2.23 - - @graphql-tools/stitch@9.3.1 - -## 0.0.170 - -### Patch Changes - -- Updated dependencies - [[`2bb2adb`](https://github.com/ardatan/graphql-tools/commit/2bb2adbe81ab940e582ea2c779a766817c099c9c)]: - - @graphql-tools/stitch@9.3.0 - - @graphql-tools/federation@2.2.22 - -## 0.0.169 - -### Patch Changes - -- Updated dependencies - [[`5145fc4`](https://github.com/ardatan/graphql-tools/commit/5145fc4f4eed543219dbab5c0bd54e4636e1b952)]: - - @graphql-tools/federation@2.2.21 - -## 0.0.168 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/federation@2.2.20 - - @graphql-tools/stitch@9.2.17 - -## 0.0.167 - -### Patch Changes - -- Updated dependencies - [[`180f3f0`](https://github.com/ardatan/graphql-tools/commit/180f3f0c8362613eb3013ff12f2d5405cd987903)]: - - @graphql-tools/federation@2.2.19 - - @graphql-tools/stitch@9.2.16 - -## 0.0.166 - -### Patch Changes - -- Updated dependencies - [[`4deac7f`](https://github.com/ardatan/graphql-tools/commit/4deac7f3ac468334874f1d9e4ab41943fdf2818c)]: - - @graphql-tools/federation@2.2.18 - -## 0.0.165 - -### Patch Changes - -- Updated dependencies - [[`b1e002f`](https://github.com/ardatan/graphql-tools/commit/b1e002f16fe01f7d5d42f9a6b6c8d3ec67fe93ba)]: - - @graphql-tools/federation@2.2.17 - -## 0.0.164 - -### Patch Changes - -- Updated dependencies - [[`8effad4`](https://github.com/ardatan/graphql-tools/commit/8effad4ffb9be1bca098b8cb6ce41b84ac7d9b6b)]: - - @graphql-tools/federation@2.2.16 - - @graphql-tools/stitch@9.2.15 - -## 0.0.163 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/federation@2.2.15 - - @graphql-tools/stitch@9.2.14 - -## 0.0.162 - -### Patch Changes - -- Updated dependencies - [[`e0070c2`](https://github.com/ardatan/graphql-tools/commit/e0070c2327ca49bc2a87b88d6ff1066ac2078d2b)]: - - @graphql-tools/federation@2.2.14 - -## 0.0.161 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/federation@2.2.13 - - @graphql-tools/stitch@9.2.13 - -## 0.0.160 - -### Patch Changes - -- Updated dependencies - [[`7e2938d`](https://github.com/ardatan/graphql-tools/commit/7e2938d45c6d0a6eb6b18b89f9f80e9b5b5c08db)]: - - @graphql-tools/federation@2.2.12 - - @graphql-tools/stitch@9.2.12 - -## 0.0.159 - -### Patch Changes - -- Updated dependencies - [[`dcb3e27`](https://github.com/ardatan/graphql-tools/commit/dcb3e276cce59340596156542bcede9d8b143d44)]: - - @graphql-tools/stitch@9.2.11 - - @graphql-tools/federation@2.2.11 - -## 0.0.158 - -### Patch Changes - -- Updated dependencies - [[`a600be6`](https://github.com/ardatan/graphql-tools/commit/a600be627a6d619ef4c95a445a5c7801d166787b)]: - - @graphql-tools/federation@2.2.10 - -## 0.0.157 - -### Patch Changes - -- Updated dependencies - [[`0e87805`](https://github.com/ardatan/graphql-tools/commit/0e8780572fb1a852c8f4d7c8a59b064ae92bdd6b)]: - - @graphql-tools/federation@2.2.9 - -## 0.0.156 - -### Patch Changes - -- Updated dependencies - [[`52a69ed`](https://github.com/ardatan/graphql-tools/commit/52a69edb8979fd081d1caea90684f5d61dc9f6ec)]: - - @graphql-tools/federation@2.2.8 - -## 0.0.155 - -### Patch Changes - -- Updated dependencies - [[`3188051`](https://github.com/ardatan/graphql-tools/commit/3188051ae530772210e9f3a2c9615932ef13f497)]: - - @graphql-tools/federation@2.2.7 - -## 0.0.154 - -### Patch Changes - -- Updated dependencies - [[`b8bf584`](https://github.com/ardatan/graphql-tools/commit/b8bf584fde87d3064c204d8ac2f9da5b869249c0)]: - - @graphql-tools/federation@2.2.6 - -## 0.0.153 - -### Patch Changes - -- Updated dependencies - [[`dbb0516`](https://github.com/ardatan/graphql-tools/commit/dbb05162731b7a2baf08f4756d4a4de3dce0a951)]: - - @graphql-tools/federation@2.2.5 - -## 0.0.152 - -### Patch Changes - -- Updated dependencies - [[`3803897`](https://github.com/ardatan/graphql-tools/commit/3803897cef27b15bad1718819c5d75030afbe781)]: - - @graphql-tools/federation@2.2.4 - -## 0.0.151 - -### Patch Changes - -- Updated dependencies - [[`0d203ab`](https://github.com/ardatan/graphql-tools/commit/0d203ab57671cfa6d4417e60b08b3224a65bec91)]: - - @graphql-tools/federation@2.2.3 - -## 0.0.150 - -### Patch Changes - -- Updated dependencies - [[`63cab60`](https://github.com/ardatan/graphql-tools/commit/63cab60dca3f36614ff5cb26869e1e7d3e939c50)]: - - @graphql-tools/federation@2.2.2 - -## 0.0.149 - -### Patch Changes - -- Updated dependencies - [[`33e8146`](https://github.com/ardatan/graphql-tools/commit/33e8146e33aa17790ee76d14e52f62c684ee1b16)]: - - @graphql-tools/federation@2.2.1 - -## 0.0.148 - -### Patch Changes - -- Updated dependencies - [[`334d301`](https://github.com/ardatan/graphql-tools/commit/334d301007d4d73e09182f22a76bdce1937ec8af)]: - - @graphql-tools/federation@2.2.0 - -## 0.0.147 - -### Patch Changes - -- Updated dependencies - [[`167b47c`](https://github.com/ardatan/graphql-tools/commit/167b47cbc6ae31ce046cf6cc17365813d2481d4c)]: - - @graphql-tools/federation@2.1.4 - -## 0.0.146 - -### Patch Changes - -- Updated dependencies - [[`d54b21a`](https://github.com/ardatan/graphql-tools/commit/d54b21a235f9632d320a32f15594ecd70b5eae29)]: - - @graphql-tools/federation@2.1.3 - -## 0.0.145 - -### Patch Changes - -- Updated dependencies - [[`c6d175b`](https://github.com/ardatan/graphql-tools/commit/c6d175b2c1de640d2156ba0b2c69bf7e8884d98f)]: - - @graphql-tools/federation@2.1.2 - -## 0.0.144 - -### Patch Changes - -- Updated dependencies - [[`3f301dc`](https://github.com/ardatan/graphql-tools/commit/3f301dc74a99ea1db28fe75923fa26ba2736d9f7), - [`66c99d9`](https://github.com/ardatan/graphql-tools/commit/66c99d9c9e480cc4e1569b032952caea0ff69c0c), - [`3f301dc`](https://github.com/ardatan/graphql-tools/commit/3f301dc74a99ea1db28fe75923fa26ba2736d9f7), - [`66c99d9`](https://github.com/ardatan/graphql-tools/commit/66c99d9c9e480cc4e1569b032952caea0ff69c0c)]: - - @graphql-tools/federation@2.1.1 - - @graphql-tools/stitch@9.2.10 - -## 0.0.143 - -### Patch Changes - -- Updated dependencies - [[`d5dd794`](https://github.com/ardatan/graphql-tools/commit/d5dd794352878aec9b0d543dfe2e6995142dddff), - [`d5dd794`](https://github.com/ardatan/graphql-tools/commit/d5dd794352878aec9b0d543dfe2e6995142dddff), - [`d5dd794`](https://github.com/ardatan/graphql-tools/commit/d5dd794352878aec9b0d543dfe2e6995142dddff)]: - - @graphql-tools/federation@2.1.0 - -## 0.0.142 - -### Patch Changes - -- Updated dependencies - [[`0f7059b`](https://github.com/ardatan/graphql-tools/commit/0f7059beb218d0012c48e121c55e7db386796bee)]: - - @graphql-tools/federation@2.0.1 - -## 0.0.141 - -### Patch Changes - -- Updated dependencies - [[`db29280`](https://github.com/ardatan/graphql-tools/commit/db29280ef4b058857923ed8a207052fe06ba5fa0), - [`85c383f`](https://github.com/ardatan/graphql-tools/commit/85c383fbb44eeb2a0509480d84ca0b12811bc3ca)]: - - @graphql-tools/federation@2.0.0 - -## 0.0.140 - -### Patch Changes - -- Updated dependencies - [[`7368829`](https://github.com/ardatan/graphql-tools/commit/73688291af0c8cb2fe550fe8c74fd8af84cb360f), - [`0134f7f`](https://github.com/ardatan/graphql-tools/commit/0134f7ffe5383603961d69337bfa5bceefb3ed74), - [`eec9d3d`](https://github.com/ardatan/graphql-tools/commit/eec9d3d86a1a0a748321263ef9bc4db13fd3c35c), - [`03a47b1`](https://github.com/ardatan/graphql-tools/commit/03a47b181516e17f33c84f364df9482c2d1ba502), - [`dfccfbf`](https://github.com/ardatan/graphql-tools/commit/dfccfbfd6633dd576f660c648f3c6cecff3667a1), - [`e10c13a`](https://github.com/ardatan/graphql-tools/commit/e10c13a60e344b9217dc77a7cac50ec447feda7e), - [`e10c13a`](https://github.com/ardatan/graphql-tools/commit/e10c13a60e344b9217dc77a7cac50ec447feda7e), - [`0827497`](https://github.com/ardatan/graphql-tools/commit/08274975ccb1524d88fc8b95f42deb1cba05425d)]: - - @graphql-tools/federation@1.1.36 - - @graphql-tools/stitch@9.2.9 - -## 0.0.139 - -### Patch Changes - -- Updated dependencies - [[`a83da08`](https://github.com/ardatan/graphql-tools/commit/a83da087e24929ed0734a2cff63c97bd45cc9eb4), - [`fc9c71f`](https://github.com/ardatan/graphql-tools/commit/fc9c71fbc9057a8e32e0d8813b23819c631afa65), - [`cd962c1`](https://github.com/ardatan/graphql-tools/commit/cd962c1048b21c0a6f91c943860089b050ac5f5e), - [`04d5431`](https://github.com/ardatan/graphql-tools/commit/04d5431deccc42d75b6ae2ae8ed941dac4c3679a)]: - - @graphql-tools/stitch@9.2.8 - - @graphql-tools/federation@1.1.35 - -## 0.0.138 - -### Patch Changes - -- Updated dependencies - [[`508ae6b`](https://github.com/ardatan/graphql-tools/commit/508ae6bbe36248926b58719d71042c4d608782a1)]: - - @graphql-tools/federation@1.1.34 - -## 0.0.137 - -### Patch Changes - -- Updated dependencies - [[`361052a`](https://github.com/ardatan/graphql-tools/commit/361052a5fcc7f3bb00092efa3efd5767b9ac1ee6)]: - - @graphql-tools/federation@1.1.33 - -## 0.0.136 - -### Patch Changes - -- Updated dependencies - [[`680351e`](https://github.com/ardatan/graphql-tools/commit/680351ee2af39ffd6b4b0048a28954d0d4b8a926)]: - - @graphql-tools/federation@1.1.32 - - @graphql-tools/stitch@9.2.7 - -## 0.0.135 - -### Patch Changes - -- Updated dependencies - [[`98b2795`](https://github.com/ardatan/graphql-tools/commit/98b2795120e05dec1d91b57422f50d38c088b630)]: - - @graphql-tools/federation@1.1.31 - - @graphql-tools/stitch@9.2.6 - -## 0.0.134 - -### Patch Changes - -- Updated dependencies - [[`9238e14`](https://github.com/ardatan/graphql-tools/commit/9238e140862d33c6df072c42054fc642eda37840)]: - - @graphql-tools/federation@1.1.30 - - @graphql-tools/stitch@9.2.5 - -## 0.0.133 - -### Patch Changes - -- Updated dependencies - [[`67a9c49`](https://github.com/ardatan/graphql-tools/commit/67a9c4909b7676b69c4b425ab1a6cd5533c799ef)]: - - @graphql-tools/stitch@9.2.4 - -## 0.0.132 - -### Patch Changes - -- Updated dependencies - [[`074fad4`](https://github.com/ardatan/graphql-tools/commit/074fad4144095fbefe449ced397b7707963bd7aa), - [`074fad4`](https://github.com/ardatan/graphql-tools/commit/074fad4144095fbefe449ced397b7707963bd7aa)]: - - @graphql-tools/federation@1.1.29 - - @graphql-tools/stitch@9.2.3 - -## 0.0.131 - -### Patch Changes - -- Updated dependencies - [[`b281dd6`](https://github.com/ardatan/graphql-tools/commit/b281dd65276dd9df56a41cc2dbff5139281f02f9)]: - - @graphql-tools/stitch@9.2.2 - -## 0.0.130 - -### Patch Changes - -- Updated dependencies - [[`5567347`](https://github.com/ardatan/graphql-tools/commit/5567347217fdfb72e3f8b389ade6d5912dfb5c95), - [`5567347`](https://github.com/ardatan/graphql-tools/commit/5567347217fdfb72e3f8b389ade6d5912dfb5c95)]: - - @graphql-tools/stitch@9.2.1 - -## 0.0.129 - -### Patch Changes - -- Updated dependencies - [[`9bca9e0`](https://github.com/ardatan/graphql-tools/commit/9bca9e03915a2e12d164e355be9aed389b0de3a4), - [`9bca9e0`](https://github.com/ardatan/graphql-tools/commit/9bca9e03915a2e12d164e355be9aed389b0de3a4), - [`243c353`](https://github.com/ardatan/graphql-tools/commit/243c353412921cf0063f963ee46b9c63d2f33b41)]: - - @graphql-tools/stitch@9.2.0 - - @graphql-tools/federation@1.1.28 - -## 0.0.128 - -### Patch Changes - -- Updated dependencies - [[`f538e50`](https://github.com/ardatan/graphql-tools/commit/f538e503c3cdb152bd29f77804217100cac0f648)]: - - @graphql-tools/federation@1.1.27 - -## 0.0.127 - -### Patch Changes - -- Updated dependencies - [[`6d26702`](https://github.com/ardatan/graphql-tools/commit/6d267022eaf4b695b3791927912375f1b1d0f3a8)]: - - @graphql-tools/stitch@9.1.2 - -## 0.0.126 - -### Patch Changes - -- Updated dependencies - [[`c5df958`](https://github.com/ardatan/graphql-tools/commit/c5df95858c5b5a57a232740e8e4b667ce5d2da2c)]: - - @graphql-tools/stitch@9.1.1 - -## 0.0.125 - -### Patch Changes - -- Updated dependencies - [[`6cf507f`](https://github.com/ardatan/graphql-tools/commit/6cf507fc70d2474c71c8604ab117d01af76376e1)]: - - @graphql-tools/federation@1.1.26 - -## 0.0.124 - -### Patch Changes - -- Updated dependencies - [[`27b6f49`](https://github.com/ardatan/graphql-tools/commit/27b6f49c67d4b3fca26d90dcaaef37ff61fe9d0a)]: - - @graphql-tools/stitch@9.1.0 - -## 0.0.123 - -### Patch Changes - -- Updated dependencies - [[`e09c383`](https://github.com/ardatan/graphql-tools/commit/e09c383a540f84f56db141466b711f88fce8548d)]: - - @graphql-tools/federation@1.1.25 - -## 0.0.122 - -### Patch Changes - -- Updated dependencies - [[`458ef46`](https://github.com/ardatan/graphql-tools/commit/458ef46536db003edc399587feabfcee7b186830)]: - - @graphql-tools/federation@1.1.24 - -## 0.0.121 - -### Patch Changes - -- Updated dependencies - [[`2202768`](https://github.com/ardatan/graphql-tools/commit/220276800d271e7c6fbc43339eb779b618c82e68)]: - - @graphql-tools/federation@1.1.23 - -## 0.0.120 - -### Patch Changes - -- Updated dependencies - [[`4620bb2`](https://github.com/ardatan/graphql-tools/commit/4620bb2a352fd0e645950aaae8bb54cbc7c85ce7)]: - - @graphql-tools/federation@1.1.22 - -## 0.0.119 - -### Patch Changes - -- Updated dependencies - [[`14f4fae`](https://github.com/ardatan/graphql-tools/commit/14f4faec87b1423c5541dab16dc2c5c1298edcf7)]: - - @graphql-tools/federation@1.1.21 - -## 0.0.118 - -### Patch Changes - -- Updated dependencies - [[`b78ce7e`](https://github.com/ardatan/graphql-tools/commit/b78ce7e42c8d016d972b125a86508f5ab78d57a6)]: - - @graphql-tools/federation@1.1.20 - -## 0.0.117 - -### Patch Changes - -- Updated dependencies - [[`d4395dd`](https://github.com/ardatan/graphql-tools/commit/d4395dd7d21db3becdf51cc0508e35d246dcbe1e)]: - - @graphql-tools/federation@1.1.19 - -## 0.0.116 - -### Patch Changes - -- Updated dependencies - [[`107c021`](https://github.com/ardatan/graphql-tools/commit/107c021aa191f0654c45ed72b45d650993e2142f)]: - - @graphql-tools/federation@1.1.18 - -## 0.0.115 - -### Patch Changes - -- Updated dependencies - [[`83c0af0`](https://github.com/ardatan/graphql-tools/commit/83c0af0713ff2ce55ccfb97a1810ecfecfeab703), - [`83c0af0`](https://github.com/ardatan/graphql-tools/commit/83c0af0713ff2ce55ccfb97a1810ecfecfeab703)]: - - @graphql-tools/federation@1.1.17 - - @graphql-tools/stitch@9.0.5 - -## 0.0.114 - -### Patch Changes - -- Updated dependencies - [[`7f606ea`](https://github.com/ardatan/graphql-tools/commit/7f606ea4da035b220319fb702d6a2c9d5e5d35e9)]: - - @graphql-tools/stitch@9.0.4 - -## 0.0.113 - -### Patch Changes - -- Updated dependencies - [[`7583729`](https://github.com/ardatan/graphql-tools/commit/7583729718ffd528bba5d1c5c4ea087975102c1f)]: - - @graphql-tools/federation@1.1.16 - -## 0.0.112 - -### Patch Changes - -- Updated dependencies - [[`2d76909`](https://github.com/ardatan/graphql-tools/commit/2d76909908a918562a9f7599825b70ae60f91127)]: - - @graphql-tools/federation@1.1.15 - -## 0.0.111 - -### Patch Changes - -- Updated dependencies - [[`ba062ff`](https://github.com/ardatan/graphql-tools/commit/ba062ff4880f6922eaddfcbd746782275a8f689e)]: - - @graphql-tools/federation@1.1.14 - -## 0.0.110 - -### Patch Changes - -- Updated dependencies - [[`974df8a`](https://github.com/ardatan/graphql-tools/commit/974df8a1a1bca422bac5d971a3f8029cd9728efd)]: - - @graphql-tools/federation@1.1.13 - -## 0.0.109 - -### Patch Changes - -- Updated dependencies - [[`efedc590`](https://github.com/ardatan/graphql-tools/commit/efedc59018ea1d63f86973d0c6608b3c7ddc2e71)]: - - @graphql-tools/federation@1.1.12 - -## 0.0.108 - -### Patch Changes - -- Updated dependencies - [[`250715a1`](https://github.com/ardatan/graphql-tools/commit/250715a1e18f0c645240ea78bb80f7557ac81340), - [`250715a1`](https://github.com/ardatan/graphql-tools/commit/250715a1e18f0c645240ea78bb80f7557ac81340)]: - - @graphql-tools/federation@1.1.11 - -## 0.0.107 - -### Patch Changes - -- Updated dependencies - [[`a0a9c5e1`](https://github.com/ardatan/graphql-tools/commit/a0a9c5e1686508c32a45fc7c9bbda89cb046cbcf)]: - - @graphql-tools/stitch@9.0.3 - -## 0.0.106 - -### Patch Changes - -- Updated dependencies - [[`cda328c3`](https://github.com/ardatan/graphql-tools/commit/cda328c3e487ea51e13a3b18f0e2e494fd3275ca)]: - - @graphql-tools/federation@1.1.10 - - @graphql-tools/stitch@9.0.2 - -## 0.0.105 - -### Patch Changes - -- Updated dependencies - [[`3ed8cbd6`](https://github.com/ardatan/graphql-tools/commit/3ed8cbd68988492e8b220a82b3590bad2a1c672b)]: - - @graphql-tools/federation@1.1.9 - -## 0.0.104 - -### Patch Changes - -- Updated dependencies - [[`7fe63895`](https://github.com/ardatan/graphql-tools/commit/7fe63895c1b989de3ab433e90945cb318718ddac)]: - - @graphql-tools/federation@1.1.8 - -## 0.0.103 - -### Patch Changes - -- [`5eabbea2`](https://github.com/ardatan/graphql-tools/commit/5eabbea27c69b67a07cfc181d597098402ca5286) - Thanks [@ardatan](https://github.com/ardatan)! - Fix Fed v2 support - -## 0.0.102 - -### Patch Changes - -- Updated dependencies - [[`d30e8735`](https://github.com/ardatan/graphql-tools/commit/d30e8735682c3a7209cded3fc16dd889ddfa5ddf)]: - - @graphql-tools/federation@1.1.7 - -## 0.0.101 - -### Patch Changes - -- Updated dependencies - [[`9b404e83`](https://github.com/ardatan/graphql-tools/commit/9b404e8346af2831e3ed56326cd9e1e9f8582b42)]: - - @graphql-tools/federation@1.1.6 - -## 0.0.100 - -### Patch Changes - -- Updated dependencies - [[`61393975`](https://github.com/ardatan/graphql-tools/commit/61393975c535e45c108500feea1ceec461586c6e)]: - - @graphql-tools/federation@1.1.5 - -## 0.0.99 - -### Patch Changes - -- Updated dependencies - [[`ada5c56a`](https://github.com/ardatan/graphql-tools/commit/ada5c56af472e06d595e53a035c105e745490bfc)]: - - @graphql-tools/federation@1.1.4 - -## 0.0.98 - -### Patch Changes - -- Updated dependencies - [[`f31be313`](https://github.com/ardatan/graphql-tools/commit/f31be313b2af5a7c5bf893f1ce1dc7d36bf5340c), - [`f31be313`](https://github.com/ardatan/graphql-tools/commit/f31be313b2af5a7c5bf893f1ce1dc7d36bf5340c)]: - - @graphql-tools/federation@1.1.3 - - @graphql-tools/stitch@9.0.1 - -## 0.0.97 - -### Patch Changes - -- Updated dependencies - [[`de9e8a67`](https://github.com/ardatan/graphql-tools/commit/de9e8a678a0ab38e5fc1cbf6c1bf27c265cc0c01), - [`de9e8a67`](https://github.com/ardatan/graphql-tools/commit/de9e8a678a0ab38e5fc1cbf6c1bf27c265cc0c01)]: - - @graphql-tools/federation@1.1.2 - -## 0.0.96 - -### Patch Changes - -- Updated dependencies - [[`d593dfce`](https://github.com/ardatan/graphql-tools/commit/d593dfce52a895993c754903687043a9d5429803)]: - - @graphql-tools/federation@1.1.1 - -## 0.0.95 - -### Patch Changes - -- Updated dependencies - [[`d4de4a8e`](https://github.com/ardatan/graphql-tools/commit/d4de4a8e84f7dabbaab058b264a350a3592dd752)]: - - @graphql-tools/federation@1.1.0 - -## 0.0.94 - -### Patch Changes - -- Updated dependencies - [[`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955)]: - - @graphql-tools/federation@1.0.0 - - @graphql-tools/stitch@9.0.0 - -## 0.0.93 - -### Patch Changes - -- Updated dependencies - [[`2bbbe1af`](https://github.com/ardatan/graphql-tools/commit/2bbbe1af0bb7d04685bdceab9252a5ded6809c78)]: - - @graphql-tools/stitch@8.7.50 - -## 0.0.92 - -### Patch Changes - -- Updated dependencies - [[`24c13616`](https://github.com/ardatan/graphql-tools/commit/24c136160fe675c08c1c1fe06bfb8883cdf0b466)]: - - @graphql-tools/federation@0.0.3 - -## 0.0.91 - -### Patch Changes - -- Updated dependencies - [[`0cd9e8c4`](https://github.com/ardatan/graphql-tools/commit/0cd9e8c4469d07e53ad8e7944ba144f58c4db34f), - [`88244048`](https://github.com/ardatan/graphql-tools/commit/882440487551abcb5bdd4f626f3b56ac2e886f11), - [`8e80b689`](https://github.com/ardatan/graphql-tools/commit/8e80b6893d2342353731610d5da9db633d806083)]: - - @graphql-tools/federation@0.0.2 - - @graphql-tools/stitch@8.7.49 - -## 0.0.90 - -### Patch Changes - -- Updated dependencies - [[`1c0e80a6`](https://github.com/ardatan/graphql-tools/commit/1c0e80a60827169eb3eb99fe5710b1e891b89740)]: - - @graphql-tools/federation@0.0.1 - -## 0.0.89 - -### Patch Changes - -- Updated dependencies - [[`1c95368a`](https://github.com/ardatan/graphql-tools/commit/1c95368aea868be537d956ba5e994cde58dfee41)]: - - @graphql-tools/stitching-directives@2.3.34 - - @graphql-tools/stitch@8.7.48 - -## 0.0.88 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.47 - - @graphql-tools/stitching-directives@2.3.33 - -## 0.0.87 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.46 - -## 0.0.86 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.45 - - @graphql-tools/stitching-directives@2.3.32 - -## 0.0.85 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.44 - -## 0.0.84 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.43 - -## 0.0.83 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.42 - - @graphql-tools/stitching-directives@2.3.31 - -## 0.0.82 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.41 - - @graphql-tools/stitching-directives@2.3.30 - -## 0.0.81 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.40 - - @graphql-tools/stitching-directives@2.3.29 - -## 0.0.80 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.39 - - @graphql-tools/stitching-directives@2.3.28 - -## 0.0.79 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.38 - - @graphql-tools/stitching-directives@2.3.27 - -## 0.0.78 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.37 - - @graphql-tools/stitching-directives@2.3.26 - -## 0.0.77 - -### Patch Changes - -- Updated dependencies - [[`fdb3e4c4`](https://github.com/ardatan/graphql-tools/commit/fdb3e4c4bbd004c92b52c55a0733793339822639)]: - - @graphql-tools/stitch@8.7.36 - -## 0.0.76 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.35 - - @graphql-tools/stitching-directives@2.3.25 - -## 0.0.75 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.34 - - @graphql-tools/stitching-directives@2.3.24 - -## 0.0.74 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.33 - -## 0.0.73 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.32 - - @graphql-tools/stitching-directives@2.3.23 - -## 0.0.72 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.31 - - @graphql-tools/stitching-directives@2.3.22 - -## 0.0.71 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.30 - - @graphql-tools/stitching-directives@2.3.21 - -## 0.0.70 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.29 - -## 0.0.69 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.28 - -## 0.0.68 - -### Patch Changes - -- Updated dependencies - [[`44fe1ef1`](https://github.com/ardatan/graphql-tools/commit/44fe1ef1ef371bfa71b9b015aedc4ee205b0f19f)]: - - @graphql-tools/stitch@8.7.27 - -## 0.0.67 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.26 - -## 0.0.66 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.25 - -## 0.0.65 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.24 - -## 0.0.64 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.23 - - @graphql-tools/stitching-directives@2.3.20 - -## 0.0.63 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.22 - - @graphql-tools/stitching-directives@2.3.19 - -## 0.0.62 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.21 - - @graphql-tools/stitching-directives@2.3.18 - -## 0.0.61 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.20 - -## 0.0.60 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.19 - - @graphql-tools/stitching-directives@2.3.17 - -## 0.0.59 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.18 - - @graphql-tools/stitching-directives@2.3.16 - -## 0.0.58 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.17 - - @graphql-tools/stitching-directives@2.3.15 - -## 0.0.57 - -### Patch Changes - -- Updated dependencies - [[`80836fa7`](https://github.com/ardatan/graphql-tools/commit/80836fa78af3c6e61c61fe4d3bc52831b2c58931)]: - - @graphql-tools/stitch@8.7.16 - - @graphql-tools/stitching-directives@2.3.14 - -## 0.0.56 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.15 - - @graphql-tools/stitching-directives@2.3.13 - -## 0.0.55 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.14 - - @graphql-tools/stitching-directives@2.3.12 - -## 0.0.54 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.13 - - @graphql-tools/stitching-directives@2.3.11 - -## 0.0.53 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.12 - - @graphql-tools/stitching-directives@2.3.10 - -## 0.0.52 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.11 - -## 0.0.51 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.10 - - @graphql-tools/stitching-directives@2.3.9 - -## 0.0.50 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.9 - -## 0.0.49 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.8 - - @graphql-tools/stitching-directives@2.3.8 - -## 0.0.48 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.7 - - @graphql-tools/stitching-directives@2.3.7 - -## 0.0.47 - -### Patch Changes - -- Updated dependencies - [[`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d), - [`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d)]: - - @graphql-tools/stitch@8.7.6 - - @graphql-tools/stitching-directives@2.3.6 - -## 0.0.46 - -### Patch Changes - -- Updated dependencies - [[`0555a972`](https://github.com/ardatan/graphql-tools/commit/0555a972f010d2b3ca93b9164b26474a78d0b20b)]: - - @graphql-tools/stitch@8.7.5 - - @graphql-tools/stitching-directives@2.3.5 - -## 0.0.45 - -### Patch Changes - -- Updated dependencies - [[`29ee7542`](https://github.com/ardatan/graphql-tools/commit/29ee7542649e9c938bdb9c751bd3a2f56d17cb55)]: - - @graphql-tools/stitch@8.7.4 - - @graphql-tools/stitching-directives@2.3.4 - -## 0.0.44 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/stitch@8.7.3 - - @graphql-tools/stitching-directives@2.3.3 - -## 0.0.43 - -### Patch Changes - -- Updated dependencies - [[`e3167edc`](https://github.com/ardatan/graphql-tools/commit/e3167edc98172fda88ce2306c10c7d4a23d91d67)]: - - @graphql-tools/stitch@8.7.2 - - @graphql-tools/stitching-directives@2.3.2 - -## 0.0.42 - -### Patch Changes - -- @graphql-tools/stitch@8.7.1 -- @graphql-tools/stitching-directives@2.3.1 - -## 0.0.41 - -### Patch Changes - -- Updated dependencies [d76a299c] - - @graphql-tools/stitch@8.7.0 - - @graphql-tools/stitching-directives@2.3.0 - -## 0.0.40 - -### Patch Changes - -- @graphql-tools/stitch@8.6.14 -- @graphql-tools/stitching-directives@2.2.19 - -## 0.0.39 - -### Patch Changes - -- Updated dependencies [041c5ba1] - - @graphql-tools/stitch@8.6.13 - - @graphql-tools/stitching-directives@2.2.18 - -## 0.0.38 - -### Patch Changes - -- @graphql-tools/stitch@8.6.12 -- @graphql-tools/stitching-directives@2.2.17 - -## 0.0.37 - -### Patch Changes - -- @graphql-tools/stitch@8.6.11 -- @graphql-tools/stitching-directives@2.2.16 - -## 0.0.36 - -### Patch Changes - -- @graphql-tools/stitch@8.6.10 -- @graphql-tools/stitching-directives@2.2.15 - -## 0.0.35 - -### Patch Changes - -- @graphql-tools/stitch@8.6.9 -- @graphql-tools/stitching-directives@2.2.14 - -## 0.0.34 - -### Patch Changes - -- @graphql-tools/stitch@8.6.8 -- @graphql-tools/stitching-directives@2.2.13 - -## 0.0.33 - -### Patch Changes - -- @graphql-tools/stitch@8.6.7 -- @graphql-tools/stitching-directives@2.2.12 - -## 0.0.32 - -### Patch Changes - -- Updated dependencies [0bbb1769] - - @graphql-tools/stitch@8.6.6 - - @graphql-tools/stitching-directives@2.2.11 - -## 0.0.31 - -### Patch Changes - -- @graphql-tools/stitch@8.6.5 -- @graphql-tools/stitching-directives@2.2.10 - -## 0.0.30 - -### Patch Changes - -- @graphql-tools/stitch@8.6.4 -- @graphql-tools/stitching-directives@2.2.9 - -## 0.0.29 - -### Patch Changes - -- @graphql-tools/stitch@8.6.3 -- @graphql-tools/stitching-directives@2.2.8 - -## 0.0.28 - -### Patch Changes - -- @graphql-tools/stitch@8.6.2 -- @graphql-tools/stitching-directives@2.2.7 - -## 0.0.27 - -### Patch Changes - -- @graphql-tools/stitch@8.6.1 -- @graphql-tools/stitching-directives@2.2.6 - -## 0.0.26 - -### Patch Changes - -- Updated dependencies [c40e801f] - - @graphql-tools/stitch@8.6.0 - - @graphql-tools/stitching-directives@2.2.5 - -## 0.0.25 - -### Patch Changes - -- Updated dependencies [0c0c6857] - - @graphql-tools/stitch@8.5.2 - - @graphql-tools/stitching-directives@2.2.4 - -## 0.0.24 - -### Patch Changes - -- Updated dependencies [3da3d66c] - - @graphql-tools/stitch@8.5.1 - - @graphql-tools/stitching-directives@2.2.3 - -## 0.0.23 - -### Patch Changes - -- Updated dependencies [70081f8f] - - @graphql-tools/stitch@8.5.0 - -## 0.0.22 - -### Patch Changes - -- Updated dependencies [18341363] - - @graphql-tools/stitch@8.4.4 - - @graphql-tools/stitching-directives@2.2.2 - -## 0.0.21 - -### Patch Changes - -- @graphql-tools/stitch@8.4.3 - -## 0.0.20 - -### Patch Changes - -- @graphql-tools/stitch@8.4.2 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies [981eef80] -- Updated dependencies [4bfb3428] - - @graphql-tools/stitch@8.4.1 - - @graphql-tools/stitching-directives@2.2.1 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies [149afddb] - - @graphql-tools/stitch@8.4.0 - - @graphql-tools/stitching-directives@2.2.0 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies [320122ba] - - @graphql-tools/stitching-directives@2.1.1 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [d4918a78] - - @graphql-tools/stitch@8.3.1 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] - - @graphql-tools/stitch@8.3.0 - - @graphql-tools/stitching-directives@2.1.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [c8c13ed1] - - @graphql-tools/stitch@8.2.1 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [631b11bd] -- Updated dependencies [e50852e6] - - @graphql-tools/stitch@8.2.0 - - @graphql-tools/stitching-directives@2.0.11 - -## 0.0.12 - -### Patch Changes - -- @graphql-tools/stitch@8.1.2 -- @graphql-tools/stitching-directives@2.0.10 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [9a13357c] - - @graphql-tools/stitch@8.1.1 - - @graphql-tools/stitching-directives@2.0.9 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [67691b78] - - @graphql-tools/stitch@8.1.0 - - @graphql-tools/stitching-directives@2.0.8 - -## 0.0.9 - -### Patch Changes - -- @graphql-tools/stitch@8.0.8 -- @graphql-tools/stitching-directives@2.0.7 - -## 0.0.8 - -### Patch Changes - -- @graphql-tools/stitch@8.0.7 -- @graphql-tools/stitching-directives@2.0.6 - -## 0.0.7 - -### Patch Changes - -- @graphql-tools/stitch@8.0.6 -- @graphql-tools/stitching-directives@2.0.5 - -## 0.0.6 - -### Patch Changes - -- @graphql-tools/stitch@8.0.5 - -## 0.0.5 - -### Patch Changes - -- @graphql-tools/stitch@8.0.4 -- @graphql-tools/stitching-directives@2.0.4 - -## 0.0.4 - -### Patch Changes - -- @graphql-tools/stitch@8.0.3 -- @graphql-tools/stitching-directives@2.0.3 - -## 0.0.3 - -### Patch Changes - -- @graphql-tools/stitch@8.0.2 -- @graphql-tools/stitching-directives@2.0.2 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [c36defbe] - - @graphql-tools/stitch@8.0.1 - - @graphql-tools/stitching-directives@2.0.1 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [91155ab6] -- Updated dependencies [7d3e3006] -- Updated dependencies [dae6dc7b] -- Updated dependencies [1b0ce2ae] -- Updated dependencies [74581cf3] -- Updated dependencies [70cd65eb] -- Updated dependencies [c0ca3190] - - @graphql-tools/stitch@8.0.0 - - @graphql-tools/stitching-directives@2.0.0 diff --git a/benchmark/federation/call.js b/benchmark/federation/call.js deleted file mode 100644 index 8d2a336a70b..00000000000 --- a/benchmark/federation/call.js +++ /dev/null @@ -1,54 +0,0 @@ -const { fetch } = require('@whatwg-node/fetch'); - -fetch('http://localhost:3000/stitching', { - method: 'POST', - headers: { - 'content-type': 'application/json', - }, - body: JSON.stringify({ - query: /* GraphQL */ ` - fragment User on User { - id - username - name - } - - fragment Review on Review { - id - body - } - - fragment Product on Product { - inStock - name - price - shippingEstimate - upc - weight - } - - query TestQuery { - users { - ...User - reviews { - ...Review - product { - ...Product - } - } - } - topProducts { - ...Product - reviews { - ...Review - author { - ...User - } - } - } - } - `, - }), -}) - .then(res => res.json()) - .then(data => console.log(JSON.stringify(data, null, 2))); diff --git a/benchmark/federation/federation.js b/benchmark/federation/federation.js deleted file mode 100644 index b282a47c552..00000000000 --- a/benchmark/federation/federation.js +++ /dev/null @@ -1,26 +0,0 @@ -const { ApolloGateway, LocalGraphQLDataSource } = require('@apollo/gateway'); - -const serviceMap = { - accounts: require('./services/accounts'), - inventory: require('./services/inventory'), - products: require('./services/products'), - reviews: require('./services/reviews'), -}; - -module.exports = async function () { - const gateway = new ApolloGateway({ - localServiceList: Object.entries(serviceMap).map(([name, { typeDefs }]) => ({ - name, - typeDefs, - })), - buildService: ({ name }) => new LocalGraphQLDataSource(serviceMap[name].schema), - }); - - const { schema, executor } = await gateway.load(); - - return { - schema, - executor, - stop: () => gateway.stop(), - }; -}; diff --git a/benchmark/federation/index.js b/benchmark/federation/index.js deleted file mode 100644 index 98873c53ad3..00000000000 --- a/benchmark/federation/index.js +++ /dev/null @@ -1,105 +0,0 @@ -const express = require('express'); -const runStitchingGateway = require('./stitching'); -const runApolloGateway = require('./federation'); -const makeMonolithSchema = require('./monolith'); -const { normalizedExecutor } = require('@graphql-tools/executor'); -const { parse } = require('graphql'); - -function memoize1(fn) { - const memoize1cache = new Map(); - return function memoized(a1) { - const cachedValue = memoize1cache.get(a1); - if (cachedValue === undefined) { - const newValue = fn(a1); - memoize1cache.set(a1, newValue); - return newValue; - } - - return cachedValue; - }; -} - -async function main() { - const scenarios = await Promise.all([ - runStitchingGateway(), - runApolloGateway(), - makeMonolithSchema(), - ]); - - const [stitching, federation, monolith] = scenarios; - const [stitchingParse, federationParse, monolithParse] = scenarios.map(() => memoize1(parse)); - - const app = express(); - - app.use(express.json()); - - app.post('/federation', (req, res) => { - try { - const result$ = federation.executor({ - document: federationParse(req.body.query), - request: { - query: req.body.query, - }, - cache: { - get: async () => undefined, - set: async () => {}, - delete: async () => true, - }, - schema: federation.schema, - context: {}, - }); - if (result$.then) { - return result$.then(result => res.json(result)).catch(error => res.status(500).send(error)); - } - res.json(result$); - } catch (error) { - res.status(500).send(error); - } - }); - - app.post('/stitching', (req, res) => { - try { - const result$ = normalizedExecutor({ - schema: stitching, - document: stitchingParse(req.body.query), - contextValue: {}, - }); - if (result$.then) { - return result$.then(result => res.json(result)).catch(error => res.status(500).send(error)); - } - res.json(result$); - } catch (error) { - res.status(500).send(error); - } - }); - - app.post('/monolith', (req, res) => { - try { - const result$ = normalizedExecutor({ - schema: monolith, - document: monolithParse(req.body.query), - contextValue: {}, - }); - if (result$.then) { - return result$.then(result => res.json(result)).catch(error => res.status(500).send(error)); - } - res.json(result$); - } catch (error) { - res.status(500).send(error); - } - }); - - const server = app.listen(3000, () => { - console.log('listening on 0.0.0.0:3000'); - }); - - process.once('SIGINT', () => { - console.log('Closing server'); - server.closeAllConnections(); - server.close(() => { - console.log('Closed server'); - }); - }); -} - -main(); diff --git a/benchmark/federation/k6.js b/benchmark/federation/k6.js deleted file mode 100644 index 69e8df0083c..00000000000 --- a/benchmark/federation/k6.js +++ /dev/null @@ -1,105 +0,0 @@ -import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js'; -import { githubComment } from 'https://raw.githubusercontent.com/dotansimha/k6-github-pr-comment/master/lib.js'; -import { check } from 'k6'; -import { checkNoErrors, graphql } from '../utils.js'; - -const isPrinted = __ENV.GITHUB_TOKEN && __ENV.PRODUCTS_SIZE == 1000; - -export const options = { - vus: 1, - duration: '10s', -}; - -export function handleSummary(data) { - if (isPrinted) { - githubComment(data, { - token: __ENV.GITHUB_TOKEN, - commit: __ENV.GITHUB_SHA, - pr: __ENV.GITHUB_PR, - org: 'ardatan', - repo: 'graphql-tools', - renderTitle({ passes }) { - return passes ? 'โœ… Benchmark Results' : 'โŒ Benchmark Failed'; - }, - renderMessage({ passes, checks, thresholds }) { - const result = []; - - if (thresholds.failures) { - result.push( - `**Performance regression detected**: it seems like your Pull Request adds some extra latency to Schema Stitching`, - ); - } - - if (checks.failures) { - result.push('**Failed assertions detected**'); - } - - if (!passes) { - result.push( - `> If the performance regression is expected, please increase the failing threshold.`, - ); - } - - return result.join('\n'); - }, - }); - } - return { - stdout: textSummary(data, { indent: ' ', enableColors: true }), - }; -} - -export default function () { - const res = graphql({ - endpoint: `http://0.0.0.0:3000/${__ENV.ENDPOINT}`, - query: /* GraphQL */ ` - fragment User on User { - id - username - name - } - - fragment Review on Review { - id - body - } - - fragment Product on Product { - inStock - name - price - shippingEstimate - upc - weight - } - - query TestQuery { - users { - ...User - reviews { - ...Review - product { - ...Product - } - } - } - topProducts { - ...Product - reviews { - ...Review - author { - ...User - } - } - } - } - `, - variables: {}, - }); - - check(res, { - no_errors: checkNoErrors, - expected_result: resp => - 'reviews' in resp.json().data.users[0] && 'reviews' in resp.json().data.topProducts[0], - }); -} diff --git a/benchmark/federation/monolith.js b/benchmark/federation/monolith.js deleted file mode 100644 index dae01b06be5..00000000000 --- a/benchmark/federation/monolith.js +++ /dev/null @@ -1,161 +0,0 @@ -const { gql } = require('graphql-tag'); -const { makeExecutableSchema } = require('@graphql-tools/schema'); - -const typeDefs = gql` - type Query { - me: User - users: [User] - topProducts(first: Int): [Product] - } - type User { - id: ID! - name: String - username: String - reviews: [Review] - } - type Product { - upc: String! - weight: Int - price: Int - name: String - inStock: Boolean - shippingEstimate: Int - reviews: [Review] - } - type Review { - id: ID! - body: String - author: User - product: Product - } -`; - -const resolvers = { - Query: { - me() { - return users[0]; - }, - users() { - return users; - }, - topProducts(_, args) { - return args.first ? products.slice(0, args.first) : products; - }, - }, - User: { - reviews(user) { - return reviews.filter(review => review.authorID === user.id); - }, - username(user) { - const found = usernames.find(username => username.id === user.id); - return found ? found.username : null; - }, - }, - Product: { - shippingEstimate(object) { - // free for expensive items - if (object.price > 1000) return 0; - // estimate is based on weight - return object.weight * 0.5; - }, - reviews(product) { - return reviews.filter(review => review.productUpc === product.upc); - }, - inStock(product) { - return inventory.find(inv => inv.upc === product.upc)?.inStock; - }, - }, - Review: { - author(review) { - return users.find(user => user.id === review.authorID); - }, - product(review) { - return products.find(product => review.productUpc === product.upc); - }, - }, -}; - -module.exports = () => - makeExecutableSchema({ - typeDefs, - resolvers, - }); - -const users = [ - { - id: '1', - name: 'Ada Lovelace', - birthDate: '1815-12-10', - username: '@ada', - }, - { - id: '2', - name: 'Alan Turing', - birthDate: '1912-06-23', - username: '@complete', - }, -]; - -const inventory = [ - { upc: '1', inStock: true }, - { upc: '2', inStock: false }, - { upc: '3', inStock: true }, -]; - -const listSize = parseInt(process.env.PRODUCTS_SIZE || '3'); - -const definedProducts = [ - { - upc: '1', - name: 'Table', - price: 899, - weight: 100, - }, - { - upc: '2', - name: 'Couch', - price: 1299, - weight: 1000, - }, - { - upc: '3', - name: 'Chair', - price: 54, - weight: 50, - }, -]; -const products = Array(listSize) - .fill({}) - .map((_, index) => definedProducts[index % 3]); - -const usernames = [ - { id: '1', username: '@ada' }, - { id: '2', username: '@complete' }, -]; - -const reviews = [ - { - id: '1', - authorID: '1', - productUpc: '1', - body: 'Love it!', - }, - { - id: '2', - authorID: '1', - productUpc: '2', - body: 'Too expensive.', - }, - { - id: '3', - authorID: '2', - productUpc: '3', - body: 'Could be better.', - }, - { - id: '4', - authorID: '2', - productUpc: '1', - body: 'Prefer something else.', - }, -]; diff --git a/benchmark/federation/package.json b/benchmark/federation/package.json deleted file mode 100644 index 685ccfe4f3a..00000000000 --- a/benchmark/federation/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "federation-benchmark", - "version": "0.0.175", - "private": true, - "scripts": { - "loadtest:federation": "k6 -e ENDPOINT=federation run k6.js", - "loadtest:monolith": "k6 -e ENDPOINT=monolith run k6.js", - "loadtest:stitching": "k6 -e ENDPOINT=stitching run k6.js", - "start": "cross-env NODE_ENV=production node index.js" - }, - "dependencies": { - "@apollo/gateway": "2.9.3", - "@apollo/subgraph": "2.9.3", - "@graphql-tools/federation": "2.2.27", - "@graphql-tools/stitch": "9.3.4", - "cross-env": "7.0.3", - "express": "4.21.1", - "graphql": "16.9.0", - "graphql-tag": "2.12.6", - "wait-on": "8.0.1" - } -} diff --git a/benchmark/federation/services/accounts/index.js b/benchmark/federation/services/accounts/index.js deleted file mode 100644 index bc82695c28c..00000000000 --- a/benchmark/federation/services/accounts/index.js +++ /dev/null @@ -1,59 +0,0 @@ -const { gql } = require('graphql-tag'); -const { buildSubgraphSchema } = require('@apollo/subgraph'); - -const typeDefs = gql` - extend type Query { - me: User - users: [User] - } - - type User @key(fields: "id") { - id: ID! - name: String - username: String - } -`; - -const resolvers = { - Query: { - me() { - return users[0]; - }, - users() { - return users; - }, - }, - User: { - __resolveReference(object) { - return users.find(user => user.id === object.id); - }, - }, -}; - -const schema = buildSubgraphSchema([ - { - typeDefs, - resolvers, - }, -]); - -module.exports = { - typeDefs, - resolvers, - schema, -}; - -const users = [ - { - id: '1', - name: 'Ada Lovelace', - birthDate: '1815-12-10', - username: '@ada', - }, - { - id: '2', - name: 'Alan Turing', - birthDate: '1912-06-23', - username: '@complete', - }, -]; diff --git a/benchmark/federation/services/inventory/index.js b/benchmark/federation/services/inventory/index.js deleted file mode 100644 index 8626af8b408..00000000000 --- a/benchmark/federation/services/inventory/index.js +++ /dev/null @@ -1,48 +0,0 @@ -const { gql } = require('graphql-tag'); -const { buildSubgraphSchema } = require('@apollo/subgraph'); - -const typeDefs = gql` - extend type Product @key(fields: "upc") { - upc: String! @external - weight: Int @external - price: Int @external - inStock: Boolean - shippingEstimate: Int @requires(fields: "price weight") - } -`; - -const resolvers = { - Product: { - __resolveReference(object) { - return { - ...object, - ...inventory.find(product => product.upc === object.upc), - }; - }, - shippingEstimate(object) { - // free for expensive items - if (object.price > 1000) return 0; - // estimate is based on weight - return object.weight * 0.5; - }, - }, -}; - -const schema = buildSubgraphSchema([ - { - typeDefs, - resolvers, - }, -]); - -module.exports = { - typeDefs, - resolvers, - schema, -}; - -const inventory = [ - { upc: '1', inStock: true }, - { upc: '2', inStock: false }, - { upc: '3', inStock: true }, -]; diff --git a/benchmark/federation/services/products/index.js b/benchmark/federation/services/products/index.js deleted file mode 100644 index 165f0f60668..00000000000 --- a/benchmark/federation/services/products/index.js +++ /dev/null @@ -1,64 +0,0 @@ -const { gql } = require('graphql-tag'); -const { buildSubgraphSchema } = require('@apollo/subgraph'); - -const typeDefs = gql` - extend type Query { - topProducts(first: Int): [Product] - } - - type Product @key(fields: "upc") { - upc: String! - name: String - price: Int - weight: Int - } -`; - -const listSize = parseInt(process.env.PRODUCTS_SIZE || '3'); - -const definedProducts = [ - { - upc: '1', - name: 'Table', - price: 899, - weight: 100, - }, - { - upc: '2', - name: 'Couch', - price: 1299, - weight: 1000, - }, - { - upc: '3', - name: 'Chair', - price: 54, - weight: 50, - }, -]; -const products = [...Array(listSize)].map((_, index) => definedProducts[index % 3]); - -const resolvers = { - Product: { - __resolveReference(object) { - return products.find(product => product.upc === object.upc); - }, - }, - Query: { - topProducts(_, args) { - return args.first ? products.slice(0, args.first) : products; - }, - }, -}; -const schema = buildSubgraphSchema([ - { - typeDefs, - resolvers, - }, -]); - -module.exports = { - typeDefs, - resolvers, - schema, -}; diff --git a/benchmark/federation/services/reviews/index.js b/benchmark/federation/services/reviews/index.js deleted file mode 100644 index 336a700d95d..00000000000 --- a/benchmark/federation/services/reviews/index.js +++ /dev/null @@ -1,91 +0,0 @@ -const { gql } = require('graphql-tag'); -const { buildSubgraphSchema } = require('@apollo/subgraph'); - -const typeDefs = gql` - type Review @key(fields: "id") { - id: ID! - body: String - author: User @provides(fields: "username") - product: Product - } - - extend type User @key(fields: "id") { - id: ID! @external - username: String @external - reviews: [Review] - } - - extend type Product @key(fields: "upc") { - upc: String! @external - reviews: [Review] - } -`; - -const resolvers = { - Review: { - author(review) { - return { __typename: 'User', id: review.authorID }; - }, - }, - User: { - reviews(user) { - return reviews.filter(review => review.authorID === user.id); - }, - numberOfReviews(user) { - return reviews.filter(review => review.authorID === user.id).length; - }, - username(user) { - const found = usernames.find(username => username.id === user.id); - return found ? found.username : null; - }, - }, - Product: { - reviews(product) { - return reviews.filter(review => review.product.upc === product.upc); - }, - }, -}; - -const schema = buildSubgraphSchema([ - { - typeDefs, - resolvers, - }, -]); - -module.exports = { - typeDefs, - resolvers, - schema, -}; - -const usernames = [ - { id: '1', username: '@ada' }, - { id: '2', username: '@complete' }, -]; -const reviews = [ - { - id: '1', - authorID: '1', - product: { upc: '1' }, - body: 'Love it!', - }, - { - id: '2', - authorID: '1', - product: { upc: '2' }, - body: 'Too expensive.', - }, - { - id: '3', - authorID: '2', - product: { upc: '3' }, - body: 'Could be better.', - }, - { - id: '4', - authorID: '2', - product: { upc: '1' }, - body: 'Prefer something else.', - }, -]; diff --git a/benchmark/federation/stitching.js b/benchmark/federation/stitching.js deleted file mode 100644 index 85369fbe970..00000000000 --- a/benchmark/federation/stitching.js +++ /dev/null @@ -1,19 +0,0 @@ -const { stitchSchemas } = require('@graphql-tools/stitch'); -const { getSubschemaForFederationWithSchema } = require('@graphql-tools/federation'); - -const services = [ - require('./services/accounts'), - require('./services/inventory'), - require('./services/products'), - require('./services/reviews'), -]; - -async function makeGatewaySchema() { - return stitchSchemas({ - subschemas: await Promise.all( - services.map(service => getSubschemaForFederationWithSchema(service.schema)), - ), - }); -} - -module.exports = makeGatewaySchema; diff --git a/benchmark/utils.js b/benchmark/utils.js deleted file mode 100644 index 765f285780d..00000000000 --- a/benchmark/utils.js +++ /dev/null @@ -1,23 +0,0 @@ -import http from 'k6/http'; - -const params = { - headers: { - 'Content-Type': 'application/json', - }, -}; - -export function checkNoErrors(resp) { - return !('errors' in resp.json()); -} - -export function graphql({ query, operationName, variables, endpoint }) { - return http.post( - endpoint, - JSON.stringify({ - query, - operationName, - variables, - }), - params, - ); -} diff --git a/jest.config.js b/jest.config.js index a32eb63255b..f5d0ddef9f4 100644 --- a/jest.config.js +++ b/jest.config.js @@ -23,7 +23,6 @@ const externalToolsPackages = [ '@graphql-tools/batch-delegate', '@graphql-tools/batch-execute', '@graphql-tools/delegate', - '@graphql-tools/federation', '@graphql-tools/stitch', '@graphql-tools/wrap', '@graphql-tools/executor-http', @@ -37,6 +36,7 @@ externalToolsPackages.forEach(mod => { }); module.exports = { + displayName: process.env.LEAK_TEST ? 'Leak Test' : 'Unit Test', testEnvironment: 'node', rootDir: ROOT_DIR, prettierPath: null, // disable prettier for inline snapshots diff --git a/package.json b/package.json index c10e066f182..55d4b76b9be 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,7 @@ "packages/*", "packages/loaders/*", "packages/executors/*", - "website", - "benchmark/*" + "website" ], "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "keywords": [ @@ -30,19 +29,18 @@ ], "scripts": { "build": "bob build", - "build:api-docs": "ts-node --transpileOnly --compiler-options='{\"module\":\"commonjs\"}' scripts/build-api-docs", + "build:api-docs": "tsx scripts/build-api-docs", "ci:lint": "cross-env \"ESLINT_USE_FLAT_CONFIG=false\" eslint --ext .ts . --output-file eslint_report.json --format json", "clean-dist": "rimraf \"packages/**/dist\" && rimraf \".bob\"", "lint": "cross-env \"ESLINT_USE_FLAT_CONFIG=false\" eslint --ext .ts .", - "postbuild": "ts-node --compiler-options='{\"module\":\"commonjs\"}' scripts/postbuild.ts", - "postinstall": "patch-package && husky install", + "postbuild": "tsx scripts/postbuild.ts", + "postinstall": "patch-package", "prerelease": "yarn build", "prettier": "prettier --cache --ignore-path .prettierignore --write --list-different .", "prettier:check": "prettier --cache --ignore-path .prettierignore --check .", "release": "changeset publish", "test": "jest --no-watchman", - "test-fed-compat": "ts-node --transpileOnly --compiler-options='{\"module\":\"commonjs\"}' scripts/fetch-federation-tests && yarn test federation-compat", - "test:leaks": "cross-env \"LEAK_TEST=1\" jest --no-watchman --detectOpenHandles --detectLeaks --logHeapUsage", + "test:leaks": "cross-env \"LEAK_TEST=1\" jest --no-watchman --detectOpenHandles --detectLeaks --forceExit", "ts:check": "tsc --noEmit" }, "devDependencies": { @@ -51,45 +49,42 @@ "@babel/preset-env": "7.26.0", "@babel/preset-typescript": "7.26.0", "@changesets/changelog-github": "0.5.0", - "@changesets/cli": "2.27.9", - "@theguild/prettier-config": "2.0.7", - "@types/debug": "4.1.12", + "@changesets/cli": "2.27.11", + "@theguild/prettier-config": "3.0.0", "@types/jest": "29.5.14", - "@types/node": "22.9.0", - "@typescript-eslint/eslint-plugin": "8.14.0", - "@typescript-eslint/parser": "8.14.0", + "@types/node": "22.10.2", + "@typescript-eslint/eslint-plugin": "8.18.1", + "@typescript-eslint/parser": "8.18.1", "babel-jest": "29.7.0", "bob-the-bundler": "7.0.1", - "chalk": "4.1.2", + "chalk": "5.4.0", "concurrently": "9.1.0", "cross-env": "7.0.3", - "eslint": "9.14.0", + "eslint": "9.17.0", "eslint-config-prettier": "9.1.0", "eslint-config-standard": "17.1.0", "eslint-plugin-import": "2.31.0", - "eslint-plugin-n": "17.13.1", - "eslint-plugin-promise": "7.1.0", + "eslint-plugin-n": "17.15.0", + "eslint-plugin-promise": "7.2.1", "eslint-plugin-standard": "5.0.0", "globby": "11.1.0", - "graphql": "16.9.0", - "graphql-subscriptions": "2.0.0", - "husky": "9.1.6", + "graphql": "16.10.0", + "husky": "9.1.7", "jest": "29.7.0", - "lint-staged": "15.2.10", + "lint-staged": "15.2.11", "patch-package": "8.0.0", - "prettier": "3.3.3", - "prettier-plugin-tailwindcss": "0.6.8", + "prettier": "3.4.2", + "prettier-plugin-tailwindcss": "0.6.9", "ts-jest": "29.2.5", - "ts-node": "10.9.2", + "tsx": "4.19.2", "typedoc": "0.25.13", - "typedoc-plugin-markdown": "3.16.0", - "typedoc-plugin-rename-defaults": "0.7.0", - "typescript": "5.4.5", - "weak-napi": "2.0.2" + "typedoc-plugin-markdown": "3.17.1", + "typedoc-plugin-rename-defaults": "0.7.2", + "typescript": "5.7.2" }, "resolutions": { - "esbuild": "^0.24.0", - "graphql": "16.9.0" + "esbuild": "0.24.0", + "graphql": "16.10.0" }, "lint-staged": { "packages/**/src/**/*.{ts,tsx}": [ diff --git a/packages/executor/CHANGELOG.md b/packages/executor/CHANGELOG.md index c3ccf4e8616..5bccc88b561 100644 --- a/packages/executor/CHANGELOG.md +++ b/packages/executor/CHANGELOG.md @@ -1,5 +1,69 @@ # @graphql-tools/executor +## 1.3.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 1.3.8 + +### Patch Changes + +- [`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612) + Thanks [@ardatan](https://github.com/ardatan)! - \`AbortSignal\` in \`GraphQLResolveInfo\`, and + \`AbortSignal\` in \`ExecutionRequest\` + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 1.3.7 + +### Patch Changes + +- [#6750](https://github.com/ardatan/graphql-tools/pull/6750) + [`000a320`](https://github.com/ardatan/graphql-tools/commit/000a320052111e653c74438eb4f1a07e922c64af) + Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates: + - Updated dependency + [`@graphql-typed-document-node/core@^3.2.0` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-typed-document-node/core/v/3.2.0) + (from `3.2.0`, in `dependencies`) + - Added dependency + [`@whatwg-node/disposablestack@^0.0.5` โ†—๏ธŽ](https://www.npmjs.com/package/@whatwg-node/disposablestack/v/0.0.5) + (to `dependencies`) + +## 1.3.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 1.3.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 1.3.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 1.3.3 ### Patch Changes diff --git a/packages/executor/package.json b/packages/executor/package.json index f11f86202e5..05b12380450 100644 --- a/packages/executor/package.json +++ b/packages/executor/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor", - "version": "1.3.3", + "version": "1.3.9", "type": "module", "repository": { "type": "git", @@ -55,13 +55,15 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", - "@graphql-typed-document-node/core": "3.2.0", + "@graphql-tools/utils": "^10.6.4", + "@graphql-typed-document-node/core": "^3.2.0", "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.5", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, "devDependencies": { + "@types/dlv": "^1.1.4", "cross-inspect": "1.0.1", "graphql": "^16.6.0" }, diff --git a/packages/executor/src/execution/AccumulatorMap.ts b/packages/executor/src/execution/AccumulatorMap.ts new file mode 100644 index 00000000000..156fe71c207 --- /dev/null +++ b/packages/executor/src/execution/AccumulatorMap.ts @@ -0,0 +1,17 @@ +/** + * ES6 Map with additional `add` method to accumulate items. + */ +export class AccumulatorMap extends Map> { + get [Symbol.toStringTag]() { + return 'AccumulatorMap'; + } + + add(key: K, item: T): void { + const group = this.get(key); + if (group === undefined) { + this.set(key, [item]); + } else { + group.push(item); + } + } +} diff --git a/packages/executor/src/execution/BoxedPromiseOrValue.ts b/packages/executor/src/execution/BoxedPromiseOrValue.ts new file mode 100644 index 00000000000..630d1e6fcf8 --- /dev/null +++ b/packages/executor/src/execution/BoxedPromiseOrValue.ts @@ -0,0 +1,25 @@ +import { isPromise } from '@graphql-tools/utils'; +import type { MaybePromise } from '@graphql-tools/utils'; + +/** + * A BoxedPromiseOrValue is a container for a value or promise where the value + * will be updated when the promise resolves. + * + * A BoxedPromiseOrValue may only be used with promises whose possible + * rejection has already been handled, otherwise this will lead to unhandled + * promise rejections. + * + * @internal + * */ +export class BoxedPromiseOrValue { + value: MaybePromise; + + constructor(value: MaybePromise) { + this.value = value; + if (isPromise(value)) { + value.then(resolved => { + this.value = resolved; + }); + } + } +} diff --git a/packages/executor/src/execution/DeferredFragments.ts b/packages/executor/src/execution/DeferredFragments.ts new file mode 100644 index 00000000000..ea97f727e7c --- /dev/null +++ b/packages/executor/src/execution/DeferredFragments.ts @@ -0,0 +1,106 @@ +import { Path } from '@graphql-tools/utils'; +import { DeferUsage } from './collectFields.js'; +import { PendingExecutionGroup, StreamRecord, SuccessfulExecutionGroup } from './types.js'; + +export type DeliveryGroup = DeferredFragmentRecord | StreamRecord; + +/** @internal */ +export class DeferredFragmentRecord { + path: Path | undefined; + label: string | undefined; + id?: string | undefined; + parentDeferUsage: DeferUsage | undefined; + pendingExecutionGroups: Set; + successfulExecutionGroups: Set; + children: Set; + pending: boolean; + fns: Array<() => void>; + + constructor( + path: Path | undefined, + label: string | undefined, + parentDeferUsage: DeferUsage | undefined, + ) { + this.path = path; + this.label = label; + this.parentDeferUsage = parentDeferUsage; + this.pendingExecutionGroups = new Set(); + this.successfulExecutionGroups = new Set(); + this.children = new Set(); + this.pending = false; + this.fns = []; + } + + onPending(fn: () => void): void { + this.fns.push(fn); + } + + setAsPending(): void { + this.pending = true; + for (const fn of this.fns) { + fn(); + } + } +} + +export function isDeferredFragmentRecord( + deliveryGroup: DeliveryGroup, +): deliveryGroup is DeferredFragmentRecord { + return deliveryGroup instanceof DeferredFragmentRecord; +} + +/** + * @internal + */ +export class DeferredFragmentFactory { + private _rootDeferredFragments = new Map(); + + get(deferUsage: DeferUsage, path: Path | undefined): DeferredFragmentRecord { + const deferUsagePath = this._pathAtDepth(path, deferUsage.depth); + let deferredFragmentRecords: Map | undefined; + if (deferUsagePath === undefined) { + deferredFragmentRecords = this._rootDeferredFragments; + } else { + // A doubly nested Map> + // could be used, but could leak memory in long running operations. + // A WeakMap could be used instead. The below implementation is + // WeakMap-Like, saving the Map on the Path object directly. + // Alternatively, memory could be reclaimed manually, taking care to + // also reclaim memory for nested DeferredFragmentRecords if the parent + // is removed secondary to an error. + deferredFragmentRecords = ( + deferUsagePath as unknown as { + deferredFragmentRecords: Map; + } + ).deferredFragmentRecords; + if (deferredFragmentRecords === undefined) { + deferredFragmentRecords = new Map(); + ( + deferUsagePath as unknown as { + deferredFragmentRecords: Map; + } + ).deferredFragmentRecords = deferredFragmentRecords; + } + } + let deferredFragmentRecord = deferredFragmentRecords.get(deferUsage); + if (deferredFragmentRecord === undefined) { + const { label, parentDeferUsage } = deferUsage; + deferredFragmentRecord = new DeferredFragmentRecord(deferUsagePath, label, parentDeferUsage); + deferredFragmentRecords.set(deferUsage, deferredFragmentRecord); + } + return deferredFragmentRecord; + } + + private _pathAtDepth(path: Path | undefined, depth: number): Path | undefined { + if (depth === 0) { + return; + } + const stack: Array = []; + let currentPath = path; + while (currentPath !== undefined) { + stack.unshift(currentPath); + currentPath = currentPath.prev; + } + return stack[depth - 1]; + } +} diff --git a/packages/executor/src/execution/IncrementalGraph.ts b/packages/executor/src/execution/IncrementalGraph.ts new file mode 100644 index 00000000000..f713d881572 --- /dev/null +++ b/packages/executor/src/execution/IncrementalGraph.ts @@ -0,0 +1,324 @@ +import type { GraphQLError } from 'graphql'; +import { createDeferred, isPromise, Path } from '@graphql-tools/utils'; +import { BoxedPromiseOrValue } from './BoxedPromiseOrValue.js'; +import { DeferUsage } from './collectFields.js'; +import type { DeferredFragmentRecord, DeliveryGroup } from './DeferredFragments.js'; +import { DeferredFragmentFactory, isDeferredFragmentRecord } from './DeferredFragments.js'; +import { invariant } from './invariant.js'; +import type { + CompletedExecutionGroup, + IncrementalDataRecord, + IncrementalDataRecordResult, + PendingExecutionGroup, + StreamItemRecord, + StreamRecord, + SuccessfulExecutionGroup, +} from './types.js'; +import { isPendingExecutionGroup } from './types.js'; + +/** + * @internal + */ +export class IncrementalGraph { + private _rootNodes: Set; + private _deferredFragmentFactory: DeferredFragmentFactory; + private _completedQueue: Array; + private _nextQueue: Array<(iterable: Iterable | undefined) => void>; + + constructor(deferredFragmentFactory: DeferredFragmentFactory) { + this._rootNodes = new Set(); + this._deferredFragmentFactory = deferredFragmentFactory; + this._completedQueue = []; + this._nextQueue = []; + } + + getNewRootNodes( + incrementalDataRecords: ReadonlyArray, + ): ReadonlyArray { + const initialResultChildren = new Set(); + this._addIncrementalDataRecords(incrementalDataRecords, undefined, initialResultChildren); + return this._promoteNonEmptyToRoot(initialResultChildren); + } + + addCompletedSuccessfulExecutionGroup(successfulExecutionGroup: SuccessfulExecutionGroup): void { + const { pendingExecutionGroup, incrementalDataRecords } = successfulExecutionGroup; + const { deferUsages, path } = pendingExecutionGroup; + + const deferredFragmentRecords: Array = []; + for (const deferUsage of deferUsages) { + const deferredFragmentRecord = this._deferredFragmentFactory.get(deferUsage, path); + deferredFragmentRecords.push(deferredFragmentRecord); + const { pendingExecutionGroups, successfulExecutionGroups } = deferredFragmentRecord; + pendingExecutionGroups.delete(pendingExecutionGroup); + successfulExecutionGroups.add(successfulExecutionGroup); + } + + if (incrementalDataRecords !== undefined) { + this._addIncrementalDataRecords(incrementalDataRecords, deferredFragmentRecords); + } + } + + getDeepestDeferredFragmentAtRoot( + initialDeferUsage: DeferUsage, + deferUsages: ReadonlySet, + path: Path | undefined, + ): DeferredFragmentRecord { + let bestDeferUsage = initialDeferUsage; + let maxDepth = initialDeferUsage.depth; + for (const deferUsage of deferUsages) { + if (deferUsage === initialDeferUsage) { + continue; + } + const depth = deferUsage.depth; + if (depth > maxDepth) { + maxDepth = depth; + bestDeferUsage = deferUsage; + } + } + return this._deferredFragmentFactory.get(bestDeferUsage, path); + } + + *currentCompletedBatch(): Generator { + let completed; + while ((completed = this._completedQueue.shift()) !== undefined) { + yield completed; + } + if (this._rootNodes.size === 0) { + for (const resolve of this._nextQueue) { + resolve(undefined); + } + } + } + + nextCompletedBatch(): Promise | undefined> { + const { promise, resolve } = createDeferred< + Iterable | undefined + >(); + this._nextQueue.push(resolve); + return promise; + } + + abort(): void { + for (const resolve of this._nextQueue) { + resolve(undefined); + } + } + + hasNext(): boolean { + return this._rootNodes.size > 0; + } + + completeDeferredFragment( + deferUsage: DeferUsage, + path: Path | undefined, + ): + | { + deferredFragmentRecord: DeferredFragmentRecord; + newRootNodes: ReadonlyArray; + successfulExecutionGroups: ReadonlyArray; + } + | undefined { + const deferredFragmentRecord = this._deferredFragmentFactory.get(deferUsage, path); + if ( + !this._rootNodes.has(deferredFragmentRecord) || + deferredFragmentRecord.pendingExecutionGroups.size > 0 + ) { + return; + } + const successfulExecutionGroups = Array.from(deferredFragmentRecord.successfulExecutionGroups); + this._rootNodes.delete(deferredFragmentRecord); + for (const successfulExecutionGroup of successfulExecutionGroups) { + const { deferUsages, path: resultPath } = successfulExecutionGroup.pendingExecutionGroup; + for (const otherDeferUsage of deferUsages) { + const otherDeferredFragmentRecord = this._deferredFragmentFactory.get( + otherDeferUsage, + resultPath, + ); + otherDeferredFragmentRecord.successfulExecutionGroups.delete(successfulExecutionGroup); + } + } + const newRootNodes = this._promoteNonEmptyToRoot(deferredFragmentRecord.children); + return { deferredFragmentRecord, newRootNodes, successfulExecutionGroups }; + } + + removeDeferredFragment( + deferUsage: DeferUsage, + path: Path | undefined, + ): DeferredFragmentRecord | undefined { + const deferredFragmentRecord = this._deferredFragmentFactory.get(deferUsage, path); + if (!this._rootNodes.has(deferredFragmentRecord)) { + return; + } + this._rootNodes.delete(deferredFragmentRecord); + return deferredFragmentRecord; + } + + removeStream(streamRecord: StreamRecord): void { + this._rootNodes.delete(streamRecord); + } + + private _addIncrementalDataRecords( + incrementalDataRecords: ReadonlyArray, + parents: ReadonlyArray | undefined, + initialResultChildren?: Set | undefined, + ): void { + for (const incrementalDataRecord of incrementalDataRecords) { + if (isPendingExecutionGroup(incrementalDataRecord)) { + const { deferUsages, path } = incrementalDataRecord; + for (const deferUsage of deferUsages) { + const deferredFragmentRecord = this._deferredFragmentFactory.get(deferUsage, path); + this._addDeferredFragment(deferredFragmentRecord, initialResultChildren); + deferredFragmentRecord.pendingExecutionGroups.add(incrementalDataRecord); + } + if (this._completesRootNode(incrementalDataRecord)) { + this._onExecutionGroup(incrementalDataRecord); + } + } else if (parents === undefined) { + invariant(initialResultChildren !== undefined); + initialResultChildren.add(incrementalDataRecord); + } else { + for (const parent of parents) { + this._addDeferredFragment(parent, initialResultChildren); + parent.children.add(incrementalDataRecord); + } + } + } + } + + private _promoteNonEmptyToRoot( + maybeEmptyNewRootNodes: Set, + ): ReadonlyArray { + const newRootNodes: Array = []; + for (const node of maybeEmptyNewRootNodes) { + if (isDeferredFragmentRecord(node)) { + if (node.pendingExecutionGroups.size > 0) { + node.setAsPending(); + for (const pendingExecutionGroup of node.pendingExecutionGroups) { + if (!this._completesRootNode(pendingExecutionGroup)) { + this._onExecutionGroup(pendingExecutionGroup); + } + } + this._rootNodes.add(node); + newRootNodes.push(node); + continue; + } + for (const child of node.children) { + maybeEmptyNewRootNodes.add(child); + } + } else { + this._rootNodes.add(node); + newRootNodes.push(node); + + this._onStreamItems(node); + } + } + return newRootNodes; + } + + private _completesRootNode(pendingExecutionGroup: PendingExecutionGroup): boolean { + const { deferUsages, path } = pendingExecutionGroup; + for (const deferUsage of deferUsages) { + const deferredFragmentRecord = this._deferredFragmentFactory.get(deferUsage, path); + if (this._rootNodes.has(deferredFragmentRecord)) { + return true; + } + } + return false; + } + + private _addDeferredFragment( + deferredFragmentRecord: DeferredFragmentRecord, + initialResultChildren: Set | undefined, + ): void { + if (this._rootNodes.has(deferredFragmentRecord)) { + return; + } + const parentDeferUsage = deferredFragmentRecord.parentDeferUsage; + if (parentDeferUsage === undefined) { + invariant(initialResultChildren !== undefined); + initialResultChildren.add(deferredFragmentRecord); + return; + } + const parent = this._deferredFragmentFactory.get(parentDeferUsage, deferredFragmentRecord.path); + parent.children.add(deferredFragmentRecord); + this._addDeferredFragment(parent, initialResultChildren); + } + + private _onExecutionGroup(pendingExecutionGroup: PendingExecutionGroup): void { + const value = (pendingExecutionGroup.result as BoxedPromiseOrValue) + .value; + if (isPromise(value)) { + value.then(resolved => this._enqueue(resolved)); + } else { + this._enqueue(value); + } + } + + private async _onStreamItems(streamRecord: StreamRecord): Promise { + let items: Array = []; + let errors: Array = []; + let incrementalDataRecords: Array = []; + const streamItemQueue = streamRecord.streamItemQueue; + let streamItemRecord: StreamItemRecord | undefined; + while ((streamItemRecord = streamItemQueue.shift()) !== undefined) { + let result = + streamItemRecord instanceof BoxedPromiseOrValue + ? streamItemRecord.value + : streamItemRecord().value; + if (isPromise(result)) { + if (items.length > 0) { + this._enqueue({ + streamRecord, + result: + // TODO add additional test case or rework for coverage + errors.length > 0 /* c8 ignore start */ + ? { items, errors } /* c8 ignore stop */ + : { items }, + incrementalDataRecords, + }); + items = []; + errors = []; + incrementalDataRecords = []; + } + result = await result; + // wait an additional tick to coalesce resolving additional promises + // within the queue + await Promise.resolve(); + } + if (result.item === undefined) { + if (items.length > 0) { + this._enqueue({ + streamRecord, + result: errors.length > 0 ? { items, errors } : { items }, + incrementalDataRecords, + }); + } + this._enqueue( + result.errors === undefined + ? { streamRecord } + : { + streamRecord, + errors: result.errors, + }, + ); + return; + } + items.push(result.item); + if (result.errors !== undefined) { + errors.push(...result.errors); + } + if (result.incrementalDataRecords !== undefined) { + incrementalDataRecords.push(...result.incrementalDataRecords); + } + } + } + + private _enqueue(completed: IncrementalDataRecordResult): void { + this._completedQueue.push(completed); + const next = this._nextQueue.shift(); + if (next === undefined) { + return; + } + next(this.currentCompletedBatch()); + } +} diff --git a/packages/executor/src/execution/IncrementalPublisher.ts b/packages/executor/src/execution/IncrementalPublisher.ts new file mode 100644 index 00000000000..9bd4b0e7615 --- /dev/null +++ b/packages/executor/src/execution/IncrementalPublisher.ts @@ -0,0 +1,425 @@ +import type { GraphQLError } from 'graphql'; +import { addPath, pathToArray } from '@graphql-tools/utils'; +import { DeferredFragmentFactory, DeliveryGroup } from './DeferredFragments.js'; +import { IncrementalGraph } from './IncrementalGraph.js'; +import { invariant } from './invariant.js'; +import type { + CancellableStreamRecord, + CompletedExecutionGroup, + CompletedResult, + IncrementalDataRecord, + IncrementalDataRecordResult, + IncrementalDeferResult, + IncrementalExecutionResults, + IncrementalResult, + IncrementalStreamResult, + InitialIncrementalExecutionResult, + PendingResult, + StreamItemsResult, + SubsequentIncrementalExecutionResult, +} from './types.js'; +import { + isCancellableStreamRecord, + isCompletedExecutionGroup, + isFailedExecutionGroup, +} from './types.js'; + +export function buildIncrementalResponse( + context: IncrementalPublisherContext, + result: TData, + errors: ReadonlyArray | undefined, + incrementalDataRecords: ReadonlyArray, +): IncrementalExecutionResults { + const incrementalPublisher = new IncrementalPublisher(context); + return incrementalPublisher.buildResponse(result, errors, incrementalDataRecords); +} + +interface IncrementalPublisherContext { + useIncrementalNotifications: boolean; + signal: AbortSignal | undefined; + deferredFragmentFactory: DeferredFragmentFactory | undefined; + cancellableStreams: Set | undefined; +} + +interface SubsequentIncrementalExecutionResultContext { + pending: Array; + incremental: Array>; + completed: Array; +} + +/** + * The IncrementalPublisherState Enum tracks the state of the IncrementalPublisher, which is initialized to + * "Started". When there are no more incremental results to publish, the state is set to "Completed". On the + * next call to next, clean-up is potentially performed and the state is set to "Finished". + * + * If the IncrementalPublisher is ended early, it may be advanced directly from "Started" to "Finished". + */ +enum IncrementalPublisherState { + Started = 1, + Completed = 2, + Finished = 3, +} + +/** + * This class is used to publish incremental results to the client, enabling semi-concurrent + * execution while preserving result order. + * + * @internal + */ +class IncrementalPublisher { + private _context: IncrementalPublisherContext; + private _nextId: number; + private _incrementalGraph: IncrementalGraph; + + constructor(context: IncrementalPublisherContext) { + this._context = context; + this._nextId = 0; + let deferredFragmentFactory = context.deferredFragmentFactory; + if (deferredFragmentFactory === undefined) { + context.deferredFragmentFactory = deferredFragmentFactory = new DeferredFragmentFactory(); + } + this._incrementalGraph = new IncrementalGraph(deferredFragmentFactory); + } + + buildResponse( + data: TData, + errors: ReadonlyArray | undefined, + incrementalDataRecords: ReadonlyArray, + ): IncrementalExecutionResults { + const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); + + const initialResult: InitialIncrementalExecutionResult = this._context + .useIncrementalNotifications + ? errors === undefined + ? { data, pending: this._toPendingResults(newRootNodes), hasNext: true } + : { errors, data, pending: this._toPendingResults(newRootNodes), hasNext: true } + : errors === undefined + ? { data, hasNext: true } + : { errors, data, hasNext: true }; + + return { + initialResult, + subsequentResults: this._subscribe(), + }; + } + + private _toPendingResults(newRootNodes: ReadonlyArray): Array { + const pendingResults: Array = []; + for (const node of newRootNodes) { + const id = String(this._getNextId()); + node.id = id; + const pendingResult: PendingResult = { + id, + path: pathToArray(node.path), + }; + if (node.label !== undefined) { + pendingResult.label = node.label; + } + pendingResults.push(pendingResult); + } + return pendingResults; + } + + private _getNextId(): string { + return String(this._nextId++); + } + + private _subscribe(): AsyncGenerator< + SubsequentIncrementalExecutionResult, + void, + void + > { + let incrementalPublisherState: IncrementalPublisherState = IncrementalPublisherState.Started; + + const _finish = async (): Promise => { + incrementalPublisherState = IncrementalPublisherState.Finished; + this._incrementalGraph.abort(); + await this._returnAsyncIterators(); + }; + + this._context.signal?.addEventListener('abort', () => { + this._incrementalGraph.abort(); + }); + + const _next = async (): Promise< + IteratorResult, void> + > => { + switch (incrementalPublisherState) { + case IncrementalPublisherState.Finished: { + return { value: undefined, done: true }; + } + case IncrementalPublisherState.Completed: { + await _finish(); + return { value: undefined, done: true }; + } + case IncrementalPublisherState.Started: { + // continue + } + } + + const context: SubsequentIncrementalExecutionResultContext = { + pending: [], + incremental: [], + completed: [], + }; + + let batch: Iterable | undefined = + this._incrementalGraph.currentCompletedBatch(); + do { + for (const completedResult of batch) { + this._handleCompletedIncrementalData(completedResult, context); + } + + const { incremental, completed } = context; + if (incremental.length > 0 || completed.length > 0) { + const hasNext = this._incrementalGraph.hasNext(); + + if (!hasNext) { + incrementalPublisherState = IncrementalPublisherState.Completed; + } + + const subsequentIncrementalExecutionResult: SubsequentIncrementalExecutionResult = + { + hasNext, + }; + + const pending = context.pending; + if (pending.length > 0) { + subsequentIncrementalExecutionResult.pending = pending; + } + if (incremental.length > 0) { + subsequentIncrementalExecutionResult.incremental = incremental; + } + if (completed.length > 0) { + subsequentIncrementalExecutionResult.completed = completed; + } + + return { value: subsequentIncrementalExecutionResult, done: false }; + } + + batch = await this._incrementalGraph.nextCompletedBatch(); + } while (batch !== undefined); + + if (this._context.signal?.aborted) { + throw this._context.signal.reason; + } + + return { value: undefined, done: true }; + }; + + const _return = async (): Promise< + IteratorResult, void> + > => { + await _finish(); + return { value: undefined, done: true }; + }; + + const _throw = async ( + error?: unknown, + ): Promise, void>> => { + await _finish(); + return Promise.reject(error); + }; + + return { + [Symbol.asyncIterator]() { + return this; + }, + next: _next, + return: _return, + throw: _throw, + }; + } + + private _handleCompletedIncrementalData( + completedIncrementalData: IncrementalDataRecordResult, + context: SubsequentIncrementalExecutionResultContext, + ): void { + if (isCompletedExecutionGroup(completedIncrementalData)) { + this._handleCompletedExecutionGroup(completedIncrementalData, context); + } else { + this._handleCompletedStreamItems(completedIncrementalData, context); + } + } + + private _handleCompletedExecutionGroup( + completedExecutionGroup: CompletedExecutionGroup, + context: SubsequentIncrementalExecutionResultContext, + ): void { + const { deferUsages, path } = completedExecutionGroup.pendingExecutionGroup; + if (isFailedExecutionGroup(completedExecutionGroup)) { + for (const deferUsage of deferUsages) { + const deferredFragmentRecord = this._incrementalGraph.removeDeferredFragment( + deferUsage, + path, + ); + if (deferredFragmentRecord === undefined) { + // This can occur if multiple deferred grouped field sets error for a fragment. + continue; + } + if (this._context.useIncrementalNotifications) { + const id = deferredFragmentRecord.id; + invariant(id !== undefined); + context.completed.push({ + id, + errors: completedExecutionGroup.errors, + }); + } else { + const incrementalEntry: IncrementalDeferResult = { + errors: completedExecutionGroup.errors, + data: null, + }; + const { path, label } = deferredFragmentRecord; + incrementalEntry.path = pathToArray(path); + if (label !== undefined) { + incrementalEntry.label = label; + } + context.incremental.push(incrementalEntry); + } + } + return; + } + + this._incrementalGraph.addCompletedSuccessfulExecutionGroup(completedExecutionGroup); + + for (const deferUsage of deferUsages) { + const completion = this._incrementalGraph.completeDeferredFragment(deferUsage, path); + if (completion === undefined) { + continue; + } + const incremental = context.incremental; + const { deferredFragmentRecord, newRootNodes, successfulExecutionGroups } = completion; + if (this._context.useIncrementalNotifications) { + context.pending.push(...this._toPendingResults(newRootNodes)); + for (const successfulExecutionGroup of successfulExecutionGroups) { + const { deferUsages: resultDeferUsages, path: resultPath } = + successfulExecutionGroup.pendingExecutionGroup; + const bestDeferredFragmentRecord = + this._incrementalGraph.getDeepestDeferredFragmentAtRoot( + deferUsage, + resultDeferUsages, + resultPath, + ); + const bestId = bestDeferredFragmentRecord.id; + invariant(bestId !== undefined); + const incrementalEntry: IncrementalDeferResult = { + ...successfulExecutionGroup.result, + id: bestId, + }; + const subPath = pathToArray(resultPath).slice( + pathToArray(bestDeferredFragmentRecord.path).length, + ); + if (subPath.length > 0) { + incrementalEntry.subPath = subPath; + } + incremental.push(incrementalEntry); + } + const id = deferredFragmentRecord.id; + invariant(id !== undefined); + context.completed.push({ id }); + } else { + for (const successfulExecutionGroup of successfulExecutionGroups) { + const incrementalEntry: IncrementalDeferResult = { + ...successfulExecutionGroup.result, + }; + const { path, label } = deferredFragmentRecord; + incrementalEntry.path = pathToArray(path); + if (label !== undefined) { + incrementalEntry.label = label; + } + incremental.push(incrementalEntry); + } + } + } + } + + private _handleCompletedStreamItems( + streamItemsResult: StreamItemsResult, + context: SubsequentIncrementalExecutionResultContext, + ): void { + const streamRecord = streamItemsResult.streamRecord; + if (streamItemsResult.errors !== undefined) { + if (this._context.useIncrementalNotifications) { + const id = streamRecord.id; + invariant(id !== undefined); + context.completed.push({ + id, + errors: streamItemsResult.errors, + }); + } else { + const incrementalEntry: IncrementalStreamResult = { + errors: streamItemsResult.errors, + items: null, + }; + const { path, label, index } = streamRecord; + incrementalEntry.path = pathToArray(addPath(path, index, undefined)); + if (label !== undefined) { + incrementalEntry.label = label; + } + context.incremental.push(incrementalEntry); + } + this._incrementalGraph.removeStream(streamRecord); + if (isCancellableStreamRecord(streamRecord)) { + invariant(this._context.cancellableStreams !== undefined); + this._context.cancellableStreams.delete(streamRecord); + streamRecord.earlyReturn().catch(() => { + /* c8 ignore next 1 */ + // ignore error + }); + } + } else if (streamItemsResult.result === undefined) { + if (this._context.useIncrementalNotifications) { + const id = streamRecord.id; + invariant(id !== undefined); + context.completed.push({ id }); + } + this._incrementalGraph.removeStream(streamRecord); + if (isCancellableStreamRecord(streamRecord)) { + invariant(this._context.cancellableStreams !== undefined); + this._context.cancellableStreams.delete(streamRecord); + } + } else { + const bareResult = streamItemsResult.result; + const incrementalEntry: IncrementalStreamResult = { + ...bareResult, + }; + if (this._context.useIncrementalNotifications) { + const id = streamRecord.id; + invariant(id !== undefined); + incrementalEntry.id = id; + } else { + const { path, label, index } = streamRecord; + incrementalEntry.path = pathToArray(addPath(path, index, undefined)); + streamRecord.index += bareResult.items.length; + if (label !== undefined) { + incrementalEntry.label = label; + } + } + context.incremental.push(incrementalEntry); + + const incrementalDataRecords = streamItemsResult.incrementalDataRecords; + if (incrementalDataRecords !== undefined) { + const newPending = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); + if (this._context.useIncrementalNotifications) { + context.pending.push(...this._toPendingResults(newPending)); + } + } + } + } + + private async _returnAsyncIterators(): Promise { + await this._incrementalGraph.abort(); + + const cancellableStreams = this._context.cancellableStreams; + if (cancellableStreams === undefined) { + return; + } + const promises: Array> = []; + for (const streamRecord of cancellableStreams) { + if (streamRecord.earlyReturn !== undefined) { + promises.push(streamRecord.earlyReturn()); + } + } + await Promise.all(promises); + } +} diff --git a/packages/executor/src/execution/__tests__/abort-signal.test.ts b/packages/executor/src/execution/__tests__/abort-signal.test.ts index 920d7c95165..2cdb9500aef 100644 --- a/packages/executor/src/execution/__tests__/abort-signal.test.ts +++ b/packages/executor/src/execution/__tests__/abort-signal.test.ts @@ -1,7 +1,6 @@ import { parse } from 'graphql'; -import { createDeferred } from '@graphql-tools/delegate'; import { makeExecutableSchema } from '@graphql-tools/schema'; -import { isAsyncIterable } from '@graphql-tools/utils'; +import { createDeferred, isAsyncIterable } from '@graphql-tools/utils'; import { Repeater } from '@repeaterjs/repeater'; import { assertAsyncIterable } from '../../../../loaders/url/tests/test-utils'; import { normalizedExecutor } from '../normalizedExecutor'; @@ -53,7 +52,7 @@ describe('Abort Signal', () => { signal: controller.signal, }); assertAsyncIterable(result); - const results = []; + const results: any[] = []; for await (const value of result) { results.push(value.data?.counter); if (value.data?.counter === 4) { @@ -143,7 +142,7 @@ describe('Abort Signal', () => { Mutation: { first() { didInvokeFirstFn = true; - return true; + return Promise.resolve(true); }, second() { didInvokeSecondFn = true; @@ -168,7 +167,7 @@ describe('Abort Signal', () => { `), signal: controller.signal, }); - expect(result$).rejects.toMatchInlineSnapshot(`DOMException {}`); + await expect(result$).rejects.toMatchInlineSnapshot(`DOMException {}`); expect(didInvokeFirstFn).toBe(true); expect(didInvokeSecondFn).toBe(true); expect(didInvokeThirdFn).toBe(false); @@ -275,6 +274,7 @@ describe('Abort Signal', () => { data: { counter: [], }, + pending: [{ id: '0', path: ['counter'] }], hasNext: true, }, }); @@ -356,6 +356,10 @@ describe('Abort Signal', () => { counter1: [], counter2: [], }, + pending: [ + { id: '0', path: ['counter1'] }, + { id: '1', path: ['counter2'] }, + ], hasNext: true, }, }); @@ -433,6 +437,14 @@ describe('Abort Signal', () => { "root": {}, }, "hasNext": true, + "pending": [ + { + "id": "0", + "path": [ + "root", + ], + }, + ], } `); const next$ = iterator.next(); @@ -442,6 +454,89 @@ describe('Abort Signal', () => { await expect(next$).rejects.toThrow('This operation was aborted'); expect(bResolverGotInvoked).toBe(false); }); + it('stops pending stream execution for never-returning incremental delivery (@defer)', async () => { + const aResolverGotInvokedD = createDeferred(); + const requestGotCancelledD = createDeferred(); + let bResolverGotInvoked = false; + + const schema = makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + type Query { + root: A! + } + type A { + a: B! + } + type B { + b: String + } + `, + resolvers: { + Query: { + async root() { + return {}; + }, + }, + A: { + async a() { + aResolverGotInvokedD.resolve(); + await requestGotCancelledD.promise; + return {}; + }, + }, + B: { + b() { + bResolverGotInvoked = true; + return new Promise(() => {}); + }, + }, + }, + }); + const controller = new AbortController(); + const result = await normalizedExecutor({ + schema, + document: parse(/* GraphQL */ ` + query { + root { + ... @defer { + a { + b + } + } + } + } + `), + signal: controller.signal, + }); + + if (!isAsyncIterable(result)) { + throw new Error('Result is not an async iterable'); + } + + const iterator = result[Symbol.asyncIterator](); + const next = await iterator.next(); + expect(next.value).toMatchInlineSnapshot(` +{ + "data": { + "root": {}, + }, + "hasNext": true, + "pending": [ + { + "id": "0", + "path": [ + "root", + ], + }, + ], +} +`); + const next$ = iterator.next(); + await aResolverGotInvokedD.promise; + controller.abort(); + await expect(next$).rejects.toThrow('This operation was aborted'); + expect(bResolverGotInvoked).toBe(false); + }); it('stops promise execution', async () => { const controller = new AbortController(); const d = createDeferred(); diff --git a/packages/executor/src/execution/__tests__/backpressure.test.ts b/packages/executor/src/execution/__tests__/backpressure.test.ts index 9d8b8c78ec7..9d2124979d1 100644 --- a/packages/executor/src/execution/__tests__/backpressure.test.ts +++ b/packages/executor/src/execution/__tests__/backpressure.test.ts @@ -69,6 +69,7 @@ describe('Defer Stream cancellation', () => { data: { countdownStream: [], }, + pending: [{ id: '0', path: ['countdownStream'] }], hasNext: true, }); break; @@ -93,6 +94,7 @@ describe('Defer Stream cancellation', () => { data: { countdownStream: [], }, + pending: [{ id: '0', path: ['countdownStream'] }], hasNext: true, }); break; @@ -120,6 +122,7 @@ describe('Defer Stream cancellation', () => { data: { countdownStream: [], }, + pending: [{ id: '0', path: ['countdownStream'] }], hasNext: true, }); break; @@ -128,7 +131,7 @@ describe('Defer Stream cancellation', () => { incremental: [ { items: [3], - path: ['countdownStream', 0], + id: '0', }, ], hasNext: true, @@ -158,6 +161,7 @@ describe('Defer Stream cancellation', () => { data: { countdownStream: [3], }, + pending: [{ id: '0', path: ['countdownStream'] }], hasNext: true, }); break; diff --git a/packages/executor/src/execution/__tests__/defer-test.ts b/packages/executor/src/execution/__tests__/defer-test.ts index bf577a7320a..3d79d6083da 100644 --- a/packages/executor/src/execution/__tests__/defer-test.ts +++ b/packages/executor/src/execution/__tests__/defer-test.ts @@ -8,22 +8,25 @@ import { GraphQLString, parse, } from 'graphql'; +import { createDeferred } from '@graphql-tools/utils'; import { expectJSON } from '../../__testUtils__/expectJSON.js'; import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; +import { + execute, + IncrementalDeliveryPreset2023_06_22, + IncrementalDeliveryPresetLegacy, +} from '../execute.js'; +import type { IncrementalPreset } from '../execute.js'; import type { InitialIncrementalExecutionResult, SubsequentIncrementalExecutionResult, -} from '../execute.js'; -import { execute } from '../execute.js'; +} from '../types.js'; const friendType = new GraphQLObjectType({ fields: { id: { type: GraphQLID }, name: { type: GraphQLString }, - promiseNonNullErrorField: { - type: new GraphQLNonNull(GraphQLString), - resolve: () => Promise.resolve(null), - }, + nonNullName: { type: new GraphQLNonNull(GraphQLString) }, }, name: 'Friend', }); @@ -34,64 +37,116 @@ const friends = [ { name: 'C-3PO', id: 4 }, ]; +const deeperObject = new GraphQLObjectType({ + fields: { + foo: { type: GraphQLString }, + bar: { type: GraphQLString }, + baz: { type: GraphQLString }, + bak: { type: GraphQLString }, + }, + name: 'DeeperObject', +}); + +const nestedObject = new GraphQLObjectType({ + fields: { + deeperObject: { type: deeperObject }, + name: { type: GraphQLString }, + }, + name: 'NestedObject', +}); + +const anotherNestedObject = new GraphQLObjectType({ + fields: { + deeperObject: { type: deeperObject }, + }, + name: 'AnotherNestedObject', +}); + +const hero = { + name: 'Luke', + id: 1, + friends, + nestedObject, + anotherNestedObject, +}; + +const c = new GraphQLObjectType({ + fields: { + d: { type: GraphQLString }, + nonNullErrorField: { type: new GraphQLNonNull(GraphQLString) }, + }, + name: 'c', +}); + +const e = new GraphQLObjectType({ + fields: { + f: { type: GraphQLString }, + }, + name: 'e', +}); + +const b = new GraphQLObjectType({ + fields: { + c: { type: c }, + e: { type: e }, + }, + name: 'b', +}); + +const a = new GraphQLObjectType({ + fields: { + b: { type: b }, + someField: { type: GraphQLString }, + }, + name: 'a', +}); + +const g = new GraphQLObjectType({ + fields: { + h: { type: GraphQLString }, + }, + name: 'g', +}); + 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), - }, + nonNullName: { type: new GraphQLNonNull(GraphQLString) }, friends: { type: new GraphQLList(friendType), - resolve: () => friends, - }, - asyncFriends: { - type: new GraphQLList(friendType), - async *resolve() { - yield await Promise.resolve(friends[0]); - }, }, + nestedObject: { type: nestedObject }, + anotherNestedObject: { type: anotherNestedObject }, }, name: 'Hero', }); -const hero = { name: 'Luke', id: 1 }; - const query = new GraphQLObjectType({ fields: { hero: { type: heroType, - resolve: () => hero, }, + a: { type: a }, + g: { type: g }, }, name: 'Query', }); const schema = new GraphQLSchema({ query }); -async function complete(document: DocumentNode) { +async function complete( + document: DocumentNode, + rootValue: unknown = { hero }, + enableEarlyExecution = false, + incrementalPreset: IncrementalPreset = IncrementalDeliveryPreset2023_06_22, +) { const result = await execute({ schema, document, - rootValue: {}, + rootValue, + enableEarlyExecution, + incrementalPreset, }); if ('initialResult' in result) { @@ -107,7 +162,7 @@ async function complete(document: DocumentNode) { describe('Execute: defer directive', () => { it('Can defer fragments containing scalar types', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { id @@ -115,39 +170,37 @@ describe('Execute: defer directive', () => { } } fragment NameFragment on Hero { - id name } `); - const result = await complete(document); - expect(result).toEqual([ + expectJSON(result).toDeepEqual([ { data: { hero: { id: '1', }, }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { incremental: [ { data: { - id: '1', name: 'Luke', }, - path: ['hero'], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can disable defer using if argument', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { id @@ -158,7 +211,6 @@ describe('Execute: defer directive', () => { name } `); - const result = await complete(document); expectJSON(result).toDeepEqual({ @@ -170,9 +222,8 @@ describe('Execute: defer directive', () => { }, }); }); - it('Does not disable defer with null if argument', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery($shouldDefer: Boolean) { hero { id @@ -183,27 +234,139 @@ describe('Execute: defer directive', () => { name } `); - const result = await complete(document); expectJSON(result).toDeepEqual([ { data: { hero: { id: '1' } }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { incremental: [ { data: { name: 'Luke' }, - path: ['hero'], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Does not execute deferred fragments early when not specified', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + name + } + `); + const order: Array = []; + const result = await complete(document, { + hero: { + ...hero, + id: async () => { + await resolveOnNextTick(); + await resolveOnNextTick(); + order.push('slow-id'); + return hero.id; + }, + name: () => { + order.push('fast-name'); + return hero.name; + }, + }, + }); + + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + }, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + incremental: [ + { + data: { + name: 'Luke', + }, + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); + expect(order).toEqual(['slow-id', 'fast-name']); }); + it('Does execute deferred fragments early when specified', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + name + } + `); + const order: Array = []; + const result = await complete( + document, + { + hero: { + ...hero, + id: async () => { + await resolveOnNextTick(); + await resolveOnNextTick(); + order.push('slow-id'); + return hero.id; + }, + name: () => { + order.push('fast-name'); + return hero.name; + }, + }, + }, + true, + ); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + id: '1', + }, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + incremental: [ + { + data: { + name: 'Luke', + }, + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + expect(order).toEqual(['fast-name', 'slow-id']); + }); it('Can defer fragments on the top level Query field', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { ...QueryFragment @defer(label: "DeferQuery") } @@ -213,12 +376,12 @@ describe('Execute: defer directive', () => { } } `); - const result = await complete(document); expectJSON(result).toDeepEqual([ { data: {}, + pending: [{ id: '0', path: [], label: 'DeferQuery' }], hasNext: true, }, { @@ -229,32 +392,38 @@ describe('Execute: defer directive', () => { id: '1', }, }, - path: [], - label: 'DeferQuery', + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can defer fragments with errors on the top level Query field', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { ...QueryFragment @defer(label: "DeferQuery") } fragment QueryFragment on Query { hero { - errorField + name } } `); - - const result = await complete(document); + const result = await complete(document, { + hero: { + ...hero, + name: () => { + throw new Error('bad'); + }, + }, + }); expectJSON(result).toDeepEqual([ { data: {}, + pending: [{ id: '0', path: [], label: 'DeferQuery' }], hasNext: true, }, { @@ -262,35 +431,33 @@ describe('Execute: defer directive', () => { { data: { hero: { - errorField: null, + name: null, }, }, errors: [ { message: 'bad', locations: [{ line: 7, column: 11 }], - path: ['hero', 'errorField'], + path: ['hero', 'name'], }, ], - path: [], - label: 'DeferQuery', + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can defer a fragment within an already deferred fragment', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { - id ...TopFragment @defer(label: "DeferTop") } } fragment TopFragment on Hero { - name + id ...NestedFragment @defer(label: "DeferNested") } fragment NestedFragment on Hero { @@ -299,45 +466,41 @@ describe('Execute: defer directive', () => { } } `); - const result = await complete(document); expectJSON(result).toDeepEqual([ { data: { - hero: { - id: '1', - }, + hero: {}, }, + pending: [{ id: '0', path: ['hero'], label: 'DeferTop' }], hasNext: true, }, { + pending: [{ id: '1', path: ['hero'], label: 'DeferNested' }], incremental: [ { data: { - friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }], + id: '1', }, - path: ['hero'], - label: 'DeferNested', + id: '0', }, { data: { - name: 'Luke', + friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }], }, - path: ['hero'], - label: 'DeferTop', + id: '1', }, ], + completed: [{ id: '0' }, { id: '1' }], hasNext: false, }, ]); }); - it('Can defer a fragment that is also not deferred, deferred fragment is first', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { - id ...TopFragment @defer(label: "DeferTop") ...TopFragment } @@ -346,38 +509,19 @@ describe('Execute: defer directive', () => { name } `); - const result = await complete(document); - expectJSON(result).toDeepEqual([ - { - data: { - hero: { - id: '1', - name: 'Luke', - }, + expectJSON(result).toDeepEqual({ + data: { + hero: { + 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(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { - id ...TopFragment ...TopFragment @defer(label: "DeferTop") } @@ -386,35 +530,18 @@ describe('Execute: defer directive', () => { name } `); - const result = await complete(document); - expectJSON(result).toDeepEqual([ - { - data: { - hero: { - id: '1', - name: 'Luke', - }, + expectJSON(result).toDeepEqual({ + data: { + hero: { + name: 'Luke', }, - hasNext: true, - }, - { - incremental: [ - { - data: { - name: 'Luke', - }, - path: ['hero'], - label: 'DeferTop', - }, - ], - hasNext: false, }, - ]); + }); }); it('Can defer an inline fragment', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { id @@ -424,102 +551,1953 @@ describe('Execute: defer directive', () => { } } `); - const result = await complete(document); expectJSON(result).toDeepEqual([ { data: { hero: { id: '1' } }, + pending: [{ id: '0', path: ['hero'], label: 'InlineDeferred' }], hasNext: true, }, { - incremental: [{ data: { name: 'Luke' }, path: ['hero'], label: 'InlineDeferred' }], + incremental: [{ data: { name: 'Luke' }, id: '0' }], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Handles errors thrown in deferred fragments', async () => { - const document = parse(/* GraphQL */ ` + it('Does not emit empty defer fragments', async () => { + const document = parse(` query HeroNameQuery { hero { - id - ...NameFragment @defer + ... @defer { + name @skip(if: true) + } } } - fragment NameFragment on Hero { - errorField + fragment TopFragment on Hero { + name } `); + const result = await complete(document); + expectJSON(result).toDeepEqual({ + data: { + hero: {}, + }, + }); + }); + it('Emits children of empty defer fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + ... @defer { + ... @defer { + name + } + } + } + } + `); const result = await complete(document); expectJSON(result).toDeepEqual([ { - data: { hero: { id: '1' } }, + data: { + hero: {}, + }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { - incremental: [ - { - data: { errorField: null }, - path: ['hero'], - errors: [ - { - message: 'bad', - locations: [{ line: 9, column: 9 }], - path: ['hero', 'errorField'], - }, - ], - }, - ], + incremental: [{ data: { name: 'Luke' }, id: '0' }], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Handles non-nullable errors thrown in deferred fragments', async () => { - const document = parse(/* GraphQL */ ` + it('Can separately emit defer fragments with different labels with varying fields', async () => { + const document = parse(` query HeroNameQuery { hero { - id - ...NameFragment @defer + ... @defer(label: "DeferID") { + id + } + ... @defer(label: "DeferName") { + name + } } } - fragment NameFragment on Hero { - nonNullErrorField - } `); - const result = await complete(document); expectJSON(result).toDeepEqual([ { - data: { hero: { id: '1' } }, - hasNext: true, - }, + data: { + hero: {}, + }, + pending: [ + { id: '0', path: ['hero'], label: 'DeferID' }, + { id: '1', path: ['hero'], label: 'DeferName' }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { + id: '1', + }, + id: '0', + }, + { + data: { + name: 'Luke', + }, + id: '1', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Separately emits defer fragments with different labels with varying subfields', async () => { + const document = parse(` + query HeroNameQuery { + ... @defer(label: "DeferID") { + hero { + id + } + } + ... @defer(label: "DeferName") { + hero { + name + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [ + { id: '0', path: [], label: 'DeferID' }, + { id: '1', path: [], label: 'DeferName' }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { hero: {} }, + id: '0', + }, + { + data: { id: '1' }, + id: '0', + subPath: ['hero'], + }, + { + data: { name: 'Luke' }, + id: '1', + subPath: ['hero'], + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Separately emits defer fragments with different labels with varying subfields that return promises', async () => { + const document = parse(` + query HeroNameQuery { + ... @defer(label: "DeferID") { + hero { + id + } + } + ... @defer(label: "DeferName") { + hero { + name + } + } + } + `); + const result = await complete(document, { + hero: { + id: () => Promise.resolve('1'), + name: () => Promise.resolve('Luke'), + }, + }); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [ + { id: '0', path: [], label: 'DeferID' }, + { id: '1', path: [], label: 'DeferName' }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { hero: {} }, + id: '0', + }, + { + data: { id: '1' }, + id: '0', + subPath: ['hero'], + }, + { + data: { name: 'Luke' }, + id: '1', + subPath: ['hero'], + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Separately emits defer fragments with varying subfields of same priorities but different level of defers', async () => { + const document = parse(` + query HeroNameQuery { + hero { + ... @defer(label: "DeferID") { + id + } + } + ... @defer(label: "DeferName") { + hero { + name + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: {}, + }, + pending: [ + { id: '0', path: ['hero'], label: 'DeferID' }, + { id: '1', path: [], label: 'DeferName' }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { + id: '1', + }, + id: '0', + }, + { + data: { + name: 'Luke', + }, + id: '1', + subPath: ['hero'], + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Separately emits nested defer fragments with varying subfields of same priorities but different level of defers', async () => { + const document = parse(` + query HeroNameQuery { + ... @defer(label: "DeferName") { + hero { + name + ... @defer(label: "DeferID") { + id + } + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [{ id: '0', path: [], label: 'DeferName' }], + hasNext: true, + }, + { + pending: [{ id: '1', path: ['hero'], label: 'DeferID' }], + incremental: [ + { + data: { + hero: { + name: 'Luke', + }, + }, + id: '0', + }, + { + data: { + id: '1', + }, + id: '1', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Initiates deferred grouped field sets only if they have been released as pending', async () => { + const document = parse(` + query { + ... @defer { + a { + ... @defer { + b { + c { d } + } + } + } + } + ... @defer { + a { + someField + ... @defer { + b { + e { f } + } + } + } + } + } + `); + + const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred(); + let cResolverCalled = false; + let eResolverCalled = false; + const executeResult = execute({ + schema, + document, + rootValue: { + a: { + someField: slowFieldPromise, + b: { + c: () => { + cResolverCalled = true; + return { d: 'd' }; + }, + e: () => { + eResolverCalled = true; + return { f: 'f' }; + }, + }, + }, + }, + enableEarlyExecution: false, + }); + + expect('initialResult' in executeResult).toBeTruthy(); + + // @ts-expect-error once we assert that initialResult is in executeResult then it should work fine + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: {}, + pending: [ + { id: '0', path: [] }, + { id: '1', path: [] }, + ], + hasNext: true, + }); + + // @ts-expect-error once we assert that initialResult is in executeResult then it should work fine + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + expect(cResolverCalled).toBe(false); + expect(eResolverCalled).toBe(false); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + value: { + pending: [{ id: '2', path: ['a'] }], + incremental: [ + { + data: { a: {} }, + id: '0', + }, + { + data: { b: {} }, + id: '2', + }, + { + data: { c: { d: 'd' } }, + id: '2', + subPath: ['b'], + }, + ], + completed: [{ id: '0' }, { id: '2' }], + hasNext: true, + }, + done: false, + }); + + expect(cResolverCalled).toBe(true); + expect(eResolverCalled).toBe(false); + + resolveSlowField('someField'); + + const result3 = await iterator.next(); + expectJSON(result3).toDeepEqual({ + value: { + pending: [{ id: '3', path: ['a'] }], + incremental: [ + { + data: { someField: 'someField' }, + id: '1', + subPath: ['a'], + }, + { + data: { e: { f: 'f' } }, + id: '3', + subPath: ['b'], + }, + ], + completed: [{ id: '1' }, { id: '3' }], + hasNext: false, + }, + done: false, + }); + + expect(eResolverCalled).toBe(true); + + const result4 = await iterator.next(); + expectJSON(result4).toDeepEqual({ + value: undefined, + done: true, + }); + }); + + it('Initiates all deferred grouped field sets immediately once they have been released as pending', async () => { + const document = parse(` + query { + ... @defer { + a { + ... @defer { + b { + c { d } + } + } + } + } + ... @defer { + a { + ... @defer { + b { + c { d } + e { f } + } + } + } + } + } + `); + + const { promise: cPromise, resolve: resolveC } = createDeferred(); + let cResolverCalled = false; + let eResolverCalled = false; + const executeResult = execute({ + schema, + document, + rootValue: { + a: { + b: { + c: async () => { + cResolverCalled = true; + await cPromise; + return { d: 'd' }; + }, + e: () => { + eResolverCalled = true; + return { f: 'f' }; + }, + }, + }, + }, + enableEarlyExecution: false, + }); + + // @ts-expect-error once we assert that initialResult is in executeResult then it should work fine + const result1 = executeResult.initialResult; + expectJSON(result1).toDeepEqual({ + data: {}, + pending: [ + { id: '0', path: [] }, + { id: '1', path: [] }, + ], + hasNext: true, + }); + + // @ts-expect-error once we assert that initialResult is in executeResult then it should work fine + const iterator = executeResult.subsequentResults[Symbol.asyncIterator](); + + expect(cResolverCalled).toBe(false); + expect(eResolverCalled).toBe(false); + + const result2 = await iterator.next(); + expectJSON(result2).toDeepEqual({ + value: { + pending: [ + { id: '2', path: ['a'] }, + { id: '3', path: ['a'] }, + ], + incremental: [ + { + data: { a: {} }, + id: '0', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: true, + }, + done: false, + }); + + resolveC(); + + expect(cResolverCalled).toBe(true); + expect(eResolverCalled).toBe(true); + + const result3 = await iterator.next(); + expectJSON(result3).toDeepEqual({ + value: { + incremental: [ + { + data: { b: { c: { d: 'd' } } }, + id: '2', + }, + { + data: { e: { f: 'f' } }, + id: '3', + subPath: ['b'], + }, + ], + completed: [{ id: '2' }, { id: '3' }], + hasNext: false, + }, + done: false, + }); + + const result4 = await iterator.next(); + expectJSON(result4).toDeepEqual({ + value: undefined, + done: true, + }); + }); + + it('Can deduplicate multiple defers on the same object', async () => { + const document = parse(` + query { + hero { + friends { + ... @defer { + ...FriendFrag + ... @defer { + ...FriendFrag + ... @defer { + ...FriendFrag + ... @defer { + ...FriendFrag + } + } + } + } + } + } + } + + fragment FriendFrag on Friend { + id + name + } + `); + const result = await complete(document); + + expectJSON(result).toDeepEqual([ + { + data: { hero: { friends: [{}, {}, {}] } }, + pending: [ + { id: '0', path: ['hero', 'friends', 0] }, + { id: '1', path: ['hero', 'friends', 1] }, + { id: '2', path: ['hero', 'friends', 2] }, + ], + hasNext: true, + }, + { + incremental: [ + { data: { id: '2', name: 'Han' }, id: '0' }, + { data: { id: '3', name: 'Leia' }, id: '1' }, + { data: { id: '4', name: 'C-3PO' }, id: '2' }, + ], + completed: [{ id: '0' }, { id: '1' }, { id: '2' }], + hasNext: false, + }, + ]); + }); + + it('Deduplicates fields present in the initial payload', async () => { + const document = parse(` + query { + hero { + nestedObject { + deeperObject { + foo + } + } + anotherNestedObject { + deeperObject { + foo + } + } + ... @defer { + nestedObject { + deeperObject { + bar + } + } + anotherNestedObject { + deeperObject { + foo + } + } + } + } + } + `); + const result = await complete(document, { + hero: { + nestedObject: { deeperObject: { foo: 'foo', bar: 'bar' } }, + anotherNestedObject: { deeperObject: { foo: 'foo' } }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + nestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + anotherNestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + }, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + incremental: [ + { + data: { bar: 'bar' }, + id: '0', + subPath: ['nestedObject', 'deeperObject'], + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + + it('Can duplicate fields present in the initial payload if specified, using branching executor format', async () => { + const document = parse(` + query { + hero { + nestedObject { + deeperObject { + foo + } + } + anotherNestedObject { + deeperObject { + foo + } + } + ... @defer { + nestedObject { + deeperObject { + bar + } + } + anotherNestedObject { + deeperObject { + foo + } + } + } + } + } + `); + const result = await complete( + document, + { + hero: { + nestedObject: { deeperObject: { foo: 'foo', bar: 'bar' } }, + anotherNestedObject: { deeperObject: { foo: 'foo' } }, + }, + }, + undefined, + IncrementalDeliveryPresetLegacy, + ); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + nestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + anotherNestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + }, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + nestedObject: { + deeperObject: { + bar: 'bar', + }, + }, + anotherNestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + }, + path: ['hero'], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Deduplicates fields present in a parent defer payload', async () => { + const document = parse(` + query { + hero { + ... @defer { + nestedObject { + deeperObject { + foo + ... @defer { + foo + bar + } + } + } + } + } + } + `); + const result = await complete(document, { + hero: { nestedObject: { deeperObject: { foo: 'foo', bar: 'bar' } } }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + hero: {}, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + pending: [{ id: '1', path: ['hero', 'nestedObject', 'deeperObject'] }], + incremental: [ + { + data: { + nestedObject: { + deeperObject: { foo: 'foo' }, + }, + }, + id: '0', + }, + { + data: { + bar: 'bar', + }, + id: '1', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Can duplicate fields present in a parent defer payload if specified, using branching executor format', async () => { + const document = parse(` + query { + hero { + ... @defer { + nestedObject { + deeperObject { + foo + ... @defer { + foo + bar + } + } + } + } + } + } + `); + const result = await complete( + document, + { + hero: { nestedObject: { deeperObject: { foo: 'foo', bar: 'bar' } } }, + }, + undefined, + IncrementalDeliveryPresetLegacy, + ); + expectJSON(result).toDeepEqual([ + { + data: { + hero: {}, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { + nestedObject: { + deeperObject: { foo: 'foo' }, + }, + }, + path: ['hero'], + }, + { + data: { + foo: 'foo', + bar: 'bar', + }, + path: ['hero', 'nestedObject', 'deeperObject'], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Deduplicates fields with deferred fragments at multiple levels', async () => { + const document = parse(` + query { + hero { + nestedObject { + deeperObject { + foo + } + } + ... @defer { + nestedObject { + deeperObject { + foo + bar + } + ... @defer { + deeperObject { + foo + bar + baz + ... @defer { + foo + bar + baz + bak + } + } + } + } + } + } + } + `); + const result = await complete(document, { + hero: { + nestedObject: { + deeperObject: { foo: 'foo', bar: 'bar', baz: 'baz', bak: 'bak' }, + }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + nestedObject: { + deeperObject: { + foo: 'foo', + }, + }, + }, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + pending: [ + { id: '1', path: ['hero', 'nestedObject'] }, + { id: '2', path: ['hero', 'nestedObject', 'deeperObject'] }, + ], + incremental: [ + { + data: { bar: 'bar' }, + id: '0', + subPath: ['nestedObject', 'deeperObject'], + }, + { + data: { baz: 'baz' }, + id: '1', + subPath: ['deeperObject'], + }, + { + data: { bak: 'bak' }, + id: '2', + }, + ], + completed: [{ id: '0' }, { id: '1' }, { id: '2' }], + hasNext: false, + }, + ]); + }); + + it('Deduplicates multiple fields from deferred fragments from different branches occurring at the same level', async () => { + const document = parse(` + query { + hero { + nestedObject { + deeperObject { + ... @defer { + foo + } + } + } + ... @defer { + nestedObject { + deeperObject { + ... @defer { + foo + bar + } + } + } + } + } + } + `); + const result = await complete(document, { + hero: { nestedObject: { deeperObject: { foo: 'foo', bar: 'bar' } } }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + nestedObject: { + deeperObject: {}, + }, + }, + }, + pending: [ + { id: '0', path: ['hero', 'nestedObject', 'deeperObject'] }, + { id: '1', path: ['hero', 'nestedObject', 'deeperObject'] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { + foo: 'foo', + }, + id: '0', + }, + { + data: { + bar: 'bar', + }, + id: '1', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Deduplicate fields with deferred fragments in different branches at multiple non-overlapping levels', async () => { + const document = parse(` + query { + a { + b { + c { + d + } + ... @defer { + e { + f + } + } + } + } + ... @defer { + a { + b { + e { + f + } + } + } + g { + h + } + } + } + `); + const result = await complete(document, { + a: { + b: { + c: { d: 'd' }, + e: { f: 'f' }, + }, + }, + g: { h: 'h' }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + a: { + b: { + c: { + d: 'd', + }, + }, + }, + }, + pending: [ + { id: '0', path: ['a', 'b'] }, + { id: '1', path: [] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { e: { f: 'f' } }, + id: '0', + }, + { + data: { g: { h: 'h' } }, + id: '1', + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Correctly bundles varying subfields into incremental data records unique by defer combination, ignoring fields in a fragment masked by a parent defer', async () => { + const document = parse(` + query HeroNameQuery { + ... @defer { + hero { + id + } + } + ... @defer { + hero { + name + shouldBeWithNameDespiteAdditionalDefer: name + ... @defer { + shouldBeWithNameDespiteAdditionalDefer: name + } + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [ + { id: '0', path: [] }, + { id: '1', path: [] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { hero: {} }, + id: '0', + }, + { + data: { id: '1' }, + id: '0', + subPath: ['hero'], + }, + { + data: { + name: 'Luke', + shouldBeWithNameDespiteAdditionalDefer: 'Luke', + }, + id: '1', + subPath: ['hero'], + }, + ], + completed: [{ id: '0' }, { id: '1' }], + hasNext: false, + }, + ]); + }); + + it('Nulls cross defer boundaries, null first', async () => { + const document = parse(` + query { + ... @defer { + a { + someField + b { + c { + nonNullErrorField + } + } + } + } + a { + ... @defer { + b { + c { + d + } + } + } + } + } + `); + const result = await complete(document, { + a: { b: { c: { d: 'd' } }, someField: 'someField' }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + a: {}, + }, + pending: [ + { id: '0', path: [] }, + { id: '1', path: ['a'] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { b: { c: {} } }, + id: '1', + }, + { + data: { d: 'd' }, + id: '1', + subPath: ['b', 'c'], + }, + ], + completed: [ + { + id: '0', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 8, column: 17 }], + path: ['a', 'b', 'c', 'nonNullErrorField'], + }, + ], + }, + { id: '1' }, + ], + hasNext: false, + }, + ]); + }); + + it('Nulls do not cross defer boundaries, when using branching executor format', async () => { + const document = parse(` + query { + ... @defer { + a { + someField + b { + c { + nonNullErrorField + } + } + } + } + a { + ... @defer { + b { + c { + d + } + } + } + } + } + `); + const result = await complete( + document, + { + a: { b: { c: { d: 'd' } }, someField: 'someField' }, + }, + undefined, + IncrementalDeliveryPresetLegacy, + ); + expectJSON(result).toDeepEqual([ + { + data: { + a: {}, + }, + hasNext: true, + }, + { + incremental: [ + { + data: { b: { c: { d: 'd' } } }, + path: ['a'], + }, + { + data: { a: { someField: 'someField', b: { c: null } } }, + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 8, column: 17 }], + path: ['a', 'b', 'c', 'nonNullErrorField'], + }, + ], + path: [], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Nulls cross defer boundaries, value first', async () => { + const document = parse(` + query { + ... @defer { + a { + b { + c { + d + } + } + } + } + a { + ... @defer { + someField + b { + c { + nonNullErrorField + } + } + } + } + } + `); + const result = await complete(document, { + a: { + b: { c: { d: 'd' }, nonNullErrorFIeld: null }, + someField: 'someField', + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + a: {}, + }, + pending: [ + { id: '0', path: [] }, + { id: '1', path: ['a'] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { b: { c: {} } }, + id: '1', + }, + { + data: { d: 'd' }, + id: '0', + subPath: ['a', 'b', 'c'], + }, + ], + completed: [ + { id: '0' }, + { + id: '1', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 17, column: 17 }], + path: ['a', 'b', 'c', 'nonNullErrorField'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Handles multiple erroring deferred grouped field sets', async () => { + const document = parse(` + query { + ... @defer { + a { + b { + c { + someError: nonNullErrorField + } + } + } + } + ... @defer { + a { + b { + c { + anotherError: nonNullErrorField + } + } + } + } + } + `); + const result = await complete(document, { + a: { + b: { c: { nonNullErrorField: null } }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [ + { id: '0', path: [] }, + { id: '1', path: [] }, + ], + hasNext: true, + }, + { + completed: [ + { + id: '0', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 7, column: 17 }], + path: ['a', 'b', 'c', 'someError'], + }, + ], + }, + { + id: '1', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 16, column: 17 }], + path: ['a', 'b', 'c', 'anotherError'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Handles multiple erroring deferred grouped field sets for the same fragment', async () => { + const document = parse(` + query { + ... @defer { + a { + b { + someC: c { + d: d + } + anotherC: c { + d: d + } + } + } + } + ... @defer { + a { + b { + someC: c { + someError: nonNullErrorField + } + anotherC: c { + anotherError: nonNullErrorField + } + } + } + } + } + `); + const result = await complete(document, { + a: { + b: { c: { d: 'd', nonNullErrorField: null } }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [ + { id: '0', path: [] }, + { id: '1', path: [] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { a: { b: { someC: {}, anotherC: {} } } }, + id: '0', + }, + { + data: { d: 'd' }, + id: '0', + subPath: ['a', 'b', 'someC'], + }, + { + data: { d: 'd' }, + id: '0', + subPath: ['a', 'b', 'anotherC'], + }, + ], + completed: [ + { + id: '1', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 19, column: 17 }], + path: ['a', 'b', 'someC', 'someError'], + }, + ], + }, + { id: '0' }, + ], + hasNext: false, + }, + ]); + }); + + it('filters a payload with a null that cannot be merged', async () => { + const document = parse(` + query { + ... @defer { + a { + someField + b { + c { + nonNullErrorField + } + } + } + } + a { + ... @defer { + b { + c { + d + } + } + } + } + } + `); + const result = await complete( + document, + { + a: { + b: { + c: { + d: 'd', + nonNullErrorField: async () => { + await resolveOnNextTick(); + return null; + }, + }, + }, + someField: 'someField', + }, + }, + true, + ); + expectJSON(result).toDeepEqual([ + { + data: { + a: {}, + }, + pending: [ + { id: '0', path: [] }, + { id: '1', path: ['a'] }, + ], + hasNext: true, + }, + { + incremental: [ + { + data: { b: { c: {} } }, + id: '1', + }, + { + data: { d: 'd' }, + id: '1', + subPath: ['b', 'c'], + }, + ], + completed: [{ id: '1' }], + hasNext: true, + }, + { + completed: [ + { + id: '0', + errors: [ + { + message: 'Cannot return null for non-nullable field c.nonNullErrorField.', + locations: [{ line: 8, column: 17 }], + path: ['a', 'b', 'c', 'nonNullErrorField'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + + it('Cancels deferred fields when initial result exhibits null bubbling', async () => { + const document = parse(` + query { + hero { + nonNullName + } + ... @defer { + hero { + name + } + } + } + `); + const result = await complete( + document, + { + hero: { + ...hero, + nonNullName: () => null, + }, + }, + true, + ); + expectJSON(result).toDeepEqual({ + data: { + hero: null, + }, + errors: [ + { + message: 'Cannot return null for non-nullable field Hero.nonNullName.', + locations: [{ line: 4, column: 11 }], + path: ['hero', 'nonNullName'], + }, + ], + }); + }); + + it('Cancels deferred fields when deferred result exhibits null bubbling', async () => { + const document = parse(` + query { + ... @defer { + hero { + nonNullName + name + } + } + } + `); + const result = await complete( + document, + { + hero: { + ...hero, + nonNullName: () => null, + }, + }, + true, + ); + expectJSON(result).toDeepEqual([ + { + data: {}, + pending: [{ id: '0', path: [] }], + hasNext: true, + }, { incremental: [ { - data: null, - path: ['hero'], + data: { + hero: null, + }, errors: [ { - message: 'Cannot return null for non-nullable field Hero.nonNullErrorField.', - locations: [{ line: 9, column: 9 }], - path: ['hero', 'nonNullErrorField'], + message: 'Cannot return null for non-nullable field Hero.nonNullName.', + locations: [{ line: 5, column: 13 }], + path: ['hero', 'nonNullName'], }, ], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + + it('Deduplicates list fields', async () => { + const document = parse(` + query { + hero { + friends { + name + } + ... @defer { + friends { + name + } + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual({ + data: { + hero: { + friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }], + }, + }, + }); + }); + + it('Deduplicates async iterable list fields', async () => { + const document = parse(` + query { + hero { + friends { + name + } + ... @defer { + friends { + name + } + } + } + } + `); + const result = await complete(document, { + hero: { + ...hero, + friends: async function* resolve() { + yield await Promise.resolve(friends[0]); + }, + }, + }); + expectJSON(result).toDeepEqual({ + data: { hero: { friends: [{ name: 'Han' }] } }, + }); + }); + + it('Deduplicates empty async iterable list fields', async () => { + const document = parse(` + query { + hero { + friends { + name + } + ... @defer { + friends { + name + } + } + } + } + `); + const result = await complete(document, { + hero: { + ...hero, + // eslint-disable-next-line require-yield + friends: async function* resolve() { + await resolveOnNextTick(); + }, + }, + }); + expectJSON(result).toDeepEqual({ + data: { hero: { friends: [] } }, + }); + }); + + it('Does not deduplicate list fields with non-overlapping fields', async () => { + const document = parse(` + query { + hero { + friends { + name + } + ... @defer { + friends { + id + } + } + } + } + `); + const result = await complete(document); + expectJSON(result).toDeepEqual([ + { + data: { + hero: { + friends: [{ name: 'Han' }, { name: 'Leia' }, { name: 'C-3PO' }], + }, + }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + incremental: [ + { + data: { id: '2' }, + id: '0', + subPath: ['friends', 0], + }, + { + data: { id: '3' }, + id: '0', + subPath: ['friends', 1], + }, + { + data: { id: '4' }, + id: '0', + subPath: ['friends', 2], }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); + it('Deduplicates list fields that return empty lists', async () => { + const document = parse(` + query { + hero { + friends { + name + } + ... @defer { + friends { + name + } + } + } + } + `); + const result = await complete(document, { + hero: { + ...hero, + friends: () => [], + }, + }); + expectJSON(result).toDeepEqual({ + data: { hero: { friends: [] } }, + }); + }); + + it('Deduplicates null object fields', async () => { + const document = parse(` + query { + hero { + nestedObject { + name + } + ... @defer { + nestedObject { + name + } + } + } + } + `); + const result = await complete(document, { + hero: { + ...hero, + nestedObject: () => null, + }, + }); + expectJSON(result).toDeepEqual({ + data: { hero: { nestedObject: null } }, + }); + }); + + it('Deduplicates promise object fields', async () => { + const document = parse(` + query { + hero { + nestedObject { + name + } + ... @defer { + nestedObject { + name + } + } + } + } + `); + const result = await complete(document, { + hero: { + nestedObject: () => Promise.resolve({ name: 'foo' }), + }, + }); + expectJSON(result).toDeepEqual({ + data: { hero: { nestedObject: { name: 'foo' } } }, + }); + }); + + it('Handles errors thrown in deferred fragments', async () => { + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer + } + } + fragment NameFragment on Hero { + name + } + `); + const result = await complete(document, { + hero: { + ...hero, + name: () => { + throw new Error('bad'); + }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + incremental: [ + { + data: { name: null }, + id: '0', + errors: [ + { + message: 'bad', + locations: [{ line: 9, column: 9 }], + path: ['hero', 'name'], + }, + ], + }, + ], + completed: [{ id: '0' }], + 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 { + nonNullName + } + `); + const result = await complete(document, { + hero: { + ...hero, + nonNullName: () => null, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { hero: { id: '1' } }, + pending: [{ id: '0', path: ['hero'] }], + hasNext: true, + }, + { + completed: [ + { + id: '0', + errors: [ + { + message: 'Cannot return null for non-nullable field Hero.nonNullName.', + locations: [{ line: 9, column: 9 }], + path: ['hero', 'nonNullName'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); it('Handles non-nullable errors thrown outside deferred fragments', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { - nonNullErrorField + nonNullName ...NameFragment @defer } } @@ -527,19 +2505,23 @@ describe('Execute: defer directive', () => { id } `); - - const result = await complete(document); + const result = await complete(document, { + hero: { + ...hero, + nonNullName: () => null, + }, + }); expectJSON(result).toDeepEqual({ errors: [ { - message: 'Cannot return null for non-nullable field Hero.nonNullErrorField.', + message: 'Cannot return null for non-nullable field Hero.nonNullName.', locations: [ { line: 4, column: 11, }, ], - path: ['hero', 'nonNullErrorField'], + path: ['hero', 'nonNullName'], }, ], data: { @@ -547,9 +2529,8 @@ describe('Execute: defer directive', () => { }, }); }); - it('Handles async non-nullable errors thrown in deferred fragments', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { id @@ -557,26 +2538,30 @@ describe('Execute: defer directive', () => { } } fragment NameFragment on Hero { - promiseNonNullErrorField + nonNullName } `); - - const result = await complete(document); + const result = await complete(document, { + hero: { + ...hero, + nonNullName: () => Promise.resolve(null), + }, + }); expectJSON(result).toDeepEqual([ { data: { hero: { id: '1' } }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { - incremental: [ + completed: [ { - data: null, - path: ['hero'], + id: '0', errors: [ { - message: 'Cannot return null for non-nullable field Hero.promiseNonNullErrorField.', + message: 'Cannot return null for non-nullable field Hero.nonNullName.', locations: [{ line: 9, column: 9 }], - path: ['hero', 'promiseNonNullErrorField'], + path: ['hero', 'nonNullName'], }, ], }, @@ -585,9 +2570,8 @@ describe('Execute: defer directive', () => { }, ]); }); - it('Returns payloads in correct order', async () => { - const document = parse(/* GraphQL */ ` + const document = parse(` query HeroNameQuery { hero { id @@ -595,7 +2579,7 @@ describe('Execute: defer directive', () => { } } fragment NameFragment on Hero { - slowField + name friends { ...NestedFragment @defer } @@ -604,111 +2588,130 @@ describe('Execute: defer directive', () => { name } `); - const result = await complete(document); + const result = await complete(document, { + hero: { + ...hero, + name: async () => { + await resolveOnNextTick(); + return 'slow'; + }, + }, + }); expectJSON(result).toDeepEqual([ { data: { hero: { id: '1' }, }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { + pending: [ + { id: '1', path: ['hero', 'friends', 0] }, + { id: '2', path: ['hero', 'friends', 1] }, + { id: '3', path: ['hero', 'friends', 2] }, + ], incremental: [ { - data: { slowField: 'slow', friends: [{}, {}, {}] }, - path: ['hero'], + data: { name: 'slow', friends: [{}, {}, {}] }, + id: '0', }, + { data: { name: 'Han' }, id: '1' }, + { data: { name: 'Leia' }, id: '2' }, + { data: { name: 'C-3PO' }, id: '3' }, ], - 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] }, - ], + completed: [{ id: '0' }, { id: '1' }, { id: '2' }, { id: '3' }], hasNext: false, }, ]); }); - it('Returns payloads from synchronous data in correct order', async () => { - const document = parse(/* GraphQL */ ` - query HeroNameQuery { - hero { - id - ...NameFragment @defer - } - } - fragment NameFragment on Hero { - name - friends { - ...NestedFragment @defer - } + const document = parse(` + query HeroNameQuery { + hero { + id + ...NameFragment @defer } - fragment NestedFragment on Friend { - name + } + 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' }, }, + pending: [{ id: '0', path: ['hero'] }], hasNext: true, }, { + pending: [ + { id: '1', path: ['hero', 'friends', 0] }, + { id: '2', path: ['hero', 'friends', 1] }, + { id: '3', path: ['hero', 'friends', 2] }, + ], incremental: [ { data: { name: 'Luke', friends: [{}, {}, {}], }, - path: ['hero'], + id: '0', }, + { data: { name: 'Han' }, id: '1' }, + { data: { name: 'Leia' }, id: '2' }, + { data: { name: 'C-3PO' }, id: '3' }, ], - 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] }, - ], + completed: [{ id: '0' }, { id: '1' }, { id: '2' }, { id: '3' }], hasNext: false, }, ]); }); it('Filters deferred payloads when a list item returned by an async iterable is nulled', async () => { - const document = parse(/* GraphQL */ ` - query { - hero { - asyncFriends { - promiseNonNullErrorField - ...NameFragment @defer - } + const document = parse(` + query { + hero { + friends { + nonNullName + ...NameFragment @defer } } - fragment NameFragment on Friend { - name - } - `); - - const result = await complete(document); + } + fragment NameFragment on Friend { + name + } + `); + const result = await complete(document, { + hero: { + ...hero, + async *friends() { + yield await Promise.resolve({ + ...friends[0], + nonNullName: () => Promise.resolve(null), + }); + }, + }, + }); expectJSON(result).toDeepEqual({ data: { hero: { - asyncFriends: [null], + friends: [null], }, }, errors: [ { - message: 'Cannot return null for non-nullable field Friend.promiseNonNullErrorField.', - locations: [{ line: 5, column: 13 }], - path: ['hero', 'asyncFriends', 0, 'promiseNonNullErrorField'], + message: 'Cannot return null for non-nullable field Friend.nonNullName.', + locations: [{ line: 5, column: 11 }], + path: ['hero', 'friends', 0, 'nonNullName'], }, ], }); diff --git a/packages/executor/src/execution/__tests__/executor-test.ts b/packages/executor/src/execution/__tests__/executor-test.ts index 3d41467e43b..80d79c74e1b 100644 --- a/packages/executor/src/execution/__tests__/executor-test.ts +++ b/packages/executor/src/execution/__tests__/executor-test.ts @@ -195,7 +195,6 @@ describe('Execute: Handles basic execution tasks', () => { executeSync({ schema, document, rootValue, variableValues }); - // @ts-expect-error expect(Object.keys(resolvedInfo)).toEqual([ 'fieldName', 'fieldNodes', @@ -207,6 +206,7 @@ describe('Execute: Handles basic execution tasks', () => { 'rootValue', 'operation', 'variableValues', + 'signal', ]); const operation = document.definitions[0]; diff --git a/packages/executor/src/execution/__tests__/flattenAsyncIterable-test.ts b/packages/executor/src/execution/__tests__/flattenAsyncIterable-test.ts index adff7786eac..a2cf8dba89b 100644 --- a/packages/executor/src/execution/__tests__/flattenAsyncIterable-test.ts +++ b/packages/executor/src/execution/__tests__/flattenAsyncIterable-test.ts @@ -19,7 +19,7 @@ describe('flattenAsyncIterable', () => { const doubles = flattenAsyncIterable(source()); - const result = []; + const result: any[] = []; for await (const x of doubles) { result.push(x); } diff --git a/packages/executor/src/execution/__tests__/lists-test.ts b/packages/executor/src/execution/__tests__/lists-test.ts index eca608b712c..f7c7383a57a 100644 --- a/packages/executor/src/execution/__tests__/lists-test.ts +++ b/packages/executor/src/execution/__tests__/lists-test.ts @@ -2,6 +2,7 @@ import { buildSchema, GraphQLFieldResolver, GraphQLList, + GraphQLNonNull, GraphQLObjectType, GraphQLSchema, GraphQLString, @@ -27,7 +28,7 @@ describe('Execute: Accepts any iterable as list value', () => { }); }); - it('Accepts an Generator function as a List value', () => { + it('Accepts a Generator function as a List value', () => { function* listField() { yield 'one'; yield 2; @@ -91,7 +92,7 @@ describe('Execute: Accepts async iterables as list value', () => { name: 'ObjectWrapper', fields: { index: { - type: GraphQLString, + type: new GraphQLNonNull(GraphQLString), resolve, }, }, @@ -127,12 +128,12 @@ describe('Execute: Accepts async iterables as list value', () => { } expectJSON(await complete({ listField })).toDeepEqual({ - data: { listField: ['two', '4', null] }, + data: { listField: null }, errors: [ { message: 'bad', locations: [{ line: 1, column: 3 }], - path: ['listField', 2], + path: ['listField'], }, ], }); @@ -190,7 +191,7 @@ describe('Execute: Accepts async iterables as list value', () => { return Promise.resolve(index); }), ).toDeepEqual({ - data: { listField: [{ index: '0' }, { index: '1' }, { index: null }] }, + data: { listField: [{ index: '0' }, { index: '1' }, null] }, errors: [ { message: 'bad', @@ -229,6 +230,34 @@ describe('Execute: Accepts async iterables as list value', () => { errors, }); }); + + it('Returns async iterable when list nulls', async () => { + const values = [1, null, 2]; + let i = 0; + let returned = false; + const listField = { + [Symbol.asyncIterator]: () => ({ + next: () => Promise.resolve({ value: values[i++], done: false }), + return: () => { + returned = true; + return Promise.resolve({ value: undefined, done: true }); + }, + }), + }; + const errors = [ + { + message: 'Cannot return null for non-nullable field Query.listField.', + locations: [{ line: 1, column: 3 }], + path: ['listField', 1], + }, + ]; + + expectJSON(await complete({ listField }, '[Int!]')).toDeepEqual({ + data: { listField: null }, + errors, + }); + expect(returned).toBe(true); + }); }); describe('Execute: Handles list nullability', () => { diff --git a/packages/executor/src/execution/__tests__/mutations-test.ts b/packages/executor/src/execution/__tests__/mutations-test.ts index c4b2d36f2dc..9b39b68beb3 100644 --- a/packages/executor/src/execution/__tests__/mutations-test.ts +++ b/packages/executor/src/execution/__tests__/mutations-test.ts @@ -211,7 +211,7 @@ describe('Execute: Handles mutation execution ordering', () => { document, rootValue, }); - const patches = []; + const patches: any[] = []; expect('initialResult' in mutationResult).toBeTruthy(); // @ts-expect-error once we assert that initialResult is in mutationResult then it should work fine @@ -227,18 +227,19 @@ describe('Execute: Handles mutation execution ordering', () => { first: {}, second: { theNumber: 2 }, }, + pending: [{ id: '0', path: ['first'], label: 'defer-label' }], hasNext: true, }, { incremental: [ { - label: 'defer-label', - path: ['first'], + id: '0', data: { promiseToGetTheNumber: 2, }, }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); @@ -262,7 +263,7 @@ describe('Execute: Handles mutation execution ordering', () => { const rootValue = new Root(6); const mutationResult = await execute({ schema, document, rootValue }); - expectJSON(mutationResult).toDeepEqual({ + expect(mutationResult).toEqual({ data: { first: { theNumber: 1 }, second: { theNumber: 2 }, @@ -291,7 +292,7 @@ describe('Execute: Handles mutation execution ordering', () => { document, rootValue, }); - const patches = []; + const patches: any[] = []; expect('initialResult' in mutationResult).toBeTruthy(); // @ts-expect-error once we assert that initialResult is in mutationResult then it should work fine @@ -306,13 +307,13 @@ describe('Execute: Handles mutation execution ordering', () => { data: { second: { theNumber: 2 }, }, + pending: [{ id: '0', path: [], label: 'defer-label' }], hasNext: true, }, { incremental: [ { - label: 'defer-label', - path: [], + id: '0', data: { first: { theNumber: 1, @@ -320,6 +321,7 @@ describe('Execute: Handles mutation execution ordering', () => { }, }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); diff --git a/packages/executor/src/execution/__tests__/nonnull-test.ts b/packages/executor/src/execution/__tests__/nonnull-test.ts index fb4eead69bd..78bc207e026 100644 --- a/packages/executor/src/execution/__tests__/nonnull-test.ts +++ b/packages/executor/src/execution/__tests__/nonnull-test.ts @@ -247,6 +247,16 @@ describe('Execute: handles non-nullable types', () => { path: ['syncNest', 'syncNest', 'sync'], locations: [{ line: 6, column: 22 }], }, + { + message: promiseError.message, + path: ['syncNest', 'promise'], + locations: [{ line: 5, column: 11 }], + }, + { + message: promiseError.message, + path: ['syncNest', 'syncNest', 'promise'], + locations: [{ line: 6, column: 27 }], + }, { message: syncError.message, path: ['syncNest', 'promiseNest', 'sync'], @@ -262,21 +272,6 @@ describe('Execute: handles non-nullable types', () => { path: ['promiseNest', 'syncNest', 'sync'], locations: [{ line: 12, column: 22 }], }, - { - message: promiseError.message, - path: ['syncNest', 'promise'], - locations: [{ line: 5, column: 11 }], - }, - { - message: promiseError.message, - path: ['syncNest', 'syncNest', 'promise'], - locations: [{ line: 6, column: 27 }], - }, - { - message: syncError.message, - path: ['promiseNest', 'promiseNest', 'sync'], - locations: [{ line: 13, column: 25 }], - }, { message: promiseError.message, path: ['syncNest', 'promiseNest', 'promise'], @@ -292,6 +287,11 @@ describe('Execute: handles non-nullable types', () => { path: ['promiseNest', 'syncNest', 'promise'], locations: [{ line: 12, column: 27 }], }, + { + message: syncError.message, + path: ['promiseNest', 'promiseNest', 'sync'], + locations: [{ line: 13, column: 25 }], + }, { message: promiseError.message, path: ['promiseNest', 'promiseNest', 'promise'], @@ -521,7 +521,7 @@ describe('Execute: handles non-nullable types', () => { type: new GraphQLNonNull(GraphQLString), }, }, - resolve: (_, args: any) => 'Passed: ' + String(args.cannotBeNull), + resolve: (_, { cannotBeNull }) => 'Passed: ' + String(cannotBeNull), }, }, }), diff --git a/packages/executor/src/execution/__tests__/simplePubSub-test.ts b/packages/executor/src/execution/__tests__/simplePubSub-test.ts index 54a736e2320..0e3f35bc166 100644 --- a/packages/executor/src/execution/__tests__/simplePubSub-test.ts +++ b/packages/executor/src/execution/__tests__/simplePubSub-test.ts @@ -1,4 +1,4 @@ -import { SimplePubSub } from './simplePubSub.js'; +import { SimplePubSub } from '../../../../testing/simplePubSub.js'; describe('SimplePubSub', () => { it('subscribe async-iterator mock', async () => { diff --git a/packages/executor/src/execution/__tests__/stream-test.ts b/packages/executor/src/execution/__tests__/stream-test.ts index 183cbf8b05f..6dd10748132 100644 --- a/packages/executor/src/execution/__tests__/stream-test.ts +++ b/packages/executor/src/execution/__tests__/stream-test.ts @@ -8,13 +8,20 @@ import { GraphQLString, parse, } from 'graphql'; -import { MaybePromise } from '@graphql-tools/utils'; +import { createDeferred, MaybePromise } from '@graphql-tools/utils'; import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { expectPromise } from '../../__testUtils__/expectPromise.js'; +import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; +import { + execute, + IncrementalDeliveryPreset2023_06_22, + IncrementalDeliveryPresetLegacy, + IncrementalPreset, +} from '../execute.js'; import type { InitialIncrementalExecutionResult, SubsequentIncrementalExecutionResult, -} from '../execute.js'; -import { execute } from '../execute.js'; +} from '../types.js'; const friendType = new GraphQLObjectType({ fields: { @@ -76,11 +83,18 @@ const query = new GraphQLObjectType({ const schema = new GraphQLSchema({ query }); -async function complete(document: DocumentNode, rootValue: unknown = {}) { +async function complete( + document: DocumentNode, + rootValue: unknown = {}, + enableEarlyExecution = false, + incrementalPreset: IncrementalPreset = IncrementalDeliveryPreset2023_06_22, +) { const result = await execute({ schema, document, rootValue, + enableEarlyExecution, + incrementalPreset, }); if ('initialResult' in result) { @@ -117,65 +131,70 @@ async function completeAsync(document: DocumentNode, numCalls: number, rootValue 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'], }); - expect(result).toEqual([ + expectJSON(result).toDeepEqual([ { data: { scalarList: ['apple'], }, + pending: [{ id: '0', path: ['scalarList'] }], hasNext: true, }, { - incremental: [{ items: ['banana'], path: ['scalarList', 1] }], + incremental: [{ items: ['banana', 'coconut'], id: '0' }], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Can stream a list field using branching executor format', async () => { + const document = parse('{ scalarList @stream(initialCount: 1) }'); + const result = await complete( + document, + { + scalarList: () => ['apple', 'banana', 'coconut'], + }, + undefined, + IncrementalDeliveryPresetLegacy, + ); + expectJSON(result).toDeepEqual([ + { + data: { + scalarList: ['apple'], + }, hasNext: true, }, { - incremental: [{ items: ['coconut'], path: ['scalarList', 2] }], + incremental: [{ items: ['banana', 'coconut'], path: ['scalarList', 1] }], hasNext: false, }, ]); }); - it('Can use default value of initialCount', async () => { const document = parse('{ scalarList @stream }'); const result = await complete(document, { scalarList: () => ['apple', 'banana', 'coconut'], }); - expect(result).toEqual([ + expectJSON(result).toDeepEqual([ { data: { scalarList: [], }, + pending: [{ id: '0', path: ['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] }], + incremental: [{ items: ['apple', 'banana', 'coconut'], id: '0' }], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Negative values of initialCount throw field errors', async () => { const document = parse('{ scalarList @stream(initialCount: -2) }'); const result = await complete(document, { @@ -199,7 +218,6 @@ describe('Execute: stream directive', () => { }, }); }); - it('Returns label from stream directive', async () => { const document = parse('{ scalarList @stream(initialCount: 1, label: "scalar-stream") }'); const result = await complete(document, { @@ -210,31 +228,21 @@ describe('Execute: stream directive', () => { data: { scalarList: ['apple'], }, + pending: [{ id: '0', path: ['scalarList'], label: 'scalar-stream' }], hasNext: true, }, { incremental: [ { - items: ['banana'], - path: ['scalarList', 1], - label: 'scalar-stream', - }, - ], - hasNext: true, - }, - { - incremental: [ - { - items: ['coconut'], - path: ['scalarList', 2], - label: 'scalar-stream', + items: ['banana', 'coconut'], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can disable @stream using if argument', async () => { const document = parse('{ scalarList @stream(initialCount: 0, if: false) }'); const result = await complete(document, { @@ -244,7 +252,6 @@ describe('Execute: stream directive', () => { 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) }', @@ -255,15 +262,16 @@ describe('Execute: stream directive', () => { expectJSON(result).toDeepEqual([ { data: { scalarList: ['apple', 'banana'] }, + pending: [{ id: '0', path: ['scalarList'] }], hasNext: true, }, { - incremental: [{ items: ['coconut'], path: ['scalarList', 2] }], + incremental: [{ items: ['coconut'], id: '0' }], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can stream multi-dimensional lists', async () => { const document = parse('{ scalarListList @stream(initialCount: 1) }'); const result = await complete(document, { @@ -278,29 +286,24 @@ describe('Execute: stream directive', () => { data: { scalarListList: [['apple', 'apple', 'apple']], }, + pending: [{ id: '0', path: ['scalarListList'] }], hasNext: true, }, { incremental: [ { - items: [['banana', 'banana', 'banana']], - path: ['scalarListList', 1], - }, - ], - hasNext: true, - }, - { - incremental: [ - { - items: [['coconut', 'coconut', 'coconut']], - path: ['scalarListList', 2], + items: [ + ['banana', 'banana', 'banana'], + ['coconut', 'coconut', 'coconut'], + ], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can stream a field that returns a list of promises', async () => { const document = parse(/* GraphQL */ ` query { @@ -327,6 +330,7 @@ describe('Execute: stream directive', () => { }, ], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { @@ -338,14 +342,14 @@ describe('Execute: stream directive', () => { id: '3', }, ], - path: ['friendList', 2], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can stream in correct order with lists of promises', async () => { const document = parse(/* GraphQL */ ` query { @@ -363,13 +367,14 @@ describe('Execute: stream directive', () => { data: { friendList: [], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [{ name: 'Luke', id: '1' }], - path: ['friendList', 0], + id: '0', }, ], hasNext: true, @@ -378,7 +383,7 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ name: 'Han', id: '2' }], - path: ['friendList', 1], + id: '0', }, ], hasNext: true, @@ -387,14 +392,172 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Does not execute early if not specified', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 0) { + id + } + } + `); + const order: Array = []; + const result = await complete(document, { + friendList: () => + friends.map((f, i) => ({ + id: async () => { + const slowness = 3 - i; + for (let j = 0; j < slowness; j++) { + await resolveOnNextTick(); + } + order.push(i); + return f.id; + }, + })), + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '1' }], + id: '0', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '2' }], + id: '0', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '3' }], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + expect(order).toEqual([0, 1, 2]); + }); + it('Executes early if specified', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 0) { + id + } + } + `); + const order: Array = []; + const result = await complete( + document, + { + friendList: () => + friends.map((f, i) => ({ + id: async () => { + const slowness = 3 - i; + for (let j = 0; j < slowness; j++) { + await resolveOnNextTick(); + } + order.push(i); + return f.id; + }, + })), + }, + true, + ); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '1' }, { id: '2' }, { id: '3' }], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + expect(order).toEqual([2, 1, 0]); + }); + it('Can stream a field that returns a list with nested promises', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 2) { + name + id + } + } + `); + const result = await complete(document, { + friendList: () => + friends.map(f => ({ + name: Promise.resolve(f.name), + id: Promise.resolve(f.id), + })), + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [ + { + name: 'Luke', + id: '1', + }, + { + name: 'Han', + id: '2', + }, + ], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [ + { + name: 'Leia', + id: '3', + }, + ], + id: '0', + }, + ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Handles rejections in a field that returns a list of promises before initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -425,20 +588,21 @@ describe('Execute: stream directive', () => { data: { friendList: [{ name: 'Luke', id: '1' }, null], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Handles rejections in a field that returns a list of promises after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -462,13 +626,14 @@ describe('Execute: stream directive', () => { data: { friendList: [{ name: 'Luke', id: '1' }], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [null], - path: ['friendList', 1], + id: '0', errors: [ { message: 'bad', @@ -477,16 +642,21 @@ describe('Execute: stream directive', () => { }, ], }, + ], + hasNext: true, + }, + { + incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can stream a field that returns an async iterable', async () => { const document = parse(/* GraphQL */ ` query { @@ -508,13 +678,14 @@ describe('Execute: stream directive', () => { data: { friendList: [], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [{ name: 'Luke', id: '1' }], - path: ['friendList', 0], + id: '0', }, ], hasNext: true, @@ -523,7 +694,7 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ name: 'Han', id: '2' }], - path: ['friendList', 1], + id: '0', }, ], hasNext: true, @@ -532,17 +703,17 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], hasNext: true, }, { + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Can stream a field that returns an async iterable, using a non-zero initialCount', async () => { const document = parse(/* GraphQL */ ` query { @@ -567,20 +738,24 @@ describe('Execute: stream directive', () => { { name: 'Han', id: '2' }, ], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], + hasNext: true, + }, + { + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Negative values of initialCount throw field errors on a field that returns an async iterable', async () => { const document = parse(/* GraphQL */ ` query { @@ -606,7 +781,125 @@ describe('Execute: stream directive', () => { }, }); }); - + it('Does not execute early if not specified, when streaming from an async iterable', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 0) { + id + } + } + `); + const order: Array = []; + const slowFriend = async (n: number) => ({ + id: async () => { + const slowness = (3 - n) * 10; + for (let j = 0; j < slowness; j++) { + await resolveOnNextTick(); + } + order.push(n); + return friends[n].id; + }, + }); + const result = await complete(document, { + async *friendList() { + yield await Promise.resolve(slowFriend(0)); + yield await Promise.resolve(slowFriend(1)); + yield await Promise.resolve(slowFriend(2)); + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '1' }], + id: '0', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '2' }], + id: '0', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '3' }], + id: '0', + }, + ], + hasNext: true, + }, + { + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + expect(order).toEqual([0, 1, 2]); + }); + it('Executes early if specified when streaming from an async iterable', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 0) { + id + } + } + `); + const order: Array = []; + const slowFriend = (n: number) => ({ + id: async () => { + const slowness = (3 - n) * 10; + for (let j = 0; j < slowness; j++) { + await resolveOnNextTick(); + } + order.push(n); + return friends[n].id; + }, + }); + const result = await complete( + document, + { + async *friendList() { + yield await Promise.resolve(slowFriend(0)); + yield await Promise.resolve(slowFriend(1)); + yield await Promise.resolve(slowFriend(2)); + }, + }, + true, + ); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '1' }, { id: '2' }, { id: '3' }], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + expect(order).toEqual([2, 1, 0]); + }); it('Can handle concurrent calls to .next() without waiting', async () => { const document = parse(/* GraphQL */ ` query { @@ -616,7 +909,7 @@ describe('Execute: stream directive', () => { } } `); - const result = await completeAsync(document, 3, { + const result = await completeAsync(document, 2, { async *friendList() { yield await Promise.resolve(friends[0]); yield await Promise.resolve(friends[1]); @@ -633,6 +926,7 @@ describe('Execute: stream directive', () => { { name: 'Han', id: '2' }, ], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, }, @@ -642,17 +936,16 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ name: 'Leia', id: '3' }], - path: ['friendList', 2], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: false, }, }, { done: true, value: undefined }, - { done: true, value: undefined }, ]); }); - it('Handles error thrown in async iterable before initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -673,15 +966,14 @@ describe('Execute: stream directive', () => { { message: 'bad', locations: [{ line: 3, column: 9 }], - path: ['friendList', 1], + path: ['friendList'], }, ], data: { - friendList: [{ name: 'Luke', id: '1' }, null], + friendList: null, }, }); }); - it('Handles error thrown in async iterable after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -702,18 +994,18 @@ describe('Execute: stream directive', () => { data: { friendList: [{ name: 'Luke', id: '1' }], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: [null], - path: ['friendList', 1], + id: '0', errors: [ { message: 'bad', locations: [{ line: 3, column: 9 }], - path: ['friendList', 1], + path: ['friendList'], }, ], }, @@ -722,7 +1014,6 @@ describe('Execute: stream directive', () => { }, ]); }); - it('Handles null returned in non-null list items after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -732,7 +1023,7 @@ describe('Execute: stream directive', () => { } `); const result = await complete(document, { - nonNullFriendList: () => [friends[0], null], + nonNullFriendList: () => [friends[0], null, friends[1]], }); expectJSON(result).toDeepEqual([ @@ -740,13 +1031,13 @@ describe('Execute: stream directive', () => { data: { nonNullFriendList: [{ name: 'Luke' }], }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: null, - path: ['nonNullFriendList', 1], + id: '0', errors: [ { message: 'Cannot return null for non-nullable field Query.nonNullFriendList.', @@ -760,7 +1051,48 @@ describe('Execute: stream directive', () => { }, ]); }); + it('Handles null returned in non-null list items after initialCount is reached, using branching executor format', async () => { + const document = parse(/* GraphQL */ ` + query { + nonNullFriendList @stream(initialCount: 1) { + name + } + } + `); + const result = await complete( + document, + { + nonNullFriendList: () => [friends[0], null, friends[1]], + }, + undefined, + IncrementalDeliveryPresetLegacy, + ); + expectJSON(result).toDeepEqual([ + { + data: { + nonNullFriendList: [{ name: 'Luke' }], + }, + hasNext: true, + }, + { + incremental: [ + { + errors: [ + { + message: 'Cannot return null for non-nullable field Query.nonNullFriendList.', + locations: [{ line: 3, column: 9 }], + path: ['nonNullFriendList', 1], + }, + ], + items: null, + path: ['nonNullFriendList', 1], + }, + ], + hasNext: false, + }, + ]); + }); it('Handles null returned in non-null async iterable list items after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -787,13 +1119,13 @@ describe('Execute: stream directive', () => { data: { nonNullFriendList: [{ name: 'Luke' }], }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: null, - path: ['nonNullFriendList', 1], + id: '0', errors: [ { message: 'Cannot return null for non-nullable field Query.nonNullFriendList.', @@ -807,7 +1139,6 @@ describe('Execute: stream directive', () => { }, ]); }); - it('Handles errors thrown by completeValue after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -822,13 +1153,14 @@ describe('Execute: stream directive', () => { data: { scalarList: ['Luke'], }, + pending: [{ id: '0', path: ['scalarList'] }], hasNext: true, }, { incremental: [ { items: [null], - path: ['scalarList', 1], + id: '0', errors: [ { message: 'String cannot represent value: {}', @@ -838,11 +1170,11 @@ describe('Execute: stream directive', () => { ], }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Handles async errors thrown by completeValue after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -852,26 +1184,213 @@ describe('Execute: stream directive', () => { } `); const result = await complete(document, { - friendList: () => [ - Promise.resolve({ nonNullName: friends[0].name }), - Promise.resolve({ + friendList: () => [ + Promise.resolve({ nonNullName: friends[0].name }), + Promise.resolve({ + nonNullName: () => Promise.reject(new Error('Oops')), + }), + Promise.resolve({ nonNullName: friends[1].name }), + ], + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ nonNullName: 'Luke' }], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [null], + id: '0', + errors: [ + { + message: 'Oops', + locations: [{ line: 4, column: 11 }], + path: ['friendList', 1, 'nonNullName'], + }, + ], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ nonNullName: 'Han' }], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Handles nested async errors thrown by completeValue after initialCount is reached', async () => { + const document = parse(/* GraphQL */ ` + query { + friendList @stream(initialCount: 1) { + nonNullName + } + } + `); + const result = await complete(document, { + friendList: () => [ + { nonNullName: Promise.resolve(friends[0].name) }, + { nonNullName: Promise.reject(new Error('Oops')) }, + { nonNullName: Promise.resolve(friends[1].name) }, + ], + }); + expectJSON(result).toDeepEqual([ + { + data: { + friendList: [{ nonNullName: 'Luke' }], + }, + pending: [{ id: '0', path: ['friendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [null], + id: '0', + errors: [ + { + message: 'Oops', + locations: [{ line: 4, column: 11 }], + path: ['friendList', 1, 'nonNullName'], + }, + ], + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ nonNullName: 'Han' }], + id: '0', + }, + ], + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Handles async errors thrown by completeValue after initialCount is reached for a non-nullable list', async () => { + const document = parse(/* GraphQL */ ` + 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' }], + }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], + hasNext: true, + }, + { + completed: [ + { + id: '0', + errors: [ + { + message: 'Oops', + locations: [{ line: 4, column: 11 }], + path: ['nonNullFriendList', 1, 'nonNullName'], + }, + ], + }, + ], + hasNext: false, + }, + ]); + }); + it('Handles nested async errors thrown by completeValue after initialCount is reached for a non-nullable list', async () => { + const document = parse(/* GraphQL */ ` + query { + nonNullFriendList @stream(initialCount: 1) { + nonNullName + } + } + `); + const result = await complete(document, { + nonNullFriendList: () => [ + { nonNullName: Promise.resolve(friends[0].name) }, + { nonNullName: Promise.reject(new Error('Oops')) }, + { nonNullName: Promise.resolve(friends[1].name) }, + ], + }); + expectJSON(result).toDeepEqual([ + { + data: { + nonNullFriendList: [{ nonNullName: 'Luke' }], + }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], + hasNext: true, + }, + { + completed: [ + { + id: '0', + 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(/* GraphQL */ ` + 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')), - }), - Promise.resolve({ nonNullName: friends[1].name }), - ], + }); + yield await Promise.resolve({ nonNullName: friends[1].name }); + }, }); expectJSON(result).toDeepEqual([ { data: { friendList: [{ nonNullName: 'Luke' }], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [null], - path: ['friendList', 1], + id: '0', errors: [ { message: 'Oops', @@ -887,15 +1406,18 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ nonNullName: 'Han' }], - path: ['friendList', 2], + id: '0', }, ], + hasNext: true, + }, + { + completed: [{ id: '0' }], hasNext: false, }, ]); }); - - it('Handles async errors thrown by completeValue after initialCount is reached for a non-nullable list', async () => { + it('Handles async errors thrown by completeValue after initialCount is reached from async generator for a non-nullable list', async () => { const document = parse(/* GraphQL */ ` query { nonNullFriendList @stream(initialCount: 1) { @@ -904,26 +1426,25 @@ describe('Execute: stream directive', () => { } `); const result = await complete(document, { - nonNullFriendList: () => [ - Promise.resolve({ nonNullName: friends[0].name }), - Promise.resolve({ + async *nonNullFriendList() { + yield await Promise.resolve({ nonNullName: friends[0].name }); + yield await Promise.resolve({ nonNullName: () => Promise.reject(new Error('Oops')), - }), - Promise.resolve({ nonNullName: friends[1].name }), - ], + }); /* c8 ignore start */ + } /* c8 ignore stop */, }); expectJSON(result).toDeepEqual([ { data: { nonNullFriendList: [{ nonNullName: 'Luke' }], }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: null, - path: ['nonNullFriendList', 1], + id: '0', errors: [ { message: 'Oops', @@ -937,63 +1458,70 @@ describe('Execute: stream directive', () => { }, ]); }); - - it('Handles async errors thrown by completeValue after initialCount is reached from async iterable', async () => { + it('Handles async errors thrown by completeValue after initialCount is reached from async iterable for a non-nullable list when the async iterable does not provide a return method) ', async () => { const document = parse(/* GraphQL */ ` query { - friendList @stream(initialCount: 1) { + nonNullFriendList @stream(initialCount: 1) { nonNullName } } `); + let count = 0; 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 }); + nonNullFriendList: { + [Symbol.asyncIterator]: () => ({ + next: async () => { + switch (count++) { + case 0: + return Promise.resolve({ + done: false, + value: { nonNullName: friends[0].name }, + }); + case 1: + return Promise.resolve({ + done: false, + value: { + nonNullName: () => Promise.reject(new Error('Oops')), + }, + }); + // Not reached + /* c8 ignore next 5 */ + case 2: + return Promise.resolve({ + done: false, + value: { nonNullName: friends[1].name }, + }); + } + }, + }), }, }); expectJSON(result).toDeepEqual([ { data: { - friendList: [{ nonNullName: 'Luke' }], + nonNullFriendList: [{ nonNullName: 'Luke' }], }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: [null], - path: ['friendList', 1], + id: '0', errors: [ { message: 'Oops', locations: [{ line: 4, column: 11 }], - path: ['friendList', 1, 'nonNullName'], + path: ['nonNullFriendList', 1, 'nonNullName'], }, ], }, ], - hasNext: true, - }, - { - incremental: [ - { - items: [{ nonNullName: 'Han' }], - path: ['friendList', 2], - }, - ], - hasNext: true, - }, - { hasNext: false, }, ]); }); - - it('Handles async errors thrown by completeValue after initialCount is reached from async iterable for a non-nullable list', async () => { + it('Handles async errors thrown by completeValue after initialCount is reached from async iterable for a non-nullable list when the async iterable provides concurrent next/return methods and has a slow return ', async () => { const document = parse(/* GraphQL */ ` query { nonNullFriendList @stream(initialCount: 1) { @@ -1001,29 +1529,58 @@ describe('Execute: stream directive', () => { } } `); + let count = 0; + let returned = false; const result = await complete(document, { - async *nonNullFriendList() { - 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, - }); /* c8 ignore start */ - } /* c8 ignore stop */, + nonNullFriendList: { + [Symbol.asyncIterator]: () => ({ + next: async () => { + /* c8 ignore next 3 */ + if (returned) { + return Promise.resolve({ done: true }); + } + switch (count++) { + case 0: + return Promise.resolve({ + done: false, + value: { nonNullName: friends[0].name }, + }); + case 1: + return Promise.resolve({ + done: false, + value: { + nonNullName: () => Promise.reject(new Error('Oops')), + }, + }); + // Not reached + /* c8 ignore next 5 */ + case 2: + return Promise.resolve({ + done: false, + value: { nonNullName: friends[1].name }, + }); + } + }, + return: async () => { + await resolveOnNextTick(); + returned = true; + return { done: true }; + }, + }), + }, }); expectJSON(result).toDeepEqual([ { data: { nonNullFriendList: [{ nonNullName: 'Luke' }], }, + pending: [{ id: '0', path: ['nonNullFriendList'] }], hasNext: true, }, { - incremental: [ + completed: [ { - items: null, - path: ['nonNullFriendList', 1], + id: '0', errors: [ { message: 'Oops', @@ -1036,8 +1593,8 @@ describe('Execute: stream directive', () => { hasNext: false, }, ]); + expect(returned).toBeTruthy(); }); - it('Filters payloads that are nulled', async () => { const document = parse(/* GraphQL */ ` query { @@ -1070,7 +1627,6 @@ describe('Execute: stream directive', () => { }, }); }); - it('Filters payloads that are nulled by a later synchronous error', async () => { const document = parse(/* GraphQL */ ` query { @@ -1103,7 +1659,6 @@ describe('Execute: stream directive', () => { }, }); }); - it('Does not filter payloads when null error is in a different path', async () => { const document = parse(/* GraphQL */ ` query { @@ -1133,13 +1688,26 @@ describe('Execute: stream directive', () => { otherNestedObject: {}, nestedObject: { nestedFriendList: [] }, }, + pending: [ + { id: '0', path: ['otherNestedObject'] }, + { id: '1', path: ['nestedObject', 'nestedFriendList'] }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ name: 'Luke' }], + id: '1', + }, + ], hasNext: true, }, { incremental: [ { data: { scalarField: null }, - path: ['otherNestedObject'], + id: '0', errors: [ { message: 'Oops', @@ -1148,16 +1716,16 @@ describe('Execute: stream directive', () => { }, ], }, - { - items: [{ name: 'Luke' }], - path: ['nestedObject', 'nestedFriendList', 0], - }, ], + completed: [{ id: '0' }], + hasNext: true, + }, + { + completed: [{ id: '1' }], hasNext: false, }, ]); }); - it('Filters stream payloads that are nulled in a deferred payload', async () => { const document = parse(/* GraphQL */ ` query { @@ -1188,6 +1756,7 @@ describe('Execute: stream directive', () => { data: { nestedObject: {}, }, + pending: [{ id: '0', path: ['nestedObject'] }], hasNext: true, }, { @@ -1196,7 +1765,7 @@ describe('Execute: stream directive', () => { data: { deeperNestedObject: null, }, - path: ['nestedObject'], + id: '0', errors: [ { message: @@ -1207,11 +1776,11 @@ describe('Execute: stream directive', () => { ], }, ], + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Filters defer payloads that are nulled in a stream response', async () => { const document = parse(/* GraphQL */ ` query { @@ -1236,13 +1805,14 @@ describe('Execute: stream directive', () => { data: { friendList: [], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [null], - path: ['friendList', 0], + id: '0', errors: [ { message: 'Cannot return null for non-nullable field Friend.nonNullName.', @@ -1255,22 +1825,23 @@ describe('Execute: stream directive', () => { hasNext: true, }, { + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Returns iterator and ignores errors when stream payloads are filtered', async () => { + it('Returns iterator and passes through errors when stream payloads are filtered', async () => { let returned = false; let requested = false; const iterable = { [Symbol.asyncIterator]: () => ({ next: () => { + /* c8 ignore start */ if (requested) { - /* c8 ignore next 3 */ - // Not reached, iterator should end immediately. - expect('Not reached').toBeFalsy(); - } + // stream is filtered, next is not called, and so this is not reached. + return Promise.reject(new Error('Oops')); + } /* c8 ignore stop */ requested = true; const friend = friends[0]; return Promise.resolve({ @@ -1283,6 +1854,7 @@ describe('Execute: stream directive', () => { }, return: () => { returned = true; + // This error should be passed through. return Promise.reject(new Error('Oops')); }, }), @@ -1314,6 +1886,7 @@ describe('Execute: stream directive', () => { }, }, }, + enableEarlyExecution: true, }); expect('initialResult' in executeResult).toBeTruthy(); @@ -1325,6 +1898,7 @@ describe('Execute: stream directive', () => { data: { nestedObject: {}, }, + pending: [{ id: '0', path: ['nestedObject'] }], hasNext: true, }); @@ -1337,7 +1911,7 @@ describe('Execute: stream directive', () => { data: { deeperNestedObject: null, }, - path: ['nestedObject'], + id: '0', errors: [ { message: @@ -1348,16 +1922,16 @@ describe('Execute: stream directive', () => { ], }, ], + completed: [{ id: '0' }], hasNext: false, }, }); - const result3 = await iterator.next(); - expectJSON(result3).toDeepEqual({ done: true, value: undefined }); + const result3Promise = iterator.next(); + await expectPromise(result3Promise).toRejectWith('Oops'); expect(returned).toBeTruthy(); }); - it('Handles promises returned by completeValue after initialCount is reached', async () => { const document = parse(/* GraphQL */ ` query { @@ -1382,13 +1956,14 @@ describe('Execute: stream directive', () => { data: { friendList: [{ id: '1', name: 'Luke' }], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }, { incremental: [ { items: [{ id: '2', name: 'Han' }], - path: ['friendList', 1], + id: '0', }, ], hasNext: true, @@ -1397,19 +1972,79 @@ describe('Execute: stream directive', () => { incremental: [ { items: [{ id: '3', name: 'Leia' }], - path: ['friendList', 2], + id: '0', }, ], hasNext: true, }, { + completed: [{ id: '0' }], + hasNext: false, + }, + ]); + }); + it('Handles overlapping deferred and non-deferred streams', async () => { + const document = parse(/* GraphQL */ ` + query { + nestedObject { + nestedFriendList @stream(initialCount: 0) { + id + } + } + nestedObject { + ... @defer { + nestedFriendList @stream(initialCount: 0) { + id + name + } + } + } + } + `); + const result = await complete(document, { + nestedObject: { + async *nestedFriendList() { + yield await Promise.resolve(friends[0]); + yield await Promise.resolve(friends[1]); + }, + }, + }); + expectJSON(result).toDeepEqual([ + { + data: { + nestedObject: { + nestedFriendList: [], + }, + }, + pending: [{ id: '0', path: ['nestedObject', 'nestedFriendList'] }], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '1', name: 'Luke' }], + id: '0', + }, + ], + hasNext: true, + }, + { + incremental: [ + { + items: [{ id: '2', name: 'Han' }], + id: '0', + }, + ], + hasNext: true, + }, + { + completed: [{ id: '0' }], hasNext: false, }, ]); }); - it('Returns payloads in correct order when parent deferred fragment resolves slower than stream', async () => { - const [slowFieldPromise, resolveSlowField] = createResolvablePromise(); + const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred(); const document = parse(/* GraphQL */ ` query { nestedObject { @@ -1435,6 +2070,7 @@ describe('Execute: stream directive', () => { }, }, }, + enableEarlyExecution: false, }); expect('initialResult' in executeResult).toBeTruthy(); @@ -1446,6 +2082,7 @@ describe('Execute: stream directive', () => { data: { nestedObject: {}, }, + pending: [{ id: '0', path: ['nestedObject'] }], hasNext: true, }); @@ -1454,45 +2091,53 @@ describe('Execute: stream directive', () => { const result2 = await result2Promise; expectJSON(result2).toDeepEqual({ value: { + pending: [{ id: '1', path: ['nestedObject', 'nestedFriendList'] }], incremental: [ { data: { scalarField: 'slow', nestedFriendList: [] }, - path: ['nestedObject'], + id: '0', }, ], + completed: [{ id: '0' }], hasNext: true, }, done: false, }); + const result3 = await iterator.next(); expectJSON(result3).toDeepEqual({ value: { incremental: [ { items: [{ name: 'Luke' }], - path: ['nestedObject', 'nestedFriendList', 0], + id: '1', }, ], hasNext: true, }, done: false, }); + const result4 = await iterator.next(); expectJSON(result4).toDeepEqual({ value: { incremental: [ { items: [{ name: 'Han' }], - path: ['nestedObject', 'nestedFriendList', 1], + id: '1', }, ], hasNext: true, }, done: false, }); + const result5 = await iterator.next(); expectJSON(result5).toDeepEqual({ - value: { hasNext: false }, + value: { + completed: [{ id: '1' }], + hasNext: false, + }, done: false, }); const result6 = await iterator.next(); @@ -1501,10 +2146,10 @@ describe('Execute: stream directive', () => { done: true, }); }); - it('Can @defer fields that are resolved after async iterable is complete', async () => { - const [slowFieldPromise, resolveSlowField] = createResolvablePromise(); - const [iterableCompletionPromise, resolveIterableCompletion] = createResolvablePromise(); + const { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred(); + const { promise: iterableCompletionPromise, resolve: resolveIterableCompletion } = + createDeferred(); const document = parse(/* GraphQL */ ` query { @@ -1531,6 +2176,7 @@ describe('Execute: stream directive', () => { await iterableCompletionPromise; }, }, + enableEarlyExecution: false, }); expect('initialResult' in executeResult).toBeTruthy(); @@ -1542,26 +2188,25 @@ describe('Execute: stream directive', () => { data: { friendList: [{ id: '1' }], }, + pending: [ + { id: '0', path: ['friendList', 0], label: 'DeferName' }, + { id: '1', path: ['friendList'], label: 'stream-label' }, + ], hasNext: true, }); const result2Promise = iterator.next(); - resolveIterableCompletion(); + resolveIterableCompletion(null); 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', + id: '0', }, ], + completed: [{ id: '0' }], hasNext: true, }, done: false, @@ -1572,27 +2217,49 @@ describe('Execute: stream directive', () => { const result3 = await result3Promise; expectJSON(result3).toDeepEqual({ value: { + pending: [{ id: '2', path: ['friendList', 1], label: 'DeferName' }], incremental: [ { - data: { name: 'Han' }, - path: ['friendList', 1], - label: 'DeferName', + items: [{ id: '2' }], + id: '1', }, ], - hasNext: false, + hasNext: true, }, done: false, }); const result4 = await iterator.next(); expectJSON(result4).toDeepEqual({ + value: { + completed: [{ id: '1' }], + hasNext: true, + }, + done: false, + }); + const result5 = await iterator.next(); + expectJSON(result5).toDeepEqual({ + value: { + incremental: [ + { + data: { name: 'Han' }, + id: '2', + }, + ], + completed: [{ id: '2' }], + hasNext: false, + }, + done: false, + }); + const result6 = await iterator.next(); + expectJSON(result6).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 { promise: slowFieldPromise, resolve: resolveSlowField } = createDeferred(); + const { promise: iterableCompletionPromise, resolve: resolveIterableCompletion } = + createDeferred(); const document = parse(/* GraphQL */ ` query { @@ -1619,6 +2286,7 @@ describe('Execute: stream directive', () => { await iterableCompletionPromise; }, }, + enableEarlyExecution: false, }); expect('initialResult' in executeResult).toBeTruthy(); // @ts-expect-error once we assert that initialResult is in executeResult then it should work fine @@ -1630,6 +2298,10 @@ describe('Execute: stream directive', () => { data: { friendList: [{ id: '1' }], }, + pending: [ + { id: '0', path: ['friendList', 0], label: 'DeferName' }, + { id: '1', path: ['friendList'], label: 'stream-label' }, + ], hasNext: true, }); @@ -1641,15 +2313,10 @@ describe('Execute: stream directive', () => { incremental: [ { data: { name: 'Luke' }, - path: ['friendList', 0], - label: 'DeferName', - }, - { - items: [{ id: '2' }], - path: ['friendList', 1], - label: 'stream-label', + id: '0', }, ], + completed: [{ id: '0' }], hasNext: true, }, done: false, @@ -1658,57 +2325,70 @@ describe('Execute: stream directive', () => { const result3 = await iterator.next(); expectJSON(result3).toDeepEqual({ value: { + pending: [{ id: '2', path: ['friendList', 1], label: 'DeferName' }], incremental: [ { - data: { name: 'Han' }, - path: ['friendList', 1], - label: 'DeferName', + items: [{ id: '2' }], + id: '1', }, ], hasNext: true, }, done: false, }); - const result4Promise = iterator.next(); - resolveIterableCompletion(); - const result4 = await result4Promise; + + const result4 = await iterator.next(); expectJSON(result4).toDeepEqual({ - value: { hasNext: false }, + value: { + incremental: [ + { + data: { name: 'Han' }, + id: '2', + }, + ], + completed: [{ id: '2' }], + hasNext: true, + }, done: false, }); - const result5 = await iterator.next(); + const result5Promise = iterator.next(); + resolveIterableCompletion(null); + const result5 = await result5Promise; expectJSON(result5).toDeepEqual({ + value: { + completed: [{ id: '1' }], + hasNext: false, + }, + done: false, + }); + + const result6 = await iterator.next(); + expectJSON(result6).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 }); - }, + next: () => + new Promise(() => { + /* never resolves */ + }), return: () => { returned = true; + // This error should be passed through. + return Promise.reject(new Error('Oops')); }, }), }; const document = parse(/* GraphQL */ ` query { - friendList @stream(initialCount: 1) { + friendList @stream { id - ... @defer { - name - } } } `); @@ -1727,32 +2407,30 @@ describe('Execute: stream directive', () => { const result1 = executeResult.initialResult; expectJSON(result1).toDeepEqual({ data: { - friendList: [ - { - id: '1', - }, - ], + friendList: [], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }); + + const result2Promise = iterator.next(); const returnPromise = iterator.return(); - const result2 = await iterator.next(); + const result2 = await result2Promise; expectJSON(result2).toDeepEqual({ done: true, value: undefined, }); - await returnPromise; + await expectPromise(returnPromise).toRejectWith('Oops'); expect(returned).toBeTruthy(); }); - 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) { + if (friend == null) { return Promise.resolve({ done: true, value: undefined }); } return Promise.resolve({ done: false, value: friend }); @@ -1790,6 +2468,7 @@ describe('Execute: stream directive', () => { }, ], }, + pending: [{ id: '0', path: ['friendList'] }], hasNext: true, }); @@ -1802,7 +2481,6 @@ describe('Execute: stream directive', () => { }); await returnPromise; }); - it('Returns underlying async iterables when returned generator is thrown', async () => { let index = 0; let returned = false; @@ -1810,7 +2488,7 @@ describe('Execute: stream directive', () => { [Symbol.asyncIterator]: () => ({ next: () => { const friend = friends[index++]; - if (!friend) { + if (friend == null) { return Promise.resolve({ done: true, value: undefined }); } return Promise.resolve({ done: false, value: friend }); @@ -1851,6 +2529,10 @@ describe('Execute: stream directive', () => { }, ], }, + pending: [ + { id: '0', path: ['friendList', 0] }, + { id: '1', path: ['friendList'] }, + ], hasNext: true, }); @@ -1861,13 +2543,7 @@ describe('Execute: stream directive', () => { done: true, value: undefined, }); - try { - await throwPromise; /* c8 ignore start */ - // Not reachable, always throws - /* c8 ignore stop */ - } catch (e) { - // ignore error - } + await expectPromise(throwPromise).toRejectWith('bad'); expect(returned).toBeTruthy(); }); }); diff --git a/packages/executor/src/execution/__tests__/subscribe.test.ts b/packages/executor/src/execution/__tests__/subscribe.test.ts index bf17d40dae7..734f210da77 100644 --- a/packages/executor/src/execution/__tests__/subscribe.test.ts +++ b/packages/executor/src/execution/__tests__/subscribe.test.ts @@ -10,11 +10,18 @@ import { import { makeExecutableSchema } from '@graphql-tools/schema'; import { ExecutionResult, isAsyncIterable, isPromise, MaybePromise } from '@graphql-tools/utils'; import { expectJSON } from '../../__testUtils__/expectJSON.js'; +import { expectPromise } from '../../__testUtils__/expectPromise.js'; import { resolveOnNextTick } from '../../__testUtils__/resolveOnNextTick.js'; import { assertAsyncIterable } from '../../../../loaders/url/tests/test-utils.js'; -import { ExecutionArgs, subscribe } from '../execute.js'; +import { SimplePubSub } from '../../../../testing/simplePubSub.js'; +import { + ExecutionArgs, + IncrementalDeliveryPreset2023_06_22, + IncrementalDeliveryPresetLegacy, + IncrementalPreset, + subscribe, +} from '../execute.js'; import { normalizedExecutor } from '../normalizedExecutor.js'; -import { SimplePubSub } from './simplePubSub.js'; interface Email { from: string; @@ -85,9 +92,15 @@ const emailSchema = new GraphQLSchema({ function createSubscription( pubsub: SimplePubSub, variableValues?: { readonly [variable: string]: unknown }, + incrementalPreset: IncrementalPreset = IncrementalDeliveryPreset2023_06_22, ) { const document = parse(` - subscription ($priority: Int = 0, $shouldDefer: Boolean = false, $asyncResolver: Boolean = false) { + subscription ( + $priority: Int = 0 + $shouldDefer: Boolean = false + $shouldStream: Boolean = false + $asyncResolver: Boolean = false + ) { importantEmail(priority: $priority) { email { from @@ -98,6 +111,7 @@ function createSubscription( } ... @defer(if: $shouldDefer) { inbox { + emails @include(if: $shouldStream) @stream(if: $shouldStream) unread total } @@ -135,32 +149,10 @@ function createSubscription( document, rootValue: data, variableValues, + incrementalPreset, }); } -// TODO: consider adding this method to testUtils (with tests) -function expectPromise(maybePromise: unknown) { - expect(isPromise(maybePromise)).toBeTruthy(); - - return { - toResolve() { - return maybePromise; - }, - async toRejectWith(message: string) { - let caughtError: Error; - - try { - /* c8 ignore next 2 */ - await maybePromise; - } catch (error) { - caughtError = error as Error; - expect(caughtError).toBeInstanceOf(Error); - expect(caughtError).toHaveProperty('message', message); - } - }, - }; -} - const DummyQueryType = new GraphQLObjectType({ name: 'Query', fields: { @@ -721,7 +713,7 @@ describe('Subscription Publish Phase', () => { }); }); - it('produces additional payloads for subscriptions with @defer', async () => { + it('subscribe function returns errors with @defer', async () => { const pubsub = new SimplePubSub(); const subscription = await createSubscription(pubsub, { shouldDefer: true, @@ -741,6 +733,76 @@ describe('Subscription Publish Phase', () => { }), ).toBeTruthy(); + const errorPayload = { + done: false, + value: { + errors: [ + { + message: + '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', + locations: [{ line: 8, column: 7 }], + path: ['importantEmail'], + }, + ], + data: { importantEmail: null }, + }, + }; + + // The previously waited on payload now has a value. + expectJSON(await payload).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, + }), + ).toBeTruthy(); + + // The next waited on payload will have a value. + // @ts-expect-error we have asserted it is an async iterable + expectJSON(await subscription.next()).toDeepEqual(errorPayload); + + // @ts-expect-error + expectJSON(await subscription.return()).toDeepEqual({ + done: true, + value: undefined, + }); + + // Awaiting a subscription after closing it results in completed results. + // @ts-expect-error + expectJSON(await subscription.next()).toDeepEqual({ + done: true, + value: undefined, + }); + }); + + it('produces additional payloads for subscriptions with @defer if allowed', async () => { + const pubsub = new SimplePubSub(); + const subscription = await createSubscription( + pubsub, + { + shouldDefer: true, + }, + IncrementalDeliveryPresetLegacy, + ); + expect(isAsyncIterable(subscription)).toBeTruthy(); + // Wait for the next subscription payload. + // @ts-expect-error we have asserted it is an async iterable + const payload = subscription.next(); + + // A new email arrives! + expect( + pubsub.emit({ + from: 'yuzhi@graphql.org', + subject: 'Alright', + message: 'Tests are good', + unread: true, + }), + ).toBeTruthy(); + // The previously waited on payload now has a value. expectJSON(await payload).toDeepEqual({ done: false, @@ -866,6 +928,93 @@ describe('Subscription Publish Phase', () => { }); }); + it('subscribe function returns errors with @stream', async () => { + const pubsub = new SimplePubSub(); + const subscription = await createSubscription(pubsub, { + shouldStream: true, + }); + expect(isAsyncIterable(subscription)).toBeTruthy(); + // Wait for the next subscription payload. + // @ts-expect-error + const payload = subscription.next(); + + // A new email arrives! + expect( + pubsub.emit({ + from: 'yuzhi@graphql.org', + subject: 'Alright', + message: 'Tests are good', + unread: true, + }), + ).toBeTruthy(); + + // The previously waited on payload now has a value. + expectJSON(await payload).toDeepEqual({ + done: false, + value: { + errors: [ + { + message: + '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', + locations: [{ line: 18, column: 13 }], + path: ['importantEmail', 'inbox', 'emails'], + }, + ], + data: { + importantEmail: { + email: { from: 'yuzhi@graphql.org', subject: 'Alright' }, + inbox: { emails: null, unread: 1, total: 2 }, + }, + }, + }, + }); + + // 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, + }), + ).toBeTruthy(); + + // The next waited on payload will have a value. + // @ts-expect-error we have asserted it is an async iterable + expectJSON(await subscription.next()).toDeepEqual({ + done: false, + value: { + errors: [ + { + message: + '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', + locations: [{ line: 18, column: 13 }], + path: ['importantEmail', 'inbox', 'emails'], + }, + ], + data: { + importantEmail: { + email: { from: 'hyo@graphql.org', subject: 'Tools' }, + inbox: { emails: null, unread: 2, total: 3 }, + }, + }, + }, + }); + + // @ts-expect-error we have asserted it is an async iterable + expectJSON(await subscription.return()).toDeepEqual({ + done: true, + value: undefined, + }); + + // Awaiting a subscription after closing it results in completed results. + // @ts-expect-error we have asserted it is an async iterable + 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/packages/executor/src/execution/buildExecutionPlan.ts b/packages/executor/src/execution/buildExecutionPlan.ts new file mode 100644 index 00000000000..d054cfb858f --- /dev/null +++ b/packages/executor/src/execution/buildExecutionPlan.ts @@ -0,0 +1,95 @@ +import { AccumulatorMap } from './AccumulatorMap.js'; +import type { DeferUsage, FieldDetails, FieldGroup, GroupedFieldSet } from './collectFields.js'; +import { getBySet } from './getBySet.js'; +import { isSameSet } from './isSameSet.js'; + +export type DeferUsageSet = ReadonlySet; + +export interface ExecutionPlan { + groupedFieldSet: GroupedFieldSet; + newGroupedFieldSets: Map; +} + +export function buildExecutionPlan( + originalGroupedFieldSet: GroupedFieldSet, + parentDeferUsages: DeferUsageSet = new Set(), +): ExecutionPlan { + const groupedFieldSet = new Map(); + const newGroupedFieldSets = new Map>(); + for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { + const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); + + if (isSameSet(filteredDeferUsageSet, parentDeferUsages)) { + groupedFieldSet.set(responseKey, fieldGroup); + continue; + } + + let newGroupedFieldSet = getBySet(newGroupedFieldSets, filteredDeferUsageSet); + if (newGroupedFieldSet === undefined) { + newGroupedFieldSet = new Map(); + newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); + } + newGroupedFieldSet.set(responseKey, fieldGroup); + } + + return { + groupedFieldSet, + newGroupedFieldSets, + }; +} + +function getFilteredDeferUsageSet(fieldGroup: FieldGroup): ReadonlySet { + const filteredDeferUsageSet = new Set(); + for (const fieldDetails of fieldGroup) { + const deferUsage = fieldDetails.deferUsage; + if (deferUsage === undefined) { + filteredDeferUsageSet.clear(); + return filteredDeferUsageSet; + } + filteredDeferUsageSet.add(deferUsage); + } + + for (const deferUsage of filteredDeferUsageSet) { + let parentDeferUsage: DeferUsage | undefined = deferUsage.parentDeferUsage; + while (parentDeferUsage !== undefined) { + if (filteredDeferUsageSet.has(parentDeferUsage)) { + filteredDeferUsageSet.delete(deferUsage); + break; + } + parentDeferUsage = parentDeferUsage.parentDeferUsage; + } + } + return filteredDeferUsageSet; +} + +export function buildBranchingExecutionPlan( + originalGroupedFieldSet: GroupedFieldSet, + parentDeferUsages: DeferUsageSet = new Set(), +): ExecutionPlan { + const groupedFieldSet = new AccumulatorMap(); + + const newGroupedFieldSets = new Map>(); + + for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { + for (const fieldDetails of fieldGroup) { + const deferUsage = fieldDetails.deferUsage; + const deferUsageSet = + deferUsage === undefined ? new Set() : new Set([deferUsage]); + if (isSameSet(parentDeferUsages, deferUsageSet)) { + groupedFieldSet.add(responseKey, fieldDetails); + } else { + let newGroupedFieldSet = getBySet(newGroupedFieldSets, deferUsageSet); + if (newGroupedFieldSet === undefined) { + newGroupedFieldSet = new AccumulatorMap(); + newGroupedFieldSets.set(deferUsageSet, newGroupedFieldSet); + } + newGroupedFieldSet.add(responseKey, fieldDetails); + } + } + } + + return { + groupedFieldSet, + newGroupedFieldSets, + }; +} diff --git a/packages/executor/src/execution/collectFields.ts b/packages/executor/src/execution/collectFields.ts new file mode 100644 index 00000000000..efb7652b41d --- /dev/null +++ b/packages/executor/src/execution/collectFields.ts @@ -0,0 +1,296 @@ +import type { + FieldNode, + FragmentDefinitionNode, + FragmentSpreadNode, + GraphQLObjectType, + GraphQLSchema, + InlineFragmentNode, + SelectionSetNode, +} from 'graphql'; +import { + getDirectiveValues, + GraphQLIncludeDirective, + GraphQLSkipDirective, + isAbstractType, + Kind, + typeFromAST, +} from 'graphql'; +import { GraphQLDeferDirective, Path, pathToArray } from '@graphql-tools/utils'; +import { AccumulatorMap } from './AccumulatorMap.js'; +import { invariant } from './invariant.js'; + +export interface DeferUsage { + label: string | undefined; + parentDeferUsage: DeferUsage | undefined; + depth: number; +} + +export interface FieldDetails { + node: FieldNode; + deferUsage: DeferUsage | undefined; +} + +export type FieldGroup = ReadonlyArray; + +export type GroupedFieldSet = ReadonlyMap & { + encounteredDefer?: boolean; +}; + +interface CollectFieldsContext { + schema: GraphQLSchema; + fragments: Record; + variableValues: TVariables; + errorOnIncrementalDeliveryDirective: boolean; + runtimeType: GraphQLObjectType; + visitedFragmentNames: Set; + encounteredDefer: boolean; +} + +/** + * Given a selectionSet, collects all of the fields and returns them. + * + * CollectFields requires the "runtime type" of an object. For a field that + * returns an Interface or Union type, the "runtime type" will be the actual + * object type returned by that field. + * + * @internal + */ +export function collectFields( + schema: GraphQLSchema, + fragments: Record, + variableValues: TVariables, + runtimeType: GraphQLObjectType, + selectionSet: SelectionSetNode, + errorOnIncrementalDeliveryDirective: boolean, +): GroupedFieldSet { + const groupedFieldSet = new AccumulatorMap(); + const context: CollectFieldsContext = { + schema, + fragments, + variableValues, + runtimeType, + errorOnIncrementalDeliveryDirective, + visitedFragmentNames: new Set(), + encounteredDefer: false, + }; + + collectFieldsImpl(context, selectionSet, groupedFieldSet); + if (context.encounteredDefer) { + (groupedFieldSet as GroupedFieldSet).encounteredDefer = true; + } + return groupedFieldSet; +} + +/** + * Given an array of field nodes, collects all of the subfields of the passed + * in fields, and returns them at the end. + * + * CollectSubFields requires the "return type" of an object. For a field that + * returns an Interface or Union type, the "return type" will be the actual + * object type returned by that field. + * + * @internal + */ +export function collectSubfields( + schema: GraphQLSchema, + fragments: Record, + variableValues: { [variable: string]: unknown }, + errorOnIncrementalDeliveryDirective: boolean, + returnType: GraphQLObjectType, + fieldGroup: FieldGroup, + path: Path, +): GroupedFieldSet { + const context: CollectFieldsContext = { + schema, + fragments, + variableValues, + runtimeType: returnType, + errorOnIncrementalDeliveryDirective, + visitedFragmentNames: new Set(), + encounteredDefer: false, + }; + const subGroupedFieldSet = new AccumulatorMap(); + + for (const fieldDetail of fieldGroup) { + const { node, deferUsage } = fieldDetail; + if (node.selectionSet) { + collectFieldsImpl(context, node.selectionSet, subGroupedFieldSet, path, deferUsage); + } + } + + if (context.encounteredDefer) { + (subGroupedFieldSet as GroupedFieldSet).encounteredDefer = true; + } + return subGroupedFieldSet; +} + +function collectFieldsImpl( + context: CollectFieldsContext, + selectionSet: SelectionSetNode, + groupedFieldSet: AccumulatorMap, + path?: Path, + deferUsage?: DeferUsage, +): void { + const { + schema, + fragments, + variableValues, + runtimeType, + errorOnIncrementalDeliveryDirective, + visitedFragmentNames, + } = context; + + for (const selection of selectionSet.selections) { + switch (selection.kind) { + case Kind.FIELD: { + if (!shouldIncludeNode(variableValues, selection)) { + continue; + } + groupedFieldSet.add(getFieldEntryKey(selection), { + node: selection, + deferUsage, + }); + break; + } + case Kind.INLINE_FRAGMENT: { + if ( + !shouldIncludeNode(variableValues, selection) || + !doesFragmentConditionMatch(schema, selection, runtimeType) + ) { + continue; + } + + const newDeferUsage = getDeferUsage( + errorOnIncrementalDeliveryDirective, + variableValues, + selection, + path, + deferUsage, + ); + + if (!newDeferUsage) { + collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, path, deferUsage); + } else { + context.encounteredDefer = true; + collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, path, newDeferUsage); + } + + break; + } + case Kind.FRAGMENT_SPREAD: { + const fragName = selection.name.value; + + const newDeferUsage = getDeferUsage( + errorOnIncrementalDeliveryDirective, + variableValues, + selection, + path, + deferUsage, + ); + + if ( + !newDeferUsage && + (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection)) + ) { + continue; + } + + const fragment = fragments[fragName]; + if (fragment == null || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { + continue; + } + if (!newDeferUsage) { + visitedFragmentNames.add(fragName); + collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, path, deferUsage); + } else { + context.encounteredDefer = true; + collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, path, newDeferUsage); + } + 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 getDeferUsage( + errorOnIncrementalDeliveryDirective: boolean, + variableValues: { [variable: string]: unknown }, + node: FragmentSpreadNode | InlineFragmentNode, + path: Path | undefined, + parentDeferUsage: DeferUsage | undefined, +): DeferUsage | undefined { + const defer = getDirectiveValues(GraphQLDeferDirective, node, variableValues); + + if (!defer) { + return; + } + + if (defer['if'] === false) { + return; + } + + invariant( + !errorOnIncrementalDeliveryDirective, + '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', + ); + + return { + label: typeof defer['label'] === 'string' ? defer['label'] : undefined, + parentDeferUsage, + depth: pathToArray(path).length, + }; +} + +/** + * Determines if a field should be included based on the `@include` and `@skip` + * directives, where `@skip` has higher precedence than `@include`. + */ +function shouldIncludeNode( + variableValues: { [variable: string]: unknown }, + node: FragmentSpreadNode | FieldNode | InlineFragmentNode, +): boolean { + const skip = getDirectiveValues(GraphQLSkipDirective, node, variableValues); + if (skip?.['if'] === true) { + return false; + } + + const include = getDirectiveValues(GraphQLIncludeDirective, node, variableValues); + if (include?.['if'] === false) { + return false; + } + return true; +} + +/** + * Determines if a fragment is applicable to the given type. + */ +function doesFragmentConditionMatch( + schema: GraphQLSchema, + fragment: FragmentDefinitionNode | InlineFragmentNode, + type: GraphQLObjectType, +): boolean { + const typeConditionNode = fragment.typeCondition; + if (!typeConditionNode) { + return true; + } + const conditionalType = typeFromAST(schema, typeConditionNode); + if (conditionalType === type) { + return true; + } + if (isAbstractType(conditionalType)) { + return schema.isSubType(conditionalType, type); + } + return false; +} + +/** + * Implements the logic to compute the key of a given field's entry + */ +function getFieldEntryKey(node: FieldNode): string { + return node.alias ? node.alias.value : node.name.value; +} diff --git a/packages/executor/src/execution/execute.ts b/packages/executor/src/execution/execute.ts index 1978e4bc4bc..8a5d0356b33 100644 --- a/packages/executor/src/execution/execute.ts +++ b/packages/executor/src/execution/execute.ts @@ -8,12 +8,10 @@ import { GraphQLError, GraphQLField, GraphQLFieldResolver, - GraphQLFormattedError, GraphQLLeafType, GraphQLList, GraphQLObjectType, GraphQLOutputType, - GraphQLResolveInfo, GraphQLSchema, GraphQLTypeResolver, isAbstractType, @@ -24,19 +22,19 @@ import { Kind, locatedError, OperationDefinitionNode, + OperationTypeNode, SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef, versionInfo, } from 'graphql'; -import { ValueOrPromise } from 'value-or-promise'; import { - collectSubFields as _collectSubfields, addPath, - collectFields, createGraphQLError, + fakePromise, getArgumentValues, getDefinedRootType, + GraphQLResolveInfo, GraphQLStreamDirective, inspect, isAsyncIterable, @@ -47,37 +45,60 @@ import { Maybe, MaybePromise, memoize1, - memoize3, + memoize3of4, Path, pathToArray, promiseReduce, } from '@graphql-tools/utils'; import { TypedDocumentNode } from '@graphql-typed-document-node/core'; +import { DisposableSymbols } from '@whatwg-node/disposablestack'; +import { AccumulatorMap } from './AccumulatorMap.js'; +import { BoxedPromiseOrValue } from './BoxedPromiseOrValue.js'; +import type { DeferUsageSet, ExecutionPlan } from './buildExecutionPlan.js'; +import { buildBranchingExecutionPlan, buildExecutionPlan } from './buildExecutionPlan.js'; import { coerceError } from './coerceError.js'; +import type { FieldGroup, GroupedFieldSet } from './collectFields.js'; +import { collectSubfields as _collectSubfields, collectFields } from './collectFields.js'; +import { DeferredFragmentFactory } from './DeferredFragments.js'; import { flattenAsyncIterable } from './flattenAsyncIterable.js'; +import { buildIncrementalResponse } from './IncrementalPublisher.js'; import { invariant } from './invariant.js'; import { promiseForObject } from './promiseForObject.js'; +import type { + CancellableStreamRecord, + CompletedExecutionGroup, + IncrementalDataRecord, + IncrementalExecutionResults, + InitialIncrementalExecutionResult, + PendingExecutionGroup, + SingularExecutionResult, + StreamItemRecord, + StreamItemResult, + StreamRecord, + SubsequentIncrementalExecutionResult, +} from './types.js'; import { getVariableValues } from './values.js'; -export interface SingularExecutionResult { - errors?: ReadonlyArray; - data?: TData | null; - extensions?: TExtensions; -} - /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ -const collectSubfields = memoize3( - (exeContext: ExecutionContext, returnType: GraphQLObjectType, fieldNodes: Array) => +const collectSubfields = memoize3of4( + ( + exeContext: ExecutionContext, + returnType: GraphQLObjectType, + fieldGroup: FieldGroup, + path: Path, + ) => _collectSubfields( exeContext.schema, exeContext.fragments, exeContext.variableValues, + exeContext.errorOnIncrementalDeliveryDirective, returnType, - fieldNodes, + fieldGroup, + path, ), ); @@ -120,117 +141,65 @@ export interface ExecutionContext { fieldResolver: GraphQLFieldResolver; typeResolver: GraphQLTypeResolver; subscribeFieldResolver: GraphQLFieldResolver; - errors: Array; - subsequentPayloads: Set; - signal?: AbortSignal; -} - -export interface FormattedExecutionResult< - TData = Record, - TExtensions = Record, -> { - errors?: ReadonlyArray; - data?: TData | null; - extensions?: TExtensions; -} - -export interface IncrementalExecutionResults< - TData = Record, - TExtensions = Record, -> { - initialResult: InitialIncrementalExecutionResult; - subsequentResults: AsyncGenerator< - SubsequentIncrementalExecutionResult, - void, - void - >; -} - -export interface InitialIncrementalExecutionResult< - TData = Record, - TExtensions = Record, -> extends SingularExecutionResult { - hasNext: boolean; - incremental?: ReadonlyArray>; - extensions?: TExtensions; -} - -export interface FormattedInitialIncrementalExecutionResult< - TData = Record, - TExtensions = Record, -> extends FormattedExecutionResult { - hasNext: boolean; - incremental?: ReadonlyArray>; - extensions?: TExtensions; + enableEarlyExecution: boolean; + deferWithoutDuplication: boolean; + useIncrementalNotifications: boolean; + errorOnIncrementalDeliveryDirective: boolean; + signal: AbortSignal | undefined; + errors: AccumulatorMap | undefined; + encounteredDefer: boolean; + deferredFragmentFactory: DeferredFragmentFactory | undefined; + cancellableStreams: Set | undefined; + incrementalDataRecords: Array | undefined; } -export interface SubsequentIncrementalExecutionResult< - TData = Record, - TExtensions = Record, -> { - hasNext: boolean; - incremental?: ReadonlyArray>; - extensions?: TExtensions; -} - -export interface FormattedSubsequentIncrementalExecutionResult< - TData = Record, - TExtensions = Record, -> { - hasNext: boolean; - incremental?: ReadonlyArray>; - extensions?: TExtensions; -} - -export interface IncrementalDeferResult< - TData = Record, - TExtensions = Record, -> extends SingularExecutionResult { - path?: ReadonlyArray; - label?: string; -} - -export interface FormattedIncrementalDeferResult< - TData = Record, - TExtensions = Record, -> extends FormattedExecutionResult { - path?: ReadonlyArray; - label?: string; +interface IncrementalContext { + errors: AccumulatorMap | undefined; + deferUsageSet?: DeferUsageSet | undefined; + incrementalDataRecords: Array | undefined; } -export interface IncrementalStreamResult< - TData = Array, - TExtensions = Record, -> { - errors?: ReadonlyArray; - items?: TData | null; - path?: ReadonlyArray; - label?: string; - extensions?: TExtensions; -} +/** + * Configuration for the incremental delivery protocol. + */ +export type IncrementalDeliveryPreset = { + /** + * Whether results should be deduplicated. + */ + deferWithoutDuplication: boolean; + /** + * Setting `useIncrementalNotifications` to `false` will + * - omit the `pending` entries + * - send `path` and `label` on every `incremental` entry + * - omit `completed` entries, and (4) send incremental errors within `incremental` entries along with a `data` or `items` field set to `null`. + */ + useIncrementalNotifications: boolean; + /** + * Whether incremental delivery is enabled for subscription operations. + */ + allowSubscription: boolean; +}; -export interface FormattedIncrementalStreamResult< - TData = Array, - TExtensions = Record, -> { - errors?: ReadonlyArray; - items?: TData | null; - path?: ReadonlyArray; - label?: string; - extensions?: TExtensions; -} +/** + * Configuration for the incremental delivery response format as specified by + * https://github.com/graphql/defer-stream-wg/discussions/69 + */ +export const IncrementalDeliveryPreset2023_06_22: IncrementalDeliveryPreset = { + deferWithoutDuplication: true, + useIncrementalNotifications: true, + allowSubscription: false, +}; -export type IncrementalResult< - TData = Record, - TExtensions = Record, -> = IncrementalDeferResult | IncrementalStreamResult; +/** + * The initial candidate for the incremental delivery specification. Now legacy. + */ +export const IncrementalDeliveryPresetLegacy = { + deferWithoutDuplication: false, + useIncrementalNotifications: false, + allowSubscription: true, +}; -export type FormattedIncrementalResult< - TData = Record, - TExtensions = Record, -> = - | FormattedIncrementalDeferResult - | FormattedIncrementalStreamResult; +export type IncrementalPreset = Partial; export interface ExecutionArgs { schema: GraphQLSchema; @@ -242,9 +211,20 @@ export interface ExecutionArgs { fieldResolver?: Maybe>; typeResolver?: Maybe>; subscribeFieldResolver?: Maybe>; + enableEarlyExecution?: Maybe; + incrementalPreset?: Maybe; + deferWithoutDuplication?: Maybe; + useIncrementalNotifications?: Maybe; + errorOnSubscriptionWithIncrementalDelivery?: Maybe; signal?: AbortSignal; } +interface StreamUsage { + label: string | undefined; + initialCount: number; + fieldGroup: FieldGroup; +} + /** * Implements the "Executing requests" section of the GraphQL specification, * including `@defer` and `@stream` as proposed in @@ -272,7 +252,7 @@ export function execute( value: { ...e.extensions, http: { - ...e.extensions?.['http'], + ...(e.extensions?.['http'] || {}), status: 400, }, }, @@ -282,59 +262,7 @@ export function execute( }; } - return executeImpl(exeContext); -} - -function executeImpl( - exeContext: ExecutionContext, -): MaybePromise | IncrementalExecutionResults> { - if (exeContext.signal?.aborted) { - throw exeContext.signal.reason; - } - - // Return a Promise that will eventually resolve to the data described by - // The "Response" section of the GraphQL specification. - // - // If errors are encountered while executing a GraphQL field, only that - // field and its descendants will be omitted, and sibling fields will still - // be executed. An execution which encounters errors will still result in a - // resolved Promise. - // - // Errors from sub-fields of a NonNull type may propagate to the top level, - // at which point we still log the error and null the parent field, which - // in this case is the entire response. - const result = new ValueOrPromise(() => executeOperation(exeContext)) - .then( - data => { - const initialResult = buildResponse(data, exeContext.errors); - if (exeContext.subsequentPayloads.size > 0) { - return { - initialResult: { - ...initialResult, - hasNext: true, - }, - subsequentResults: yieldSubsequentPayloads(exeContext), - }; - } - - return initialResult; - }, - (error: any) => { - if (exeContext.signal?.aborted) { - throw exeContext.signal.reason; - } - - if (error.errors) { - exeContext.errors.push(...error.errors); - } else { - exeContext.errors.push(error); - } - return buildResponse(null, exeContext.errors); - }, - ) - .resolve()!; - - return result; + return executeOperation(exeContext); } /** @@ -357,11 +285,84 @@ export function executeSync(args: ExecutionArgs): SingularExecutionResult { * Given a completed execution context and data, build the `{ errors, data }` * response defined by the "Response" section of the GraphQL specification. */ -function buildResponse( - data: TData | null, - errors: ReadonlyArray, +function buildDataResponse( + exeContext: ExecutionContext, + data: TData, +): SingularExecutionResult | IncrementalExecutionResults { + const { errors, incrementalDataRecords } = exeContext; + if (incrementalDataRecords === undefined) { + return buildSingleResult(data, errors); + } + + if (errors === undefined) { + return buildIncrementalResponse(exeContext, data, undefined, incrementalDataRecords); + } + + const filteredIncrementalDataRecords = filterIncrementalDataRecords( + undefined, + errors, + incrementalDataRecords, + ); + + if (filteredIncrementalDataRecords.length === 0) { + return buildSingleResult(data, errors); + } + + return buildIncrementalResponse( + exeContext, + data, + flattenErrors(errors), + filteredIncrementalDataRecords, + ); +} + +function buildSingleResult( + data: TData, + errors: ReadonlyMap> | undefined, ): SingularExecutionResult { - return errors.length === 0 ? { data } : { errors, data }; + return errors !== undefined ? { errors: Array.from(errors.values()).flat(), data } : { data }; +} + +function filterIncrementalDataRecords( + initialPath: Path | undefined, + errors: ReadonlyMap>, + incrementalDataRecords: ReadonlyArray, +): ReadonlyArray { + const filteredIncrementalDataRecords: Array = []; + for (const incrementalDataRecord of incrementalDataRecords) { + let currentPath = incrementalDataRecord.path; + + if (errors.has(currentPath)) { + continue; + } + + const paths: Array = [currentPath]; + let filtered = false; + while (currentPath !== initialPath) { + // Because currentPath leads to initialPath or is undefined, and the + // loop will exit if initialPath is undefined, currentPath must be + // defined. + // TODO: Consider, however, adding an invariant. + + currentPath = currentPath!.prev; + if (errors.has(currentPath)) { + filtered = true; + break; + } + paths.push(currentPath); + } + + if (!filtered) { + filteredIncrementalDataRecords.push(incrementalDataRecord); + } + } + + return filteredIncrementalDataRecords; +} + +function flattenErrors(errors: ReadonlyMap>) { + const errorsByPath = [...errors.values()]; + return errorsByPath.flat(); } /** @@ -421,6 +422,8 @@ export function buildExecutionContext( exeContext: ExecutionContext, -): MaybePromise { - const { operation, schema, fragments, variableValues, rootValue } = exeContext; - const rootType = getDefinedRootType(schema, operation.operation, [operation]); - if (rootType == null) { - createGraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { - nodes: operation, - }); +): MaybePromise | IncrementalExecutionResults> { + if (exeContext.signal?.aborted) { + throw exeContext.signal.reason; } - const { fields: rootFields, patches } = collectFields( - schema, - fragments, - variableValues, - rootType, - operation.selectionSet, - ); - const path = undefined; - let result: MaybePromise; + try { + const { + operation, + schema, + fragments, + variableValues, + rootValue, + deferWithoutDuplication, + errorOnIncrementalDeliveryDirective: errorOnSubscriptionWithIncrementalDelivery, + } = exeContext; + const rootType = getDefinedRootType(schema, operation.operation, [operation]); + if (rootType == null) { + createGraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { + nodes: operation, + }); + } + + const originalGroupedFieldSet = collectFields( + schema, + fragments, + variableValues, + rootType, + operation.selectionSet, + errorOnSubscriptionWithIncrementalDelivery, + ); + let data: MaybePromise; + if (!originalGroupedFieldSet.encounteredDefer) { + data = executeRootGroupedFieldSet( + exeContext, + operation.operation, + rootType, + rootValue, + originalGroupedFieldSet, + ); + } else { + exeContext.encounteredDefer = true; + const { groupedFieldSet, newGroupedFieldSets } = deferWithoutDuplication + ? buildExecutionPlan(originalGroupedFieldSet) + : buildBranchingExecutionPlan(originalGroupedFieldSet); + + data = executeRootGroupedFieldSet( + exeContext, + operation.operation, + rootType, + rootValue, + groupedFieldSet, + ); + + if (newGroupedFieldSets.size > 0) { + const newPendingExecutionGroups = collectExecutionGroups( + exeContext, + rootType, + rootValue, + undefined, + undefined, + newGroupedFieldSets, + ); + + addIncrementalDataRecords(exeContext, newPendingExecutionGroups); + } + } + if (isPromise(data)) { + return data.then( + resolved => buildDataResponse(exeContext, resolved), + error => { + if (exeContext.signal?.aborted) { + throw exeContext.signal.reason; + } + return { + data: null, + errors: withError(exeContext.errors, error), + }; + }, + ); + } + return buildDataResponse(exeContext, data); + } catch (error: any) { + if (exeContext.signal?.aborted) { + throw exeContext.signal.reason; + } + return { data: null, errors: withError(exeContext.errors, error) }; + } +} - if (operation.operation === 'mutation') { - result = executeFieldsSerially(exeContext, rootType, rootValue, path, rootFields); +function executeRootGroupedFieldSet( + exeContext: ExecutionContext, + operation: OperationTypeNode, + rootType: GraphQLObjectType, + rootValue: unknown, + groupedFieldSet: GroupedFieldSet, +): MaybePromise { + let result: MaybePromise; + if (operation === 'mutation') { + result = executeFieldsSerially( + exeContext, + rootType, + rootValue, + undefined, + groupedFieldSet, + undefined, + ); } else { - result = executeFields(exeContext, rootType, rootValue, path, rootFields) as TData; + result = executeFields( + exeContext, + rootType, + rootValue, + undefined, + groupedFieldSet, + undefined, + ) as MaybePromise; } + return result; +} - for (const patch of patches) { - const { label, fields: patchFields } = patch; - executeDeferredFragment(exeContext, rootType, rootValue, patchFields, label, path); +function addIncrementalDataRecords( + context: ExecutionContext | IncrementalContext, + newIncrementalDataRecords: ReadonlyArray, +): void { + const incrementalDataRecords = context.incrementalDataRecords; + if (incrementalDataRecords === undefined) { + context.incrementalDataRecords = [...newIncrementalDataRecords]; + return; } + incrementalDataRecords.push(...newIncrementalDataRecords); +} - return result; +function withError( + errors: ReadonlyMap> | undefined, + error: GraphQLError | AggregateError, +): ReadonlyArray { + const newErrors = 'errors' in error ? error.errors : [error]; + return errors === undefined ? newErrors : [...flattenErrors(errors), ...newErrors]; } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ -function executeFieldsSerially( +function executeFieldsSerially( exeContext: ExecutionContext, parentType: GraphQLObjectType, sourceValue: unknown, path: Path | undefined, - fields: Map>, + groupedFieldSet: GroupedFieldSet, + incrementalContext: IncrementalContext | undefined, ): MaybePromise { return promiseReduce( - fields, - (results, [responseName, fieldNodes]) => { + groupedFieldSet, + (results, [responseName, fieldGroup]) => { const fieldPath = addPath(path, responseName, parentType.name); if (exeContext.signal?.aborted) { throw exeContext.signal.reason; } - return new ValueOrPromise(() => - executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath), - ).then(result => { - if (result === undefined) { - return results; - } - - results[responseName] = result; - + const result = executeField( + exeContext, + parentType, + sourceValue, + fieldGroup, + fieldPath, + incrementalContext, + ); + if (result === undefined) { return results; - }); + } + if (isPromise(result)) { + return result.then(resolved => { + results[responseName] = resolved; + return results; + }); + } + results[responseName] = result; + return results; }, Object.create(null), - ).resolve(); + ); } /** @@ -585,14 +718,14 @@ function executeFields( parentType: GraphQLObjectType, sourceValue: unknown, path: Path | undefined, - fields: Map>, - asyncPayloadRecord?: AsyncPayloadRecord, + groupedFieldSet: GroupedFieldSet, + incrementalContext: IncrementalContext | undefined, ): MaybePromise> { const results = Object.create(null); let containsPromise = false; try { - for (const [responseName, fieldNodes] of fields) { + for (const [responseName, fieldGroup] of groupedFieldSet) { if (exeContext.signal?.aborted) { throw exeContext.signal.reason; } @@ -602,9 +735,9 @@ function executeFields( exeContext, parentType, sourceValue, - fieldNodes, + fieldGroup, fieldPath, - asyncPayloadRecord, + incrementalContext, ); if (result !== undefined) { @@ -619,12 +752,12 @@ function executeFields( // Ensure that any promises returned by other fields are handled, as they may also reject. return promiseForObject(results, exeContext.signal).finally(() => { throw error; - }); + }) as never; } throw error; } - // If there are no promises, we can just return the object + // If there are no promises, we can just return the object and any incrementalDataRecords if (!containsPromise) { return results; } @@ -635,6 +768,10 @@ function executeFields( return promiseForObject(results, exeContext.signal); } +function toNodes(fieldGroup: FieldGroup): Array { + return fieldGroup.map(fieldDetails => fieldDetails.node); +} + /** * Implements the "Executing fields" section of the spec * In particular, this function figures out the value that the field returns by @@ -645,12 +782,11 @@ function executeField( exeContext: ExecutionContext, parentType: GraphQLObjectType, source: unknown, - fieldNodes: Array, + fieldGroup: FieldGroup, path: Path, - asyncPayloadRecord?: AsyncPayloadRecord, -): MaybePromise { - const errors = asyncPayloadRecord?.errors ?? exeContext.errors; - const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); + incrementalContext: IncrementalContext | undefined, +): MaybePromise | undefined { + const fieldDef = getFieldDef(exeContext.schema, parentType, fieldGroup[0].node); if (!fieldDef) { return; } @@ -658,14 +794,14 @@ function executeField( const returnType = fieldDef.type; const resolveFn = fieldDef.resolve ?? exeContext.fieldResolver; - const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); + const info = buildResolveInfo(exeContext, fieldDef, toNodes(fieldGroup), parentType, path); // Get the resolve function, regardless of if its result is normal or abrupt (error). try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. - const args = getArgumentValues(fieldDef, fieldNodes[0], exeContext.variableValues); + const args = getArgumentValues(fieldDef, fieldGroup[0].node, exeContext.variableValues); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly @@ -674,61 +810,40 @@ function executeField( const result = resolveFn(source, args, contextValue, info); - let completed; if (isPromise(result)) { - completed = result.then(resolved => - completeValue(exeContext, returnType, fieldNodes, info, path, resolved, asyncPayloadRecord), - ); - } else { - completed = completeValue( + return completePromisedValue( exeContext, returnType, - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); } + const completed = completeValue( + exeContext, + returnType, + fieldGroup, + info, + path, + result, + incrementalContext, + ); + if (isPromise(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, rawError => { - if (rawError instanceof AggregateError) { - return new AggregateError( - rawError.errors.map(rawErrorItem => { - rawErrorItem = coerceError(rawErrorItem); - const error = locatedError(rawErrorItem, fieldNodes, pathToArray(path)); - const handledError = handleFieldError(error, returnType, errors); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return handledError; - }), - ); - } - rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(path)); - const handledError = handleFieldError(error, returnType, errors); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return handledError; + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return null; }); } return completed; } catch (rawError) { - if (rawError instanceof AggregateError) { - return new AggregateError( - rawError.errors.map(rawErrorItem => { - const coercedError = coerceError(rawErrorItem); - const error = locatedError(coercedError, fieldNodes, pathToArray(path)); - return handleFieldError(error, returnType, errors); - }), - ); - } - const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(path)); - const handledError = handleFieldError(error, returnType, errors); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return handledError; + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return null; } } @@ -756,16 +871,29 @@ export function buildResolveInfo( rootValue: exeContext.rootValue, operation: exeContext.operation, variableValues: exeContext.variableValues, + signal: exeContext.signal, }; } export const CRITICAL_ERROR = 'CRITICAL_ERROR' as const; function handleFieldError( - error: GraphQLError, + rawError: unknown, + exeContext: ExecutionContext, returnType: GraphQLOutputType, - errors: Array, -): null { + fieldGroup: FieldGroup, + path: Path, + incrementalContext: IncrementalContext | undefined, +): void { + if (rawError instanceof AggregateError) { + for (const rawErrorItem of rawError.errors) { + handleFieldError(rawErrorItem, exeContext, returnType, fieldGroup, path, incrementalContext); + } + return; + } + + const error = locatedError(coerceError(rawError), toNodes(fieldGroup), pathToArray(path)); + // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if (isNonNullType(returnType)) { @@ -778,8 +906,13 @@ function handleFieldError( // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - errors.push(error); - return null; + const context = incrementalContext ?? exeContext; + let errors = context.errors; + if (errors === undefined) { + errors = new AccumulatorMap(); + context.errors = errors; + } + errors.add(path, error); } /** @@ -806,11 +939,11 @@ function handleFieldError( function completeValue( exeContext: ExecutionContext, returnType: GraphQLOutputType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): MaybePromise { // If result is an Error, throw a located error. if (result instanceof Error) { @@ -823,13 +956,13 @@ function completeValue( const completed = completeValue( exeContext, returnType.ofType, - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); - if (completed === null) { + if (completed == null) { throw new Error( `Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`, ); @@ -847,11 +980,11 @@ function completeValue( return completeListValue( exeContext, returnType, - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); } @@ -867,11 +1000,11 @@ function completeValue( return completeAbstractValue( exeContext, returnType, - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); } @@ -880,43 +1013,75 @@ function completeValue( return completeObjectValue( exeContext, returnType, - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. - console.assert(false, 'Cannot complete value of unexpected output type: ' + inspect(returnType)); + invariant(false, 'Cannot complete value of unexpected output type: ' + inspect(returnType)); +} + +async function completePromisedValue( + exeContext: ExecutionContext, + returnType: GraphQLOutputType, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + path: Path, + result: PromiseLike, + incrementalContext: IncrementalContext | undefined, +): Promise { + try { + const resolved = await result; + let completed = completeValue( + exeContext, + returnType, + fieldGroup, + info, + path, + resolved, + incrementalContext, + ); + + if (isPromise(completed)) { + completed = await completed; + } + return completed; + } catch (rawError) { + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return null; + } } /** - * Returns an object containing the `@stream` arguments if a field should be + * Returns an object containing info for streaming if a field should be * streamed based on the experimental flag, stream directive present and * not disabled by the "if" argument. */ -function getStreamValues( +function getStreamUsage( exeContext: ExecutionContext, - fieldNodes: Array, + fieldGroup: FieldGroup, path: Path, -): - | undefined - | { - initialCount: number | undefined; - label: string | undefined; - } { +): StreamUsage | undefined { // do not stream inner lists of multi-dimensional lists if (typeof path.key === 'number') { return; } + // TODO: add test for this case (a streamed list nested under a list). + /* c8 ignore next 7 */ + if ((fieldGroup as unknown as { _streamUsage: StreamUsage })._streamUsage !== undefined) { + return (fieldGroup as unknown as { _streamUsage: StreamUsage })._streamUsage; + } + // 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], + fieldGroup[0].node, exeContext.variableValues, ) as { initialCount: number; @@ -936,10 +1101,25 @@ function getStreamValues( invariant(stream['initialCount'] >= 0, 'initialCount must be a positive integer'); - return { + invariant( + !exeContext.errorOnIncrementalDeliveryDirective, + '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', + ); + + const streamedFieldGroup: FieldGroup = fieldGroup.map(fieldDetails => ({ + node: fieldDetails.node, + deferUsage: undefined, + })); + + const streamUsage = { initialCount: stream['initialCount'], label: typeof stream['label'] === 'string' ? stream['label'] : undefined, + fieldGroup: streamedFieldGroup, }; + + (fieldGroup as unknown as { _streamUsage: StreamUsage })._streamUsage = streamUsage; + + return streamUsage; } /** @@ -949,69 +1129,124 @@ function getStreamValues( async function completeAsyncIteratorValue( exeContext: ExecutionContext, itemType: GraphQLOutputType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, - iterator: AsyncIterator, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncIterator: AsyncIterator, + incrementalContext: IncrementalContext | undefined, ): Promise> { exeContext.signal?.addEventListener('abort', () => { - iterator.return?.(); + asyncIterator.return?.(); }); - const errors = asyncPayloadRecord?.errors ?? exeContext.errors; - const stream = getStreamValues(exeContext, fieldNodes, path); let containsPromise = false; const completedResults: Array = []; let index = 0; + const streamUsage = getStreamUsage(exeContext, fieldGroup, path); + const earlyReturn = + asyncIterator.return === undefined ? undefined : asyncIterator.return.bind(asyncIterator); + try { + while (true) { + if (streamUsage && index >= streamUsage.initialCount) { + const streamItemQueue = buildAsyncStreamItemQueue( + index, + path, + asyncIterator, + exeContext, + streamUsage.fieldGroup, + info, + itemType, + ); - while (true) { - if (stream && typeof stream.initialCount === 'number' && index >= stream.initialCount) { - executeStreamIterator( - index, - iterator, - exeContext, - fieldNodes, - info, - itemType, - path, - stream.label, - asyncPayloadRecord, - ); - break; - } + let streamRecord: StreamRecord | CancellableStreamRecord; + if (earlyReturn === undefined) { + streamRecord = { + label: streamUsage.label, + path, + index, + streamItemQueue, + }; + } else { + streamRecord = { + label: streamUsage.label, + path, + index, + streamItemQueue, + earlyReturn, + }; + if (exeContext.cancellableStreams === undefined) { + exeContext.cancellableStreams = new Set(); + } + exeContext.cancellableStreams.add(streamRecord); + } - const itemPath = addPath(path, index, undefined); - let iteration; - try { - iteration = await iterator.next(); + const context = incrementalContext ?? exeContext; + addIncrementalDataRecords(context, [streamRecord]); + break; + } + + const itemPath = addPath(path, index, undefined); + let iteration; + try { + iteration = await asyncIterator.next(); + } catch (rawError) { + throw locatedError(coerceError(rawError), toNodes(fieldGroup), pathToArray(path)); + } + + // TODO: add test case for stream returning done before initialCount + /* c8 ignore next 3 */ if (iteration.done) { break; } - } catch (rawError) { - const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); - completedResults.push(handleFieldError(error, itemType, errors)); - break; - } - if ( - completeListItemValue( - iteration.value, - completedResults, - errors, - exeContext, - itemType, - fieldNodes, - info, - itemPath, - asyncPayloadRecord, - ) - ) { - containsPromise = true; + const item = iteration.value; + // TODO: add tests for stream backed by asyncIterator that returns a promise + /* c8 ignore start */ + if (isPromise(item)) { + completedResults.push( + completePromisedListItemValue( + item, + exeContext, + itemType, + fieldGroup, + info, + itemPath, + incrementalContext, + ), + ); + containsPromise = true; + } else if ( + /* c8 ignore stop */ + completeListItemValue( + item, + completedResults, + exeContext, + itemType, + fieldGroup, + info, + itemPath, + incrementalContext, + ) + // TODO: add tests for stream backed by asyncIterator that completes to a promise + /* c8 ignore start */ + ) { + containsPromise = true; + } + /* c8 ignore stop */ + index++; } - index += 1; + } catch (error) { + if (earlyReturn !== undefined) { + earlyReturn().catch(() => { + /* c8 ignore next 1 */ + // ignore error + }); + } + throw error; } - return containsPromise ? Promise.all(completedResults) : completedResults; + + return containsPromise + ? /* c8 ignore start */ Promise.all(completedResults) + : /* c8 ignore stop */ completedResults; } /** @@ -1021,26 +1256,25 @@ async function completeAsyncIteratorValue( function completeListValue( exeContext: ExecutionContext, returnType: GraphQLList, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): MaybePromise> { const itemType = returnType.ofType; - const errors = asyncPayloadRecord?.errors ?? exeContext.errors; if (isAsyncIterable(result)) { - const iterator = result[Symbol.asyncIterator](); + const asyncIterator = result[Symbol.asyncIterator](); return completeAsyncIteratorValue( exeContext, itemType, - fieldNodes, + fieldGroup, info, path, - iterator, - asyncPayloadRecord, + asyncIterator, + incrementalContext, ); } @@ -1050,52 +1284,93 @@ function completeListValue( ); } - const stream = getStreamValues(exeContext, fieldNodes, path); + return completeIterableValue( + exeContext, + itemType, + fieldGroup, + info, + path, + result, + incrementalContext, + ); +} +function completeIterableValue( + exeContext: ExecutionContext, + itemType: GraphQLOutputType, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + path: Path, + items: Iterable, + incrementalContext: IncrementalContext | undefined, +): MaybePromise> { // 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; - let previousAsyncPayloadRecord = asyncPayloadRecord; const completedResults: Array = []; let index = 0; - for (const item of result) { + const streamUsage = getStreamUsage(exeContext, fieldGroup, path); + const iterator = items[Symbol.iterator](); + let iteration = iterator.next(); + while (!iteration.done) { + const item = iteration.value; + + if (streamUsage && index >= streamUsage.initialCount) { + const streamRecord: StreamRecord = { + label: streamUsage.label, + path, + index, + streamItemQueue: buildSyncStreamItemQueue( + item, + index, + path, + iterator, + exeContext, + streamUsage.fieldGroup, + info, + itemType, + ), + }; + + const context = incrementalContext ?? exeContext; + addIncrementalDataRecords(context, [streamRecord]); + break; + } + // 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); - if (stream && typeof stream.initialCount === 'number' && index >= stream.initialCount) { - previousAsyncPayloadRecord = executeStreamField( - path, - itemPath, - item, - exeContext, - fieldNodes, - info, - itemType, - stream.label, - previousAsyncPayloadRecord, + if (isPromise(item)) { + completedResults.push( + completePromisedListItemValue( + item, + exeContext, + itemType, + fieldGroup, + info, + itemPath, + incrementalContext, + ), ); - index++; - continue; - } - - if ( + containsPromise = true; + } else if ( completeListItemValue( item, completedResults, - errors, exeContext, itemType, - fieldNodes, + fieldGroup, info, itemPath, - asyncPayloadRecord, + incrementalContext, ) ) { containsPromise = true; } - index++; + + iteration = iterator.next(); } return containsPromise ? Promise.all(completedResults) : completedResults; @@ -1109,68 +1384,81 @@ function completeListValue( function completeListItemValue( item: unknown, completedResults: Array, - errors: Array, exeContext: ExecutionContext, itemType: GraphQLOutputType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemPath: Path, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): boolean { try { - let completedItem; - 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, - ); - } + const completedItem = completeValue( + exeContext, + itemType, + fieldGroup, + info, + itemPath, + item, + incrementalContext, + ); 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. completedResults.push( completedItem.then(undefined, rawError => { - rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); - const handledError = handleFieldError(error, itemType, errors); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); - return handledError; + handleFieldError( + rawError, + exeContext, + itemType, + fieldGroup, + itemPath, + incrementalContext, + ); + return null; }), ); - return true; } completedResults.push(completedItem); } catch (rawError) { - const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); - const handledError = handleFieldError(error, itemType, errors); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); - completedResults.push(handledError); + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + completedResults.push(null); } - return false; } +async function completePromisedListItemValue( + item: unknown, + exeContext: ExecutionContext, + itemType: GraphQLOutputType, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + itemPath: Path, + incrementalContext: IncrementalContext | undefined, +): Promise { + try { + const resolved = await item; + let completed = completeValue( + exeContext, + itemType, + fieldGroup, + info, + itemPath, + resolved, + incrementalContext, + ); + if (isPromise(completed)) { + completed = await completed; + } + return completed; + } catch (rawError) { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + return null; + } +} + /** * Complete a Scalar or Enum by serializing to a valid value, returning * null if serialization is not possible. @@ -1207,11 +1495,11 @@ function completeLeafValue(returnType: GraphQLLeafType, result: unknown): unknow function completeAbstractValue( exeContext: ExecutionContext, returnType: GraphQLAbstractType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): MaybePromise> { const resolveTypeFn = returnType.resolveType ?? exeContext.typeResolver; const contextValue = exeContext.contextValue; @@ -1225,27 +1513,27 @@ function completeAbstractValue( resolvedRuntimeType, exeContext, returnType, - fieldNodes, + fieldGroup, info, result, ), - fieldNodes, + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ), ); } return completeObjectValue( exeContext, - ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), - fieldNodes, + ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldGroup, info, result), + fieldGroup, info, path, result, - asyncPayloadRecord, + incrementalContext, ); } @@ -1253,14 +1541,14 @@ function ensureValidRuntimeType( runtimeTypeName: unknown, exeContext: ExecutionContext, returnType: GraphQLAbstractType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, result: unknown, ): GraphQLObjectType { if (runtimeTypeName == null) { throw createGraphQLError( `Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, - { nodes: fieldNodes }, + { nodes: toNodes(fieldGroup) }, ); } @@ -1286,21 +1574,21 @@ function ensureValidRuntimeType( if (runtimeType == null) { throw createGraphQLError( `Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, - { nodes: fieldNodes }, + { nodes: toNodes(fieldGroup) }, ); } if (!isObjectType(runtimeType)) { throw createGraphQLError( `Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, - { nodes: fieldNodes }, + { nodes: toNodes(fieldGroup) }, ); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw createGraphQLError( `Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, - { nodes: fieldNodes }, + { nodes: toNodes(fieldGroup) }, ); } @@ -1313,11 +1601,11 @@ function ensureValidRuntimeType( function completeObjectValue( exeContext: ExecutionContext, returnType: GraphQLObjectType, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): MaybePromise> { // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather @@ -1328,60 +1616,70 @@ function completeObjectValue( if (isPromise(isTypeOf)) { return isTypeOf.then(resolvedIsTypeOf => { if (!resolvedIsTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldNodes); + throw invalidReturnTypeError(returnType, result, fieldGroup); } return collectAndExecuteSubfields( exeContext, returnType, - fieldNodes, + fieldGroup, path, result, - asyncPayloadRecord, + incrementalContext, ); }); } if (!isTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldNodes); + throw invalidReturnTypeError(returnType, result, fieldGroup); } } return collectAndExecuteSubfields( exeContext, returnType, - fieldNodes, + fieldGroup, path, result, - asyncPayloadRecord, + incrementalContext, ); } function invalidReturnTypeError( returnType: GraphQLObjectType, result: unknown, - fieldNodes: Array, + fieldGroup: FieldGroup, ): GraphQLError { return createGraphQLError( `Expected value of type "${returnType.name}" but got: ${inspect(result)}.`, - { - nodes: fieldNodes, - }, + { nodes: toNodes(fieldGroup) }, ); } function collectAndExecuteSubfields( exeContext: ExecutionContext, returnType: GraphQLObjectType, - fieldNodes: Array, + fieldGroup: FieldGroup, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + incrementalContext: IncrementalContext | undefined, ): MaybePromise> { // Collect sub-fields to execute to complete this value. - const { fields: subFieldNodes, patches: subPatches } = collectSubfields( - exeContext, - returnType, - fieldNodes, + const originalGroupedFieldSet = collectSubfields(exeContext, returnType, fieldGroup, path); + if (!exeContext.encounteredDefer && !originalGroupedFieldSet.encounteredDefer) { + return executeFields( + exeContext, + returnType, + result, + path, + originalGroupedFieldSet, + incrementalContext, + ); + } + exeContext.encounteredDefer = true; + const { groupedFieldSet, newGroupedFieldSets } = buildSubExecutionPlan( + originalGroupedFieldSet, + incrementalContext?.deferUsageSet, + exeContext.deferWithoutDuplication, ); const subFields = executeFields( @@ -1389,26 +1687,44 @@ function collectAndExecuteSubfields( returnType, result, path, - subFieldNodes, - asyncPayloadRecord, + groupedFieldSet, + incrementalContext, ); - for (const subPatch of subPatches) { - const { label, fields: subPatchFieldNodes } = subPatch; - executeDeferredFragment( + if (newGroupedFieldSets.size > 0) { + const newPendingExecutionGroups = collectExecutionGroups( exeContext, returnType, result, - subPatchFieldNodes, - label, path, - asyncPayloadRecord, + incrementalContext?.deferUsageSet, + newGroupedFieldSets, ); - } + const context = incrementalContext ?? exeContext; + addIncrementalDataRecords(context, newPendingExecutionGroups); + } return subFields; } +function buildSubExecutionPlan( + originalGroupedFieldSet: GroupedFieldSet, + deferUsageSet: DeferUsageSet | undefined, + deferWithoutDuplication: boolean, +): ExecutionPlan { + let executionPlan = (originalGroupedFieldSet as unknown as { _executionPlan: ExecutionPlan }) + ._executionPlan; + if (executionPlan !== undefined) { + return executionPlan; + } + executionPlan = deferWithoutDuplication + ? buildExecutionPlan(originalGroupedFieldSet, deferUsageSet) + : buildBranchingExecutionPlan(originalGroupedFieldSet, deferUsageSet); + (originalGroupedFieldSet as unknown as { _executionPlan: ExecutionPlan })._executionPlan = + executionPlan; + return executionPlan; +} + /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -1432,7 +1748,7 @@ export const defaultTypeResolver: GraphQLTypeResolver = functi // Otherwise, test each possible type. const possibleTypes = info.schema.getPossibleTypes(abstractType); - const promisedIsTypeOfResults = []; + const promisedIsTypeOfResults: any[] = []; for (let i = 0; i < possibleTypes.length; i++) { const type = possibleTypes[i]; @@ -1514,6 +1830,25 @@ export const defaultFieldResolver: GraphQLFieldResolver = func * * Accepts an object with named arguments. */ +export function subscribe( + args: ExecutionArgs & { + errorOnSubscriptionWithIncrementalDelivery: true | undefined | null; + }, +): MaybePromise< + AsyncGenerator, void, void> | SingularExecutionResult +>; +export function subscribe( + args: ExecutionArgs, +): MaybePromise< + | AsyncGenerator< + | SingularExecutionResult + | InitialIncrementalExecutionResult + | SubsequentIncrementalExecutionResult, + void, + void + > + | SingularExecutionResult +>; export function subscribe( args: ExecutionArgs, ): MaybePromise< @@ -1538,7 +1873,7 @@ export function subscribe( value: { ...e.extensions, http: { - ...e.extensions?.['http'], + ...(e.extensions?.['http'] || {}), status: 400, }, }, @@ -1575,16 +1910,13 @@ export function flattenIncrementalResults( }, next() { if (done) { - return Promise.resolve({ - value: undefined, - done, - }); + return fakePromise({ value: undefined, done }); } if (initialResultSent) { return subsequentIterator.next(); } initialResultSent = true; - return Promise.resolve({ + return fakePromise({ value: incrementalResults.initialResult, done, }); @@ -1597,6 +1929,10 @@ export function flattenIncrementalResults( done = true; return subsequentIterator.throw(error); }, + [DisposableSymbols.asyncDispose]() { + done = true; + return subsequentIterator?.[DisposableSymbols.asyncDispose]?.(); + }, }; } @@ -1643,7 +1979,9 @@ function mapSourceToResponse( mapAsyncIterator( resultOrStream, async (payload: unknown) => - ensureAsyncIterable(await executeImpl(buildPerEventExecutionContext(exeContext, payload))), + ensureAsyncIterable( + await executeOperation(buildPerEventExecutionContext(exeContext, payload)), + ), (error: Error) => { if (error instanceof AggregateError) { throw new AggregateError( @@ -1680,7 +2018,14 @@ function createSourceEventStreamImpl( } function executeSubscription(exeContext: ExecutionContext): MaybePromise> { - const { schema, fragments, operation, variableValues, rootValue } = exeContext; + const { + schema, + fragments, + operation, + variableValues, + rootValue, + errorOnIncrementalDeliveryDirective, + } = exeContext; const rootType = schema.getSubscriptionType(); if (rootType == null) { @@ -1689,25 +2034,27 @@ function executeSubscription(exeContext: ExecutionContext): MaybePromise { - throw locatedError(error, fieldNodes, pathToArray(path)); + throw locatedError(error, toNodes(fieldGroup), pathToArray(path)); }); } return assertEventStream(result, exeContext.signal); } catch (error) { - throw locatedError(error, fieldNodes, pathToArray(path)); + throw locatedError(error, toNodes(fieldGroup), pathToArray(path)); } } @@ -1761,495 +2108,435 @@ function assertEventStream(result: unknown, signal?: AbortSignal): AsyncIterable }; } -function executeDeferredFragment( +function collectExecutionGroups( 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: Path | undefined, + parentDeferUsages: DeferUsageSet | undefined, + newGroupedFieldSets: Map, +): ReadonlyArray { + const newPendingExecutionGroups: Array = []; + + for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) { + const pendingExecutionGroup: PendingExecutionGroup = { + deferUsages: deferUsageSet, path, - fields, - asyncPayloadRecord, - ); + result: undefined as unknown as BoxedPromiseOrValue, + }; - if (isPromise(promiseOrData)) { - promiseOrData = promiseOrData.then(null, e => { - asyncPayloadRecord.errors.push(e); - return null; - }); + const executor = () => + executeExecutionGroup( + pendingExecutionGroup, + exeContext, + parentType, + sourceValue, + path, + groupedFieldSet, + { + errors: undefined, + deferUsageSet, + incrementalDataRecords: undefined, + }, + ); + + if (exeContext.enableEarlyExecution) { + pendingExecutionGroup.result = new BoxedPromiseOrValue( + shouldDefer(parentDeferUsages, deferUsageSet) + ? Promise.resolve().then(executor) + : executor(), + ); + } else { + pendingExecutionGroup.result = () => new BoxedPromiseOrValue(executor()); + const resolveThunk = () => { + const maybeThunk = pendingExecutionGroup.result; + if (!(maybeThunk instanceof BoxedPromiseOrValue)) { + pendingExecutionGroup.result = maybeThunk(); + } + }; + let deferredFragmentFactory = exeContext.deferredFragmentFactory; + if (deferredFragmentFactory === undefined) { + exeContext.deferredFragmentFactory = deferredFragmentFactory = + new DeferredFragmentFactory(); + } + for (const deferUsage of deferUsageSet) { + const deferredFragmentRecord = deferredFragmentFactory.get(deferUsage, path); + deferredFragmentRecord.onPending(resolveThunk); + } } - } catch (e) { - asyncPayloadRecord.errors.push(e as GraphQLError); - promiseOrData = null; + + newPendingExecutionGroups.push(pendingExecutionGroup); } - asyncPayloadRecord.addData(promiseOrData); + + return newPendingExecutionGroups; } -function executeStreamField( - path: Path, - itemPath: Path, - item: MaybePromise, +function shouldDefer( + parentDeferUsages: undefined | DeferUsageSet, + deferUsages: DeferUsageSet, +): boolean { + // If we have a new child defer usage, defer. + // Otherwise, this defer usage was already deferred when it was initially + // encountered, and is now in the midst of executing early, so the new + // deferred grouped fields set can be executed immediately. + return ( + parentDeferUsages === undefined || + !Array.from(deferUsages).every(deferUsage => parentDeferUsages.has(deferUsage)) + ); +} + +function executeExecutionGroup( + pendingExecutionGroup: PendingExecutionGroup, exeContext: ExecutionContext, - fieldNodes: Array, - info: GraphQLResolveInfo, - itemType: GraphQLOutputType, - label?: string, - parentContext?: AsyncPayloadRecord, -): AsyncPayloadRecord { - const asyncPayloadRecord = new StreamRecord({ - label, - path: itemPath, - parentContext, - exeContext, - }); - let completedItem: MaybePromise; + parentType: GraphQLObjectType, + sourceValue: unknown, + path: Path | undefined, + groupedFieldSet: GroupedFieldSet, + incrementalContext: IncrementalContext, +): MaybePromise { + let result; 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, - ); - } + result = executeFields( + exeContext, + parentType, + sourceValue, + path, + groupedFieldSet, + incrementalContext, + ); + } catch (error: any) { + return { + pendingExecutionGroup, + path: pathToArray(path), + errors: withError(incrementalContext.errors, error), + }; + } - 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 => { - rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); - const handledError = handleFieldError(error, itemType, asyncPayloadRecord.errors); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); - return handledError; - }); - } - } catch (rawError) { - const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); - completedItem = handleFieldError(error, itemType, asyncPayloadRecord.errors); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); - } - } catch (error) { - asyncPayloadRecord.errors.push(error as GraphQLError); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - asyncPayloadRecord.addItems(null); - return asyncPayloadRecord; - } - - let completedItems: MaybePromise | null>; - if (isPromise(completedItem)) { - completedItems = completedItem.then( - value => [value], - error => { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return null; - }, + if (isPromise(result)) { + return result.then( + resolved => + buildCompletedExecutionGroup(incrementalContext, pendingExecutionGroup, path, resolved), + error => ({ + pendingExecutionGroup, + path: pathToArray(path), + errors: withError(incrementalContext.errors, error), + }), ); - } else { - completedItems = [completedItem]; } - asyncPayloadRecord.addItems(completedItems); - return asyncPayloadRecord; + return buildCompletedExecutionGroup(incrementalContext, pendingExecutionGroup, path, result); } -async function executeStreamIteratorItem( - iterator: AsyncIterator, - exeContext: ExecutionContext, - fieldNodes: Array, - info: GraphQLResolveInfo, - itemType: GraphQLOutputType, - asyncPayloadRecord: StreamRecord, - itemPath: Path, -): Promise> { - let item; - try { - const { value, done } = await iterator.next(); - if (done) { - asyncPayloadRecord.setIsCompletedIterator(); - return { done, value: undefined }; - } - item = value; - } catch (rawError) { - const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); - const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); - // don't continue if iterator throws - return { done: true, value }; +function buildCompletedExecutionGroup( + incrementalContext: IncrementalContext, + pendingExecutionGroup: PendingExecutionGroup, + path: Path | undefined, + data: Record, +): CompletedExecutionGroup { + const { errors, incrementalDataRecords } = incrementalContext; + if (incrementalDataRecords === undefined) { + return { + pendingExecutionGroup, + path: pathToArray(path), + result: errors === undefined ? { data } : { data, errors: [...flattenErrors(errors)] }, + incrementalDataRecords, + }; } - let completedItem; - try { - completedItem = completeValue( - exeContext, - itemType, - fieldNodes, - info, - itemPath, - item, - asyncPayloadRecord, - ); - if (isPromise(completedItem)) { - 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; - }); - } - return { done: false, value: completedItem }; - } catch (rawError) { - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); - const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); - return { done: false, value }; + if (errors === undefined) { + return { + pendingExecutionGroup, + path: pathToArray(path), + result: { data }, + incrementalDataRecords, + }; } + + return { + pendingExecutionGroup, + path: pathToArray(path), + result: { data, errors: [...flattenErrors(errors)] }, + incrementalDataRecords: filterIncrementalDataRecords(path, errors, incrementalDataRecords), + }; } -async function executeStreamIterator( +function buildSyncStreamItemQueue( + initialItem: MaybePromise, initialIndex: number, - iterator: AsyncIterator, + streamPath: Path, + iterator: Iterator, exeContext: ExecutionContext, - fieldNodes: Array, + fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemType: GraphQLOutputType, - path: Path, - label?: string, - parentContext?: AsyncPayloadRecord, -): Promise { - let index = initialIndex; - let previousAsyncPayloadRecord = parentContext ?? undefined; - while (true) { - const itemPath = addPath(path, index, undefined); - const asyncPayloadRecord = new StreamRecord({ - label, - path: itemPath, - parentContext: previousAsyncPayloadRecord, - iterator, - exeContext, - }); - - let iteration; - try { - iteration = await executeStreamIteratorItem( - iterator, +): Array { + const streamItemQueue: Array = []; + + const enableEarlyExecution = exeContext.enableEarlyExecution; + + const firstExecutor = () => { + const initialPath = addPath(streamPath, initialIndex, undefined); + const firstStreamItem = new BoxedPromiseOrValue( + completeStreamItem( + streamPath, + initialPath, + initialItem, exeContext, - fieldNodes, + { errors: undefined, incrementalDataRecords: undefined }, + fieldGroup, info, itemType, - asyncPayloadRecord, - itemPath, - ); - } catch (error) { - asyncPayloadRecord.errors.push(error as GraphQLError); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - asyncPayloadRecord.addItems(null); - // entire stream has errored and bubbled upwards - if (iterator?.return) { - iterator.return().catch(() => { - // ignore errors - }); + ), + ); + + let iteration = iterator.next(); + let currentIndex = initialIndex + 1; + let currentStreamItem: + | BoxedPromiseOrValue + | (() => BoxedPromiseOrValue) = firstStreamItem; + while (!iteration.done) { + // TODO: add test case for early sync termination + /* c8 ignore next 6 */ + if (currentStreamItem instanceof BoxedPromiseOrValue) { + const result = currentStreamItem.value; + if (!isPromise(result) && result.errors !== undefined) { + break; + } } - return; - } - const { done, value: completedItem } = iteration; + const itemPath = addPath(streamPath, currentIndex, undefined); - let completedItems: MaybePromise | null>; - if (isPromise(completedItem)) { - completedItems = completedItem.then( - value => [value], - error => { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return null; - }, - ); - } else { - completedItems = [completedItem]; - } + const value = iteration.value; - asyncPayloadRecord.addItems(completedItems); + const currentExecutor = () => + completeStreamItem( + streamPath, + itemPath, + value, + exeContext, + { errors: undefined, incrementalDataRecords: undefined }, + fieldGroup, + info, + itemType, + ); - if (done) { - break; - } - previousAsyncPayloadRecord = asyncPayloadRecord; - index++; - } -} + currentStreamItem = enableEarlyExecution + ? new BoxedPromiseOrValue(currentExecutor()) + : () => new BoxedPromiseOrValue(currentExecutor()); -function filterSubsequentPayloads( - exeContext: ExecutionContext, - nullPath: Path, - currentAsyncRecord: AsyncPayloadRecord | undefined, -): 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; - } + streamItemQueue.push(currentStreamItem); - incrementalResult.path = asyncPayloadRecord.path; - if (asyncPayloadRecord.label) { - incrementalResult.label = asyncPayloadRecord.label; - } - if (asyncPayloadRecord.errors.length > 0) { - incrementalResult.errors = asyncPayloadRecord.errors; + iteration = iterator.next(); + currentIndex = initialIndex + 1; } - incrementalResults.push(incrementalResult); - } - return incrementalResults; -} -function yieldSubsequentPayloads( - exeContext: ExecutionContext, -): AsyncGenerator { - let isDone = false; + streamItemQueue.push(new BoxedPromiseOrValue({ path: streamPath })); - const abortPromise = new Promise((_, reject) => { - exeContext.signal?.addEventListener('abort', () => { - isDone = true; - reject(exeContext.signal?.reason); - }); - }); - - async function next(): Promise> { - if (isDone) { - return { value: undefined, done: true }; - } + return firstStreamItem.value; + }; - await Promise.race([ - abortPromise, - ...Array.from(exeContext.subsequentPayloads).map(p => p.promise), - ]); + streamItemQueue.push( + enableEarlyExecution + ? new BoxedPromiseOrValue(Promise.resolve().then(firstExecutor)) + : () => new BoxedPromiseOrValue(firstExecutor()), + ); - if (isDone) { - // a different call to next has exhausted all payloads - return { value: undefined, done: true }; - } + return streamItemQueue; +} - const incremental = getCompletedIncrementalResults(exeContext); - const hasNext = exeContext.subsequentPayloads.size > 0; +function buildAsyncStreamItemQueue( + initialIndex: number, + streamPath: Path, + asyncIterator: AsyncIterator, + exeContext: ExecutionContext, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, +): Array { + const streamItemQueue: Array = []; + const executor = () => + getNextAsyncStreamItemResult( + streamItemQueue, + streamPath, + initialIndex, + asyncIterator, + exeContext, + fieldGroup, + info, + itemType, + ); - if (!incremental.length && hasNext) { - return next(); - } + streamItemQueue.push( + exeContext.enableEarlyExecution + ? new BoxedPromiseOrValue(executor()) + : () => new BoxedPromiseOrValue(executor()), + ); - if (!hasNext) { - isDone = true; - } + return streamItemQueue; +} +async function getNextAsyncStreamItemResult( + streamItemQueue: Array, + streamPath: Path, + index: number, + asyncIterator: AsyncIterator, + exeContext: ExecutionContext, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, +): Promise { + let iteration; + try { + iteration = await asyncIterator.next(); + } catch (error) { return { - value: incremental.length ? { incremental, hasNext } : { hasNext }, - done: false, + path: streamPath, + errors: [locatedError(coerceError(error), toNodes(fieldGroup), pathToArray(streamPath))], }; } - function returnStreamIterators() { - const promises: Array>> = []; - exeContext.subsequentPayloads.forEach(asyncPayloadRecord => { - if (isStreamPayload(asyncPayloadRecord) && asyncPayloadRecord.iterator?.return) { - promises.push(asyncPayloadRecord.iterator.return()); - } - }); - return Promise.all(promises); + if (iteration.done) { + return { path: streamPath }; } - return { - [Symbol.asyncIterator]() { - return this; - }, - next, - async return(): Promise> { - await returnStreamIterators(); - isDone = true; - return { value: undefined, done: true }; - }, - async throw(error?: unknown): Promise> { - await returnStreamIterators(); - isDone = true; - return Promise.reject(error); - }, - }; -} + const itemPath = addPath(streamPath, index, undefined); -class DeferredFragmentRecord { - type: 'defer'; - errors: Array; - label: string | undefined; - path: Array; - promise: Promise; - data: Record | null; - parentContext: AsyncPayloadRecord | undefined; - isCompleted: boolean; - _exeContext: ExecutionContext; - _resolve?: (arg: MaybePromise | 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 = MaybePromise => { - resolve(MaybePromise); - }; - }).then(data => { - this.data = data; - this.isCompleted = true; - }); - } + const result = completeStreamItem( + streamPath, + itemPath, + iteration.value, + exeContext, + { errors: undefined, incrementalDataRecords: undefined }, + fieldGroup, + info, + itemType, + ); - addData(data: MaybePromise | null>) { - const parentData = this.parentContext?.promise; - if (parentData) { - this._resolve?.(parentData.then(() => data)); - return; - } - this._resolve?.(data); - } + const executor = () => + getNextAsyncStreamItemResult( + streamItemQueue, + streamPath, + index, + asyncIterator, + exeContext, + fieldGroup, + info, + itemType, + ); + + streamItemQueue.push( + exeContext.enableEarlyExecution + ? new BoxedPromiseOrValue(executor()) + : () => new BoxedPromiseOrValue(executor()), + ); + + return result; } -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: MaybePromise | 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 = MaybePromise => { - resolve(MaybePromise); - }; - }).then(items => { - this.items = items; - this.isCompleted = true; - }); +function completeStreamItem( + streamPath: Path, + itemPath: Path, + item: unknown, + exeContext: ExecutionContext, + incrementalContext: IncrementalContext, + fieldGroup: FieldGroup, + info: GraphQLResolveInfo, + itemType: GraphQLOutputType, +): MaybePromise { + if (isPromise(item)) { + return completePromisedValue( + exeContext, + itemType, + fieldGroup, + info, + itemPath, + item, + incrementalContext, + ).then( + resolvedItem => buildStreamItemResult(incrementalContext, streamPath, resolvedItem), + error => ({ + path: streamPath, + errors: withError(incrementalContext.errors, error), + }), + ); } - addItems(items: MaybePromise | null>) { - const parentData = this.parentContext?.promise; - if (parentData) { - this._resolve?.(parentData.then(() => items)); - return; + let result: MaybePromise; + try { + try { + result = completeValue( + exeContext, + itemType, + fieldGroup, + info, + itemPath, + item, + incrementalContext, + ); + } catch (rawError) { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + result = null; } - this._resolve?.(items); + } catch (error: any) { + return { + path: streamPath, + errors: withError(incrementalContext.errors, error), + }; } - setIsCompletedIterator() { - this.isCompletedIterator = true; + if (isPromise(result)) { + return result + .then(undefined, rawError => { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + return null; + }) + .then( + resolvedItem => buildStreamItemResult(incrementalContext, streamPath, resolvedItem), + error => ({ + path: streamPath, + errors: withError(incrementalContext.errors, error), + }), + ); } + + return buildStreamItemResult(incrementalContext, streamPath, result); } -type AsyncPayloadRecord = DeferredFragmentRecord | StreamRecord; +function buildStreamItemResult( + incrementalContext: IncrementalContext, + streamPath: Path, + item: unknown, +): StreamItemResult { + const { errors, incrementalDataRecords } = incrementalContext; + if (incrementalDataRecords === undefined) { + return { + path: streamPath, + item, + errors: errors === undefined ? undefined : [...flattenErrors(errors)], + incrementalDataRecords, + }; + } -function isStreamPayload(asyncPayload: AsyncPayloadRecord): asyncPayload is StreamRecord { - return asyncPayload.type === 'stream'; -} + if (errors === undefined) { + return { + path: streamPath, + item, + errors, + incrementalDataRecords, + }; + } + return { + path: streamPath, + item, + errors: [...flattenErrors(errors)], + incrementalDataRecords: filterIncrementalDataRecords( + streamPath, + errors, + incrementalDataRecords, + ), + }; +} /** * This method looks up the field on the given type definition. * It has special casing for the three introspection fields, diff --git a/packages/executor/src/execution/flattenAsyncIterable.ts b/packages/executor/src/execution/flattenAsyncIterable.ts index e30e88c2542..c40e51a5d9a 100644 --- a/packages/executor/src/execution/flattenAsyncIterable.ts +++ b/packages/executor/src/execution/flattenAsyncIterable.ts @@ -1,3 +1,5 @@ +import { DisposableSymbols } from '@whatwg-node/disposablestack'; + type AsyncIterableOrGenerator = AsyncGenerator | AsyncIterable; /** @@ -89,5 +91,12 @@ export function flattenAsyncIterable( [Symbol.asyncIterator]() { return this; }, + async [DisposableSymbols.asyncDispose]() { + done = true; + await Promise.all([ + currentNestedIterator?.[DisposableSymbols.asyncDispose]?.(), + topIterator?.[DisposableSymbols.asyncDispose]?.(), + ]); + }, }; } diff --git a/packages/executor/src/execution/getBySet.ts b/packages/executor/src/execution/getBySet.ts new file mode 100644 index 00000000000..4ddabd30021 --- /dev/null +++ b/packages/executor/src/execution/getBySet.ts @@ -0,0 +1,13 @@ +import { isSameSet } from './isSameSet.js'; + +export function getBySet( + map: ReadonlyMap, U>, + setToMatch: ReadonlySet, +): U | undefined { + for (const set of map.keys()) { + if (isSameSet(set, setToMatch)) { + return map.get(set); + } + } + return undefined; +} diff --git a/packages/executor/src/execution/isSameSet.ts b/packages/executor/src/execution/isSameSet.ts new file mode 100644 index 00000000000..f2837d848cd --- /dev/null +++ b/packages/executor/src/execution/isSameSet.ts @@ -0,0 +1,11 @@ +export function isSameSet(setA: ReadonlySet, setB: ReadonlySet): boolean { + if (setA.size !== setB.size) { + return false; + } + for (const item of setA) { + if (!setB.has(item)) { + return false; + } + } + return true; +} diff --git a/packages/executor/src/execution/normalizedExecutor.ts b/packages/executor/src/execution/normalizedExecutor.ts index c6db16af4f3..da96e1d080e 100644 --- a/packages/executor/src/execution/normalizedExecutor.ts +++ b/packages/executor/src/execution/normalizedExecutor.ts @@ -1,6 +1,13 @@ -import { getOperationAST } from 'graphql'; +import { getOperationAST, GraphQLSchema } from 'graphql'; import { ValueOrPromise } from 'value-or-promise'; -import { ExecutionResult, MaybeAsyncIterable, MaybePromise } from '@graphql-tools/utils'; +import { + ExecutionRequest, + ExecutionResult, + Executor, + MaybeAsyncIterable, + MaybePromise, + memoize1, +} from '@graphql-tools/utils'; import { execute, ExecutionArgs, flattenIncrementalResults, subscribe } from './execute.js'; export function normalizedExecutor( @@ -22,3 +29,19 @@ export function normalizedExecutor { + errors?: ReadonlyArray; + data?: TData | null; + extensions?: TExtensions; +} + +export interface FormattedExecutionResult< + TData = Record, + TExtensions = Record, +> { + errors?: ReadonlyArray; + data?: TData | null; + extensions?: TExtensions; +} + +export interface IncrementalExecutionResults< + TData = unknown, + TExtensions = Record, +> { + initialResult: InitialIncrementalExecutionResult; + subsequentResults: AsyncGenerator< + SubsequentIncrementalExecutionResult, + void, + void + >; +} + +export interface InitialIncrementalExecutionResult< + TData = Record, + TExtensions = Record, +> extends SingularExecutionResult { + data: TData; + pending?: ReadonlyArray; + hasNext: true; + extensions?: TExtensions; +} + +export interface FormattedInitialIncrementalExecutionResult< + TData = Record, + TExtensions = Record, +> extends FormattedExecutionResult { + data: TData; + pending?: ReadonlyArray; + hasNext: boolean; + extensions?: TExtensions; +} + +export interface SubsequentIncrementalExecutionResult< + TData = unknown, + TExtensions = Record, +> { + pending?: ReadonlyArray; + incremental?: ReadonlyArray>; + completed?: ReadonlyArray; + hasNext: boolean; + extensions?: TExtensions; +} + +export interface FormattedSubsequentIncrementalExecutionResult< + TData = unknown, + TExtensions = Record, +> { + hasNext: boolean; + pending?: ReadonlyArray; + incremental?: ReadonlyArray>; + completed?: ReadonlyArray; + extensions?: TExtensions; +} + +interface ExecutionGroupResult> { + errors?: ReadonlyArray; + data: TData; +} + +export interface IncrementalDeferResult< + TData = Record, + TExtensions = Record, +> { + errors?: ReadonlyArray; + data: TData | null; + id?: string; + path?: ReadonlyArray; + label?: string; + subPath?: ReadonlyArray; + extensions?: TExtensions; +} + +export interface FormattedIncrementalDeferResult< + TData = Record, + TExtensions = Record, +> { + errors?: ReadonlyArray; + data: TData | null; + id: string; + path?: ReadonlyArray; + label?: string; + subPath?: ReadonlyArray; + extensions?: TExtensions; +} + +interface StreamItemsRecordResult> { + errors?: ReadonlyArray; + items: TData; +} + +export interface IncrementalStreamResult< + TData = ReadonlyArray, + TExtensions = Record, +> { + errors?: ReadonlyArray; + items: TData | null; + id?: string; + path?: ReadonlyArray; + label?: string; + extensions?: TExtensions; +} + +export interface FormattedIncrementalStreamResult< + TData = Array, + TExtensions = Record, +> { + errors?: ReadonlyArray; + items: TData | null; + id: string; + path?: ReadonlyArray; + label?: string; + extensions?: TExtensions; +} + +export type IncrementalResult> = + | IncrementalDeferResult + | IncrementalStreamResult; + +export type FormattedIncrementalResult> = + | FormattedIncrementalDeferResult + | FormattedIncrementalStreamResult; + +export interface PendingResult { + id: string; + path: ReadonlyArray; + label?: string; +} + +export interface CompletedResult { + id: string; + errors?: ReadonlyArray; +} + +export interface FormattedCompletedResult { + path: ReadonlyArray; + label?: string; + errors?: ReadonlyArray; +} + +export function isPendingExecutionGroup( + incrementalDataRecord: IncrementalDataRecord, +): incrementalDataRecord is PendingExecutionGroup { + return 'deferUsages' in incrementalDataRecord; +} + +export type CompletedExecutionGroup = SuccessfulExecutionGroup | FailedExecutionGroup; + +export function isCompletedExecutionGroup( + incrementalDataRecordResult: IncrementalDataRecordResult, +): incrementalDataRecordResult is CompletedExecutionGroup { + return 'pendingExecutionGroup' in incrementalDataRecordResult; +} + +export interface SuccessfulExecutionGroup { + pendingExecutionGroup: PendingExecutionGroup; + path: Array; + result: ExecutionGroupResult; + incrementalDataRecords: ReadonlyArray | undefined; + errors?: never; +} + +interface FailedExecutionGroup { + pendingExecutionGroup: PendingExecutionGroup; + path: Array; + errors: ReadonlyArray; + result?: never; +} + +export function isFailedExecutionGroup( + completedExecutionGroup: CompletedExecutionGroup, +): completedExecutionGroup is FailedExecutionGroup { + return completedExecutionGroup.errors !== undefined; +} + +export interface PendingExecutionGroup { + deferUsages: ReadonlySet; + path: Path | undefined; + result: + | BoxedPromiseOrValue + | (() => BoxedPromiseOrValue); +} + +export interface StreamItemResult { + path: Path; + item?: unknown; + incrementalDataRecords?: ReadonlyArray | undefined; + errors?: ReadonlyArray | undefined; +} + +export type StreamItemRecord = + | BoxedPromiseOrValue + | (() => BoxedPromiseOrValue); + +export interface StreamRecord { + path: Path; + label: string | undefined; + index: number; + id?: string | undefined; + streamItemQueue: Array; +} + +export interface StreamItemsResult { + streamRecord: StreamRecord; + result?: StreamItemsRecordResult | undefined; + incrementalDataRecords?: ReadonlyArray | undefined; + errors?: ReadonlyArray | undefined; +} + +export interface CancellableStreamRecord extends StreamRecord { + earlyReturn: () => Promise; +} + +export function isCancellableStreamRecord( + streamRecord: StreamRecord, +): streamRecord is CancellableStreamRecord { + return 'earlyReturn' in streamRecord; +} + +export type IncrementalDataRecord = PendingExecutionGroup | StreamRecord; + +export type IncrementalDataRecordResult = CompletedExecutionGroup | StreamItemsResult; diff --git a/packages/executor/src/execution/values.ts b/packages/executor/src/execution/values.ts index 712e8a23c0e..7e085fdcc24 100644 --- a/packages/executor/src/execution/values.ts +++ b/packages/executor/src/execution/values.ts @@ -31,7 +31,7 @@ export function getVariableValues( inputs: { readonly [variable: string]: unknown }, options?: { maxErrors?: number }, ): CoercedVariableValues { - const errors = []; + const errors: any[] = []; const maxErrors = options?.maxErrors; try { const coerced = coerceVariableValues(schema, varDefNodes, inputs, error => { @@ -50,7 +50,6 @@ export function getVariableValues( errors.push(error); } - // @ts-expect-error - We know that errors is an array of GraphQLError. return { errors }; } diff --git a/packages/executors/apollo-link/CHANGELOG.md b/packages/executors/apollo-link/CHANGELOG.md index 578cf86236e..c3800e7a724 100644 --- a/packages/executors/apollo-link/CHANGELOG.md +++ b/packages/executors/apollo-link/CHANGELOG.md @@ -1,5 +1,56 @@ # @graphql-tools/executor-apollo-link +## 1.0.8 + +### Patch Changes + +- [#6769](https://github.com/ardatan/graphql-tools/pull/6769) + [`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1) + Thanks [@ardatan](https://github.com/ardatan)! - Improvements for `fakePromise` so it can be used + without params to create a `void` Promise + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 1.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 1.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 1.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 1.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 1.0.3 ### Patch Changes diff --git a/packages/executors/apollo-link/package.json b/packages/executors/apollo-link/package.json index 6672f1d1d7f..a37f7daae53 100644 --- a/packages/executors/apollo-link/package.json +++ b/packages/executors/apollo-link/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor-apollo-link", - "version": "1.0.3", + "version": "1.0.8", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -52,11 +52,11 @@ "graphql": "^15.2.0 || ^16.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.3.1" }, "devDependencies": { - "@apollo/client": "3.11.10" + "@apollo/client": "3.12.3" }, "publishConfig": { "directory": "dist", diff --git a/packages/executors/apollo-link/src/index.ts b/packages/executors/apollo-link/src/index.ts index c1b7b8685e2..36cf74b0574 100644 --- a/packages/executors/apollo-link/src/index.ts +++ b/packages/executors/apollo-link/src/index.ts @@ -1,5 +1,5 @@ import * as apolloImport from '@apollo/client'; -import { ExecutionRequest, Executor, isAsyncIterable } from '@graphql-tools/utils'; +import { Executor, fakePromise, isAsyncIterable } from '@graphql-tools/utils'; const apollo: typeof apolloImport = (apolloImport as any)?.default ?? apolloImport; @@ -8,34 +8,37 @@ function createApolloRequestHandler(executor: Executor): apolloImport.RequestHan operation: apolloImport.Operation, ): apolloImport.Observable { return new apollo.Observable(observer => { - Promise.resolve().then(async () => { - const executionRequest: ExecutionRequest = { - document: operation.query, - variables: operation.variables, - operationName: operation.operationName, - extensions: operation.extensions, - context: operation.getContext(), - }; - try { - const results = await executor(executionRequest); + fakePromise() + .then(() => + executor({ + document: operation.query, + variables: operation.variables, + operationName: operation.operationName, + extensions: operation.extensions, + context: operation.getContext(), + }), + ) + .then(results => { if (isAsyncIterable(results)) { - for await (const result of results) { - if (observer.closed) { - return; + return fakePromise().then(async () => { + for await (const result of results) { + if (observer.closed) { + return; + } + observer.next(result); } - observer.next(result); - } - observer.complete(); + observer.complete(); + }); } else if (!observer.closed) { observer.next(results); observer.complete(); } - } catch (e) { + }) + .catch(e => { if (!observer.closed) { observer.error(e); } - } - }); + }); }); }; } diff --git a/packages/executors/apollo-link/tests/browser-apollo-link.spec.ts b/packages/executors/apollo-link/tests/apollo-link.spec.ts similarity index 87% rename from packages/executors/apollo-link/tests/browser-apollo-link.spec.ts rename to packages/executors/apollo-link/tests/apollo-link.spec.ts index 25767d9d588..9cf46389a97 100644 --- a/packages/executors/apollo-link/tests/browser-apollo-link.spec.ts +++ b/packages/executors/apollo-link/tests/apollo-link.spec.ts @@ -1,14 +1,12 @@ +import { setTimeout } from 'timers/promises'; import { parse } from 'graphql'; import { createSchema, createYoga } from 'graphql-yoga'; import { ApolloClient, FetchResult, InMemoryCache } from '@apollo/client/core'; import { buildHTTPExecutor } from '@graphql-tools/executor-http'; +import { testIf } from '../../../testing/utils.js'; import { ExecutorLink } from '../src/index.js'; describe('Apollo Link', () => { - if (!process.env['TEST_BROWSER']) { - it('skips', () => {}); - return; - } const yoga = createYoga({ logging: false, maskedErrors: false, @@ -36,7 +34,7 @@ describe('Apollo Link', () => { time: { async *subscribe() { while (true) { - await new Promise(resolve => setTimeout(resolve, 1000)); + await setTimeout(300); yield new Date().toISOString(); } }, @@ -58,6 +56,13 @@ describe('Apollo Link', () => { cache: new InMemoryCache(), }); + beforeEach(() => {}); + + afterAll(() => { + client.stop(); + return client.clearStore(); + }); + it('should handle queries correctly', async () => { const result = await client.query({ query: parse(/* GraphQL */ ` @@ -72,7 +77,7 @@ describe('Apollo Link', () => { hello: 'Hello Apollo Client!', }); }); - it('should handle subscriptions correctly', async () => { + testIf(!process.env['LEAK_TEST'])('should handle subscriptions correctly', async () => { expect.assertions(5); const observable = client.subscribe({ query: parse(/* GraphQL */ ` @@ -83,7 +88,7 @@ describe('Apollo Link', () => { }); const collectedValues: string[] = []; let i = 0; - await new Promise(resolve => { + await new Promise((resolve, reject) => { const subscription = observable.subscribe((result: FetchResult) => { collectedValues.push(result.data?.['time']); i++; @@ -91,7 +96,7 @@ describe('Apollo Link', () => { subscription.unsubscribe(); resolve(); } - }); + }, reject); }); expect(collectedValues.length).toBe(3); expect(i).toBe(3); diff --git a/packages/executors/envelop/CHANGELOG.md b/packages/executors/envelop/CHANGELOG.md index 0a987e9333b..33f0af087bc 100644 --- a/packages/executors/envelop/CHANGELOG.md +++ b/packages/executors/envelop/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/executor-envelop +## 3.0.16 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 3.0.15 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 3.0.14 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 3.0.13 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 3.0.12 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 3.0.11 ### Patch Changes diff --git a/packages/executors/envelop/package.json b/packages/executors/envelop/package.json index 03f90c8c46b..4d3b1bff8d4 100644 --- a/packages/executors/envelop/package.json +++ b/packages/executors/envelop/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor-envelop", - "version": "3.0.11", + "version": "3.0.16", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "@envelop/core": "^3.0.4 || ^4.0.0 || ^5.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "@graphql-tools/wrap": "^10.0.16", "tslib": "^2.3.1" }, diff --git a/packages/executors/envelop/src/index.ts b/packages/executors/envelop/src/index.ts index 5ab2403a62b..882e57f5a1b 100644 --- a/packages/executors/envelop/src/index.ts +++ b/packages/executors/envelop/src/index.ts @@ -1,4 +1,4 @@ -import { ExecutionArgs, Plugin } from '@envelop/core'; +import { ExecutionArgs, mapMaybePromise, Plugin } from '@envelop/core'; import { Executor, isPromise, MaybePromise } from '@graphql-tools/utils'; import { schemaFromExecutor } from '@graphql-tools/wrap'; @@ -97,12 +97,10 @@ export function useExecutor>( pluginCtx.schema$ = pluginCtx.schema; } ensureSchema(args.contextValue); - if (isPromise(pluginCtx.schemaSetPromise$)) { - return pluginCtx.schemaSetPromise$.then(() => { - setExecuteFn(executorToExecuteFn); - }) as Promise; - } - setExecuteFn(executorToExecuteFn); + // @ts-expect-error - Typings are wrong + return mapMaybePromise(pluginCtx.schemaSetPromise$, () => { + setExecuteFn(executorToExecuteFn); + }); }, onSubscribe({ args, setSubscribeFn }) { if (args.schema) { @@ -110,12 +108,10 @@ export function useExecutor>( pluginCtx.schema$ = pluginCtx.schema; } ensureSchema(args.contextValue); - if (isPromise(pluginCtx.schemaSetPromise$)) { - return pluginCtx.schemaSetPromise$.then(() => { - setSubscribeFn(executorToExecuteFn); - }) as Promise; - } - setSubscribeFn(executorToExecuteFn); + // @ts-expect-error - Typings are wrong + return mapMaybePromise(pluginCtx.schemaSetPromise$, () => { + setSubscribeFn(executorToExecuteFn); + }); }, onValidate({ params, context, setResult }) { if (params.schema) { diff --git a/packages/executors/envelop/tests/envelop.spec.ts b/packages/executors/envelop/tests/envelop.spec.ts index 9d73b3e14ba..9854bd71a90 100644 --- a/packages/executors/envelop/tests/envelop.spec.ts +++ b/packages/executors/envelop/tests/envelop.spec.ts @@ -59,7 +59,7 @@ describe('Envelop', () => { document, }); expect(result[Symbol.asyncIterator]).toBeDefined(); - const collectedResults = []; + const collectedResults: any[] = []; for await (const chunk of result as AsyncIterableIterator) { collectedResults.push(chunk); } diff --git a/packages/executors/legacy-ws/CHANGELOG.md b/packages/executors/legacy-ws/CHANGELOG.md index 70ab17e3edb..df086b2444d 100644 --- a/packages/executors/legacy-ws/CHANGELOG.md +++ b/packages/executors/legacy-ws/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/executor-legacy-ws +## 1.1.7 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 1.1.6 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 1.1.5 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 1.1.4 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 1.1.3 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 1.1.2 ### Patch Changes diff --git a/packages/executors/legacy-ws/package.json b/packages/executors/legacy-ws/package.json index 4352f7cc6cb..69c280dc51b 100644 --- a/packages/executors/legacy-ws/package.json +++ b/packages/executors/legacy-ws/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor-legacy-ws", - "version": "1.1.2", + "version": "1.1.7", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "@types/ws": "^8.0.0", "isomorphic-ws": "^5.0.0", "tslib": "^2.4.0", diff --git a/packages/executors/urql-exchange/CHANGELOG.md b/packages/executors/urql-exchange/CHANGELOG.md index 361e2ef1578..c429fdbaba5 100644 --- a/packages/executors/urql-exchange/CHANGELOG.md +++ b/packages/executors/urql-exchange/CHANGELOG.md @@ -1,5 +1,56 @@ # @graphql-tools/executor-urql-exchange +## 1.0.9 + +### Patch Changes + +- [#6769](https://github.com/ardatan/graphql-tools/pull/6769) + [`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1) + Thanks [@ardatan](https://github.com/ardatan)! - Improvements for `fakePromise` so it can be used + without params to create a `void` Promise + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 1.0.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 1.0.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 1.0.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 1.0.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 1.0.4 ### Patch Changes diff --git a/packages/executors/urql-exchange/package.json b/packages/executors/urql-exchange/package.json index 04f6d61af02..f7d3dd02af1 100644 --- a/packages/executors/urql-exchange/package.json +++ b/packages/executors/urql-exchange/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor-urql-exchange", - "version": "1.0.4", + "version": "1.0.9", "type": "module", "description": "", "repository": { @@ -48,11 +48,11 @@ "wonka": "^6.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, "devDependencies": { - "@urql/core": "5.0.8", + "@urql/core": "5.1.0", "wonka": "6.3.4" }, "publishConfig": { diff --git a/packages/executors/urql-exchange/src/index.ts b/packages/executors/urql-exchange/src/index.ts index f6f50f003cd..ae0ee4fa3fe 100644 --- a/packages/executors/urql-exchange/src/index.ts +++ b/packages/executors/urql-exchange/src/index.ts @@ -1,6 +1,6 @@ import { OperationTypeNode } from 'graphql'; import { filter, make, merge, mergeMap, pipe, share, Source, takeUntil } from 'wonka'; -import { ExecutionRequest, Executor, isAsyncIterable } from '@graphql-tools/utils'; +import { ExecutionRequest, Executor, fakePromise, isAsyncIterable } from '@graphql-tools/utils'; import { AnyVariables, Exchange, @@ -37,31 +37,35 @@ export function executorExchange(executor: Executor): Exchange { }; return make>(observer => { let ended = false; - Promise.resolve(executor(executionRequest)) - .then(async result => { + fakePromise() + .then(() => executor(executionRequest)) + .then(result => { if (ended || !result) { return; } if (!isAsyncIterable(result)) { observer.next(makeResult(operation, result as ExecutionResult)); + observer.complete(); } else { let prevResult: OperationResult | null = null; - for await (const value of result) { - if (value) { - if (prevResult && value.incremental) { - prevResult = mergeResultPatch(prevResult, value as ExecutionResult); - } else { - prevResult = makeResult(operation, value as ExecutionResult); + return fakePromise().then(async () => { + for await (const value of result) { + if (value) { + if (prevResult && value.incremental) { + prevResult = mergeResultPatch(prevResult, value as ExecutionResult); + } else { + prevResult = makeResult(operation, value as ExecutionResult); + } + observer.next(prevResult); + } + if (ended) { + break; } - observer.next(prevResult); - } - if (ended) { - break; } - } + observer.complete(); + }); } - observer.complete(); }) .catch(error => { observer.next(makeErrorResult(operation, error)); diff --git a/packages/executors/urql-exchange/tests/browser-urql-exchange.spec.ts b/packages/executors/urql-exchange/tests/urql-exchange.spec.ts similarity index 91% rename from packages/executors/urql-exchange/tests/browser-urql-exchange.spec.ts rename to packages/executors/urql-exchange/tests/urql-exchange.spec.ts index b00c42443a6..2b10adb003f 100644 --- a/packages/executors/urql-exchange/tests/browser-urql-exchange.spec.ts +++ b/packages/executors/urql-exchange/tests/urql-exchange.spec.ts @@ -1,16 +1,13 @@ +import { setTimeout } from 'timers/promises'; import { createSchema, createYoga } from 'graphql-yoga'; import { pipe, toObservable } from 'wonka'; import { buildHTTPExecutor } from '@graphql-tools/executor-http'; import { ExecutionResult } from '@graphql-tools/utils'; import { createClient } from '@urql/core'; +import { testIf } from '../../../testing/utils.js'; import { executorExchange } from '../src/index.js'; describe('URQL Yoga Exchange', () => { - if (!process.env['TEST_BROWSER']) { - it('skips', () => {}); - return; - } - const aCharCode = 'a'.charCodeAt(0); const yoga = createYoga({ logging: false, maskedErrors: false, @@ -39,8 +36,9 @@ describe('URQL Yoga Exchange', () => { async *subscribe() { let i = 0; while (true) { + const aCharCode = 'a'.charCodeAt(0); yield String.fromCharCode(aCharCode + i); - await new Promise(resolve => setTimeout(resolve, 300)); + await setTimeout(300); i++; } }, @@ -80,7 +78,7 @@ describe('URQL Yoga Exchange', () => { hello: 'Hello Urql Client!', }); }); - it('should handle subscriptions correctly', async () => { + testIf(!process.env['LEAK_TEST'])('should handle subscriptions correctly', async () => { const observable = pipe( client.subscription( /* GraphQL */ ` diff --git a/packages/executors/yoga/CHANGELOG.md b/packages/executors/yoga/CHANGELOG.md index 7eea1fed2a2..c535692d903 100644 --- a/packages/executors/yoga/CHANGELOG.md +++ b/packages/executors/yoga/CHANGELOG.md @@ -1,5 +1,60 @@ # @graphql-tools/executor-yoga +## 3.0.16 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/executor-envelop@3.0.16 + +## 3.0.15 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/executor-envelop@3.0.15 + +## 3.0.14 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/executor-envelop@^3.0.13` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/executor-envelop/v/3.0.13) + (from `^3.0.12`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/executor-envelop@3.0.14 + - @graphql-tools/utils@10.6.2 + +## 3.0.13 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/executor-envelop@3.0.13 + +## 3.0.12 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/executor-envelop@3.0.12 + ## 3.0.11 ### Patch Changes diff --git a/packages/executors/yoga/package.json b/packages/executors/yoga/package.json index 5a7afd28aed..e32bf4df4ee 100644 --- a/packages/executors/yoga/package.json +++ b/packages/executors/yoga/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/executor-yoga", - "version": "3.0.11", + "version": "3.0.16", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -52,8 +52,8 @@ "graphql-yoga": "^3.5.1 || ^4.0.0 || ^5.0.0" }, "dependencies": { - "@graphql-tools/executor-envelop": "^3.0.11", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/executor-envelop": "^3.0.16", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.3.1" }, "devDependencies": { diff --git a/packages/graphql-tag-pluck/CHANGELOG.md b/packages/graphql-tag-pluck/CHANGELOG.md index 85c298cd0ac..a5d978229b1 100644 --- a/packages/graphql-tag-pluck/CHANGELOG.md +++ b/packages/graphql-tag-pluck/CHANGELOG.md @@ -1,5 +1,58 @@ # @graphql-tools/graphql-tag-pluck +## 8.3.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 8.3.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 8.3.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) + +- [#6667](https://github.com/ardatan/graphql-tools/pull/6667) + [`4fd0d3a`](https://github.com/ardatan/graphql-tools/commit/4fd0d3a335b39dc0c44e78a0416bb7dfe900c2ea) + Thanks [@renovate](https://github.com/apps/renovate)! - Support content-tag v3 and support older + versions + +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 8.3.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 8.3.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 8.3.4 ### Patch Changes diff --git a/packages/graphql-tag-pluck/package.json b/packages/graphql-tag-pluck/package.json index 10cd8b7a93f..273bd76deb3 100644 --- a/packages/graphql-tag-pluck/package.json +++ b/packages/graphql-tag-pluck/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/graphql-tag-pluck", - "version": "8.3.4", + "version": "8.3.9", "type": "module", "description": "Pluck graphql-tag template literals", "repository": { @@ -55,20 +55,20 @@ "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/traverse": "^7.16.8", "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, "devDependencies": { "@astrojs/compiler": "^2.3.4", - "@babel/parser": "7.26.2", - "@babel/traverse": "7.25.9", - "@babel/types": "7.26.0", + "@babel/parser": "7.26.3", + "@babel/traverse": "7.26.4", + "@babel/types": "7.26.3", "@types/babel__traverse": "7.20.6", - "@vue/compiler-sfc": "3.5.12", + "@vue/compiler-sfc": "3.5.13", "astrojs-compiler-sync": "^1.0.0", - "content-tag": "^2.0.1", - "svelte": "5.2.0", - "svelte2tsx": "0.7.24" + "content-tag": "^3.0.0", + "svelte": "5.14.4", + "svelte2tsx": "0.7.31" }, "publishConfig": { "directory": "dist", diff --git a/packages/graphql-tag-pluck/src/index.ts b/packages/graphql-tag-pluck/src/index.ts index 90405b0cab6..5affe6b95b3 100644 --- a/packages/graphql-tag-pluck/src/index.ts +++ b/packages/graphql-tag-pluck/src/index.ts @@ -201,7 +201,12 @@ function parseWithAstroSync( function transformGlimmerFile(glimmerSyntax: typeof import('content-tag'), fileData: string) { const processor = new glimmerSyntax.Preprocessor(); - return processor.process(fileData); + // backwards compatibility with older versions of content-tag + const result = processor.process(fileData); + if (typeof result === 'string') { + return result; + } + return result.code; } /** diff --git a/packages/graphql-tools/CHANGELOG.md b/packages/graphql-tools/CHANGELOG.md index cb1df68f136..0ebebf2c8e8 100644 --- a/packages/graphql-tools/CHANGELOG.md +++ b/packages/graphql-tools/CHANGELOG.md @@ -1,5 +1,48 @@ # graphql-tools +## 9.0.8 + +### Patch Changes + +- Updated dependencies []: + - @graphql-tools/schema@10.0.13 + +## 9.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/schema@10.0.12 + +## 9.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/schema@^10.0.10` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.10) + (from `^10.0.9`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679)]: + - @graphql-tools/schema@10.0.11 + +## 9.0.5 + +### Patch Changes + +- Updated dependencies []: + - @graphql-tools/schema@10.0.10 + +## 9.0.4 + +### Patch Changes + +- Updated dependencies []: + - @graphql-tools/schema@10.0.9 + ## 9.0.3 ### Patch Changes diff --git a/packages/graphql-tools/package.json b/packages/graphql-tools/package.json index a34766eac4e..cfcb66d5322 100644 --- a/packages/graphql-tools/package.json +++ b/packages/graphql-tools/package.json @@ -1,6 +1,6 @@ { "name": "graphql-tools", - "version": "9.0.3", + "version": "9.0.8", "type": "module", "description": "Useful tools to create and manipulate GraphQL schemas.", "repository": { @@ -50,11 +50,11 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/schema": "^10.0.8", + "@graphql-tools/schema": "^10.0.13", "tslib": "^2.4.0" }, "optionalDependencies": { - "@apollo/client": "~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0" + "@apollo/client": "~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0 || ~3.12.0" }, "publishConfig": { "directory": "dist", diff --git a/packages/import/CHANGELOG.md b/packages/import/CHANGELOG.md index c58a71db6d4..58a228dd338 100644 --- a/packages/import/CHANGELOG.md +++ b/packages/import/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/import +## 7.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 7.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 7.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 7.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 7.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 7.0.3 ### Patch Changes diff --git a/packages/import/package.json b/packages/import/package.json index bf14647f27d..89341f8f4aa 100644 --- a/packages/import/package.json +++ b/packages/import/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/import", - "version": "7.0.3", + "version": "7.0.8", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "resolve-from": "5.0.0", "tslib": "^2.4.0" }, diff --git a/packages/import/tests/schema/import-schema.spec.ts b/packages/import/tests/schema/import-schema.spec.ts index b7009c58bcf..524f4566e7d 100644 --- a/packages/import/tests/schema/import-schema.spec.ts +++ b/packages/import/tests/schema/import-schema.spec.ts @@ -422,21 +422,21 @@ describe('importSchema', () => { expect(importSchema('./fixtures/directive/c.graphql')).toBeSimilarGqlDoc(expectedSDL); }); - // TODO: later - test.skip('importSchema: multiple key directive', () => { - const expectedSDL = /* GraphQL */ ` - scalar UPC - - scalar SKU - - type Product @key(fields: "upc") @key(fields: "sku") { - upc: UPC! - sku: SKU! - name: String - } - `; - expect(importSchema('./fixtures/directive/e.graphql')).toBeSimilarGqlDoc(expectedSDL); - }); + // // TODO: later + // test.skip('importSchema: multiple key directive', () => { + // const expectedSDL = /* GraphQL */ ` + // scalar UPC + + // scalar SKU + + // type Product @key(fields: "upc") @key(fields: "sku") { + // upc: UPC! + // sku: SKU! + // name: String + // } + // `; + // expect(importSchema('./fixtures/directive/e.graphql')).toBeSimilarGqlDoc(expectedSDL); + // }); test('importSchema: external directive', () => { const expectedSDL = /* GraphQL */ ` diff --git a/packages/inspect/src/index.ts b/packages/inspect/src/index.ts index 1e8a35965e8..39191d52853 100644 --- a/packages/inspect/src/index.ts +++ b/packages/inspect/src/index.ts @@ -97,7 +97,7 @@ function formatArray(array: ReadonlyArray, seenValues: ReadonlyArray { - return Promise.resolve(object).then(resolvedObject => { + return mapMaybePromise(object, resolvedObject => { if (resolvedObject == null) { return resolvedObject; } diff --git a/packages/load/CHANGELOG.md b/packages/load/CHANGELOG.md index 8d8544fd9e1..23534a1c9b8 100644 --- a/packages/load/CHANGELOG.md +++ b/packages/load/CHANGELOG.md @@ -1,5 +1,60 @@ # @graphql-tools/load +## 8.0.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/schema@10.0.13 + +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/schema@10.0.12 + - @graphql-tools/utils@10.6.3 + +## 8.0.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/schema@^10.0.10` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.10) + (from `^10.0.9`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/schema@10.0.11 + - @graphql-tools/utils@10.6.2 + +## 8.0.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/schema@10.0.10 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/schema@10.0.9 + ## 8.0.4 ### Patch Changes diff --git a/packages/load/package.json b/packages/load/package.json index ff4caf41cb9..a98da89532f 100644 --- a/packages/load/package.json +++ b/packages/load/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/load", - "version": "8.0.4", + "version": "8.0.9", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,8 +51,8 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/schema": "^10.0.8", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/schema": "^10.0.13", + "@graphql-tools/utils": "^10.6.4", "p-limit": "3.1.0", "tslib": "^2.4.0" }, diff --git a/packages/load/tests/loaders/schema/schema-from-string.spec.ts b/packages/load/tests/loaders/schema/schema-from-string.spec.ts index 021f2368cc3..8971de34738 100644 --- a/packages/load/tests/loaders/schema/schema-from-string.spec.ts +++ b/packages/load/tests/loaders/schema/schema-from-string.spec.ts @@ -1,6 +1,7 @@ import '../../../../testing/to-be-similar-string'; import '../../../../testing/to-be-similar-gql-doc'; import { printSchema } from 'graphql'; +import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; import { loadSchema, loadSchemaSync } from '@graphql-tools/load'; import { printSchemaWithDirectives } from '@graphql-tools/utils'; import { runTests, useMonorepo } from '../../../../testing/utils.js'; @@ -76,5 +77,25 @@ describe('schema from string', () => { } `); }); + it('should throw parse error', async () => { + const schemaString = ` + extend type Query { + test(id: String!): Test + @resolveTo( + sourceName: "Test" + sourceTypeName: "Test" + sourceFieldName: "test" + requiredSelectionSet: "{ ...on Test { id name } }", + sourceArgs: { testId: {root.id} } + returnType: Test + ) + } + `; + await expect( + load(schemaString, { + loaders: [new GraphQLFileLoader()], + }), + ).rejects.toThrowError('Syntax Error'); + }); }); }); diff --git a/packages/loaders/apollo-engine/CHANGELOG.md b/packages/loaders/apollo-engine/CHANGELOG.md index f83e0b620f8..108aafb1f60 100644 --- a/packages/loaders/apollo-engine/CHANGELOG.md +++ b/packages/loaders/apollo-engine/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/apollo-engine-loader +## 8.0.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 8.0.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 8.0.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 8.0.4 ### Patch Changes diff --git a/packages/loaders/apollo-engine/package.json b/packages/loaders/apollo-engine/package.json index 0dfb23e08be..8ae047ffa82 100644 --- a/packages/loaders/apollo-engine/package.json +++ b/packages/loaders/apollo-engine/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/apollo-engine-loader", - "version": "8.0.4", + "version": "8.0.9", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -52,7 +52,7 @@ }, "dependencies": { "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "@whatwg-node/fetch": "^0.10.0", "tslib": "^2.4.0" }, diff --git a/packages/loaders/code-file/CHANGELOG.md b/packages/loaders/code-file/CHANGELOG.md index f565fdefe36..ce98ee5d622 100644 --- a/packages/loaders/code-file/CHANGELOG.md +++ b/packages/loaders/code-file/CHANGELOG.md @@ -1,5 +1,61 @@ # @graphql-tools/code-file-loader +## 8.1.10 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/graphql-tag-pluck@8.3.9 + +## 8.1.9 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/graphql-tag-pluck@8.3.8 + +## 8.1.8 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/graphql-tag-pluck@8.3.6` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.6) + (from `8.3.5`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`4fd0d3a`](https://github.com/ardatan/graphql-tools/commit/4fd0d3a335b39dc0c44e78a0416bb7dfe900c2ea), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/graphql-tag-pluck@8.3.7 + - @graphql-tools/utils@10.6.2 + +## 8.1.7 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/graphql-tag-pluck@8.3.6 + +## 8.1.6 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/graphql-tag-pluck@8.3.5 + ## 8.1.5 ### Patch Changes diff --git a/packages/loaders/code-file/package.json b/packages/loaders/code-file/package.json index 65c97744761..b648b17d2ca 100644 --- a/packages/loaders/code-file/package.json +++ b/packages/loaders/code-file/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/code-file-loader", - "version": "8.1.5", + "version": "8.1.10", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,8 +51,8 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.4", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/graphql-tag-pluck": "8.3.9", + "@graphql-tools/utils": "^10.6.4", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" diff --git a/packages/loaders/git/CHANGELOG.md b/packages/loaders/git/CHANGELOG.md index a3fb135b0f9..bf16f4b1196 100644 --- a/packages/loaders/git/CHANGELOG.md +++ b/packages/loaders/git/CHANGELOG.md @@ -1,5 +1,61 @@ # @graphql-tools/git-loader +## 8.0.14 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/graphql-tag-pluck@8.3.9 + +## 8.0.13 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/graphql-tag-pluck@8.3.8 + +## 8.0.12 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/graphql-tag-pluck@8.3.6` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.6) + (from `8.3.5`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`4fd0d3a`](https://github.com/ardatan/graphql-tools/commit/4fd0d3a335b39dc0c44e78a0416bb7dfe900c2ea), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/graphql-tag-pluck@8.3.7 + - @graphql-tools/utils@10.6.2 + +## 8.0.11 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/graphql-tag-pluck@8.3.6 + +## 8.0.10 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/graphql-tag-pluck@8.3.5 + ## 8.0.9 ### Patch Changes diff --git a/packages/loaders/git/package.json b/packages/loaders/git/package.json index 3919a5ee5ff..7f5ad1969c8 100644 --- a/packages/loaders/git/package.json +++ b/packages/loaders/git/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/git-loader", - "version": "8.0.9", + "version": "8.0.14", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,8 +51,8 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.4", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/graphql-tag-pluck": "8.3.9", + "@graphql-tools/utils": "^10.6.4", "is-glob": "4.0.3", "micromatch": "^4.0.8", "tslib": "^2.4.0", diff --git a/packages/loaders/github/CHANGELOG.md b/packages/loaders/github/CHANGELOG.md index 44934c4f8c2..6f8d2a78e21 100644 --- a/packages/loaders/github/CHANGELOG.md +++ b/packages/loaders/github/CHANGELOG.md @@ -1,5 +1,61 @@ # @graphql-tools/github-loader +## 8.0.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/graphql-tag-pluck@8.3.9 + +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/graphql-tag-pluck@8.3.8 + +## 8.0.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/graphql-tag-pluck@^8.3.6` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.6) + (from `^8.3.5`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`4fd0d3a`](https://github.com/ardatan/graphql-tools/commit/4fd0d3a335b39dc0c44e78a0416bb7dfe900c2ea), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/graphql-tag-pluck@8.3.7 + - @graphql-tools/utils@10.6.2 + +## 8.0.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/graphql-tag-pluck@8.3.6 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/graphql-tag-pluck@8.3.5 + ## 8.0.4 ### Patch Changes @@ -361,9 +417,9 @@ - c50d8568: Fix Github loader responding with 401 with invalid credentials Running the GitHub loader on a private repository with a missing or invalid GitHub token masks the - real error as [object Object]. This happens because the GitHub GraphQL api returns 401 unauthorized - if the token is not valid. After some debugging the only http status code i could find that triggers - this is 401. With the returned payload being: + real error as [object Object]. This happens because the GitHub GraphQL api returns 401 + unauthorized if the token is not valid. After some debugging the only http status code i could + find that triggers this is 401. With the returned payload being: This update fixes the problem for 401 by passing status to `handleResponse` and checking if that is 401 and reporting the correct message returned from Github. The response from github being: diff --git a/packages/loaders/github/package.json b/packages/loaders/github/package.json index 3249021c8ca..80d7df862cd 100644 --- a/packages/loaders/github/package.json +++ b/packages/loaders/github/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/github-loader", - "version": "8.0.4", + "version": "8.0.9", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -53,8 +53,8 @@ "dependencies": { "@ardatan/sync-fetch": "^0.0.1", "@graphql-tools/executor-http": "^1.1.9", - "@graphql-tools/graphql-tag-pluck": "^8.3.4", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/graphql-tag-pluck": "^8.3.9", + "@graphql-tools/utils": "^10.6.4", "@whatwg-node/fetch": "^0.10.0", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" diff --git a/packages/loaders/graphql-file/CHANGELOG.md b/packages/loaders/graphql-file/CHANGELOG.md index cc4ff4e423d..6438c2b470a 100644 --- a/packages/loaders/graphql-file/CHANGELOG.md +++ b/packages/loaders/graphql-file/CHANGELOG.md @@ -1,5 +1,60 @@ # @graphql-tools/graphql-file-loader +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/import@7.0.8 + +## 8.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/import@7.0.7 + +## 8.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/import@7.0.5` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/import/v/7.0.5) + (from `7.0.4`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/import@7.0.6 + - @graphql-tools/utils@10.6.2 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/import@7.0.5 + +## 8.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/import@7.0.4 + ## 8.0.3 ### Patch Changes diff --git a/packages/loaders/graphql-file/package.json b/packages/loaders/graphql-file/package.json index b381c6780bf..a5a62fd2c53 100644 --- a/packages/loaders/graphql-file/package.json +++ b/packages/loaders/graphql-file/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/graphql-file-loader", - "version": "8.0.3", + "version": "8.0.8", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,8 +51,8 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/import": "7.0.3", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/import": "7.0.8", + "@graphql-tools/utils": "^10.6.4", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" diff --git a/packages/loaders/json-file/CHANGELOG.md b/packages/loaders/json-file/CHANGELOG.md index 6bea0686db9..fd039e50e9a 100644 --- a/packages/loaders/json-file/CHANGELOG.md +++ b/packages/loaders/json-file/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/json-file-loader +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 8.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 8.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 8.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 8.0.3 ### Patch Changes diff --git a/packages/loaders/json-file/package.json b/packages/loaders/json-file/package.json index 38acc1fc364..53ce2d1f9b4 100644 --- a/packages/loaders/json-file/package.json +++ b/packages/loaders/json-file/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/json-file-loader", - "version": "8.0.3", + "version": "8.0.8", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" diff --git a/packages/loaders/module/CHANGELOG.md b/packages/loaders/module/CHANGELOG.md index a034ce390ff..141f56e84cf 100644 --- a/packages/loaders/module/CHANGELOG.md +++ b/packages/loaders/module/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/module-loader +## 8.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 8.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 8.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 8.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 8.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 8.0.3 ### Patch Changes diff --git a/packages/loaders/module/package.json b/packages/loaders/module/package.json index 0568b5c6792..7b68460b28c 100644 --- a/packages/loaders/module/package.json +++ b/packages/loaders/module/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/module-loader", - "version": "8.0.3", + "version": "8.0.8", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, "publishConfig": { diff --git a/packages/loaders/prisma/CHANGELOG.md b/packages/loaders/prisma/CHANGELOG.md deleted file mode 100644 index 56b0ea45920..00000000000 --- a/packages/loaders/prisma/CHANGELOG.md +++ /dev/null @@ -1,1158 +0,0 @@ -# @graphql-tools/prisma-loader - -## 8.0.17 - -### Patch Changes - -- Updated dependencies - [[`dc5043b`](https://github.com/ardatan/graphql-tools/commit/dc5043bb7c9afaca907c242eb6bf65e8019d79c4)]: - - @graphql-tools/utils@10.5.6 - - @graphql-tools/url-loader@8.0.15 - -## 8.0.16 - -### Patch Changes - -- [#6663](https://github.com/ardatan/graphql-tools/pull/6663) - [`d06afe3`](https://github.com/ardatan/graphql-tools/commit/d06afe3065edb15f4c58c1c155a230d8d542669f) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency - [`@whatwg-node/fetch@^0.10.0` โ†—๏ธŽ](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.0) - (from `^0.9.0`, in `dependencies`) -- Updated dependencies - [[`d06afe3`](https://github.com/ardatan/graphql-tools/commit/d06afe3065edb15f4c58c1c155a230d8d542669f)]: - - @graphql-tools/url-loader@8.0.14 - -## 8.0.15 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.13 - -## 8.0.14 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.12 - -## 8.0.13 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.11 - -## 8.0.12 - -### Patch Changes - -- Updated dependencies - [[`218422e`](https://github.com/ardatan/graphql-tools/commit/218422e9b93e9ea461043686907b18076bfaccc2)]: - - @graphql-tools/url-loader@8.0.10 - -## 8.0.11 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.9 - -## 8.0.10 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.8 - -## 8.0.9 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.7 - -## 8.0.8 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.6 - -## 8.0.7 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.5 - -## 8.0.6 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@8.0.4 - -## 8.0.5 - -### Patch Changes - -- Updated dependencies - [[`cf2ce5e`](https://github.com/ardatan/graphql-tools/commit/cf2ce5ed4773087cc324599f2812f4fb91398b21)]: - - @graphql-tools/utils@10.5.5 - - @graphql-tools/url-loader@8.0.3 - -## 8.0.4 - -### Patch Changes - -- [#6100](https://github.com/ardatan/graphql-tools/pull/6100) - [`4e72868`](https://github.com/ardatan/graphql-tools/commit/4e728689b70a563b6fa1eb0d52289974231f4251) - Thanks [@JohanBrorson](https://github.com/JohanBrorson)! - Remove unused dependencies - `json-stable-stringify` and `@types/json-stable-stringify`. - -## 8.0.3 - -### Patch Changes - -- [#5913](https://github.com/ardatan/graphql-tools/pull/5913) - [`83c0af0`](https://github.com/ardatan/graphql-tools/commit/83c0af0713ff2ce55ccfb97a1810ecfecfeab703) - Thanks [@enisdenjo](https://github.com/enisdenjo)! - dependencies updates: - - Updated dependency - [`@graphql-tools/utils@^10.0.13` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.13) - (from `^10.0.8`, in `dependencies`) -- Updated dependencies - [[`83c0af0`](https://github.com/ardatan/graphql-tools/commit/83c0af0713ff2ce55ccfb97a1810ecfecfeab703)]: - - @graphql-tools/url-loader@8.0.2 - -## 8.0.2 - -### Patch Changes - -- [#5664](https://github.com/ardatan/graphql-tools/pull/5664) - [`75a94362`](https://github.com/ardatan/graphql-tools/commit/75a94362346f4c260c1ab7472e1e4d7c0401e567) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency [`jose@^5.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/jose/v/5.0.0) (from - `^4.11.4`, in `dependencies`) -- Updated dependencies - [[`accd58fd`](https://github.com/ardatan/graphql-tools/commit/accd58fdcf2698422f7e99173206168a84fe17a8)]: - - @graphql-tools/utils@10.0.8 - -## 8.0.1 - -### Patch Changes - -- [#5304](https://github.com/ardatan/graphql-tools/pull/5304) - [`a97b78f2`](https://github.com/ardatan/graphql-tools/commit/a97b78f2bef939c3bd34953f9ad41a618b2a2376) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - - Updated dependency - [`http-proxy-agent@^7.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/http-proxy-agent/v/7.0.0) (from - `^6.0.0`, in `dependencies`) - -- [#5305](https://github.com/ardatan/graphql-tools/pull/5305) - [`cfd44c61`](https://github.com/ardatan/graphql-tools/commit/cfd44c6105276b6e93d6a13e5035b5093a71c326) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency - [`https-proxy-agent@^7.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/https-proxy-agent/v/7.0.0) (from - `^6.0.0`, in `dependencies`) - -## 8.0.0 - -### Major Changes - -- [#5274](https://github.com/ardatan/graphql-tools/pull/5274) - [`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955) - Thanks [@ardatan](https://github.com/ardatan)! - Drop Node 14 support. Require Node.js `>= 16` - -### Patch Changes - -- [#5274](https://github.com/ardatan/graphql-tools/pull/5274) - [`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955) - Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates: - - Updated dependency - [`@whatwg-node/fetch@^0.9.0` โ†—๏ธŽ](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.9.0) - (from `^0.8.2`, in `dependencies`) -- Updated dependencies - [[`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955), - [`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955), - [`944a68e8`](https://github.com/ardatan/graphql-tools/commit/944a68e8becf9c86b4c97fd17c372d98a285b955)]: - - @graphql-tools/url-loader@8.0.0 - - @graphql-tools/utils@10.0.0 - -## 7.2.72 - -### Patch Changes - -- [#5251](https://github.com/ardatan/graphql-tools/pull/5251) - [`58a18e4d`](https://github.com/ardatan/graphql-tools/commit/58a18e4d60dfb43dff2ebdeca2865da0bbaa1c16) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - - Updated dependency - [`http-proxy-agent@^6.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/http-proxy-agent/v/6.0.0) (from - `^5.0.0`, in `dependencies`) - -- [#5252](https://github.com/ardatan/graphql-tools/pull/5252) - [`8f79ded2`](https://github.com/ardatan/graphql-tools/commit/8f79ded25b82f68b8950ef326c90d4414f780912) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency - [`https-proxy-agent@^6.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/https-proxy-agent/v/6.0.0) (from - `^5.0.0`, in `dependencies`) - -## 7.2.71 - -### Patch Changes - -- [`bba3d32f`](https://github.com/ardatan/graphql-tools/commit/bba3d32f6c60c32530ba2e48aadb9baaf985978c) - Thanks [@ardatan](https://github.com/ardatan)! - Unpin url loader - -## 7.2.70 - -### Patch Changes - -- [#5166](https://github.com/ardatan/graphql-tools/pull/5166) - [`807c9b54`](https://github.com/ardatan/graphql-tools/commit/807c9b547369903575c1182f891e9a89aadbaeb8) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - - Updated dependency - [`graphql-request@^6.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/graphql-request/v/6.0.0) (from - `^5.0.0`, in `dependencies`) - -- [`1c95368a`](https://github.com/ardatan/graphql-tools/commit/1c95368aea868be537d956ba5e994cde58dfee41) - Thanks [@ardatan](https://github.com/ardatan)! - Use ranged versions for dependencies - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.18 - -## 7.2.69 - -### Patch Changes - -- Updated dependencies - [[`07589ae9`](https://github.com/ardatan/graphql-tools/commit/07589ae97499a4668b0bd24caa1e52ef8fcfd0e5)]: - - @graphql-tools/url-loader@7.17.17 - -## 7.2.68 - -### Patch Changes - -- Updated dependencies - [[`58414b26`](https://github.com/ardatan/graphql-tools/commit/58414b2606c13c77f2d3a3015b9931c587272b6b)]: - - @graphql-tools/url-loader@7.17.16 - -## 7.2.67 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.15 - -## 7.2.66 - -### Patch Changes - -- [`6df5c021`](https://github.com/ardatan/graphql-tools/commit/6df5c021c18e9ec10f700c910e79e7cae5558ce2) - Thanks [@ardatan](https://github.com/ardatan)! - Replace isomorphic-fetch with @whatwg-node/fetch - -## 7.2.65 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.14 - -## 7.2.64 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.13 - -## 7.2.63 - -### Patch Changes - -- Updated dependencies - [[`1b948acc`](https://github.com/ardatan/graphql-tools/commit/1b948accf76366f45f69fe212e0d600a85eb6a89)]: - - @graphql-tools/url-loader@7.17.12 - -## 7.2.62 - -### Patch Changes - -- Updated dependencies - [[`ab4cf86b`](https://github.com/ardatan/graphql-tools/commit/ab4cf86bf1330deacd95ecea2fcca54dd6590da1)]: - - @graphql-tools/url-loader@7.17.11 - -## 7.2.61 - -### Patch Changes - -- Updated dependencies - [[`b09ea282`](https://github.com/ardatan/graphql-tools/commit/b09ea282f0945fb19f354af57aabddcd23b2a155), - [`b5c8f640`](https://github.com/ardatan/graphql-tools/commit/b5c8f6407b74466ed0d2989000458cb59239e9af)]: - - @graphql-tools/url-loader@7.17.10 - - @graphql-tools/utils@9.2.1 - -## 7.2.60 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.9 - -## 7.2.59 - -### Patch Changes - -- Updated dependencies - [[`a94217e9`](https://github.com/ardatan/graphql-tools/commit/a94217e920c5d6237471ab6ad4d96cf230984177), - [`62d074be`](https://github.com/ardatan/graphql-tools/commit/62d074be48779b1e096e056ca1233822c421dc99)]: - - @graphql-tools/utils@9.2.0 - - @graphql-tools/url-loader@7.17.8 - -## 7.2.58 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.7 - -## 7.2.57 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.6 - -## 7.2.56 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.5 - -## 7.2.55 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.4 - -## 7.2.54 - -### Patch Changes - -- Updated dependencies - [[`1c291f33`](https://github.com/ardatan/graphql-tools/commit/1c291f33ba5e42126b5335530c1ac4cd6b3eaf6a)]: - - @graphql-tools/url-loader@7.17.3 - -## 7.2.53 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.2 - -## 7.2.52 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.17.1 - -## 7.2.51 - -### Patch Changes - -- [#4930](https://github.com/ardatan/graphql-tools/pull/4930) - [`cbc2fa8b`](https://github.com/ardatan/graphql-tools/commit/cbc2fa8b9f057f32f56088742c02e7b6628d84cb) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency - [`@types/jsonwebtoken@^9.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/@types/jsonwebtoken/v/9.0.0) - (from `^8.5.0`, in `dependencies`) -- Updated dependencies - [[`0e5d250c`](https://github.com/ardatan/graphql-tools/commit/0e5d250cbac7ab003c45020b5ea464a8924eed01), - [`1c4853cb`](https://github.com/ardatan/graphql-tools/commit/1c4853cb8563d83c0d862d3c11257c48c7d1469c), - [`499365aa`](https://github.com/ardatan/graphql-tools/commit/499365aa3f33148a47e708351416b6a54c17655a), - [`e3ec35ed`](https://github.com/ardatan/graphql-tools/commit/e3ec35ed27d4a329739c8da6be06ce74c8f25591)]: - - @graphql-tools/url-loader@7.17.0 - - @graphql-tools/utils@9.1.4 - -## 7.2.50 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.29 - -## 7.2.49 - -### Patch Changes - -- [#4923](https://github.com/ardatan/graphql-tools/pull/4923) - [`c10d688b`](https://github.com/ardatan/graphql-tools/commit/c10d688b33f1ba46a2269b589cea7bab1b05d283) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - Updated dependency - [`jsonwebtoken@^9.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/jsonwebtoken/v/9.0.0) (from `^8.5.1`, - in `dependencies`) - -## 7.2.48 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.28 - -## 7.2.47 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.27 - -## 7.2.46 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.26 - -## 7.2.45 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.25 - -## 7.2.44 - -### Patch Changes - -- Updated dependencies - [[`904fe770`](https://github.com/ardatan/graphql-tools/commit/904fe770a355ee3d79464c3bbf0375d2dcd64759)]: - - @graphql-tools/utils@9.1.3 - - @graphql-tools/url-loader@7.16.24 - -## 7.2.43 - -### Patch Changes - -- Updated dependencies - [[`13c24883`](https://github.com/ardatan/graphql-tools/commit/13c24883004d5330f7402cb20566e37535c5729b)]: - - @graphql-tools/utils@9.1.2 - - @graphql-tools/url-loader@7.16.23 - -## 7.2.42 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.22 - -## 7.2.41 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.21 - -## 7.2.40 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.20 - -## 7.2.39 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.19 - -## 7.2.38 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.18 - -## 7.2.37 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.17 - -## 7.2.36 - -### Patch Changes - -- Updated dependencies - [[`7411a5e7`](https://github.com/ardatan/graphql-tools/commit/7411a5e71a8138d9ccfe907b1fb01e62fcbb0cdb)]: - - @graphql-tools/utils@9.1.1 - - @graphql-tools/url-loader@7.16.16 - -## 7.2.35 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.15 - -## 7.2.34 - -### Patch Changes - -- Updated dependencies - [[`e2fc041e`](https://github.com/ardatan/graphql-tools/commit/e2fc041e6f751c70efc20e8a02cbf88da0b905d2)]: - - @graphql-tools/url-loader@7.16.14 - -## 7.2.33 - -### Patch Changes - -- Updated dependencies - [[`61812ccb`](https://github.com/ardatan/graphql-tools/commit/61812ccb97d6e179e74d72661dd0736f6ca0a7ff), - [`61812ccb`](https://github.com/ardatan/graphql-tools/commit/61812ccb97d6e179e74d72661dd0736f6ca0a7ff)]: - - @graphql-tools/url-loader@7.16.13 - -## 7.2.32 - -### Patch Changes - -- Updated dependencies - [[`c0639dd0`](https://github.com/ardatan/graphql-tools/commit/c0639dd0065db1b5bcedaabf58b11945714bab8d)]: - - @graphql-tools/utils@9.1.0 - - @graphql-tools/url-loader@7.16.12 - -## 7.2.31 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.11 - -## 7.2.30 - -### Patch Changes - -- Updated dependencies - [[`d83b1960`](https://github.com/ardatan/graphql-tools/commit/d83b19605be71481ccf8effd80d5254423ea811a)]: - - @graphql-tools/url-loader@7.16.10 - - @graphql-tools/utils@9.0.1 - -## 7.2.29 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.9 - -## 7.2.28 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.8 - -## 7.2.27 - -### Patch Changes - -- Updated dependencies - [[`80836fa7`](https://github.com/ardatan/graphql-tools/commit/80836fa78af3c6e61c61fe4d3bc52831b2c58931), - [`8f6d3efc`](https://github.com/ardatan/graphql-tools/commit/8f6d3efc92b25236f5a3a761ea7ba2f0a7c7f550), - [`80836fa7`](https://github.com/ardatan/graphql-tools/commit/80836fa78af3c6e61c61fe4d3bc52831b2c58931), - [`80836fa7`](https://github.com/ardatan/graphql-tools/commit/80836fa78af3c6e61c61fe4d3bc52831b2c58931), - [`80836fa7`](https://github.com/ardatan/graphql-tools/commit/80836fa78af3c6e61c61fe4d3bc52831b2c58931)]: - - @graphql-tools/utils@9.0.0 - - @graphql-tools/url-loader@7.16.7 - -## 7.2.26 - -### Patch Changes - -- Updated dependencies - [[`f7daf777`](https://github.com/ardatan/graphql-tools/commit/f7daf7777cc214801886e4a45c0389bc5837d175)]: - - @graphql-tools/utils@8.13.1 - - @graphql-tools/url-loader@7.16.6 - -## 7.2.25 - -### Patch Changes - -- Updated dependencies - [[`884c7ef7`](https://github.com/ardatan/graphql-tools/commit/884c7ef7bc549421fad6cbf38616d4a9eb9f8738), - [`df5848b8`](https://github.com/ardatan/graphql-tools/commit/df5848b85102827f004f23aded7cf802cdcde00f), - [`df5848b8`](https://github.com/ardatan/graphql-tools/commit/df5848b85102827f004f23aded7cf802cdcde00f), - [`df5848b8`](https://github.com/ardatan/graphql-tools/commit/df5848b85102827f004f23aded7cf802cdcde00f)]: - - @graphql-tools/url-loader@7.16.5 - - @graphql-tools/utils@8.13.0 - -## 7.2.24 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.4 - -## 7.2.23 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.3 - -## 7.2.22 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.16.2 - -## 7.2.21 - -### Patch Changes - -- Updated dependencies - [[`43c736bd`](https://github.com/ardatan/graphql-tools/commit/43c736bd1865c00898966a7ed14060496c9e6a0c)]: - - @graphql-tools/utils@8.12.0 - - @graphql-tools/url-loader@7.16.1 - -## 7.2.20 - -### Patch Changes - -- [#4678](https://github.com/ardatan/graphql-tools/pull/4678) - [`1b0988a4`](https://github.com/ardatan/graphql-tools/commit/1b0988a42ca83a21e5a30284f83bd78ecbaf2e90) - Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: - - - Updated dependency - [`graphql-request@^5.0.0` โ†—๏ธŽ](https://www.npmjs.com/package/graphql-request/v/null) (from - `^4.0.0`, in `dependencies`) - -- Updated dependencies - [[`939e07ca`](https://github.com/ardatan/graphql-tools/commit/939e07cae38ff179e00c2ff2a23b70f6259971ef), - [`dd8886d1`](https://github.com/ardatan/graphql-tools/commit/dd8886d1534fdf73b7cfb6d54b13a3db5812b38b), - [`dd8886d1`](https://github.com/ardatan/graphql-tools/commit/dd8886d1534fdf73b7cfb6d54b13a3db5812b38b), - [`dd8886d1`](https://github.com/ardatan/graphql-tools/commit/dd8886d1534fdf73b7cfb6d54b13a3db5812b38b), - [`dd8886d1`](https://github.com/ardatan/graphql-tools/commit/dd8886d1534fdf73b7cfb6d54b13a3db5812b38b)]: - - @graphql-tools/url-loader@7.16.0 - -## 7.2.19 - -### Patch Changes - -- Updated dependencies - [[`2926a270`](https://github.com/ardatan/graphql-tools/commit/2926a27098a94469306664add1f8c232ac6de6e7)]: - - @graphql-tools/url-loader@7.15.0 - -## 7.2.18 - -### Patch Changes - -- Updated dependencies - [[`71cb4fae`](https://github.com/ardatan/graphql-tools/commit/71cb4faeb0833a228520a7bc2beed8ac7274443f), - [`403ed450`](https://github.com/ardatan/graphql-tools/commit/403ed4507eff7cd509f410f7542a702da72e1a9a)]: - - @graphql-tools/utils@8.11.0 - - @graphql-tools/url-loader@7.14.3 - -## 7.2.17 - -### Patch Changes - -- Updated dependencies - [[`f8610d24`](https://github.com/ardatan/graphql-tools/commit/f8610d240083a621852c21342139c12d736ac6af)]: - - @graphql-tools/url-loader@7.14.2 - -## 7.2.16 - -### Patch Changes - -- Updated dependencies - [[`5e9b1c06`](https://github.com/ardatan/graphql-tools/commit/5e9b1c066ed02fcac54cd79080c89e327d8d2f53), - [`4fe3d9c0`](https://github.com/ardatan/graphql-tools/commit/4fe3d9c037e9c138bd8a9b04b3977d74eba32c97)]: - - @graphql-tools/url-loader@7.14.1 - - @graphql-tools/utils@8.10.1 - -## 7.2.15 - -### Patch Changes - -- Updated dependencies - [[`768432c8`](https://github.com/ardatan/graphql-tools/commit/768432c8f75a5684de802988bed1df814a9ef191)]: - - @graphql-tools/url-loader@7.14.0 - -## 7.2.14 - -### Patch Changes - -- Updated dependencies - [[`b6f1f5ce`](https://github.com/ardatan/graphql-tools/commit/b6f1f5ce847cc1e12da29f7adc1be298c32d1162)]: - - @graphql-tools/url-loader@7.13.9 - -## 7.2.13 - -### Patch Changes - -- [#4640](https://github.com/ardatan/graphql-tools/pull/4640) - [`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d) - Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates: - - - Updated dependency - [`@graphql-tools/url-loader@7.13.7` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/url-loader/v/7.13.7) - (was `7.13.6`, in `dependencies`) - -- Updated dependencies - [[`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d), - [`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d), - [`27bdc237`](https://github.com/ardatan/graphql-tools/commit/27bdc23713a5176485ac940fc5431256b4f2de8d)]: - - @graphql-tools/url-loader@7.13.8 - -## 7.2.12 - -### Patch Changes - -- [`0555a972`](https://github.com/ardatan/graphql-tools/commit/0555a972f010d2b3ca93b9164b26474a78d0b20b) - Thanks [@ardatan](https://github.com/ardatan)! - Bump versions - -- Updated dependencies - [[`0555a972`](https://github.com/ardatan/graphql-tools/commit/0555a972f010d2b3ca93b9164b26474a78d0b20b)]: - - @graphql-tools/url-loader@7.13.7 - -## 7.2.11 - -### Patch Changes - -- Updated dependencies []: - - @graphql-tools/url-loader@7.13.6 - -## 7.2.10 - -### Patch Changes - -- Updated dependencies - [[`2609d71f`](https://github.com/ardatan/graphql-tools/commit/2609d71f7c3a0ef2b381c51d9ce60b0de49f9b27)]: - - @graphql-tools/utils@8.10.0 - - @graphql-tools/url-loader@7.13.5 - -## 7.2.9 - -### Patch Changes - -- [#4624](https://github.com/ardatan/graphql-tools/pull/4624) - [`e3167edc`](https://github.com/ardatan/graphql-tools/commit/e3167edc98172fda88ce2306c10c7d4a23d91d67) - Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with - `moduleResolution` `node16` or `nodenext` - -- Updated dependencies - [[`e3167edc`](https://github.com/ardatan/graphql-tools/commit/e3167edc98172fda88ce2306c10c7d4a23d91d67)]: - - @graphql-tools/url-loader@7.13.4 - - @graphql-tools/utils@8.9.1 - -## 7.2.8 - -### Patch Changes - -- Updated dependencies [4dc7c3a0] - - @graphql-tools/url-loader@7.13.3 - -## 7.2.7 - -### Patch Changes - -- 49ced0e7: Replace and remove unnecessary `replaceall` dependency -- Updated dependencies [3c8fb360] - - @graphql-tools/url-loader@7.13.2 - -## 7.2.6 - -### Patch Changes - -- Updated dependencies [2a3b45e3] - - @graphql-tools/utils@8.9.0 - - @graphql-tools/url-loader@7.13.1 - -## 7.2.5 - -### Patch Changes - -- Updated dependencies [e98c84a3] - - @graphql-tools/url-loader@7.13.0 - -## 7.2.3 - -### Patch Changes - -- Updated dependencies [eda0da95] - - @graphql-tools/url-loader@7.12.2 - -## 7.2.2 - -### Patch Changes - -- Updated dependencies [ead60ca3] - - @graphql-tools/url-loader@7.12.1 - -## 7.2.1 - -### Patch Changes - -- Updated dependencies [adbf372c] - - @graphql-tools/url-loader@7.12.0 - -## 7.2.0 - -### Minor Changes - -- d76a299c: Support TypeScript module resolution. - -### Patch Changes - -- Updated dependencies [a0abbbcd] -- Updated dependencies [d76a299c] - - @graphql-tools/utils@8.8.0 - - @graphql-tools/url-loader@7.11.0 - -## 7.1.25 - -### Patch Changes - -- Updated dependencies [4914970b] -- Updated dependencies [4914970b] - - @graphql-tools/utils@8.7.0 - - @graphql-tools/url-loader@7.10.0 - -## 7.1.24 - -### Patch Changes - -- Updated dependencies [05218bfe] - - @graphql-tools/url-loader@7.9.25 - -## 7.1.23 - -### Patch Changes - -- 041c5ba1: Use caret range for the tslib dependency -- Updated dependencies [041c5ba1] - - @graphql-tools/url-loader@7.9.24 - - @graphql-tools/utils@8.6.13 - -## 7.1.22 - -### Patch Changes - -- Updated dependencies [da7ad43b] - - @graphql-tools/utils@8.6.12 - - @graphql-tools/url-loader@7.9.23 - -## 7.1.21 - -### Patch Changes - -- Updated dependencies [c0762ee3] - - @graphql-tools/utils@8.6.11 - - @graphql-tools/url-loader@7.9.22 - -## 7.1.20 - -### Patch Changes - -- Updated dependencies [0fc510cb] - - @graphql-tools/utils@8.6.10 - - @graphql-tools/url-loader@7.9.21 - -## 7.1.19 - -### Patch Changes - -- Updated dependencies [ab0549cc] - - @graphql-tools/url-loader@7.9.20 - -## 7.1.18 - -### Patch Changes - -- Updated dependencies [627565a8] - - @graphql-tools/url-loader@7.9.19 - -## 7.1.17 - -### Patch Changes - -- Updated dependencies [84ae31ea] - - @graphql-tools/url-loader@7.9.18 - -## 7.1.16 - -### Patch Changes - -- Updated dependencies [3d89a26e] - - @graphql-tools/url-loader@7.9.17 - -## 7.1.15 - -### Patch Changes - -- Updated dependencies [4b70d2be] - - @graphql-tools/url-loader@7.9.16 - -## 7.1.14 - -### Patch Changes - -- Updated dependencies [dd8563f1] - - @graphql-tools/url-loader@7.9.15 - -## 7.1.13 - -### Patch Changes - -- Updated dependencies [31a33e2b] - - @graphql-tools/utils@8.6.9 - - @graphql-tools/url-loader@7.9.14 - -## 7.1.12 - -### Patch Changes - -- Updated dependencies [8d9f48bc] - - @graphql-tools/url-loader@7.9.13 - -## 7.1.11 - -### Patch Changes - -- Updated dependencies [cb238877] -- Updated dependencies [43758d61] - - @graphql-tools/utils@8.6.8 - - @graphql-tools/url-loader@7.9.12 - -## 7.1.10 - -### Patch Changes - -- Updated dependencies [0bbb1769] - - @graphql-tools/url-loader@7.9.11 - - @graphql-tools/utils@8.6.7 - -## 7.1.9 - -### Patch Changes - -- Updated dependencies [fe9402af] - - @graphql-tools/url-loader@7.9.10 - -## 7.1.8 - -### Patch Changes - -- Updated dependencies [904c0847] - - @graphql-tools/utils@8.6.6 - - @graphql-tools/url-loader@7.9.9 - -## 7.1.7 - -### Patch Changes - -- @graphql-tools/url-loader@7.9.8 - -## 7.1.6 - -### Patch Changes - -- @graphql-tools/url-loader@7.9.7 - -## 7.1.5 - -### Patch Changes - -- Updated dependencies [be2c02d7] - - @graphql-tools/utils@8.6.5 - - @graphql-tools/url-loader@7.9.6 - -## 7.1.4 - -### Patch Changes - -- Updated dependencies [d36d530b] - - @graphql-tools/utils@8.6.4 - - @graphql-tools/url-loader@7.9.5 - -## 7.1.3 - -### Patch Changes - -- 0c0c6857: fix - align versions -- Updated dependencies [0c0c6857] - - @graphql-tools/url-loader@7.9.4 - -## 7.1.2 - -### Patch Changes - -- 18341363: feat(visitResult): ignore if field not present in visited object -- Updated dependencies [18341363] - - @graphql-tools/url-loader@7.7.2 - - @graphql-tools/utils@8.6.2 - -## 7.1.1 - -### Patch Changes - -- 4bfb3428: enhance: use ^ for tslib dependency -- Updated dependencies [981eef80] -- Updated dependencies [4bfb3428] - - @graphql-tools/url-loader@7.4.2 - - @graphql-tools/utils@8.5.1 - -## 7.1.0 - -### Minor Changes - -- c5b0719c: feat: GraphQL v16 support - -### Patch Changes - -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] -- Updated dependencies [c5b0719c] - - @graphql-tools/utils@8.2.0 - - @graphql-tools/url-loader@7.1.0 - -## 7.0.6 - -### Patch Changes - -- e50852e6: use version ranges instead of a fixed version for the graphql-tools package versions -- Updated dependencies [e50852e6] - - @graphql-tools/url-loader@7.0.11 - -## 7.0.5 - -### Patch Changes - -- Updated dependencies [2c807ddb] - - @graphql-tools/utils@8.1.1 - - @graphql-tools/url-loader@7.0.10 - -## 7.0.4 - -### Patch Changes - -- Updated dependencies [b9684631] -- Updated dependencies [9ede806a] -- Updated dependencies [67691b78] - - @graphql-tools/utils@8.1.0 - - @graphql-tools/url-loader@7.0.8 - -## 7.0.3 - -### Patch Changes - -- Updated dependencies [04830049] - - @graphql-tools/utils@8.0.2 - - @graphql-tools/url-loader@7.0.4 - -## 7.0.2 - -### Patch Changes - -- 118b3ca5: fix imports for ESM - -## 7.0.1 - -### Patch Changes - -- Updated dependencies [b823dbaf] - - @graphql-tools/utils@8.0.1 - - @graphql-tools/url-loader@7.0.3 - -## 7.0.0 - -### Major Changes - -- 1c039fd3: BREAKING CHANGE - - - Now each loader handles glob patterns internally and returns an array of `Source` object instead - of single `Source` - - - GraphQL Tag Pluck now respects code locations and returns graphql-js `Source` objects for each - found code block - - - Thanks to the one above, `CodeFileLoader` now returns different `Source` objects for each found - SDL code block. - -## 6.3.1 - -### Patch Changes - -- Updated dependencies [af9a78de] -- Updated dependencies [9c26b847] -- Updated dependencies [7d3e3006] -- Updated dependencies [614c08cc] -- Updated dependencies [7d3e3006] -- Updated dependencies [dae6dc7b] -- Updated dependencies [a31f9593] -- Updated dependencies [6877b913] -- Updated dependencies [c42e811d] -- Updated dependencies [7d3e3006] -- Updated dependencies [8c8d4fc0] -- Updated dependencies [7d3e3006] -- Updated dependencies [7d3e3006] -- Updated dependencies [74581cf3] -- Updated dependencies [c0ca3190] -- Updated dependencies [982c8f53] -- Updated dependencies [7d3e3006] -- Updated dependencies [fd81e800] -- Updated dependencies [7d3e3006] -- Updated dependencies [7d3e3006] - - @graphql-tools/url-loader@7.0.0 - - @graphql-tools/utils@8.0.0 - -## 6.3.0 - -### Minor Changes - -- de05971c: Use native Promise instead of Bluebird - -### Patch Changes - -- Updated dependencies [50bc2178] - - @graphql-tools/url-loader@6.8.2 - -## 6.2.7 - -### Patch Changes - -- eacf0dc3: Replace fs-extra with native methods - -## 6.2.6 - -### Patch Changes - -- 07548058: Don't initialize env vars with an empty object, so it can fall back on process.env - -## 6.2.5 - -### Patch Changes - -- Updated dependencies [be1a1575] - - @graphql-tools/utils@7.0.0 - - @graphql-tools/url-loader@6.3.1 - -## 6.2.4 - -### Patch Changes - -- 533d6d53: Bump all packages to allow adjustments -- Updated dependencies [32c3c4f8] -- Updated dependencies [533d6d53] - - @graphql-tools/utils@6.2.4 - - @graphql-tools/url-loader@6.2.4 diff --git a/packages/loaders/prisma/package.json b/packages/loaders/prisma/package.json deleted file mode 100644 index b3ccaa9873b..00000000000 --- a/packages/loaders/prisma/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "@graphql-tools/prisma-loader", - "version": "8.0.17", - "type": "module", - "description": "A set of utils for faster development of GraphQL tools", - "repository": { - "type": "git", - "url": "ardatan/graphql-tools", - "directory": "packages/loaders/prisma" - }, - "author": "Dotan Simha ", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "exports": { - ".": { - "require": { - "types": "./dist/typings/index.d.cts", - "default": "./dist/cjs/index.js" - }, - "import": { - "types": "./dist/typings/index.d.ts", - "default": "./dist/esm/index.js" - }, - "default": { - "types": "./dist/typings/index.d.ts", - "default": "./dist/esm/index.js" - } - }, - "./*": { - "require": { - "types": "./dist/typings/*.d.cts", - "default": "./dist/cjs/*.js" - }, - "import": { - "types": "./dist/typings/*.d.ts", - "default": "./dist/esm/*.js" - }, - "default": { - "types": "./dist/typings/*.d.ts", - "default": "./dist/esm/*.js" - } - }, - "./package.json": "./package.json" - }, - "typings": "dist/typings/index.d.ts", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - }, - "dependencies": { - "@graphql-tools/url-loader": "^8.0.15", - "@graphql-tools/utils": "^10.5.6", - "@types/js-yaml": "^4.0.0", - "@whatwg-node/fetch": "^0.10.0", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "dotenv": "^16.0.0", - "graphql-request": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "jose": "^5.0.0", - "js-yaml": "^4.0.0", - "lodash": "^4.17.20", - "scuid": "^1.1.0", - "tslib": "^2.4.0", - "yaml-ast-parser": "^0.0.43" - }, - "publishConfig": { - "directory": "dist", - "access": "public" - }, - "sideEffects": false, - "typescript": { - "definition": "dist/typings/index.d.ts" - } -} diff --git a/packages/loaders/prisma/src/index.ts b/packages/loaders/prisma/src/index.ts deleted file mode 100644 index 9dc19da22f4..00000000000 --- a/packages/loaders/prisma/src/index.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { promises as fsPromises } from 'fs'; -import { homedir } from 'os'; -import { join } from 'path'; -import { cwd } from 'process'; -import { LoadFromUrlOptions, UrlLoader } from '@graphql-tools/url-loader'; -import { Environment, PrismaDefinitionClass } from './prisma-yml/index.js'; - -const { access } = fsPromises; - -/** - * additional options for loading from a `prisma.yml` file - */ -export interface PrismaLoaderOptions extends LoadFromUrlOptions { - envVars?: { [key: string]: string }; - graceful?: boolean; - cwd?: string; -} - -/** - * This loader loads a schema from a `prisma.yml` file - */ -export class PrismaLoader extends UrlLoader { - canLoadSync() { - return false; - } - - async canLoad(prismaConfigFilePath: string, options: PrismaLoaderOptions): Promise { - if (typeof prismaConfigFilePath === 'string' && prismaConfigFilePath.endsWith('prisma.yml')) { - const joinedYmlPath = join(options.cwd || cwd(), prismaConfigFilePath); - try { - await access(joinedYmlPath); - return true; - } catch { - return false; - } - } - return false; - } - - async load(prismaConfigFilePath: string, options: PrismaLoaderOptions) { - if (!(await this.canLoad(prismaConfigFilePath, options))) { - return []; - } - const { graceful, envVars } = options; - const home = homedir(); - const env = new Environment(home); - await env.load(); - const joinedYmlPath = join(options.cwd || cwd(), prismaConfigFilePath); - const definition = new PrismaDefinitionClass(env, joinedYmlPath, envVars); - await definition.load({}, undefined, graceful); - const serviceName = definition.service!; - const stage = definition.stage!; - const clusterName = definition.cluster; - if (!clusterName) { - throw new Error(`No cluster set. Please set the "cluster" property in your prisma.yml`); - } - const cluster = await definition.getCluster(); - if (!cluster) { - throw new Error( - `Cluster ${clusterName} provided in prisma.yml could not be found in global ~/.prisma/config.yml. - Please check in ~/.prisma/config.yml, if the cluster exists. - You can use \`docker-compose up -d\` to start a new cluster.`, - ); - } - const token = await definition.getToken(serviceName, stage); - const url = cluster.getApiEndpoint(serviceName, stage, definition.getWorkspace() || undefined); - const headers = token - ? { - Authorization: `Bearer ${token}`, - } - : undefined; - return super.load(url, { headers }); - } -} diff --git a/packages/loaders/prisma/src/prisma-yml/Cluster.test.ts b/packages/loaders/prisma/src/prisma-yml/Cluster.test.ts deleted file mode 100644 index 4db70c01caf..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Cluster.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Cluster, Output } from './index.js'; - -describe('cluster endpoint generation', () => { - test('local cluster', () => { - const cluster = new Cluster(new Output(), 'local', 'http://localhost:4466', undefined, true); - expect(cluster.getApiEndpoint('default', 'default')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('dev', 'default')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('default', 'dev')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('default', 'dev', 'ignore-me')).toMatchSnapshot(); - }); - test('private cluster', () => { - const cluster = new Cluster( - new Output(), - 'test01', - 'https://test01_workspace.prisma.sh', - undefined, - false, - false, - true, - ); - expect(cluster.getApiEndpoint('default', 'default', 'workspace')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('dev', 'default', 'workspace')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('default', 'dev', 'workspace')).toMatchSnapshot(); - }); - test('sandbox cluster', () => { - const cluster = new Cluster( - new Output(), - 'prisma-eu1', - 'https://eu1.prisma.sh', - undefined, - false, - true, - false, - ); - expect(cluster.getApiEndpoint('default', 'default', 'workspace')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('dev', 'default', 'workspace')).toMatchSnapshot(); - expect(cluster.getApiEndpoint('default', 'dev', 'workspace')).toMatchSnapshot(); - }); -}); diff --git a/packages/loaders/prisma/src/prisma-yml/Cluster.ts b/packages/loaders/prisma/src/prisma-yml/Cluster.ts deleted file mode 100644 index 68dc4ba3c0a..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Cluster.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { Buffer } from 'buffer'; -import { createPrivateKey } from 'crypto'; -import chalk from 'chalk'; -import debugPkg from 'debug'; -import { GraphQLClient } from 'graphql-request'; -import { SignJWT } from 'jose'; -import { fetch } from '@whatwg-node/fetch'; -import { cloudApiEndpoint } from './constants.js'; -import { IOutput } from './Output.js'; -import { getProxyAgent } from './utils/getProxyAgent.js'; - -const debug = debugPkg('Environment'); - -export class Cluster { - name: string; - baseUrl: string; - local: boolean; - shared: boolean; - clusterSecret?: string; - requiresAuth: boolean | undefined; - out: IOutput; - isPrivate: boolean; - workspaceSlug?: string; - private cachedToken?: string; - hasOldDeployEndpoint: boolean; - custom?: boolean; - constructor( - out: IOutput, - name: string, - baseUrl: string, - clusterSecret?: string, - local = true, - shared = false, - isPrivate = false, - workspaceSlug?: string, - ) { - this.out = out; - this.name = name; - - // All `baseUrl` extension points in this class - // adds a trailing slash. Here we remove it from - // the passed `baseUrl` in order to avoid double - // slashes. - this.baseUrl = baseUrl.replace(/\/$/, ''); - this.clusterSecret = clusterSecret; - this.local = local; - this.shared = shared; - this.isPrivate = isPrivate; - this.workspaceSlug = workspaceSlug; - this.hasOldDeployEndpoint = false; - } - - async getToken( - serviceName: string, - workspaceSlug?: string, - stageName?: string, - ): Promise { - // public clusters just take the token - - const needsAuth = await this.needsAuth(); - debug({ needsAuth }); - if (!needsAuth) { - return null; - } - - if (this.name === 'shared-public-demo') { - return ''; - } - if (this.isPrivate && process.env['PRISMA_MANAGEMENT_API_SECRET']) { - return this.getLocalToken(); - } - if (this.shared || (this.isPrivate && !process.env['PRISMA_MANAGEMENT_API_SECRET'])) { - return this.generateClusterToken(serviceName, workspaceSlug, stageName); - } else { - return this.getLocalToken(); - } - } - - async getLocalToken(): Promise { - if (!this.clusterSecret && !process.env['PRISMA_MANAGEMENT_API_SECRET']) { - return null; - } - if (!this.cachedToken) { - const grants = [{ target: `*/*`, action: '*' }]; - const secret = process.env['PRISMA_MANAGEMENT_API_SECRET'] || this.clusterSecret; - - if (!secret) { - throw new Error( - `Could not generate token for cluster ${chalk.bold( - this.getDeployEndpoint(), - )}. Did you provide the env var PRISMA_MANAGEMENT_API_SECRET?`, - ); - } - - try { - const algorithm = process.env['PRISMA_MANAGEMENT_API_SECRET'] ? 'HS256' : 'RS256'; - this.cachedToken = await new SignJWT({ grants }) - .setProtectedHeader({ alg: algorithm, typ: 'JWT' }) - .setExpirationTime('5y') - .setIssuedAt() - .sign(algorithm === 'HS256' ? Buffer.from(secret) : createPrivateKey(secret)); - } catch (e: any) { - throw new Error( - `Could not generate token for cluster ${chalk.bold(this.getDeployEndpoint())}. -Original error: ${e.message}`, - ); - } - } - - return this.cachedToken!; - } - - get cloudClient() { - return new GraphQLClient(cloudApiEndpoint, { - headers: { - Authorization: `Bearer ${this.clusterSecret}`, - }, - agent: getProxyAgent(cloudApiEndpoint), - } as any); - } - - async generateClusterToken( - serviceName: string, - workspaceSlug: string = this.workspaceSlug || '*', - stageName?: string, - ): Promise { - const query = /* GraphQL */ ` - mutation ($input: GenerateClusterTokenRequest!) { - generateClusterToken(input: $input) { - clusterToken - } - } - `; - - const { - generateClusterToken: { clusterToken }, - } = await this.cloudClient.request<{ - generateClusterToken: { - clusterToken: string; - }; - }>(query, { - input: { - workspaceSlug, - clusterName: this.name, - serviceName, - stageName, - }, - }); - - return clusterToken; - } - - async addServiceToCloudDBIfMissing( - serviceName: string, - workspaceSlug: string = this.workspaceSlug!, - stageName?: string, - ): Promise { - const query = /* GraphQL */ ` - mutation ($input: GenerateClusterTokenRequest!) { - addServiceToCloudDBIfMissing(input: $input) - } - `; - - const serviceCreated = await this.cloudClient.request<{ - addServiceToCloudDBIfMissing: boolean; - }>(query, { - input: { - workspaceSlug, - clusterName: this.name, - serviceName, - stageName, - }, - }); - - return serviceCreated.addServiceToCloudDBIfMissing; - } - - getApiEndpoint(service: string, stage: string, workspaceSlug?: string | null) { - if (!this.shared && service === 'default' && stage === 'default') { - return this.baseUrl; - } - if (!this.shared && stage === 'default') { - return `${this.baseUrl}/${service}`; - } - if (this.isPrivate || this.local) { - return `${this.baseUrl}/${service}/${stage}`; - } - const workspaceString = workspaceSlug ? `${workspaceSlug}/` : ''; - return `${this.baseUrl}/${workspaceString}${service}/${stage}`; - } - - getWSEndpoint(service: string, stage: string, workspaceSlug?: string | null) { - return this.getApiEndpoint(service, stage, workspaceSlug).replace(/^http/, 'ws'); - } - - getImportEndpoint(service: string, stage: string, workspaceSlug?: string | null) { - return this.getApiEndpoint(service, stage, workspaceSlug) + `/import`; - } - - getExportEndpoint(service: string, stage: string, workspaceSlug?: string | null) { - return this.getApiEndpoint(service, stage, workspaceSlug) + `/export`; - } - - getDeployEndpoint() { - return `${this.baseUrl}/${this.hasOldDeployEndpoint ? 'cluster' : 'management'}`; - } - - async isOnline(): Promise { - const version = await this.getVersion(); - return typeof version === 'string'; - } - - async getVersion(): Promise { - // first try new api - try { - const result = await this.request(`{ - serverInfo { - version - } - }`); - - const res = await result.json(); - const { data, errors } = res; - if (errors && errors[0].code === 3016 && errors[0].message.includes('management@default')) { - this.hasOldDeployEndpoint = true; - return await this.getVersion(); - } - if (data && data.serverInfo) { - return data.serverInfo.version; - } - } catch (e: any) { - debug(e); - } - - // if that doesn't work, try the old one - try { - const result = await this.request(`{ - serverInfo { - version - } - }`); - - const res = await result.json(); - const { data } = res; - return data.serverInfo.version; - } catch (e: any) { - debug(e); - } - - return null; - } - - request(query: string, variables?: any) { - return fetch(this.getDeployEndpoint(), { - method: 'post', - headers: { - 'Content-Type': 'application/json', - } as any, - body: JSON.stringify({ - query, - variables, - }), - } as any); - } - - async needsAuth(): Promise { - try { - const result = await this.request(`{ - listProjects { - name - } - }`); - const data = await result.json(); - if (data.errors && data.errors.length > 0) { - return true; - } - return false; - } catch (e: any) { - debug('Assuming that the server needs authentication'); - debug(e.toString()); - return true; - } - } - - toJSON() { - return { - name: this.name, - baseUrl: this.baseUrl, - local: this.local, - clusterSecret: this.clusterSecret, - shared: this.shared, - isPrivate: this.isPrivate, - workspaceSlug: this.workspaceSlug, - }; - } -} diff --git a/packages/loaders/prisma/src/prisma-yml/Environment.test.ts b/packages/loaders/prisma/src/prisma-yml/Environment.test.ts deleted file mode 100644 index 2b0b5394622..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Environment.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import * as fs from 'fs'; -import { Cluster } from './Cluster.js'; -import { Environment } from './Environment.js'; -import { Output } from './Output.js'; -import { getTmpDir } from './test/getTmpDir.js'; - -export function makeEnv(_?: string) { - const tmpDir = getTmpDir(); - return new Environment(tmpDir); -} - -const out = new Output(); - -describe('Environment', () => { - test('non-existent global prisma rc', async () => { - const env = makeEnv(); - await env.load(); - expect(env.clusters).toMatchSnapshot(); - }); - test('persists .prisma correctly', async () => { - const env = makeEnv(); - await env.load(); - const cluster = new Cluster(out, 'cluster', `http://localhost:60000`, ''); - env.addCluster(cluster); - env.saveGlobalRC(); - expect(fs.readFileSync(env.rcPath, 'utf-8')).toMatchSnapshot(); - expect(env.clusters).toMatchSnapshot(); - }); - test('empty global prisma rc', async () => { - const env = makeEnv(''); - await env.load(); - expect(env.clusters).toMatchSnapshot(); - }); - test('sets the platform token correctly', async () => { - const env = makeEnv(`platformToken: asdf`); - await env.load(); - expect(env.clusters).toMatchSnapshot(); - }); - test('interpolates env vars', async () => { - process.env['SPECIAL_TEST_ENV_VAR'] = 'this-is-so-special'; - const env = makeEnv(`platformToken: \${env:SPECIAL_TEST_ENV_VAR}`); - await env.load(); - expect(env.clusters).toMatchSnapshot(); - }); - test('loads multiple cluster definitions correctly + gives cluster by name', async () => { - const rc = `clusters: - local: - host: 'http://localhost:60000' - remote: - host: 'https://remote.graph.cool' - clusterSecret: 'here-is-a-token' - `; - const env = makeEnv(rc); - await env.load(); - expect(env.clusters).toMatchSnapshot(); - - const cluster = env.clusterByName('remote'); - expect(cluster).toMatchSnapshot(); - }); -}); diff --git a/packages/loaders/prisma/src/prisma-yml/Environment.ts b/packages/loaders/prisma/src/prisma-yml/Environment.ts deleted file mode 100644 index 198d0ddfd34..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Environment.ts +++ /dev/null @@ -1,296 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -// eslint-disable-next-line -// @ts-ignore -import debugPkg from 'debug'; -import { decodeJwt } from 'jose'; -import * as yaml from 'js-yaml'; -import { fetch } from '@whatwg-node/fetch'; -import { Cluster } from './Cluster.js'; -import { clusterEndpointMap } from './constants.js'; -import { ClusterNotFound } from './errors/ClusterNotFound.js'; -import { ClusterNotSet } from './errors/ClusterNotSet.js'; -import { RC } from './index.js'; -import { IOutput, Output } from './Output.js'; -import { Args } from './types/common.js'; -import { Variables } from './Variables.js'; - -const debug = debugPkg('Environment'); - -export class Environment { - sharedClusters: string[] = ['prisma-eu1', 'prisma-us1']; - clusterEndpointMap = clusterEndpointMap; - args: Args | undefined; - activeCluster: Cluster | undefined; - globalRC: RC = {}; - clusters: Cluster[] | undefined; - out: IOutput; - home: string; - rcPath: string; - clustersFetched = false; - version?: string; - constructor(home: string, out: IOutput = new Output(), version?: string) { - this.out = out; - this.home = home; - this.version = version; - - this.rcPath = path.join(this.home, '.prisma/config.yml'); - fs.mkdirSync(path.dirname(this.rcPath), { recursive: true }); - } - - private _getClusters() { - const clusters = this.clusters; - if (clusters === undefined) { - throw new Error(`Cannot get clusters. Did you forget to call "Environment.load()"?`); - } - return clusters; - } - - async load() { - await this.loadGlobalRC(); - } - - get cloudSessionKey(): string | undefined { - return process.env['PRISMA_CLOUD_SESSION_KEY'] || this.globalRC.cloudSessionKey; - } - - async renewToken() { - if (this.cloudSessionKey) { - const data = decodeJwt(this.cloudSessionKey); - if (!data.exp) { - return; - } - const timeLeft = data.exp * 1000 - Date.now(); - if (timeLeft < 1000 * 60 * 60 * 24 && timeLeft > 0) { - try { - const res = await this.requestCloudApi(` - mutation { - renewToken - } - `); - if (res.renewToken) { - this.globalRC.cloudSessionKey = res.renewToken; - this.saveGlobalRC(); - } - } catch (e: any) { - debug(e); - } - } - } - } - - async fetchClusters() { - if (!this.clustersFetched && this.cloudSessionKey) { - const renewPromise = this.renewToken(); - try { - const res = (await Promise.race([ - this.requestCloudApi(` - query prismaCliGetClusters { - me { - memberships { - workspace { - id - slug - clusters { - id - name - connectInfo { - endpoint - } - customConnectionInfo { - endpoint - } - } - } - } - } - } - `), - // eslint-disable-next-line - new Promise((_, r) => setTimeout(() => r(), 6000)), - ])) as any; - if (!res) { - return; - } - if (res.me && res.me.memberships && Array.isArray(res.me.memberships)) { - // clean up all prisma-eu1 and prisma-us1 clusters if they already exist - this.clusters = this._getClusters().filter( - c => c.name !== 'prisma-eu1' && c.name !== 'prisma-us1', - ); - - for (const m of res.me.memberships) { - for (const cluster of m.workspace.clusters) { - const endpoint = cluster.connectInfo - ? cluster.connectInfo.endpoint - : cluster.customConnectionInfo - ? cluster.customConnectionInfo.endpoint - : this.clusterEndpointMap[cluster.name]; - this.addCluster( - new Cluster( - this.out, - cluster.name, - endpoint, - this.globalRC.cloudSessionKey, - false, - ['prisma-eu1', 'prisma-us1'].includes(cluster.name), - !['prisma-eu1', 'prisma-us1'].includes(cluster.name), - m.workspace.slug, - ), - ); - } - } - } - } catch (e: any) { - debug(e); - } - await renewPromise; - } - } - - clusterByName(name: string, throws = false): Cluster | undefined { - if (!this.clusters) { - return; - } - const cluster = this.clusters.find(c => c.name === name); - if (!throws) { - return cluster; - } - - if (!cluster) { - if (!name) { - throw new ClusterNotSet(); - } - throw new ClusterNotFound(name); - } - - return cluster; - } - - setToken(token: string | undefined) { - this.globalRC.cloudSessionKey = token; - } - - addCluster(cluster: Cluster) { - const clusters = this._getClusters(); - const existingClusterIndex = clusters.findIndex(c => { - if (cluster.workspaceSlug) { - return c.workspaceSlug === cluster.workspaceSlug && c.name === cluster.name; - } else { - return c.name === cluster.name; - } - }); - if (existingClusterIndex > -1) { - clusters.splice(existingClusterIndex, 1); - } - clusters.push(cluster); - } - - removeCluster(name: string) { - this.clusters = this._getClusters().filter(c => c.name !== name); - } - - saveGlobalRC() { - const rc = { - cloudSessionKey: this.globalRC.cloudSessionKey - ? this.globalRC.cloudSessionKey.trim() - : undefined, - clusters: this.getLocalClusterConfig(), - }; - // parse & stringify to rm undefined for yaml parser - const rcString = yaml.dump(JSON.parse(JSON.stringify(rc))); - fs.writeFileSync(this.rcPath, rcString); - } - - setActiveCluster(cluster: Cluster) { - this.activeCluster = cluster; - } - - async loadGlobalRC(): Promise { - if (this.rcPath) { - try { - fs.accessSync(this.rcPath); - const globalFile = fs.readFileSync(this.rcPath, 'utf-8'); - await this.parseGlobalRC(globalFile); - } catch { - await this.parseGlobalRC(); - } - } else { - await this.parseGlobalRC(); - } - } - - async parseGlobalRC(globalFile?: string): Promise { - if (globalFile) { - this.globalRC = await this.loadYaml(globalFile, this.rcPath); - } - this.clusters = this.initClusters(this.globalRC); - } - - private async loadYaml(file: string | null, filePath: string | null = null): Promise { - if (file) { - let content; - try { - content = yaml.load(file); - } catch (e: any) { - throw new Error(`Yaml parsing error in ${filePath}: ${e.message}`); - } - const variables = new Variables(filePath || 'no filepath provided', this.args, this.out); - content = await variables.populateJson(content); - - return content; - } else { - return {}; - } - } - - private initClusters(rc: RC): Cluster[] { - const sharedClusters = this.getSharedClusters(rc); - return [...sharedClusters]; - } - - private getSharedClusters(rc: RC): Cluster[] { - return this.sharedClusters.map(clusterName => { - return new Cluster( - this.out, - clusterName, - this.clusterEndpointMap[clusterName], - rc && rc.cloudSessionKey, - false, - true, - ); - }); - } - - private getLocalClusterConfig() { - return this._getClusters() - .filter(c => !c.shared && c.clusterSecret !== this.cloudSessionKey && !c.isPrivate) - .reduce((acc, cluster) => { - return { - ...acc, - [cluster.name]: { - host: cluster.baseUrl, - clusterSecret: cluster.clusterSecret, - }, - }; - }, {}); - } - - private async requestCloudApi(query: string) { - const res = await fetch('https://api.cloud.prisma.sh', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${this.cloudSessionKey}`, - 'X-Cli-Version': this.version, - } as any, - body: JSON.stringify({ - query, - }), - } as any); - const json = await res.json(); - return json.data; - } -} - -export const isLocal = (hostname: any) => - hostname.includes('localhost') || hostname.includes('127.0.0.1'); diff --git a/packages/loaders/prisma/src/prisma-yml/Output.ts b/packages/loaders/prisma/src/prisma-yml/Output.ts deleted file mode 100644 index 0ae96666a68..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Output.ts +++ /dev/null @@ -1,39 +0,0 @@ -export class Output { - log(...args: any) { - console.log(args); - } - - warn(...args: any) { - console.warn(args); - } - - getErrorPrefix(fileName: string, type: 'error' | 'warning' = 'error') { - return `[${type.toUpperCase()}] in ${fileName}: `; - } -} - -export class TestOutput { - output: string[]; - - constructor() { - this.output = []; - } - - log(...args: any) { - this.output = this.output.concat(args); - } - - warn(...args: any) { - this.output = this.output.concat(args); - } - - getErrorPrefix(fileName: string, type: 'error' | 'warning' = 'error') { - return `[${type.toUpperCase()}] in ${fileName}: `; - } -} - -export interface IOutput { - warn: (...args: any) => void; - log: (...args: any) => void; - getErrorPrefix: (fileName: string, type?: 'error' | 'warning') => string; -} diff --git a/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.test.ts b/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.test.ts deleted file mode 100644 index 46a94538f8d..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.test.ts +++ /dev/null @@ -1,317 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { makeEnv } from './Environment.test.js'; -import { PrismaDefinitionClass } from './PrismaDefinition.js'; -import { getTmpDir } from './test/getTmpDir.js'; -import { Args } from './types/common.js'; - -const defaultGlobalRC = `prisma-1.0: - clusters: - local: - host: 'http://localhost:4466' - remote: - host: 'https://remote.graph.cool' - clusterSecret: 'here-is-a-token' -`; - -function makeDefinition( - yml: string, - datamodel: string, - _: Args = {}, - __: string = defaultGlobalRC, - envVars: any = process.env, -) { - const definitionDir = getTmpDir(); - const definitionPath = path.join(definitionDir, 'prisma.yml'); - const modelPath = path.join(definitionDir, 'datamodel.prisma'); - const env = makeEnv(defaultGlobalRC); - - const definition = new PrismaDefinitionClass(env, definitionPath, envVars); - - fs.writeFileSync(modelPath, datamodel); - fs.writeFileSync(definitionPath, yml); - - return { env, definition }; -} - -async function loadDefinition( - yml: string, - datamodel: string, - args: Args = {}, - envPath?: string, - globalRC: string = defaultGlobalRC, -) { - const { env, definition } = makeDefinition(yml, datamodel, args, globalRC); - await env.load(); - await definition.load(args, envPath); - return { env, definition }; -} - -describe('prisma definition', () => { - test('load basic yml, provide cluster', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -secret: some-secret - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - expect(e).toMatchSnapshot(); - } - }); - test('load yml with secret and env var', async () => { - const secret = 'this-is-a-long-secret'; - process.env['MY_TEST_SECRET'] = secret; - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -secret: \${env:MY_TEST_SECRET} - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - expect(e).toMatchSnapshot(); - } - }); - test('load yml with secret and env var in .env', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -secret: \${env:MY_DOT_ENV_SECRET} - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - const { definition, env } = makeDefinition(yml, datamodel, {}); - const envPath = path.join(definition.definitionDir!, '.env'); - - fs.mkdirSync(path.dirname(envPath), { recursive: true }); - fs.writeFileSync(envPath, `MY_DOT_ENV_SECRET=this-is-very-secret,and-comma,seperated`); - - await env.load(); - - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - expect(e).toMatchSnapshot(); - } - }); - test('load yml with injected env var', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -secret: \${env:MY_INJECTED_ENV_SECRET} - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - const envVars = { - MY_INJECTED_ENV_SECRET: 'some-secret', - }; - - const { env } = makeDefinition(yml, datamodel, {}, defaultGlobalRC, envVars); - - await env.load(); - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - expect(e).toMatchSnapshot(); - } - }); - /** - * This test ensures, that GRAPHCOOL_SECRET can't be injected anymore - */ - test(`don't load yml with secret and env var in args`, async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - - const definitionDir = getTmpDir(); - const definitionPath = path.join(definitionDir, 'prisma.yml'); - const modelPath = path.join(definitionDir, 'datamodel.prisma'); - const env = makeEnv(defaultGlobalRC); - - const definition = new PrismaDefinitionClass(env, definitionPath, { - GRAPHCOOL_SECRET: 'this-is-secret', - }); - - fs.writeFileSync(modelPath, datamodel); - fs.writeFileSync(definitionPath, yml); - - let error; - try { - await env.load(); - await definition.load({}); - } catch (e: any) { - error = e; - } - - expect(error).toMatchSnapshot(); - }); - test('load yml with disableAuth: true', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -disableAuth: true - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - const { definition, env } = makeDefinition(yml, datamodel); - const envPath = path.join(definition.definitionDir!, '.env'); - - fs.mkdirSync(path.dirname(envPath), { recursive: true }); - fs.writeFileSync(envPath, `MY_DOT_ENV_SECRET=this-is-very-secret,and-comma,seperated`); - - await env.load(); - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - expect(e).toMatchSnapshot(); - } - }); - test('throw when no secret or disable auth provided', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -schema: schemas/database.graphql - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - - let error; - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - error = e; - } - - expect(error).toMatchSnapshot(); - }); - test('throws when stages key apparent', async () => { - const yml = `\ -service: jj -stage: dev -cluster: local - -datamodel: -- datamodel.prisma - -schema: schemas/database.graphql - -stages: - dev: local - `; - const datamodel = ` -type User @model { - id: ID! @isUnique - name: String! - lol: Int - what: String -} -`; - - let error; - try { - await loadDefinition(yml, datamodel); - } catch (e: any) { - error = e; - } - - expect(error).toMatchSnapshot(); - }); -}); diff --git a/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.ts b/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.ts deleted file mode 100644 index aba5bd458a2..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/PrismaDefinition.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { Buffer } from 'buffer'; -import * as fs from 'fs'; -import * as path from 'path'; -import chalk from 'chalk'; -import * as dotenv from 'dotenv'; -import { SignJWT } from 'jose'; -import { Cluster } from './Cluster.js'; -import { Environment } from './Environment.js'; -import { IOutput } from './Output.js'; -import { PrismaDefinition } from './prisma-json-schema.js'; -// eslint-disable-next-line -// @ts-ignore -import { Args } from './types/common.js'; -import { FunctionInput, Header } from './types/rc.js'; -import { parseEndpoint, ParseEndpointResult } from './utils/parseEndpoint.js'; -import { replaceYamlValue } from './utils/yamlComment.js'; -import { readDefinition } from './yaml.js'; - -export interface EnvVars { - [key: string]: string | undefined; -} - -export type HookType = 'post-deploy'; - -export class PrismaDefinitionClass { - definition?: PrismaDefinition; - rawJson?: any; - typesString?: string; - secrets: string[] | null; - definitionPath?: string | null; - definitionDir: string | undefined; - env: Environment; - out?: IOutput; - envVars: any; - rawEndpoint?: string; - private definitionString: string | undefined; - constructor( - env: Environment, - definitionPath?: string | null, - envVars: EnvVars = process.env, - out?: IOutput, - ) { - this.secrets = null; - this.definitionPath = definitionPath; - if (definitionPath) { - this.definitionDir = path.dirname(definitionPath); - } - this.env = env; - this.out = out; - this.envVars = envVars; - } - - async load(args: Args, envPath?: string, graceful?: boolean) { - if (args['project']) { - const flagPath = path.resolve(String(args['project'])); - - try { - fs.accessSync(flagPath); - } catch { - throw new Error( - `Prisma definition path specified by --project '${flagPath}' does not exist`, - ); - } - - this.definitionPath = flagPath; - this.definitionDir = path.dirname(flagPath); - await this.loadDefinition(args, graceful); - - this.validate(); - return; - } - - if (envPath) { - try { - fs.accessSync(envPath); - } catch { - envPath = path.join(process.cwd(), envPath); - } - - try { - fs.accessSync(envPath); - } catch { - throw new Error(`--env-file path '${envPath}' does not exist`); - } - } - dotenv.config({ path: envPath }); - if (this.definitionPath) { - await this.loadDefinition(args, graceful); - - this.validate(); - } else { - throw new Error(`Couldnโ€™t find \`prisma.yml\` file. Are you in the right directory?`); - } - } - - private async loadDefinition(args: any, graceful?: boolean) { - const { definition, rawJson } = await readDefinition( - this.definitionPath!, - args, - this.out, - this.envVars, - graceful, - ); - this.rawEndpoint = rawJson.endpoint; - this.definition = definition; - this.rawJson = rawJson; - this.definitionString = fs.readFileSync(this.definitionPath!, 'utf-8'); - this.typesString = this.getTypesString(this.definition); - const secrets = this.definition.secret; - this.secrets = secrets ? secrets.replace(/\s/g, '').split(',') : null; - } - - get endpoint(): string | undefined { - return ( - (this.definition && this.definition.endpoint) || process.env['PRISMA_MANAGEMENT_API_ENDPOINT'] - ); - } - - get clusterBaseUrl(): string | undefined { - if (!this.definition || !this.endpoint) { - return undefined; - } - const { clusterBaseUrl } = parseEndpoint(this.endpoint); - return clusterBaseUrl; - } - - get service(): string | undefined { - if (!this.definition) { - return undefined; - } - if (!this.endpoint) { - return undefined; - } - const { service } = parseEndpoint(this.endpoint); - return service; - } - - get stage(): string | undefined { - if (!this.definition) { - return undefined; - } - if (!this.endpoint) { - return undefined; - } - const { stage } = parseEndpoint(this.endpoint); - return stage; - } - - get cluster(): string | undefined { - if (!this.definition) { - return undefined; - } - if (!this.endpoint) { - return undefined; - } - const { clusterName } = parseEndpoint(this.endpoint); - return clusterName; - } - - validate() { - // shared clusters need a workspace - const clusterName = this.getClusterName(); - const cluster = this.env.clusterByName(clusterName!)!; - if ( - this.definition && - clusterName && - cluster && - cluster.shared && - !cluster.isPrivate && - !this.getWorkspace() && - clusterName !== 'shared-public-demo' - ) { - throw new Error( - `Your \`cluster\` property in the prisma.yml is missing the workspace slug. -Make sure that your \`cluster\` property looks like this: ${chalk.bold( - '/', - )}. You can also remove the cluster property from the prisma.yml -and execute ${chalk.bold.green('prisma deploy')} again, to get that value auto-filled.`, - ); - } - if ( - this.definition && - this.definition.endpoint && - clusterName && - cluster && - cluster.shared && - !cluster.isPrivate && - !this.getWorkspace() && - clusterName !== 'shared-public-demo' - ) { - throw new Error( - `The provided endpoint ${this.definition.endpoint} points to a demo cluster, but is missing the workspace slug. A valid demo endpoint looks like this: https://eu1.prisma.sh/myworkspace/service-name/stage-name`, - ); - } - if ( - this.definition && - this.definition.endpoint && - !this.definition.endpoint.startsWith('http') - ) { - throw new Error( - `${chalk.bold( - this.definition.endpoint, - )} is not a valid endpoint. It must start with http:// or https://`, - ); - } - } - - async getToken(serviceName: string, stageName: string): Promise { - if (this.secrets) { - const data = { - data: { - service: `${serviceName}@${stageName}`, - roles: ['admin'], - }, - }; - return new SignJWT(data) - .setProtectedHeader({ alg: 'HS256', typ: 'JWT' }) - .setIssuedAt() - .setExpirationTime('7d') - .sign(Buffer.from(this.secrets[0])); - } - - return undefined; - } - - async getCluster(_ = false): Promise { - if (this.definition && this.endpoint) { - const clusterData = parseEndpoint(this.endpoint); - const cluster = await this.getClusterByEndpoint(clusterData); - this.env.removeCluster(clusterData.clusterName); - this.env.addCluster(cluster); - return cluster; - } - - return undefined; - } - - findClusterByBaseUrl(baseUrl: string) { - return this.env.clusters?.find(c => c.baseUrl.toLowerCase() === baseUrl); - } - - async getClusterByEndpoint(data: ParseEndpointResult) { - if (data.clusterBaseUrl && !process.env['PRISMA_MANAGEMENT_API_SECRET']) { - const cluster = this.findClusterByBaseUrl(data.clusterBaseUrl); - if (cluster) { - return cluster; - } - } - - const { clusterName, clusterBaseUrl, isPrivate, local, shared, workspaceSlug } = data; - - // if the cluster could potentially be served by the cloud api, fetch the available - // clusters from the cloud api - if (!local) { - await this.env.fetchClusters(); - const cluster = this.findClusterByBaseUrl(data.clusterBaseUrl); - if (cluster) { - return cluster; - } - } - - return new Cluster( - this.out!, - clusterName, - clusterBaseUrl, - shared || isPrivate ? this.env.cloudSessionKey : undefined, - local, - shared, - isPrivate, - workspaceSlug!, - ); - } - - getTypesString(definition: PrismaDefinition) { - const typesPaths = definition.datamodel - ? Array.isArray(definition.datamodel) - ? definition.datamodel - : [definition.datamodel] - : []; - - let allTypes = ''; - for (const unresolvedTypesPath of typesPaths) { - const typesPath = path.join(this.definitionDir!, unresolvedTypesPath!); - try { - fs.accessSync(typesPath); - const types = fs.readFileSync(typesPath, 'utf-8'); - allTypes += types + '\n'; - } catch { - throw new Error(`The types definition file "${typesPath}" could not be found.`); - } - } - - return allTypes; - } - - getClusterName(): string | null { - return this.cluster || null; - } - - getWorkspace(): string | null { - if (this.definition && this.endpoint) { - const { workspaceSlug } = parseEndpoint(this.endpoint); - if (workspaceSlug) { - return workspaceSlug; - } - } - - return null; - } - - async getDeployName() { - const cluster = await this.getCluster(); - return concatName(cluster!, this.service!, this.getWorkspace()); - } - - getSubscriptions(): FunctionInput[] { - if (this.definition && this.definition.subscriptions) { - return Object.entries(this.definition!.subscriptions!).map(([name, subscription]) => { - const url = - typeof subscription.webhook === 'string' - ? subscription.webhook - : subscription.webhook.url; - const headers = - typeof subscription.webhook === 'string' - ? [] - : transformHeaders(subscription.webhook.headers); - - let query = subscription.query; - if (subscription.query.endsWith('.graphql')) { - const queryPath = path.join(this.definitionDir!, subscription.query); - try { - fs.accessSync(queryPath); - } catch { - throw new Error( - `Subscription query ${queryPath} provided in subscription "${name}" in prisma.yml does not exist.`, - ); - } - query = fs.readFileSync(queryPath, 'utf-8'); - } - - return { - name, - query, - headers, - url, - }; - }); - } - return []; - } - - replaceEndpoint(newEndpoint: any) { - this.definitionString = replaceYamlValue(this.definitionString, 'endpoint', newEndpoint); - fs.writeFileSync(this.definitionPath!, this.definitionString); - } - - addDatamodel(datamodel: any) { - this.definitionString += `\ndatamodel: ${datamodel}`; - fs.writeFileSync(this.definitionPath!, this.definitionString!); - this.definition!.datamodel = datamodel; - } - - async getEndpoint(serviceInput?: string, stageInput?: string) { - const cluster = await this.getCluster(); - const service = serviceInput || this.service; - const stage = stageInput || this.stage; - const workspace = this.getWorkspace(); - - if (service && stage && cluster) { - return cluster!.getApiEndpoint(service, stage, workspace); - } - - return null; - } - - getHooks(hookType: HookType): string[] { - if (this.definition && this.definition.hooks && this.definition.hooks[hookType]) { - const hooks = this.definition.hooks[hookType]; - if (typeof hooks !== 'string' && !Array.isArray(hooks)) { - throw new Error( - `Hook ${hookType} provided in prisma.yml must be string or an array of strings.`, - ); - } - return typeof hooks === 'string' ? [hooks] : hooks; - } - - return []; - } -} - -export function concatName(cluster: Cluster, name: string, workspace: string | null) { - if (cluster.shared) { - const workspaceString = workspace ? `${workspace}~` : ''; - return `${workspaceString}${name}`; - } - - return name; -} - -function transformHeaders(headers?: { [key: string]: string }): Header[] { - if (!headers) { - return []; - } - return Object.entries(headers).map(([name, value]) => ({ name, value })); -} diff --git a/packages/loaders/prisma/src/prisma-yml/Variables.ts b/packages/loaders/prisma/src/prisma-yml/Variables.ts deleted file mode 100644 index 6af83cf2d64..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/Variables.ts +++ /dev/null @@ -1,266 +0,0 @@ -import _ from 'lodash'; -import { IOutput, Output } from './Output.js'; -import { Args } from './types/common.js'; - -export class Variables { - json: any; - overwriteSyntax = /,/g; - envRefSyntax = /^env:/g; - selfRefSyntax = /^self:/g; - stringRefSyntax = /('.*')|(".*")/g; - optRefSyntax = /^opt:/g; - // eslint-disable-next-line - variableSyntax = new RegExp( - // eslint-disable-next-line - '\\${([ ~:a-zA-Z0-9._\'",\\-\\/\\(\\)]+?)}', - 'g', - ); - - fileName: string; - options: Args; - out: Output; - envVars: any; - - constructor(fileName: string, options: Args = {}, out: IOutput = new Output(), envVars?: any) { - this.out = out; - this.fileName = fileName; - this.options = options; - this.envVars = envVars || process.env; - } - - populateJson(json: any): Promise { - this.json = json; - return this.populateObject(this.json).then(() => { - return Promise.resolve(this.json); - }); - } - - public populateObject(objectToPopulate: any) { - const populateAll: any[] = []; - const deepMapValues = (object: any, callback: any, propertyPath?: string[]): any => { - const deepMapValuesIteratee = (value: any, key: any) => - deepMapValues(value, callback, propertyPath ? propertyPath.concat(key) : [key]); - if (_.isArray(object)) { - return _.map(object, deepMapValuesIteratee); - } else if (_.isObject(object) && !_.isDate(object) && !_.isFunction(object)) { - return _.extend({}, object, _.mapValues(object, deepMapValuesIteratee)); - } - return callback(object, propertyPath); - }; - - deepMapValues(objectToPopulate, (property: any, propertyPath: any) => { - if (typeof property === 'string') { - const populateSingleProperty = this.populateProperty(property, true).then( - (newProperty: any) => _.set(objectToPopulate, propertyPath, newProperty), - ); - populateAll.push(populateSingleProperty); - } - }); - - return Promise.all(populateAll).then(() => objectToPopulate); - } - - populateProperty(propertyParam: any, populateInPlace?: boolean): any { - let property = populateInPlace ? propertyParam : _.cloneDeep(propertyParam); - const allValuesToPopulate: any[] = []; - let warned = false; - - if (typeof property === 'string' && property.match(this.variableSyntax)) { - const matchedStrings = property.match(this.variableSyntax); - if (matchedStrings) { - for (const matchedString of matchedStrings) { - const variableString = matchedString - .replace(this.variableSyntax, (_, varName) => varName.trim()) - .replace(/\s/g, ''); - - let singleValueToPopulate: Promise | null = null; - if (variableString.match(this.overwriteSyntax)) { - singleValueToPopulate = this.overwrite(variableString); - } else { - singleValueToPopulate = this.getValueFromSource(variableString).then( - (valueToPopulate: any) => { - if (typeof valueToPopulate === 'object') { - return this.populateObject(valueToPopulate); - } - return valueToPopulate; - }, - ); - } - - singleValueToPopulate = singleValueToPopulate!.then(valueToPopulate => { - if (this.warnIfNotFound(variableString, valueToPopulate)) { - warned = true; - } - return this.populateVariable(property, matchedString, valueToPopulate).then( - (newProperty: any) => { - property = newProperty; - return Promise.resolve(property); - }, - ); - }); - - allValuesToPopulate.push(singleValueToPopulate); - } - } - return Promise.all(allValuesToPopulate).then(() => { - if ((property as any) !== (this.json as any) && !warned) { - return this.populateProperty(property); - } - return Promise.resolve(property); - }); - } - return Promise.resolve(property); - } - - populateVariable(propertyParam: any, matchedString: any, valueToPopulate: any) { - let property = propertyParam; - if (typeof valueToPopulate === 'string') { - // TODO: Replace `split` and `join` with `replaceAll` once Node v14 is no longer supported - property = (property as string).split(matchedString).join(valueToPopulate); - } else { - if (property !== matchedString) { - if (typeof valueToPopulate === 'number') { - // TODO: Replace `split` and `join` with `replaceAll` once Node v14 is no longer supported - property = (property as string).split(matchedString).join(String(valueToPopulate)); - } else { - const errorMessage = [ - 'Trying to populate non string value into', - ` a string for variable ${matchedString}.`, - ' Please make sure the value of the property is a string.', - ].join(''); - this.out.warn(this.out.getErrorPrefix(this.fileName, 'warning') + errorMessage); - } - return Promise.resolve(property); - } - property = valueToPopulate; - } - return Promise.resolve(property); - } - - overwrite(variableStringsString: any) { - let finalValue: any; - const variableStringsArray = variableStringsString.split(','); - const allValuesFromSource = variableStringsArray.map((variableString: any) => - this.getValueFromSource(variableString), - ); - return Promise.all(allValuesFromSource).then((valuesFromSources: any) => { - valuesFromSources.find((valueFromSource: any) => { - finalValue = valueFromSource; - return ( - finalValue !== null && - typeof finalValue !== 'undefined' && - !(typeof finalValue === 'object' && _.isEmpty(finalValue)) - ); - }); - return Promise.resolve(finalValue); - }); - } - - getValueFromSource(variableString: any) { - if (variableString.match(this.envRefSyntax)) { - return this.getValueFromEnv(variableString); - } else if (variableString.match(this.optRefSyntax)) { - return this.getValueFromOptions(variableString); - } else if (variableString.match(this.selfRefSyntax)) { - return this.getValueFromSelf(variableString); - } else if (variableString.match(this.stringRefSyntax)) { - return this.getValueFromString(variableString); - } - const errorMessage = [ - `Invalid variable reference syntax for variable ${variableString}.`, - ' You can only reference env vars, options, & files.', - ' You can check our docs for more info.', - ].join(''); - this.out.warn(this.out.getErrorPrefix(this.fileName, 'warning') + errorMessage); - return Promise.resolve(); - } - - getValueFromEnv(variableString: any) { - const requestedEnvVar = variableString.split(':')[1]; - const valueToPopulate = - requestedEnvVar !== '' || '' in this.envVars ? this.envVars[requestedEnvVar] : this.envVars; - return Promise.resolve(valueToPopulate); - } - - getValueFromString(variableString: any) { - const valueToPopulate = variableString.replace(/^['"]|['"]$/g, ''); - return Promise.resolve(valueToPopulate); - } - - getValueFromOptions(variableString: any) { - const requestedOption = variableString.split(':')[1]; - const valueToPopulate = - requestedOption !== '' || '' in this.options ? this.options[requestedOption] : this.options; - return Promise.resolve(valueToPopulate); - } - - getValueFromSelf(variableString: any) { - const valueToPopulate = this.json; - const deepProperties = variableString.split(':')[1].split('.'); - return this.getDeepValue(deepProperties, valueToPopulate); - } - - getDeepValue(deepProperties: any, valueToPopulate: any) { - return promiseReduce( - deepProperties, - (computedValueToPopulateParam: any, subProperty: any) => { - let computedValueToPopulate = computedValueToPopulateParam; - if (typeof computedValueToPopulate === 'undefined') { - computedValueToPopulate = {}; - } else if (subProperty !== '' || '' in computedValueToPopulate) { - computedValueToPopulate = computedValueToPopulate[subProperty]; - } - if ( - typeof computedValueToPopulate === 'string' && - computedValueToPopulate.match(this.variableSyntax) - ) { - return this.populateProperty(computedValueToPopulate); - } - return Promise.resolve(computedValueToPopulate); - }, - valueToPopulate, - ); - } - - warnIfNotFound(variableString: any, valueToPopulate: any): boolean { - if ( - valueToPopulate === null || - typeof valueToPopulate === 'undefined' || - (typeof valueToPopulate === 'object' && _.isEmpty(valueToPopulate)) - ) { - let varType; - if (variableString.match(this.envRefSyntax)) { - varType = 'environment variable'; - } else if (variableString.match(this.optRefSyntax)) { - varType = 'option'; - } else if (variableString.match(this.selfRefSyntax)) { - varType = 'self reference'; - } - this.out.warn( - this.out.getErrorPrefix(this.fileName, 'warning') + - `A valid ${varType} to satisfy the declaration '${variableString}' could not be found.`, - ); - return true; - } - - return false; - } -} - -function promiseReduce( - values: readonly T[], - callback: (u: U, t: T) => Promise, - initialValue: Promise, -): Promise { - return values.reduce( - (previous, value) => - isPromise(previous) - ? previous.then(resolved => callback(resolved, value)) - : callback(previous, value), - initialValue, - ); -} - -function isPromise(value: T | Promise): value is Promise { - return typeof (value as any)?.then === 'function'; -} diff --git a/packages/loaders/prisma/src/prisma-yml/__snapshots__/Cluster.test.ts.snap b/packages/loaders/prisma/src/prisma-yml/__snapshots__/Cluster.test.ts.snap deleted file mode 100644 index d77bdeb52c2..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/__snapshots__/Cluster.test.ts.snap +++ /dev/null @@ -1,21 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`cluster endpoint generation local cluster 1`] = `"http://localhost:4466"`; - -exports[`cluster endpoint generation local cluster 2`] = `"http://localhost:4466/dev"`; - -exports[`cluster endpoint generation local cluster 3`] = `"http://localhost:4466/default/dev"`; - -exports[`cluster endpoint generation local cluster 4`] = `"http://localhost:4466/default/dev"`; - -exports[`cluster endpoint generation private cluster 1`] = `"https://test01_workspace.prisma.sh"`; - -exports[`cluster endpoint generation private cluster 2`] = `"https://test01_workspace.prisma.sh/dev"`; - -exports[`cluster endpoint generation private cluster 3`] = `"https://test01_workspace.prisma.sh/default/dev"`; - -exports[`cluster endpoint generation sandbox cluster 1`] = `"https://eu1.prisma.sh/workspace/default/default"`; - -exports[`cluster endpoint generation sandbox cluster 2`] = `"https://eu1.prisma.sh/workspace/dev/default"`; - -exports[`cluster endpoint generation sandbox cluster 3`] = `"https://eu1.prisma.sh/workspace/default/dev"`; diff --git a/packages/loaders/prisma/src/prisma-yml/__snapshots__/Environment.test.ts.snap b/packages/loaders/prisma/src/prisma-yml/__snapshots__/Environment.test.ts.snap deleted file mode 100644 index 350f4c7ce40..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/__snapshots__/Environment.test.ts.snap +++ /dev/null @@ -1,158 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Environment empty global prisma rc 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment interpolates env vars 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment loads multiple cluster definitions correctly + gives cluster by name 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment loads multiple cluster definitions correctly + gives cluster by name 2`] = `undefined`; - -exports[`Environment non-existent global prisma rc 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment persists .prisma correctly 1`] = ` -"clusters: - cluster: - host: http://localhost:60000 - clusterSecret: '' -" -`; - -exports[`Environment persists .prisma correctly 2`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "http://localhost:60000", - "clusterSecret": "", - "isPrivate": false, - "local": true, - "name": "cluster", - "shared": false, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment sets the platform token correctly 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; diff --git a/packages/loaders/prisma/src/prisma-yml/__snapshots__/PrismaDefinition.test.ts.snap b/packages/loaders/prisma/src/prisma-yml/__snapshots__/PrismaDefinition.test.ts.snap deleted file mode 100644 index afc31156470..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/__snapshots__/PrismaDefinition.test.ts.snap +++ /dev/null @@ -1,164 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Environment empty global prisma rc 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment interpolates env vars 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment loads multiple cluster definitions correctly + gives cluster by name 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment loads multiple cluster definitions correctly + gives cluster by name 2`] = `undefined`; - -exports[`Environment non-existent global prisma rc 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment persists .prisma correctly 1`] = ` -"clusters: - cluster: - host: http://localhost:60000 - clusterSecret: '' -" -`; - -exports[`Environment persists .prisma correctly 2`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "http://localhost:60000", - "clusterSecret": "", - "isPrivate": false, - "local": true, - "name": "cluster", - "shared": false, - "workspaceSlug": undefined, - }, -] -`; - -exports[`Environment sets the platform token correctly 1`] = ` -[ - { - "baseUrl": "https://eu1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-eu1", - "shared": true, - "workspaceSlug": undefined, - }, - { - "baseUrl": "https://us1.prisma.sh", - "clusterSecret": undefined, - "isPrivate": false, - "local": false, - "name": "prisma-us1", - "shared": true, - "workspaceSlug": undefined, - }, -] -`; - -exports[`prisma definition don't load yml with secret and env var in args 1`] = `undefined`; - -exports[`prisma definition throw when no secret or disable auth provided 1`] = `undefined`; - -exports[`prisma definition throws when stages key apparent 1`] = `undefined`; diff --git a/packages/loaders/prisma/src/prisma-yml/constants.ts b/packages/loaders/prisma/src/prisma-yml/constants.ts deleted file mode 100644 index 93832914b50..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -import _ from 'lodash'; - -export const cloudApiEndpoint = process.env['CLOUD_API_ENDPOINT'] || 'https://api.cloud.prisma.sh'; - -export const clusterEndpointMap: { [key: string]: string } = { - 'prisma-eu1': 'https://eu1.prisma.sh', - 'prisma-us1': 'https://us1.prisma.sh', -}; - -export const clusterEndpointMapReverse: { [key: string]: string } = _.invert(clusterEndpointMap); diff --git a/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotFound.ts b/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotFound.ts deleted file mode 100644 index b37d71675ab..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotFound.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class ClusterNotFound extends Error { - constructor(name: string) { - super( - `Cluster '${name}' is neither a known shared cluster nor defined in your global .prismarc.`, - ); - } -} diff --git a/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotSet.ts b/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotSet.ts deleted file mode 100644 index e7e8a47e74d..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/errors/ClusterNotSet.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class ClusterNotSet extends Error { - constructor() { - super( - `No cluster set. In order to run this command, please set the "cluster" property in your prisma.yml`, - ); - } -} diff --git a/packages/loaders/prisma/src/prisma-yml/errors/StageNotFound.ts b/packages/loaders/prisma/src/prisma-yml/errors/StageNotFound.ts deleted file mode 100644 index 929c161df0a..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/errors/StageNotFound.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class StageNotFound extends Error { - constructor(name?: string) { - if (name) { - super(`Stage '${name}' could not be found in the local prisma.yml`); - } else { - super(`No stage provided and no default stage set`); - } - } -} diff --git a/packages/loaders/prisma/src/prisma-yml/index.ts b/packages/loaders/prisma/src/prisma-yml/index.ts deleted file mode 100644 index 2867871cbe4..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export { parseEndpoint } from './utils/parseEndpoint.js'; -export { Cluster } from './Cluster.js'; -export { PrismaDefinitionClass } from './PrismaDefinition.js'; -export { Environment } from './Environment.js'; -export { Args } from './types/common.js'; -export { ClusterNotFound } from './errors/ClusterNotFound.js'; -export { ClusterNotSet } from './errors/ClusterNotSet.js'; -export { StageNotFound } from './errors/StageNotFound.js'; -export { Output, IOutput } from './Output.js'; -export { Variables } from './Variables.js'; -export { RC, Clusters, ClusterConfig, FunctionInput } from './types/rc.js'; -export { getProxyAgent } from './utils/getProxyAgent.js'; diff --git a/packages/loaders/prisma/src/prisma-yml/prisma-json-schema.ts b/packages/loaders/prisma/src/prisma-yml/prisma-json-schema.ts deleted file mode 100644 index eed29b83a8e..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/prisma-json-schema.ts +++ /dev/null @@ -1,44 +0,0 @@ -export interface PrismaDefinition { - datamodel?: string | string[]; - subscriptions?: SubscriptionMap; - custom?: any; - secret?: string; - disableAuth?: boolean; - seed?: Seed; - endpoint?: string; - hooks?: any; - generate?: Generate[]; - databaseType?: DatabaseType; -} - -export type DatabaseType = 'relational' | 'document'; - -export interface Generate { - generator: string; - output: string; -} - -export interface Seed { - import?: string; - run?: string; -} - -export interface SubscriptionMap { - [subscriptionName: string]: SubscriptionDefinition; -} - -export interface SubscriptionDefinition { - query: string; - webhook: FunctionHandlerWebhookSource; -} - -export type FunctionHandlerWebhookSource = string | FunctionHandlerWebhookWithHeaders; - -export interface FunctionHandlerWebhookWithHeaders { - url: string; - headers?: Headers; -} - -export interface Headers { - [key: string]: string; -} diff --git a/packages/loaders/prisma/src/prisma-yml/test/getTmpDir.ts b/packages/loaders/prisma/src/prisma-yml/test/getTmpDir.ts deleted file mode 100644 index 443bb8a350e..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/test/getTmpDir.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -// eslint-disable-next-line -// @ts-ignore -import cuid from 'scuid'; - -export const getTmpDir = () => { - const dir = path.join(os.tmpdir(), cuid() + '/'); - fs.mkdirSync(dir, { recursive: true }); - return dir; -}; diff --git a/packages/loaders/prisma/src/prisma-yml/types/common.ts b/packages/loaders/prisma/src/prisma-yml/types/common.ts deleted file mode 100644 index 24d91e0158a..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/types/common.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Args { - [name: string]: string | boolean; -} diff --git a/packages/loaders/prisma/src/prisma-yml/types/rc.ts b/packages/loaders/prisma/src/prisma-yml/types/rc.ts deleted file mode 100644 index 22d6f8c4287..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/types/rc.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface RC { - cloudSessionKey?: string; - clusters?: Clusters; -} - -export interface Clusters { - [name: string]: ClusterConfig; -} - -export interface ClusterConfig { - host: string; - clusterSecret: string; -} - -export interface Header { - name: string; - value: string; -} - -export interface FunctionInput { - name: string; - query: string; - url: string; - headers: Header[]; -} diff --git a/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/parseEndpoint.test.ts.snap b/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/parseEndpoint.test.ts.snap deleted file mode 100644 index a46e18a37a0..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/parseEndpoint.test.ts.snap +++ /dev/null @@ -1,131 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`parseEndpoint custom hosted url as ip in internet 1`] = ` -{ - "clusterBaseUrl": "http://13.228.39.83:4466", - "clusterName": "default", - "isPrivate": true, - "local": false, - "service": "default", - "shared": false, - "stage": "default", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint custom hosted url in internet 1`] = ` -{ - "clusterBaseUrl": "https://api-prisma.divyendusingh.com", - "clusterName": "default", - "isPrivate": true, - "local": false, - "service": "zebra-4069", - "shared": false, - "stage": "dev", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint local behind a proxy 1`] = ` -{ - "clusterBaseUrl": "http://local.dev", - "clusterName": "default", - "isPrivate": true, - "local": false, - "service": "default", - "shared": false, - "stage": "default", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint private url 1`] = ` -{ - "clusterBaseUrl": "https://test1_workspace.prisma.sh", - "clusterName": "test1", - "isPrivate": true, - "local": false, - "service": "tessst", - "shared": false, - "stage": "dev", - "workspaceSlug": "workspace", -} -`; - -exports[`parseEndpoint shared url 1`] = ` -{ - "clusterBaseUrl": "https://eu1.prisma.sh", - "clusterName": "prisma-eu1", - "isPrivate": false, - "local": false, - "service": "tessst", - "shared": true, - "stage": "dev", - "workspaceSlug": "workspace-name", -} -`; - -exports[`parseEndpoint url on a subdomain 1`] = ` -{ - "clusterBaseUrl": "https://db.cloud.prisma.sh", - "clusterName": "db.cloud.prisma.sh", - "isPrivate": true, - "local": false, - "service": "test-token", - "shared": false, - "stage": "test", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint work for minimal docker url 1`] = ` -{ - "clusterBaseUrl": "http://prisma:4466", - "clusterName": "default", - "isPrivate": false, - "local": true, - "service": "default", - "shared": false, - "stage": "default", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint work for minimal url 1`] = ` -{ - "clusterBaseUrl": "http://localhost:4466", - "clusterName": "local", - "isPrivate": false, - "local": true, - "service": "default", - "shared": false, - "stage": "default", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint work for url with service 1`] = ` -{ - "clusterBaseUrl": "http://localhost:4466", - "clusterName": "local", - "isPrivate": false, - "local": true, - "service": "service-name", - "shared": false, - "stage": "default", - "workspaceSlug": null, -} -`; - -exports[`parseEndpoint work for url with service and stage 1`] = ` -{ - "clusterBaseUrl": "http://localhost:4466", - "clusterName": "local", - "isPrivate": false, - "local": true, - "service": "service-name", - "shared": false, - "stage": "stage", - "workspaceSlug": null, -} -`; diff --git a/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/yamlComment.test.ts.snap b/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/yamlComment.test.ts.snap deleted file mode 100644 index 569009a18c9..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/__snapshots__/yamlComment.test.ts.snap +++ /dev/null @@ -1,86 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`migrateToEndpoint ignore when endpoint present 1`] = ` -{ - "input": "endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -datamodel: datamodel.prisma", - "output": "#endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -endpoint: -datamodel: datamodel.prisma", -} -`; - -exports[`migrateToEndpoint work in simple case 1`] = ` -{ - "input": "service: my-service -stage: dev -cluster: public-asdf/prisma-eu1 -datamodel: datamodel.prisma", - "output": "#service: my-service -#stage: dev -#cluster: public-asdf/prisma-eu1 -datamodel: datamodel.prisma -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -", -} -`; - -exports[`migrateToEndpoint work with different order and respect comments 1`] = ` -{ - "input": "# don't delete me -stage: dev -cluster: public-asdf/prisma-eu1 - -service: my-service - - - -datamodel: datamodel.prisma", - "output": "# don't delete me -#stage: dev -#cluster: public-asdf/prisma-eu1 - -#service: my-service - - - -datamodel: datamodel.prisma -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -", -} -`; - -exports[`replaceYamlValue when comments already exist 1`] = ` -{ - "input": "#anothercomment: asdasd -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev - -#endpoint: asdasd -datamodel: datamodel.prisma", - "output": "#anothercomment: asdasd -#endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -endpoint: http://localhost:4466 - -#endpoint: asdasd -datamodel: datamodel.prisma", -} -`; - -exports[`replaceYamlValue when document is clean 1`] = ` -{ - "input": "endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -datamodel: datamodel.prisma", - "output": "#endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -endpoint: http://localhost:4466 -datamodel: datamodel.prisma", -} -`; - -exports[`replaceYamlValue when key does not yet exist 1`] = ` -{ - "input": "datamodel: datamodel.prisma", - "output": "datamodel: datamodel.prisma -endpoint: http://localhost:4466 -", -} -`; diff --git a/packages/loaders/prisma/src/prisma-yml/utils/getProxyAgent.ts b/packages/loaders/prisma/src/prisma-yml/utils/getProxyAgent.ts deleted file mode 100644 index 1fc7b629608..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/getProxyAgent.ts +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -import { Agent as HttpAgent } from 'http'; -import { Agent as HttpsAgent } from 'https'; -import HttpProxyAgent from 'http-proxy-agent'; -import HttpsProxyAgent from 'https-proxy-agent'; - -// code from https://raw.githubusercontent.com/request/request/5ba8eb44da7cd639ca21070ea9be20d611b85f66/lib/getProxyFromURI.js - -function formatHostname(hostname: any) { - // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' - return hostname.replace(/^\.*/, '.').toLowerCase(); -} - -function parseNoProxyZone(zone: any) { - zone = zone.trim().toLowerCase(); - - const zoneParts = zone.split(':', 2); - const zoneHost = formatHostname(zoneParts[0]); - const zonePort = zoneParts[1]; - const hasPort = zone.indexOf(':') > -1; - - return { hostname: zoneHost, port: zonePort, hasPort }; -} - -function uriInNoProxy(uri: any, noProxy: any) { - const port = uri.port || (uri.protocol === 'https:' ? '443' : '80'); - const hostname = formatHostname(uri.hostname); - const noProxyList = noProxy.split(','); - - // iterate through the noProxyList until it finds a match. - return noProxyList.map(parseNoProxyZone).some(function (noProxyZone: any) { - const isMatchedAt = hostname.indexOf(noProxyZone.hostname); - const hostnameMatched = - isMatchedAt > -1 && isMatchedAt === hostname.length - noProxyZone.hostname.length; - - if (noProxyZone.hasPort) { - return port === noProxyZone.port && hostnameMatched; - } - - return hostnameMatched; - }); -} - -function getProxyFromURI(uri: any) { - // Decide the proper request proxy to use based on the request URI object and the - // environmental variables (NO_PROXY, HTTP_PROXY, etc.) - // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html) - - const noProxy = process.env['NO_PROXY'] || process.env['no_proxy'] || ''; - - // if the noProxy is a wildcard then return null - - if (noProxy === '*') { - return null; - } - - // if the noProxy is not empty and the uri is found return null - - if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { - return null; - } - - // Check for HTTP or HTTPS Proxy in environment Else default to null - - if (uri.protocol === 'http:') { - return process.env['HTTP_PROXY'] || process.env['http_proxy'] || null; - } - - if (uri.protocol === 'https:') { - return ( - process.env['HTTPS_PROXY'] || - process.env['https_proxy'] || - process.env['HTTP_PROXY'] || - process.env['http_proxy'] || - null - ); - } - - // if none of that works, return null - // (What uri protocol are you using then?) - - return null; -} - -export function getProxyAgent(url: string): HttpAgent | HttpsAgent | undefined { - const uri = new URL(url); - const proxy = getProxyFromURI(uri); - if (!proxy) { - return undefined; - } - - const proxyUri = new URL(proxy); - - if (proxyUri.protocol === 'http:') { - // eslint-disable-next-line - // @ts-ignore - return new HttpProxyAgent(proxy) as HttpAgent; - } - - if (proxyUri.protocol === 'https:') { - // eslint-disable-next-line - // @ts-ignore - return new HttpsProxyAgent(proxy) as HttpsAgent; - } - - return undefined; -} diff --git a/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.test.ts b/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.test.ts deleted file mode 100644 index a8a46d6f210..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { parseEndpoint } from './parseEndpoint.js'; - -describe('parseEndpoint', () => { - test('work for minimal url', () => { - expect(parseEndpoint('http://localhost:4466')).toMatchSnapshot(); - }); - test('work for minimal docker url', () => { - expect(parseEndpoint('http://prisma:4466')).toMatchSnapshot(); - }); - test('local behind a proxy', () => { - // This snapshot will be incorrect for now as URL does not have enough - // information to determine if something is truly local - expect(parseEndpoint('http://local.dev')).toMatchSnapshot(); - }); - test('work for url with service', () => { - expect(parseEndpoint('http://localhost:4466/service-name')).toMatchSnapshot(); - }); - test('work for url with service and stage', () => { - expect(parseEndpoint('http://localhost:4466/service-name/stage')).toMatchSnapshot(); - }); - test('private url', () => { - expect(parseEndpoint('https://test1_workspace.prisma.sh/tessst/dev')).toMatchSnapshot(); - }); - test('shared url', () => { - expect(parseEndpoint('https://eu1.prisma.sh/workspace-name/tessst/dev')).toMatchSnapshot(); - }); - test('custom hosted url in internet', () => { - expect(parseEndpoint('https://api-prisma.divyendusingh.com/zebra-4069/dev')).toMatchSnapshot(); - }); - test('custom hosted url as ip in internet', () => { - expect(parseEndpoint('http://13.228.39.83:4466')).toMatchSnapshot(); - }); - test('url on a subdomain', () => { - expect(parseEndpoint('https://db.cloud.prisma.sh/test-token/test')).toMatchSnapshot(); - }); -}); diff --git a/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.ts b/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.ts deleted file mode 100644 index 48b5d14b42b..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/parseEndpoint.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { URL } from 'url'; -import { clusterEndpointMapReverse } from '../constants.js'; - -function getClusterName(origin: any): string { - if (clusterEndpointMapReverse[origin]) { - return clusterEndpointMapReverse[origin]; - } - - if (origin.endsWith('prisma.sh')) { - return origin.split('_')[0].replace(/https?:\/\//, ''); - } - - if (isLocal(origin)) { - return 'local'; - } - - return 'default'; -} - -const getWorkspaceFromPrivateOrigin = (origin: string) => { - const split = origin.split('_'); - if (split.length > 1) { - return split[1].split('.')[0]; - } - - return null; -}; - -const isLocal = (origin: any) => origin.includes('localhost') || origin.includes('127.0.0.1'); - -export interface ParseEndpointResult { - service: string; - clusterBaseUrl: string; - stage: string; - isPrivate: boolean; - local: boolean; - shared: boolean; - workspaceSlug: string | null; - clusterName: string; -} - -export function parseEndpoint(endpoint: string): ParseEndpointResult { - /* - Terminology: - local - hosted locally using docker and accessed using localhost or prisma or local web proxy like domain.dev - shared - demo server - isPrivate - private hosted by Prisma or private and self-hosted, important that in our terminology a local server is not private - */ - - const url = new URL(endpoint); - const splittedPath = url.pathname.split('/'); - // assuming, that the pathname always starts with a leading /, we always can ignore the first element of the split array - const service = splittedPath.length > 3 ? splittedPath[2] : splittedPath[1] || 'default'; - const stage = splittedPath.length > 3 ? splittedPath[3] : splittedPath[2] || 'default'; - - // This logic might break for self-hosted servers incorrectly yielding a "workspace" simply if the UX has - // enough "/"es like if https://custom.dev/not-a-workspace/ is the base Prisma URL then for default/default service/stage - // pair. This function would incorrectly return not-a-workspace as a workspace. - let workspaceSlug = splittedPath.length > 3 ? splittedPath[1] : null; - - const shared = ['eu1.prisma.sh', 'us1.prisma.sh'].includes(url.host); - - // When using localAliases, do an exact match because of 'prisma' option which is added for local docker networking access - const localAliases = ['localhost', '127.0.0.1', 'prisma']; - const isPrivate = !shared && !localAliases.includes(url.hostname); - const local = !shared && !isPrivate && !workspaceSlug; - - if (isPrivate && !workspaceSlug) { - workspaceSlug = getWorkspaceFromPrivateOrigin(url.origin); - } - - return { - clusterBaseUrl: url.origin, - service, - stage, - local, - isPrivate, - shared, - workspaceSlug, - clusterName: getClusterName(url.origin), - }; -} diff --git a/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.test.ts b/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.test.ts deleted file mode 100644 index 6b5a0ecd79d..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { migrateToEndpoint, replaceYamlValue } from './yamlComment.js'; - -describe('replaceYamlValue', () => { - test('when document is clean', () => { - const input = `\ -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -datamodel: datamodel.prisma`; - - const output = replaceYamlValue(input, 'endpoint', 'http://localhost:4466'); - - expect({ input, output }).toMatchSnapshot(); - }); - - test('when comments already exist', () => { - const input = `\ -#anothercomment: asdasd -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev - -#endpoint: asdasd -datamodel: datamodel.prisma`; - - const output = replaceYamlValue(input, 'endpoint', 'http://localhost:4466'); - - expect({ input, output }).toMatchSnapshot(); - }); - - test('when key does not yet exist', () => { - const input = `\ -datamodel: datamodel.prisma`; - - const output = replaceYamlValue(input, 'endpoint', 'http://localhost:4466'); - - expect({ input, output }).toMatchSnapshot(); - }); -}); - -describe('migrateToEndpoint', () => { - test('ignore when endpoint present', () => { - const input = `\ -endpoint: https://eu1.prisma.sh/public-asdf/my-service/dev -datamodel: datamodel.prisma`; - - const output = migrateToEndpoint(input, ''); - - expect({ input, output }).toMatchSnapshot(); - }); - - test('work in simple case', () => { - const input = `\ -service: my-service -stage: dev -cluster: public-asdf/prisma-eu1 -datamodel: datamodel.prisma`; - - const output = migrateToEndpoint(input, 'https://eu1.prisma.sh/public-asdf/my-service/dev'); - - expect({ input, output }).toMatchSnapshot(); - }); - - test('work with different order and respect comments', () => { - const input = `\ -# don't delete me -stage: dev -cluster: public-asdf/prisma-eu1 - -service: my-service - - - -datamodel: datamodel.prisma`; - - const output = migrateToEndpoint(input, 'https://eu1.prisma.sh/public-asdf/my-service/dev'); - - expect({ input, output }).toMatchSnapshot(); - }); -}); diff --git a/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.ts b/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.ts deleted file mode 100644 index e335170fbde..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/utils/yamlComment.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as yamlParser from 'yaml-ast-parser'; - -/** - * Comments out the current entry of a specific key in a yaml document and creates a new value next to it - * @param key key in yaml document to comment out - * @param newValue new value to add in the document - */ -export function replaceYamlValue(input: any, key: any, newValue: any) { - const ast = yamlParser.safeLoad(input); - const position = getPosition(ast, key); - const newEntry = `${key}: ${newValue}\n`; - if (!position) { - return input + '\n' + newEntry; - } - - return ( - input.slice(0, position.start) + - '#' + - input.slice(position.start, position.end) + - newEntry + - input.slice(position.end) - ); -} - -function getPosition(ast: any, key: string): { start: number; end: number } | undefined { - const mapping = ast.mappings.find((m: any) => m.key.value === key); - if (!mapping) { - return undefined; - } - return { - start: mapping.startPosition, - end: mapping.endPosition + 1, - }; -} - -function commentOut(input: string, keys: string[]) { - let output = input; - for (const key of keys) { - const ast = yamlParser.safeLoad(output); - const position = getPosition(ast, key); - - if (position) { - output = output.slice(0, position.start) + '#' + output.slice(position.start); - } - } - - return output; -} - -export function migrateToEndpoint(input: any, endpoint: any) { - const output = commentOut(input, ['service', 'stage', 'cluster']); - return replaceYamlValue(output, 'endpoint', endpoint); -} diff --git a/packages/loaders/prisma/src/prisma-yml/yaml.ts b/packages/loaders/prisma/src/prisma-yml/yaml.ts deleted file mode 100644 index ebf56b6d8e0..00000000000 --- a/packages/loaders/prisma/src/prisma-yml/yaml.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as fs from 'fs'; -import * as yaml from 'js-yaml'; -import { IOutput, Output } from './Output.js'; -import { PrismaDefinition } from './prisma-json-schema.js'; -import { Args } from './types/common.js'; -import { Variables } from './Variables.js'; - -const cache: Record = {}; - -export async function readDefinition( - filePath: string, - args: Args, - out: IOutput = new Output(), - envVars?: any, - _graceful?: boolean, -): Promise<{ definition: PrismaDefinition; rawJson: any }> { - try { - fs.accessSync(filePath); - } catch { - throw new Error(`${filePath} could not be found.`); - } - const file = fs.readFileSync(filePath, 'utf-8'); - const json = yaml.load(file) as PrismaDefinition; - // we need this copy because populateJson runs inplace - const jsonCopy = { ...json }; - - const vars = new Variables(filePath, args, out, envVars); - const populatedJson = await vars.populateJson(json); - if (populatedJson.custom) { - delete populatedJson.custom; - } - - cache[file] = populatedJson; - return { - definition: populatedJson, - rawJson: jsonCopy, - }; -} diff --git a/packages/loaders/url/.gitignore b/packages/loaders/url/.gitignore deleted file mode 100644 index 043f8173475..00000000000 --- a/packages/loaders/url/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tests/webpack.js diff --git a/packages/loaders/url/CHANGELOG.md b/packages/loaders/url/CHANGELOG.md index 755a690b093..0052695c257 100644 --- a/packages/loaders/url/CHANGELOG.md +++ b/packages/loaders/url/CHANGELOG.md @@ -1,5 +1,60 @@ # @graphql-tools/url-loader +## 8.0.20 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/executor-legacy-ws@1.1.7 + +## 8.0.19 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/executor-legacy-ws@1.1.6 + +## 8.0.18 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/executor-legacy-ws@^1.1.4` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/executor-legacy-ws/v/1.1.4) + (from `^1.1.3`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/executor-legacy-ws@1.1.5 + - @graphql-tools/utils@10.6.2 + +## 8.0.17 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/executor-legacy-ws@1.1.4 + +## 8.0.16 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/executor-legacy-ws@1.1.3 + ## 8.0.15 ### Patch Changes diff --git a/packages/loaders/url/package.json b/packages/loaders/url/package.json index 514a0a764a9..f1eeebcda53 100644 --- a/packages/loaders/url/package.json +++ b/packages/loaders/url/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/url-loader", - "version": "8.0.15", + "version": "8.0.20", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -54,8 +54,8 @@ "@ardatan/sync-fetch": "^0.0.1", "@graphql-tools/executor-graphql-ws": "^1.3.2", "@graphql-tools/executor-http": "^1.1.9", - "@graphql-tools/executor-legacy-ws": "^1.1.2", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/executor-legacy-ws": "^1.1.7", + "@graphql-tools/utils": "^10.6.4", "@graphql-tools/wrap": "^10.0.16", "@types/ws": "^8.0.0", "@whatwg-node/fetch": "^0.10.0", @@ -67,18 +67,17 @@ "devDependencies": { "@envelop/core": "5.0.2", "@envelop/live-query": "7.0.0", - "@graphql-yoga/plugin-defer-stream": "3.10.2", + "@graphql-yoga/plugin-defer-stream": "3.10.6", "@types/express": "5.0.0", - "@types/extract-files": "8.1.3", "@types/valid-url": "1.0.7", "babel-loader": "9.2.1", - "express": "4.21.1", + "express": "4.21.2", "graphql-sse": "2.5.3", "graphql-upload": "17.0.0", - "graphql-yoga": "5.10.2", - "puppeteer": "23.8.0", + "graphql-yoga": "5.10.6", + "puppeteer": "23.11.1", "subscriptions-transport-ws": "0.11.0", - "webpack": "5.96.1" + "webpack": "5.97.1" }, "publishConfig": { "directory": "dist", diff --git a/packages/loaders/url/tests/sync.spec.ts b/packages/loaders/url/tests/sync.spec.ts index 19f3155dfd8..a52c7b86043 100644 --- a/packages/loaders/url/tests/sync.spec.ts +++ b/packages/loaders/url/tests/sync.spec.ts @@ -3,12 +3,10 @@ import { printSchemaWithDirectives } from '@graphql-tools/utils'; import { UrlLoader } from '../src'; describe('sync', () => { + const TEST_API = `https://swapi-graphql.netlify.app/graphql`; const loader = new UrlLoader(); it('should handle introspection', () => { - const [{ schema }] = loader.loadSync( - `https://swapi-graphql.netlify.app/.netlify/functions/index`, - {}, - ); + const [{ schema }] = loader.loadSync(TEST_API, {}); expect(schema).toBeInstanceOf(GraphQLSchema); expect(printSchemaWithDirectives(schema!).trim()).toMatchInlineSnapshot(` "schema { @@ -1016,11 +1014,8 @@ describe('sync', () => { }" `); }); - it('should handle queries', () => { - const [{ schema }] = loader.loadSync( - `https://swapi-graphql.netlify.app/.netlify/functions/index`, - {}, - ); + it.skip('should handle queries', () => { + const [{ schema }] = loader.loadSync(TEST_API, {}); const result = graphqlSync({ schema: schema!, source: /* GraphQL */ ` diff --git a/packages/loaders/url/tests/url-loader-browser.spec.ts b/packages/loaders/url/tests/url-loader-browser.spec.ts index 59bcc0c91d5..ff3f517a57e 100644 --- a/packages/loaders/url/tests/url-loader-browser.spec.ts +++ b/packages/loaders/url/tests/url-loader-browser.spec.ts @@ -1,115 +1,135 @@ import fs from 'fs'; import http from 'http'; -import path from 'path'; +import { AddressInfo, Socket } from 'net'; +import { platform, tmpdir } from 'os'; +import path, { join } from 'path'; +import { setTimeout } from 'timers/promises'; import { parse } from 'graphql'; -import { createSchema, createYoga } from 'graphql-yoga'; +import { createSchema, createYoga, Repeater } from 'graphql-yoga'; import puppeteer, { Browser, Page } from 'puppeteer'; import webpack, { Stats } from 'webpack'; import { useEngine } from '@envelop/core'; import { normalizedExecutor } from '@graphql-tools/executor'; -import { ExecutionResult } from '@graphql-tools/utils'; +import { createDeferred, ExecutionResult } from '@graphql-tools/utils'; import { useDeferStream } from '@graphql-yoga/plugin-defer-stream'; +import { describeIf } from '../../../testing/utils.js'; import type * as UrlLoaderModule from '../src/index.js'; -import { sleep } from './test-utils.js'; - -describe('[url-loader] webpack bundle compat', () => { - if (process.env['TEST_BROWSER']) { - let httpServer: http.Server; - let browser: Browser; - let page: Page; - let resolveOnReturn: VoidFunction; - const timeouts = new Set(); - const fakeAsyncIterable = { - [Symbol.asyncIterator]() { - return this; - }, - next: () => - sleep(300, timeout => timeouts.add(timeout)).then(() => ({ value: true, done: false })), - return: () => { - resolveOnReturn(); - timeouts.forEach(clearTimeout); - return Promise.resolve({ done: true }); - }, - }; - const port = 8712; - const httpAddress = 'http://localhost:8712'; - const webpackBundlePath = path.resolve(__dirname, 'webpack.js'); - const yoga = createYoga({ - schema: createSchema({ - typeDefs: /* GraphQL */ ` - type Query { - foo: Boolean - countdown(from: Int): [Int] - fakeStream: [Boolean] - } - type Subscription { - foo: Boolean - } - `, - resolvers: { - Query: { - foo: () => new Promise(resolve => setTimeout(() => resolve(true), 300)), - countdown: async function* (_, { from }) { - for (let i = from; i >= 0; i--) { - yield i; - await new Promise(resolve => setTimeout(resolve, 100)); - } - }, - fakeStream: () => fakeAsyncIterable, + +declare global { + interface Window { + GraphQLToolsUrlLoader: typeof UrlLoaderModule; + } +} + +describeIf(platform() !== 'win32')('[url-loader] webpack bundle compat', () => { + let httpServer: http.Server; + let browser: Browser; + let page: Page; + const fakeAsyncIterableReturnDeferred = createDeferred(); + const yoga = createYoga({ + schema: createSchema({ + typeDefs: /* GraphQL */ ` + type Query { + foo: Boolean + countdown(from: Int): [Int] + fakeStream: [Boolean] + } + type Subscription { + foo: Boolean + } + `, + resolvers: { + Query: { + foo: () => setTimeout(300).then(() => true), + countdown: async function* (_, { from }) { + for (let i = from; i >= 0; i--) { + yield i; + await setTimeout(100); + } }, - Subscription: { - foo: { - async *subscribe() { - await new Promise(resolve => setTimeout(resolve, 300)); - yield { foo: true }; - await new Promise(resolve => setTimeout(resolve, 300)); - yield { foo: false }; - }, + fakeStream: () => + new Repeater(function (push, stop) { + let timeout: ReturnType; + function tick() { + push(true).finally(() => { + timeout = globalThis.setTimeout(tick, 300); + }); + } + tick(); + stop.finally(() => { + if (timeout) { + clearTimeout(timeout); + } + fakeAsyncIterableReturnDeferred.resolve(); + }); + }), + }, + Subscription: { + foo: { + async *subscribe() { + await setTimeout(300); + yield { foo: true }; + await setTimeout(300); + yield { foo: false }; }, }, }, + }, + }), + plugins: [ + useEngine({ + execute: normalizedExecutor, + subscribe: normalizedExecutor, }), - plugins: [ - useEngine({ - execute: normalizedExecutor, - subscribe: normalizedExecutor, - }), - useDeferStream(), - ], - }); - - beforeAll(async () => { - // bundle webpack js - const stats = await new Promise((resolve, reject) => { - webpack( - { - mode: 'development', - entry: path.resolve(__dirname, '..', 'dist', 'esm', 'index.js'), - output: { - path: path.resolve(__dirname), - filename: 'webpack.js', - libraryTarget: 'umd', - library: 'GraphQLToolsUrlLoader', - umdNamedDefine: true, - }, - plugins: [ - new webpack.DefinePlugin({ - setImmediate: 'setTimeout', - }), - ], + useDeferStream(), + ], + }); + + let httpAddress: string; + + const sockets = new Set(); + + const webpackBundleFileName = 'webpack.js'; + const webpackBundleDir = join(tmpdir(), 'graphql-tools-url-loader'); + const webpackBundleFullPath = path.resolve(webpackBundleDir, webpackBundleFileName); + + beforeAll(async () => { + // bundle webpack js + const stats = await new Promise((resolve, reject) => { + const compiler = webpack( + { + mode: 'development', + entry: path.resolve(__dirname, '..', 'dist', 'esm', 'index.js'), + output: { + path: webpackBundleDir, + filename: webpackBundleFileName, + libraryTarget: 'umd', + library: 'GraphQLToolsUrlLoader', + umdNamedDefine: true, }, - (err, stats) => { - if (err) return reject(err); - resolve(stats); - }, - ); - }); + }, + (err, stats) => { + if (err) { + reject(err); + } else { + compiler.close(err => { + if (err) { + reject(err); + } else { + resolve(stats); + } + }); + } + }, + ); + }); - if (stats?.hasErrors()) { - console.error(stats.toString({ colors: true })); - } + if (stats?.hasErrors()) { + throw stats.toString({ colors: true }); + } - httpServer = http.createServer((req, res) => { + httpServer = http + .createServer((req, res) => { if (req.method === 'GET' && req.url === '/') { res.statusCode = 200; res.writeHead(200, { @@ -120,7 +140,7 @@ describe('[url-loader] webpack bundle compat', () => { Url Loader Test - + `); @@ -128,258 +148,293 @@ describe('[url-loader] webpack bundle compat', () => { return; } - if (req.method === 'GET' && req.url === '/webpack.js') { - const stat = fs.statSync(webpackBundlePath); + if (req.method === 'GET' && req.url === '/' + webpackBundleFileName) { + const stat = fs.statSync(webpackBundleFullPath); res.writeHead(200, { 'Content-Type': 'application/javascript', 'Content-Length': stat.size, }); - const readStream = fs.createReadStream(webpackBundlePath); + const readStream = fs.createReadStream(webpackBundleFullPath); readStream.pipe(res); return; } yoga(req, res); + }) + .on('connection', socket => { + sockets.add(socket); + socket.once('close', () => { + sockets.delete(socket); + }); }); - await new Promise(resolve => { - httpServer.listen(port, () => { - resolve(); - }); + const { port } = await new Promise(resolve => { + httpServer.listen(0, () => { + resolve(httpServer.address() as AddressInfo); }); - browser = await puppeteer.launch({ - // headless: false, - args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + httpAddress = `http://localhost:${port}`; + browser = await puppeteer.launch({ + // headless: false, + args: ['--no-sandbox', '--disable-setuid-sandbox', '--incognito'], + }); + page = await browser.newPage(); + await page.goto(httpAddress); + }); + + afterAll(async () => { + if (page) { + await page.close().catch(e => { + console.warn('Error closing page', e, 'ignoring'); }); - page = await browser.newPage(); - await page.goto(httpAddress); - }, 90_000); - - afterAll(async () => { + } + if (browser) { await browser.close(); - await new Promise((resolve, reject) => { + } + await new Promise((resolve, reject) => { + for (const socket of sockets) { + socket.destroy(); + } + if (httpServer) { + httpServer.closeAllConnections(); httpServer.close(err => { if (err) return reject(err); resolve(); }); - }); - await fs.promises.unlink(webpackBundlePath); + } else { + resolve(); + } }); - - it('can be exposed as a global', async () => { - const result = await page.evaluate(async () => { - return typeof (window as any)['GraphQLToolsUrlLoader']; - }); - expect(result).toEqual('object'); + if (fs.existsSync(webpackBundleFullPath)) { + await fs.promises.unlink(webpackBundleFullPath); + } + }); + + it('can be exposed as a global', async () => { + const result = await page.evaluate(() => { + return typeof window.GraphQLToolsUrlLoader; }); + expect(result).toEqual('object'); + }); - it('can be used for executing a basic http query operation', async () => { - const expectedData = { - data: { - foo: true, - }, - }; - const document = parse(/* GraphQL */ ` - query { + it('can be used for executing a basic http query operation', async () => { + const expectedData = { + data: { + foo: true, + }, + }; + const document = parse(/* GraphQL */ ` + query { + foo + } + `); + + const result = await page.evaluate( + (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql'); + return executor({ + document, + }); + }, + httpAddress, + document, + ); + expect(result).toStrictEqual(expectedData); + }); + + it('handles executing a @defer operation using multipart responses', async () => { + const document = parse(/* GraphQL */ ` + query { + ... on Query @defer { foo } - `); - - const result = await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql'); - const result = await executor({ - document, - }); - return result; - }, - httpAddress, - document as any, - ); - expect(result).toStrictEqual(expectedData); - }); - - it('handles executing a @defer operation using multipart responses', async () => { - const document = parse(/* GraphQL */ ` - query { - ... on Query @defer { - foo - } + } + `); + + const results = await page.evaluate( + async (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql'); + const result = await executor({ + document, + }); + if (!(Symbol.asyncIterator in result)) { + throw new Error('Expected an async iterator'); } - `); - - const results = await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql'); - const result = await executor({ - document, - }); - const results = []; - for await (const currentResult of result as any[]) { - if (currentResult) { - results.push(JSON.parse(JSON.stringify(currentResult))); - } + const results: ExecutionResult[] = []; + for await (const currentResult of result) { + if (currentResult) { + results.push(JSON.parse(JSON.stringify(currentResult))); } - return results; - }, - httpAddress, - document as any, - ); - expect(results).toEqual([{ data: {} }, { data: { foo: true } }]); - }); - - it('handles executing a @stream operation using multipart responses', async () => { - const document = parse(/* GraphQL */ ` - query { - countdown(from: 3) @stream } - `); - - const results = await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql'); - const result = await executor({ - document, - }); - const results = []; - for await (const currentResult of result as any[]) { - if (currentResult) { - results.push(JSON.parse(JSON.stringify(currentResult))); - } + return results; + }, + httpAddress, + document, + ); + expect(results).toEqual([{ data: {} }, { data: { foo: true } }]); + }); + + it('handles executing a @stream operation using multipart responses', async () => { + const document = parse(/* GraphQL */ ` + query { + countdown(from: 3) @stream + } + `); + + const results = await page.evaluate( + async (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql'); + const result = await executor({ + document, + }); + if (!(Symbol.asyncIterator in result)) { + throw new Error('Expected an async iterator'); + } + const results: ExecutionResult[] = []; + for await (const currentResult of result) { + if (currentResult) { + results.push(JSON.parse(JSON.stringify(currentResult))); } - return results; - }, - httpAddress, - document as any, - ); - - expect(results[0]).toEqual({ data: { countdown: [] } }); - expect(results[1]).toEqual({ data: { countdown: [3] } }); - expect(results[2]).toEqual({ data: { countdown: [3, 2] } }); - expect(results[3]).toEqual({ data: { countdown: [3, 2, 1] } }); - expect(results[4]).toEqual({ data: { countdown: [3, 2, 1, 0] } }); - }); + } + return results; + }, + httpAddress, + document, + ); + + expect(results[0]).toEqual({ data: { countdown: [] } }); + expect(results[1]).toEqual({ data: { countdown: [3] } }); + expect(results[2]).toEqual({ data: { countdown: [3, 2] } }); + expect(results[3]).toEqual({ data: { countdown: [3, 2, 1] } }); + expect(results[4]).toEqual({ data: { countdown: [3, 2, 1, 0] } }); + }); + + it('handles SSE subscription operations', async () => { + const expectedDatas = [{ data: { foo: true } }, { data: { foo: false } }]; + + const document = parse(/* GraphQL */ ` + subscription { + foo + } + `); + + const result = await page.evaluate( + async (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql', { + subscriptionsProtocol: module.SubscriptionProtocol.SSE, + }); + const result = await executor({ + document, + }); + if (!(Symbol.asyncIterator in result)) { + throw new Error('Expected an async iterator'); + } + const results: ExecutionResult[] = []; + for await (const currentResult of result) { + results.push(currentResult); + } + return results; + }, + httpAddress, + document, + ); + expect(result).toStrictEqual(expectedDatas); + }); + it('terminates SSE subscriptions when calling return on the AsyncIterator', async () => { + const sentDatas = [{ data: { foo: true } }, { data: { foo: false } }, { data: { foo: true } }]; + + const document = parse(/* GraphQL */ ` + subscription { + foo + } + `); - it('handles SSE subscription operations', async () => { - const expectedDatas = [{ data: { foo: true } }, { data: { foo: false } }]; + const pageerrorFn = jest.fn(); + page.on('pageerror', pageerrorFn); - const document = parse(/* GraphQL */ ` - subscription { - foo + const result = await page.evaluate( + async (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql', { + subscriptionsProtocol: module.SubscriptionProtocol.SSE, + }); + const result = await executor({ + document, + }); + if (!(Symbol.asyncIterator in result)) { + throw new Error('Expected an async iterator'); } - `); - - const result = await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql', { - subscriptionsProtocol: module.SubscriptionProtocol.SSE, - }); - const result = await executor({ - document, - }); - const results = []; - for await (const currentResult of result as AsyncIterable) { - results.push(currentResult); + const results: ExecutionResult[] = []; + for await (const currentResult of result) { + results.push(currentResult); + if (results.length === 2) { + break; } - return results; - }, - httpAddress, - document as any, - ); - expect(result).toStrictEqual(expectedDatas); - }); - it('terminates SSE subscriptions when calling return on the AsyncIterator', async () => { - const sentDatas = [ - { data: { foo: true } }, - { data: { foo: false } }, - { data: { foo: true } }, - ]; - - const document = parse(/* GraphQL */ ` - subscription { - foo } - `); - - const pageerrorFn = jest.fn(); - page.on('pageerror', pageerrorFn); - - const result = await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql', { - subscriptionsProtocol: module.SubscriptionProtocol.SSE, - }); - const result = (await executor({ - document, - })) as AsyncIterableIterator; - const results = []; - for await (const currentResult of result) { - results.push(currentResult); - if (results.length === 2) { - break; - } + return results; + }, + httpAddress, + document, + ); + + expect(result).toStrictEqual(sentDatas.slice(0, 2)); + + // no uncaught errors should be reported (browsers raise errors when canceling requests) + expect(pageerrorFn).not.toBeCalled(); + }); + it('terminates stream correctly', async () => { + const document = parse(/* GraphQL */ ` + query { + fakeStream @stream + } + `); + + const pageerrorFn = jest.fn(); + page.once('pageerror', pageerrorFn); + + const currentResult: ExecutionResult = await page.evaluate( + async (httpAddress, document) => { + const module = window.GraphQLToolsUrlLoader; + const loader = new module.UrlLoader(); + const executor = loader.getExecutorAsync(httpAddress + '/graphql'); + const result = await executor({ + document, + }); + if (!(Symbol.asyncIterator in result)) { + throw new Error('Expected an async iterator'); + } + for await (const currentResult of result) { + if (currentResult?.data?.fakeStream?.length > 1) { + return JSON.parse(JSON.stringify(currentResult)); } - return results; - }, - httpAddress, - document as any, - ); - - expect(result).toStrictEqual(sentDatas.slice(0, 2)); - - // no uncaught errors should be reported (browsers raise errors when canceling requests) - expect(pageerrorFn).not.toBeCalled(); - }); - it('terminates stream correctly', async () => { - const document = parse(/* GraphQL */ ` - query { - fakeStream @stream } - `); + }, + httpAddress, + document, + ); - const pageerrorFn = jest.fn(); - page.on('pageerror', pageerrorFn); + await fakeAsyncIterableReturnDeferred.promise; - const returnPromise$ = new Promise(resolve => { - resolveOnReturn = resolve; - }); + page.off('pageerror', pageerrorFn); - await page.evaluate( - async (httpAddress, document) => { - const module = (window as any)['GraphQLToolsUrlLoader'] as typeof UrlLoaderModule; - const loader = new module.UrlLoader(); - const executor = loader.getExecutorAsync(httpAddress + '/graphql'); - const result = (await executor({ - document, - })) as AsyncIterableIterator; - for await (const currentResult of result) { - if (currentResult?.data?.fakeStream?.length > 1) { - break; - } - } - }, - httpAddress, - document as any, - ); + // no uncaught errors should be reported (browsers raise errors when canceling requests) + expect(pageerrorFn).not.toHaveBeenCalled(); - await returnPromise$; - - // no uncaught errors should be reported (browsers raise errors when canceling requests) - expect(pageerrorFn).not.toBeCalled(); + expect(currentResult).toEqual({ + data: { + fakeStream: [true, true], + }, }); - } else { - it('dummy', () => {}); - } + }); }); diff --git a/packages/loaders/url/tests/yoga-compat.spec.ts b/packages/loaders/url/tests/yoga-compat.spec.ts index 6ba26d36149..0a36cbdd032 100644 --- a/packages/loaders/url/tests/yoga-compat.spec.ts +++ b/packages/loaders/url/tests/yoga-compat.spec.ts @@ -11,16 +11,6 @@ import { InMemoryLiveQueryStore } from '@n1ru4l/in-memory-live-query-store'; import { SubscriptionProtocol, UrlLoader } from '../src'; import { assertAsyncIterable, sleep } from './test-utils'; -if (!globalThis.DOMException) { - // @ts-expect-error DOMException is not defined in NodeJS 16 - globalThis.DOMException = class DOMException extends Error { - constructor(message: string, name: string) { - super(message); - this.name = name; - } - }; -} - describe('Yoga Compatibility', () => { jest.setTimeout(10000); const loader = new UrlLoader(); diff --git a/packages/merge/CHANGELOG.md b/packages/merge/CHANGELOG.md index a51285aac7e..1ee5992ee89 100644 --- a/packages/merge/CHANGELOG.md +++ b/packages/merge/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/merge +## 9.0.14 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 9.0.13 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 9.0.12 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 9.0.11 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 9.0.10 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 9.0.9 ### Patch Changes diff --git a/packages/merge/package.json b/packages/merge/package.json index b8644dab926..53dee7485fc 100644 --- a/packages/merge/package.json +++ b/packages/merge/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/merge", - "version": "9.0.9", + "version": "9.0.14", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -51,9 +51,12 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, + "devDependencies": { + "@graphql-tools/stitch": "^9.3.4" + }, "publishConfig": { "directory": "dist", "access": "public" diff --git a/packages/mock/CHANGELOG.md b/packages/mock/CHANGELOG.md index fcd71ccc7db..82221361270 100644 --- a/packages/mock/CHANGELOG.md +++ b/packages/mock/CHANGELOG.md @@ -1,5 +1,64 @@ # @graphql-tools/mock +## 9.0.11 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/schema@10.0.13 + +## 9.0.10 + +### Patch Changes + +- [`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612) + Thanks [@ardatan](https://github.com/ardatan)! - \`AbortSignal\` in \`GraphQLResolveInfo\`, and + \`AbortSignal\` in \`ExecutionRequest\` + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/schema@10.0.12 + - @graphql-tools/utils@10.6.3 + +## 9.0.9 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/schema@^10.0.10` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.10) + (from `^10.0.9`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/schema@10.0.11 + - @graphql-tools/utils@10.6.2 + +## 9.0.8 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/schema@10.0.10 + +## 9.0.7 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/schema@10.0.9 + ## 9.0.6 ### Patch Changes diff --git a/packages/mock/package.json b/packages/mock/package.json index 0f4681eaf43..e2ec93ac1db 100644 --- a/packages/mock/package.json +++ b/packages/mock/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/mock", - "version": "9.0.6", + "version": "9.0.11", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -50,8 +50,8 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/schema": "^10.0.8", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/schema": "^10.0.13", + "@graphql-tools/utils": "^10.6.4", "fast-json-stable-stringify": "^2.1.0", "tslib": "^2.4.0" }, diff --git a/packages/mock/src/pagination.ts b/packages/mock/src/pagination.ts index 5d3c5417293..5007dcd0eaf 100644 --- a/packages/mock/src/pagination.ts +++ b/packages/mock/src/pagination.ts @@ -1,5 +1,4 @@ -import { GraphQLResolveInfo } from 'graphql'; -import { IFieldResolver } from '@graphql-tools/utils'; +import { GraphQLResolveInfo, IFieldResolver } from '@graphql-tools/utils'; import { IMockStore, Ref } from './types.js'; import { isRootType, makeRef } from './utils.js'; diff --git a/packages/node-require/CHANGELOG.md b/packages/node-require/CHANGELOG.md index 6812fc4291a..1e077b8f03d 100644 --- a/packages/node-require/CHANGELOG.md +++ b/packages/node-require/CHANGELOG.md @@ -1,5 +1,69 @@ # @graphql-tools/node-require +## 7.0.9 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/load@8.0.9 + - @graphql-tools/graphql-file-loader@8.0.8 + +## 7.0.8 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/load@8.0.8 + - @graphql-tools/graphql-file-loader@8.0.7 + +## 7.0.7 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/graphql-file-loader@8.0.5` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.0.5) + (from `8.0.4`, in `dependencies`) + - Updated dependency + [`@graphql-tools/load@8.0.6` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/load/v/8.0.6) + (from `8.0.5`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/graphql-file-loader@8.0.6 + - @graphql-tools/load@8.0.7 + - @graphql-tools/utils@10.6.2 + +## 7.0.6 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/load@8.0.6 + - @graphql-tools/graphql-file-loader@8.0.5 + +## 7.0.5 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/load@8.0.5 + - @graphql-tools/graphql-file-loader@8.0.4 + ## 7.0.4 ### Patch Changes diff --git a/packages/node-require/package.json b/packages/node-require/package.json index cba7845b04d..e2c0cbc7e50 100644 --- a/packages/node-require/package.json +++ b/packages/node-require/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/node-require", - "version": "7.0.4", + "version": "7.0.9", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -50,9 +50,9 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/graphql-file-loader": "8.0.3", - "@graphql-tools/load": "8.0.4", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/graphql-file-loader": "8.0.8", + "@graphql-tools/load": "8.0.9", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, "publishConfig": { diff --git a/packages/relay-operation-optimizer/CHANGELOG.md b/packages/relay-operation-optimizer/CHANGELOG.md index edfd1ad60f1..3ae43191f52 100644 --- a/packages/relay-operation-optimizer/CHANGELOG.md +++ b/packages/relay-operation-optimizer/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/relay-operation-optimizer +## 7.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 7.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 7.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 7.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 7.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 7.0.3 ### Patch Changes diff --git a/packages/relay-operation-optimizer/package.json b/packages/relay-operation-optimizer/package.json index e325fde6968..22aab692240 100644 --- a/packages/relay-operation-optimizer/package.json +++ b/packages/relay-operation-optimizer/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/relay-operation-optimizer", - "version": "7.0.3", + "version": "7.0.8", "type": "module", "description": "Package for optimizing your GraphQL operations relay style.", "repository": { @@ -63,7 +63,7 @@ }, "dependencies": { "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/packages/resolvers-composition/CHANGELOG.md b/packages/resolvers-composition/CHANGELOG.md index 6c0b9c0a7db..13813ece2e7 100644 --- a/packages/resolvers-composition/CHANGELOG.md +++ b/packages/resolvers-composition/CHANGELOG.md @@ -1,5 +1,51 @@ # @graphql-tools/resolvers-composition +## 7.0.8 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + +## 7.0.7 + +### Patch Changes + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + +## 7.0.6 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/utils@10.6.2 + +## 7.0.5 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + +## 7.0.4 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + ## 7.0.3 ### Patch Changes diff --git a/packages/resolvers-composition/package.json b/packages/resolvers-composition/package.json index 20d51333f89..bd933ce1dc2 100644 --- a/packages/resolvers-composition/package.json +++ b/packages/resolvers-composition/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/resolvers-composition", - "version": "7.0.3", + "version": "7.0.8", "type": "module", "description": "Common package containing utils and types for GraphQL tools", "repository": { @@ -51,7 +51,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/utils": "^10.6.4", "lodash": "4.17.21", "micromatch": "^4.0.8", "tslib": "^2.4.0" diff --git a/packages/schema/CHANGELOG.md b/packages/schema/CHANGELOG.md index 56a6b61ceff..4648ed5ecaa 100644 --- a/packages/schema/CHANGELOG.md +++ b/packages/schema/CHANGELOG.md @@ -1,5 +1,64 @@ # @graphql-tools/schema +## 10.0.13 + +### Patch Changes + +- Updated dependencies + [[`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1)]: + - @graphql-tools/utils@10.6.4 + - @graphql-tools/merge@9.0.14 + +## 10.0.12 + +### Patch Changes + +- [`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612) + Thanks [@ardatan](https://github.com/ardatan)! - \`AbortSignal\` in \`GraphQLResolveInfo\`, and + \`AbortSignal\` in \`ExecutionRequest\` + +- Updated dependencies + [[`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612)]: + - @graphql-tools/utils@10.6.3 + - @graphql-tools/merge@9.0.13 + +## 10.0.11 + +### Patch Changes + +- [#6662](https://github.com/ardatan/graphql-tools/pull/6662) + [`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679) + Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates: + - Updated dependency + [`@graphql-tools/merge@^9.0.11` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/merge/v/9.0.11) + (from `^9.0.10`, in `dependencies`) + - Updated dependency + [`@graphql-tools/utils@^10.6.1` โ†—๏ธŽ](https://www.npmjs.com/package/@graphql-tools/utils/v/10.6.1) + (from `^10.6.0`, in `dependencies`) +- Updated dependencies + [[`696a0d5`](https://github.com/ardatan/graphql-tools/commit/696a0d5ac9232baebe730226fe9ea9d6e3b98679), + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060)]: + - @graphql-tools/merge@9.0.12 + - @graphql-tools/utils@10.6.2 + +## 10.0.10 + +### Patch Changes + +- Updated dependencies + [[`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f)]: + - @graphql-tools/utils@10.6.1 + - @graphql-tools/merge@9.0.11 + +## 10.0.9 + +### Patch Changes + +- Updated dependencies + [[`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43)]: + - @graphql-tools/utils@10.6.0 + - @graphql-tools/merge@9.0.10 + ## 10.0.8 ### Patch Changes diff --git a/packages/schema/package.json b/packages/schema/package.json index c6674ed3228..aa29186795a 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/schema", - "version": "10.0.8", + "version": "10.0.13", "type": "module", "description": "A set of utils for faster development of GraphQL tools", "repository": { @@ -50,13 +50,13 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" }, "dependencies": { - "@graphql-tools/merge": "^9.0.9", - "@graphql-tools/utils": "^10.5.6", + "@graphql-tools/merge": "^9.0.14", + "@graphql-tools/utils": "^10.6.4", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, "devDependencies": { - "graphql-scalars": "1.23.0" + "graphql-scalars": "1.24.0" }, "publishConfig": { "directory": "dist", diff --git a/packages/schema/src/chainResolvers.ts b/packages/schema/src/chainResolvers.ts index 918b50fef2d..d601621ef6b 100644 --- a/packages/schema/src/chainResolvers.ts +++ b/packages/schema/src/chainResolvers.ts @@ -1,5 +1,5 @@ -import { defaultFieldResolver, GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql'; -import { Maybe } from '@graphql-tools/utils'; +import { defaultFieldResolver, GraphQLFieldResolver } from 'graphql'; +import { GraphQLResolveInfo, Maybe } from '@graphql-tools/utils'; export function chainResolvers( resolvers: Array>>, diff --git a/packages/executor/src/execution/__tests__/simplePubSub.ts b/packages/testing/simplePubSub.ts similarity index 86% rename from packages/executor/src/execution/__tests__/simplePubSub.ts rename to packages/testing/simplePubSub.ts index a3ffc21928b..cbc4ebf4913 100644 --- a/packages/executor/src/execution/__tests__/simplePubSub.ts +++ b/packages/testing/simplePubSub.ts @@ -1,3 +1,6 @@ +import { fakePromise } from '@graphql-tools/utils'; +import { DisposableSymbols } from '@whatwg-node/disposablestack'; + /** * Create an AsyncIterator from an EventEmitter. Useful for mocking a * PubSub system for tests. @@ -56,14 +59,19 @@ export class SimplePubSub { [Symbol.asyncIterator]() { return this; }, + [DisposableSymbols.asyncDispose]() { + emptyQueue(); + return fakePromise(undefined); + }, }; function pushValue(event: T): void { const value: R = transform(event); if (pullQueue.length > 0) { const receiver = pullQueue.shift(); - expect(receiver != null).toBeTruthy(); - // @ts-expect-error + if (!receiver) { + throw new Error('Invalid state'); + } receiver({ value, done: false }); } else { pushQueue.push(value); @@ -71,7 +79,3 @@ export class SimplePubSub { } } } - -describe.skip('no simplePubSub tests', () => { - it.todo('nothing to test'); -}); diff --git a/packages/testing/utils.ts b/packages/testing/utils.ts index d5accd44239..7296279f0cb 100644 --- a/packages/testing/utils.ts +++ b/packages/testing/utils.ts @@ -83,3 +83,11 @@ function findProjectDir(dirname: string): string | never { throw new Error(`Couldn't find project's root from: ${originalDirname}`); } + +export function describeIf(condition: boolean) { + return condition ? describe : describe.skip; +} + +export function testIf(condition: boolean) { + return condition ? test : test.skip; +} diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index d406e16f539..6241fb65adc 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,5 +1,54 @@ # @graphql-tools/utils +## 10.6.4 + +### Patch Changes + +- [#6769](https://github.com/ardatan/graphql-tools/pull/6769) + [`6a8123b`](https://github.com/ardatan/graphql-tools/commit/6a8123be34d3270e4e6a628c7b4ef35fa66f52a1) + Thanks [@ardatan](https://github.com/ardatan)! - Improvements for `fakePromise` so it can be used + without params to create a `void` Promise + +## 10.6.3 + +### Patch Changes + +- [`020b9e4`](https://github.com/ardatan/graphql-tools/commit/020b9e47b51f9847bf915de5faefe09dc04d9612) + Thanks [@ardatan](https://github.com/ardatan)! - \`AbortSignal\` in \`GraphQLResolveInfo\`, and + \`AbortSignal\` in \`ExecutionRequest\` + +## 10.6.2 + +### Patch Changes + +- [#6737](https://github.com/ardatan/graphql-tools/pull/6737) + [`1b24656`](https://github.com/ardatan/graphql-tools/commit/1b24656d3d13274820e52bede56991b0c54e8060) + Thanks [@ardatan](https://github.com/ardatan)! - Handle array of primitives correctly + + The bug was following; + + ```ts + mergeDeep([{ options: ['$a', '$b'] }, { options: ['$c'] }, { options: ['$d', '$e'] }]) + + // results in { options: [{}, {}] } + ``` + +## 10.6.1 + +### Patch Changes + +- [`1e02935`](https://github.com/ardatan/graphql-tools/commit/1e0293562961fb12b267235e5aa6d0e83d0e7d0f) + Thanks [@ardatan](https://github.com/ardatan)! - Handle parse errors correctly when loader gets a + string directly + +## 10.6.0 + +### Minor Changes + +- [`414e404`](https://github.com/ardatan/graphql-tools/commit/414e404a06478ea8ddd1065bd765de14af0f6c43) + Thanks [@ardatan](https://github.com/ardatan)! - new `fakePromise`, `mapMaybePromise` and + `fakeRejectPromise` helper functions + ## 10.5.6 ### Patch Changes diff --git a/packages/utils/package.json b/packages/utils/package.json index 3079f9c70b0..d8e367c05e9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/utils", - "version": "10.5.6", + "version": "10.6.4", "type": "module", "description": "Common package containing utils and types for GraphQL tools", "repository": { @@ -39,13 +39,16 @@ "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "cross-inspect": "1.0.1", + "dlv": "^1.1.3", "dset": "^3.1.2", "tslib": "^2.4.0" }, "devDependencies": { + "@graphql-tools/stitch": "^9.3.4", "@types/dateformat": "3.0.1", + "@types/dlv": "^1.1.4", "dateformat": "4.6.3", - "graphql-scalars": "1.23.0" + "graphql-scalars": "1.24.0" }, "publishConfig": { "directory": "dist", diff --git a/packages/utils/src/Interfaces.ts b/packages/utils/src/Interfaces.ts index 552cdb2da5a..53941af9764 100644 --- a/packages/utils/src/Interfaces.ts +++ b/packages/utils/src/Interfaces.ts @@ -24,7 +24,6 @@ import { GraphQLNamedType, GraphQLObjectType, GraphQLOutputType, - GraphQLResolveInfo, GraphQLScalarLiteralParser, GraphQLScalarSerializer, GraphQLScalarType, @@ -40,6 +39,7 @@ import { ObjectTypeDefinitionNode, ObjectTypeExtensionNode, OperationTypeNode, + GraphQLResolveInfo as OrigGraphQLResolveInfo, ScalarTypeDefinitionNode, ScalarTypeExtensionNode, SelectionNode, @@ -66,6 +66,14 @@ export interface ExecutionResult { label?: string; path?: ReadonlyArray; items?: TData | null; + id?: string; + subPath?: ReadonlyArray; + pending?: ReadonlyArray<{ id: string; path: ReadonlyArray }>; + completed?: ReadonlyArray<{ id: string; errors?: ReadonlyArray }>; +} + +export interface GraphQLResolveInfo extends OrigGraphQLResolveInfo { + signal?: AbortSignal; } export interface ExecutionRequest< @@ -86,6 +94,7 @@ export interface ExecutionRequest< // If the request originates within execution of a parent request, it may contain the parent context and info context?: TContext; info?: GraphQLResolveInfo; + signal?: AbortSignal; } // graphql-js non-exported typings diff --git a/packages/utils/src/Path.ts b/packages/utils/src/Path.ts index 48161011e00..37bb6ef979e 100644 --- a/packages/utils/src/Path.ts +++ b/packages/utils/src/Path.ts @@ -21,7 +21,7 @@ export function addPath( * Given a Path, return an Array of the path keys. */ export function pathToArray(path: Maybe>): Array { - const flattened = []; + const flattened: Array = []; let curr = path; while (curr) { flattened.push(curr.key); diff --git a/packages/utils/src/astFromValue.ts b/packages/utils/src/astFromValue.ts index 5dc6caed1cc..4c0e78bbb84 100644 --- a/packages/utils/src/astFromValue.ts +++ b/packages/utils/src/astFromValue.ts @@ -60,7 +60,7 @@ export function astFromValue(value: unknown, type: GraphQLInputType): Maybe): number { - let commonIndent = null; + let commonIndent: number | null = null; for (let i = 1; i < lines.length; i++) { const line = lines[i]; diff --git a/packages/utils/src/createDeferred.ts b/packages/utils/src/createDeferred.ts new file mode 100644 index 00000000000..3aaab412e58 --- /dev/null +++ b/packages/utils/src/createDeferred.ts @@ -0,0 +1,18 @@ +export interface PromiseWithResolvers { + promise: Promise; + resolve: (value: T | PromiseLike) => void; + reject: (reason: any) => void; +} + +export function createDeferred(): PromiseWithResolvers { + if (Promise.withResolvers) { + return Promise.withResolvers(); + } + let resolve!: (value: T | PromiseLike) => void; + let reject!: (reason: any) => void; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + return { promise, resolve, reject }; +} diff --git a/packages/utils/src/fakePromise.ts b/packages/utils/src/fakePromise.ts new file mode 100644 index 00000000000..3eee4932adc --- /dev/null +++ b/packages/utils/src/fakePromise.ts @@ -0,0 +1,64 @@ +function isPromise(val: T | Promise): val is Promise { + return (val as any)?.then != null; +} + +export function fakeRejectPromise(error: unknown): Promise { + if (isPromise(error)) { + return error as Promise; + } + return { + then() { + return this; + }, + catch(reject: (error: unknown) => any) { + if (reject) { + return fakePromise(reject(error)); + } + return this; + }, + finally(cb) { + if (cb) { + cb(); + } + return this; + }, + [Symbol.toStringTag]: 'Promise', + }; +} + +export function fakePromise(value: T): Promise; +export function fakePromise(value: T): Promise; +export function fakePromise(value: void): Promise; +export function fakePromise(value: T): Promise { + if (isPromise(value)) { + return value; + } + // Write a fake promise to avoid the promise constructor + // being called with `new Promise` in the browser. + return { + then(resolve: (value: T) => any) { + if (resolve) { + const callbackResult = resolve(value); + if (isPromise(callbackResult)) { + return callbackResult; + } + return fakePromise(callbackResult); + } + return this; + }, + catch() { + return this; + }, + finally(cb) { + if (cb) { + const callbackResult = cb(); + if (isPromise(callbackResult)) { + return callbackResult.then(() => value); + } + return fakePromise(value); + } + return this; + }, + [Symbol.toStringTag]: 'Promise', + }; +} diff --git a/packages/utils/src/getResponseKeyFromInfo.ts b/packages/utils/src/getResponseKeyFromInfo.ts index 4f1277a0a7f..16e02061c81 100644 --- a/packages/utils/src/getResponseKeyFromInfo.ts +++ b/packages/utils/src/getResponseKeyFromInfo.ts @@ -1,4 +1,4 @@ -import { GraphQLResolveInfo } from 'graphql'; +import { GraphQLResolveInfo } from './Interfaces.js'; /** * Get the key under which the result of this resolver will be placed in the response JSON. Basically, just diff --git a/packages/utils/src/helpers.ts b/packages/utils/src/helpers.ts index 60508f92734..b50b514e44f 100644 --- a/packages/utils/src/helpers.ts +++ b/packages/utils/src/helpers.ts @@ -1,5 +1,14 @@ import { ASTNode, parse } from 'graphql'; +function isURL(str: string): boolean { + try { + const url = new URL(str); + return !!url; + } catch (e) { + return false; + } +} + export const asArray = (fns: T | T[]) => (Array.isArray(fns) ? fns : fns ? [fns] : []); const invalidDocRegex = /\.[a-z0-9]+$/i; @@ -13,14 +22,22 @@ export function isDocumentString(str: any): boolean { // this why checking the extension is fast enough // and prevent from parsing the string in order to find out // if the string is a SDL - if (invalidDocRegex.test(str)) { + if (invalidDocRegex.test(str) || isURL(str)) { return false; } try { parse(str); return true; - } catch (e: any) {} + } catch (e: any) { + if ( + !e.message.includes('EOF') && + str.replace(/(\#[^*]*)/g, '').trim() !== '' && + str.includes(' ') + ) { + throw new Error(`Failed to parse the GraphQL document. ${e.message}\n${str}`); + } + } return false; } diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 43b8ed2e31c..f82d39bb56e 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -55,3 +55,6 @@ export * from './directives.js'; export * from './mergeIncrementalResult.js'; export * from './debugTimer.js'; export * from './getDirectiveExtensions.js'; +export * from './map-maybe-promise.js'; +export * from './fakePromise.js'; +export * from './createDeferred.js'; diff --git a/packages/utils/src/jsutils.ts b/packages/utils/src/jsutils.ts index 3bc0bb95aba..78f5894af3d 100644 --- a/packages/utils/src/jsutils.ts +++ b/packages/utils/src/jsutils.ts @@ -1,4 +1,5 @@ import { MaybePromise } from './executor.js'; +import { mapMaybePromise } from './map-maybe-promise.js'; export function isIterableObject(value: unknown): value is Iterable { return value != null && typeof value === 'object' && Symbol.iterator in value; @@ -20,9 +21,7 @@ export function promiseReduce( let accumulator = initialValue; for (const value of values) { - accumulator = isPromise(accumulator) - ? accumulator.then(resolved => callbackFn(resolved, value)) - : callbackFn(accumulator, value); + accumulator = mapMaybePromise(accumulator, resolved => callbackFn(resolved, value)); } return accumulator; diff --git a/packages/utils/src/map-maybe-promise.ts b/packages/utils/src/map-maybe-promise.ts new file mode 100644 index 00000000000..612df855f45 --- /dev/null +++ b/packages/utils/src/map-maybe-promise.ts @@ -0,0 +1,27 @@ +import { MaybePromise } from './executor.js'; +import { isPromise } from './jsutils.js'; + +export function mapMaybePromise( + value: MaybePromise, + mapper: (v: T) => MaybePromise, + errorMapper?: (e: any) => MaybePromise, +): MaybePromise { + if (isPromise(value)) { + if (errorMapper) { + try { + return value.then(mapper, errorMapper); + } catch (e) { + return errorMapper(e); + } + } + return value.then(mapper); + } + if (errorMapper) { + try { + return mapper(value); + } catch (e) { + return errorMapper(e); + } + } + return mapper(value); +} diff --git a/packages/utils/src/mapAsyncIterator.ts b/packages/utils/src/mapAsyncIterator.ts index 9257e6e197b..d4dbc30e2c0 100644 --- a/packages/utils/src/mapAsyncIterator.ts +++ b/packages/utils/src/mapAsyncIterator.ts @@ -1,5 +1,6 @@ import type { MaybePromise } from './executor.js'; -import { isPromise } from './jsutils.js'; +import { fakePromise, fakeRejectPromise } from './fakePromise.js'; +import { mapMaybePromise } from './map-maybe-promise.js'; /** * Given an AsyncIterable and a callback function, return an AsyncIterator @@ -21,18 +22,17 @@ export function mapAsyncIterator( if (onEnd) { let onEndWithValueResult: any /** R in onEndWithValue */; onEndWithValue = value => { - if (onEndWithValueResult) { - return onEndWithValueResult; - } - const onEnd$ = onEnd(); - return (onEndWithValueResult = isPromise(onEnd$) ? onEnd$.then(() => value) : value); + onEndWithValueResult ||= mapMaybePromise(onEnd(), () => value); + return onEndWithValueResult; }; } if (typeof iterator.return === 'function') { $return = iterator.return; abruptClose = (error: any) => { - const rethrow = () => Promise.reject(error); + const rethrow = () => { + throw error; + }; return $return.call(iterator).then(rethrow, rethrow); }; } @@ -41,7 +41,9 @@ export function mapAsyncIterator( if (result.done) { return onEndWithValue ? onEndWithValue(result) : result; } - return asyncMapValue(result.value, onNext).then(iteratorResult, abruptClose); + return mapMaybePromise(result.value, value => + mapMaybePromise(onNext(value), iteratorResult, abruptClose), + ); } let mapReject: any; @@ -50,10 +52,10 @@ export function mapAsyncIterator( // Capture rejectCallback to ensure it cannot be null. const reject = onError; mapReject = (error: any) => { - if (onErrorResult) { - return onErrorResult; - } - return (onErrorResult = asyncMapValue(error, reject).then(iteratorResult, abruptClose)); + onErrorResult ||= mapMaybePromise(error, error => + mapMaybePromise(reject(error), iteratorResult, abruptClose), + ); + return onErrorResult; }; } @@ -64,14 +66,17 @@ export function mapAsyncIterator( return() { const res$ = $return ? $return.call(iterator).then(mapResult, mapReject) - : Promise.resolve({ value: undefined, done: true }); + : fakePromise({ value: undefined, done: true }); return onEndWithValue ? res$.then(onEndWithValue) : res$; }, throw(error: any) { if (typeof iterator.throw === 'function') { return iterator.throw(error).then(mapResult, mapReject); } - return Promise.reject(error).catch(abruptClose); + if (abruptClose) { + return abruptClose(error); + } + return fakeRejectPromise(error); }, [Symbol.asyncIterator]() { return this; @@ -79,10 +84,6 @@ export function mapAsyncIterator( }; } -function asyncMapValue(value: T, callback: (value: T) => PromiseLike | U): Promise { - return new Promise(resolve => resolve(callback(value))); -} - function iteratorResult(value: T): IteratorResult { return { value, done: false }; } diff --git a/packages/utils/src/memoize.ts b/packages/utils/src/memoize.ts index cd550a07c78..dacf9a04103 100644 --- a/packages/utils/src/memoize.ts +++ b/packages/utils/src/memoize.ts @@ -78,6 +78,43 @@ export function memoize3 any>(fn: F): F } as F; } +export function memoize3of4 any>(fn: F): F { + const memoize3Cache: WeakMap< + Record, + WeakMap, any> + > = new WeakMap(); + return function memoized(a1: any, a2: any, a3: any, a4: any) { + let cache2 = memoize3Cache.get(a1); + if (!cache2) { + cache2 = new WeakMap(); + memoize3Cache.set(a1, cache2); + const cache3 = new WeakMap(); + cache2.set(a2, cache3); + const newValue = fn(a1, a2, a3, a4); + cache3.set(a3, newValue); + return newValue; + } + + let cache3 = cache2.get(a2); + if (!cache3) { + cache3 = new WeakMap(); + cache2.set(a2, cache3); + const newValue = fn(a1, a2, a3, a4); + cache3.set(a3, newValue); + return newValue; + } + + const cachedValue = cache3.get(a3); + if (cachedValue === undefined) { + const newValue = fn(a1, a2, a3, a4); + cache3.set(a3, newValue); + return newValue; + } + + return cachedValue; + } as F; +} + export function memoize4 any>(fn: F): F { const memoize4Cache: WeakMap< Record, diff --git a/packages/utils/src/mergeDeep.ts b/packages/utils/src/mergeDeep.ts index ed4ddec2ee7..9f690e8c9c9 100644 --- a/packages/utils/src/mergeDeep.ts +++ b/packages/utils/src/mergeDeep.ts @@ -12,39 +12,50 @@ export function mergeDeep( respectArrays = false, respectArrayLength = false, ): UnboxIntersection>> & any { - if (respectArrays && respectArrayLength) { - let expectedLength: number | undefined; - const areArraysInTheSameLength = sources.every(source => { - if (Array.isArray(source)) { - if (expectedLength === undefined) { - expectedLength = source.length; - return true; - } else if (expectedLength === source.length) { - return true; - } + let expectedLength: number | undefined; + let allArrays = true; + const areArraysInTheSameLength = sources.every(source => { + if (Array.isArray(source)) { + if (expectedLength === undefined) { + expectedLength = source.length; + return true; + } else if (expectedLength === source.length) { + return true; } - return false; - }); - - if (areArraysInTheSameLength) { - return new Array(expectedLength).fill(null).map((_, index) => - mergeDeep( - sources.map(source => source[index]), - respectPrototype, - respectArrays, - respectArrayLength, - ), - ); + } else { + allArrays = false; } + return false; + }); + + if (respectArrayLength && areArraysInTheSameLength) { + return new Array(expectedLength).fill(null).map((_, index) => + mergeDeep( + sources.map(source => source[index]), + respectPrototype, + respectArrays, + respectArrayLength, + ), + ); + } + if (allArrays) { + return sources.flat(1); } - const output = {}; + let output: any; + let firstObjectSource: any; if (respectPrototype) { - Object.setPrototypeOf(output, Object.create(Object.getPrototypeOf(sources[0]))); + firstObjectSource = sources.find(source => isObject(source)); + if (output == null) { + output = {}; + } + if (firstObjectSource) { + Object.setPrototypeOf(output, Object.create(Object.getPrototypeOf(firstObjectSource))); + } } for (const source of sources) { if (isObject(source)) { - if (respectPrototype) { + if (firstObjectSource) { const outputPrototype = Object.getPrototypeOf(output); const sourcePrototype = Object.getPrototypeOf(source); if (sourcePrototype) { @@ -58,36 +69,28 @@ export function mergeDeep( } for (const key in source) { - if (isObject(source[key])) { - if (!(key in output)) { - Object.assign(output, { [key]: source[key] }); - } else { - output[key] = mergeDeep( - [output[key], source[key]] as S, - respectPrototype, - respectArrays, - respectArrayLength, - ); - } - } else if (respectArrays && Array.isArray(output[key])) { - if (Array.isArray(source[key])) { - if (respectArrayLength && output[key].length === source[key].length) { - output[key] = mergeDeep( - [output[key], source[key]] as S, - respectPrototype, - respectArrays, - respectArrayLength, - ); - } else { - output[key].push(...source[key]); - } - } else { - output[key].push(source[key]); - } + if (output == null) { + output = {}; + } + if (key in output) { + output[key] = mergeDeep( + [output[key], source[key]], + respectPrototype, + respectArrays, + respectArrayLength, + ); } else { - Object.assign(output, { [key]: source[key] }); + output[key] = source[key]; } } + } else if (Array.isArray(source)) { + if (!Array.isArray(output)) { + output = source; + } else { + output = mergeDeep([output, source], respectPrototype, respectArrays, respectArrayLength); + } + } else { + output = source; } } return output; diff --git a/packages/utils/src/mergeIncrementalResult.ts b/packages/utils/src/mergeIncrementalResult.ts index 3851fddd0dc..d76dbfe00d1 100644 --- a/packages/utils/src/mergeIncrementalResult.ts +++ b/packages/utils/src/mergeIncrementalResult.ts @@ -1,7 +1,10 @@ +import delve from 'dlv'; import { dset } from 'dset/merge'; import { GraphQLError } from 'graphql'; import { ExecutionResult } from './Interfaces.js'; +const pathsMap = new WeakMap>>(); + export function mergeIncrementalResult({ incrementalResult, executionResult, @@ -9,18 +12,60 @@ export function mergeIncrementalResult({ incrementalResult: ExecutionResult; executionResult: ExecutionResult; }) { - const path = ['data', ...(incrementalResult.path ?? [])]; + let path: ReadonlyArray | undefined = [ + 'data', + ...(incrementalResult.path ?? []), + ]; + + for (const result of [executionResult, incrementalResult]) { + if (result.pending) { + let paths = pathsMap.get(executionResult); + if (paths === undefined) { + paths = new Map(); + pathsMap.set(executionResult, paths); + } - if (incrementalResult.items) { - for (const item of incrementalResult.items) { - dset(executionResult, path, item); - // Increment the last path segment (the array index) to merge the next item at the next index - (path[path.length - 1] as number)++; + for (const { id, path } of result.pending) { + paths.set(id, ['data', ...path]); + } } } - if (incrementalResult.data) { - dset(executionResult, path, incrementalResult.data); + const items = incrementalResult.items; + if (items) { + const id = incrementalResult.id; + if (id) { + path = pathsMap.get(executionResult)?.get(id); + if (path === undefined) { + throw new Error('Invalid incremental delivery format.'); + } + + const list = delve(executionResult, path as Array); + list.push(...items); + } else { + const path = ['data', ...(incrementalResult.path ?? [])]; + for (const item of items) { + dset(executionResult, path, item); + // Increment the last path segment (the array index) to merge the next item at the next index + (path[path.length - 1] as number)++; + } + } + } + + const data = incrementalResult.data; + if (data) { + const id = incrementalResult.id; + if (id) { + path = pathsMap.get(executionResult)?.get(id); + if (path === undefined) { + throw new Error('Invalid incremental delivery format.'); + } + const subPath = incrementalResult.subPath; + if (subPath !== undefined) { + path = [...path, ...subPath]; + } + } + dset(executionResult, path, data); } if (incrementalResult.errors) { @@ -40,4 +85,16 @@ export function mergeIncrementalResult({ }); }); } + + if (incrementalResult.completed) { + // Remove tracking and add additional errors + for (const { id, errors } of incrementalResult.completed) { + pathsMap.get(executionResult)?.delete(id); + + if (errors) { + executionResult.errors = executionResult.errors || []; + (executionResult.errors as GraphQLError[]).push(...errors); + } + } + } } diff --git a/packages/utils/src/observableToAsyncIterable.ts b/packages/utils/src/observableToAsyncIterable.ts index 62c256c7559..30bfc6dd1d2 100644 --- a/packages/utils/src/observableToAsyncIterable.ts +++ b/packages/utils/src/observableToAsyncIterable.ts @@ -1,3 +1,5 @@ +import { fakePromise } from './fakePromise.js'; + export interface Observer { next: (value: T) => void; error: (error: Error) => void; @@ -58,13 +60,13 @@ export function observableToAsyncIterable(observable: Observable): AsyncIt const subscription = observable.subscribe({ next(value: any) { - pushValue(value); + return pushValue(value); }, error(err: Error) { - pushError(err); + return pushError(err); }, complete() { - pushDone(); + return pushDone(); }, }); @@ -87,7 +89,7 @@ export function observableToAsyncIterable(observable: Observable): AsyncIt }, return() { emptyQueue(); - return Promise.resolve({ value: undefined, done: true }); + return fakePromise({ value: undefined, done: true }); }, throw(error) { emptyQueue(); diff --git a/packages/utils/src/prune.ts b/packages/utils/src/prune.ts index 7f32b00cb01..a52164b2d8d 100644 --- a/packages/utils/src/prune.ts +++ b/packages/utils/src/prune.ts @@ -41,7 +41,7 @@ export function pruneSchema( // Custom pruning was defined, so we need to pre-emptively revisit the schema accounting for this if (skipPruning) { - const revisit = []; + const revisit: string[] = []; for (const typeName in prunedSchema.getTypeMap()) { if (typeName.startsWith('__')) { diff --git a/packages/utils/tests/helpers.test.ts b/packages/utils/tests/helpers.test.ts index ecba2becfa3..ec4dae98617 100644 --- a/packages/utils/tests/helpers.test.ts +++ b/packages/utils/tests/helpers.test.ts @@ -7,6 +7,19 @@ describe('helpers', () => { mutation: Mutation subscription: Subscription }`, + ` + extend type Query { + test(id: String!): Test + @resolveTo( + sourceName: "Test" + sourceTypeName: "Test" + sourceFieldName: "test" + requiredSelectionSet: "{ ...on Test { id name } }", + sourceArgs: { testId: {root.id} } + returnType: Test + ) + } + `, ])('should detect "%s" as NOT a valid path', str => { expect(isValidPath(str)).toBeFalsy(); }); diff --git a/packages/utils/tests/mapAsyncIterator.test.ts b/packages/utils/tests/mapAsyncIterator.test.ts index 431da6625bc..303eace991f 100644 --- a/packages/utils/tests/mapAsyncIterator.test.ts +++ b/packages/utils/tests/mapAsyncIterator.test.ts @@ -16,7 +16,7 @@ describe('mapAsyncIterator', () => { }, onEnd, ); - const onNextResults = []; + const onNextResults: string[] = []; for await (const result of iter) { onNextResults.push(result); } diff --git a/packages/utils/tests/mergeDeep.test.ts b/packages/utils/tests/mergeDeep.test.ts index e051452517f..7391f17b332 100644 --- a/packages/utils/tests/mergeDeep.test.ts +++ b/packages/utils/tests/mergeDeep.test.ts @@ -66,4 +66,10 @@ describe('mergeDeep', () => { { b: 2, d: 4 }, ]); }); + + it('merges string arrays', () => { + const a = { options: ['$A', '$B'] }; + const b = { options: ['$A', '$B'] }; + expect(mergeDeep([a, b], undefined, true, true)).toEqual({ options: ['$A', '$B'] }); + }); }); diff --git a/packages/utils/tests/mergeIncrementalResult.spec.ts b/packages/utils/tests/mergeIncrementalResult.spec.ts index 0313357a47b..378cfa34942 100644 --- a/packages/utils/tests/mergeIncrementalResult.spec.ts +++ b/packages/utils/tests/mergeIncrementalResult.spec.ts @@ -20,6 +20,15 @@ describe('mergeIncrementalResult', () => { expect(executionResult).toEqual({ data: { user: { age: 42, name: 'John' } } }); }); + it('should deep merge data with basic path with new format', () => { + const executionResult = { data: { user: { name: 'John' } }, pending: [{ id: '0', path: [] }] }; + const incrementalResult = { incremental: [{ id: '0', data: { user: { age: 42 } } }] }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult.data).toEqual({ user: { age: 42, name: 'John' } }); + }); + it('should merge data at path', () => { const executionResult = { data: { user: { name: 'John' } } }; const incrementalResult = { path: ['user'], data: { age: 42 } }; @@ -29,6 +38,18 @@ describe('mergeIncrementalResult', () => { expect(executionResult).toEqual({ data: { user: { age: 42, name: 'John' } } }); }); + it('should merge data at path with new format', () => { + const executionResult = { + data: { user: { name: 'John' } }, + pending: [{ id: '0', path: ['user'] }], + }; + const incrementalResult = { incremental: [{ id: '0', data: { age: 42 } }] }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult.data).toEqual({ user: { age: 42, name: 'John' } }); + }); + it('should push items', () => { const executionResult = { data: { user: { name: 'John' } } }; const incrementalResult = { @@ -69,6 +90,27 @@ describe('mergeIncrementalResult', () => { }); }); + it('should push items at path with new format', () => { + const executionResult = { + data: { + user: { name: 'John', comments: ['comment 1', 'comment 2'] }, + }, + pending: [{ id: '0', path: ['user', 'comments'] }], + }; + const incrementalResult = { + incremental: [{ id: '0', items: ['comment 3', 'comment 4'] }], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult.data).toEqual({ + user: { + name: 'John', + comments: ['comment 1', 'comment 2', 'comment 3', 'comment 4'], + }, + }); + }); + it('should merge items at path', () => { const executionResult = { data: { @@ -113,6 +155,38 @@ describe('mergeIncrementalResult', () => { }); }); + it('should add errors with new format', () => { + const executionResult = { data: { user: { name: 'John' } }, pending: [{ id: '0', path: [] }] }; + const incrementalResult = { + incremental: [ + { id: '0', errors: [new GraphQLError('error 1'), new GraphQLError('error 2')] }, + ], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult).toEqual({ + data: { user: { name: 'John' } }, + errors: [new GraphQLError('error 1'), new GraphQLError('error 2')], + pending: [{ id: '0', path: [] }], + }); + }); + + it('should add completion errors with new format', () => { + const executionResult = { data: { user: { name: 'John' } }, pending: [{ id: '0', path: [] }] }; + const incrementalResult = { + completed: [{ id: '0', errors: [new GraphQLError('error 1'), new GraphQLError('error 2')] }], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult).toEqual({ + data: { user: { name: 'John' } }, + errors: [new GraphQLError('error 1'), new GraphQLError('error 2')], + pending: [{ id: '0', path: [] }], + }); + }); + it('should keep errors', () => { const executionResult = { errors: [new GraphQLError('error 1')] }; const incrementalResult = { data: { user: { name: 'John' } }, path: [] }; @@ -125,6 +199,24 @@ describe('mergeIncrementalResult', () => { }); }); + it('should keep errors with new format', () => { + const executionResult = { + errors: [new GraphQLError('error 1')], + pending: [{ id: '0', path: [] }], + }; + const incrementalResult = { + incremental: [{ id: '0', data: { user: { name: 'John' } }, path: [] }], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult).toEqual({ + data: { user: { name: 'John' } }, + errors: [new GraphQLError('error 1')], + pending: [{ id: '0', path: [] }], + }); + }); + it('should merge errors', () => { const executionResult = { errors: [new GraphQLError('error 1')] }; @@ -143,6 +235,52 @@ describe('mergeIncrementalResult', () => { }); }); + it('should merge errors with new format', () => { + const executionResult = { + errors: [new GraphQLError('error 1')], + pending: [{ id: '0', path: [] }], + }; + + const incrementalResult = { + incremental: [ + { id: '0', errors: [new GraphQLError('error 2'), new GraphQLError('error 3')] }, + ], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult).toEqual({ + errors: [ + new GraphQLError('error 1'), + new GraphQLError('error 2'), + new GraphQLError('error 3'), + ], + pending: [{ id: '0', path: [] }], + }); + }); + + it('should merge completion errors with new format', () => { + const executionResult = { + errors: [new GraphQLError('error 1')], + pending: [{ id: '0', path: [] }], + }; + + const incrementalResult = { + completed: [{ id: '0', errors: [new GraphQLError('error 2'), new GraphQLError('error 3')] }], + }; + + mergeIncrementalResult({ incrementalResult, executionResult }); + + expect(executionResult).toEqual({ + errors: [ + new GraphQLError('error 1'), + new GraphQLError('error 2'), + new GraphQLError('error 3'), + ], + pending: [{ id: '0', path: [] }], + }); + }); + it('should keep extensions', () => { const exeuctionResult = { data: { user: { name: 'John' } }, extensions: { foo: 'bar' } }; const incrementalResult = { data: { user: { age: 42 } }, path: [] }; diff --git a/packages/webpack-loader/src/index.ts b/packages/webpack-loader/src/index.ts index 549d6788bc1..1b9642539dc 100644 --- a/packages/webpack-loader/src/index.ts +++ b/packages/webpack-loader/src/index.ts @@ -2,6 +2,7 @@ import os from 'os'; import { DocumentNode, isExecutableDefinitionNode, Kind } from 'graphql'; import type { LoaderContext } from 'webpack'; import { + DocumentOptimizer, optimizeDocumentNode, removeDescriptions, removeEmptyNodes, @@ -52,7 +53,7 @@ export default function graphqlLoader(this: LoaderContext, source: stri const options = (this.query as Options) || {}; let doc = parseDocument(source); - const optimizers = []; + const optimizers: DocumentOptimizer[] = []; if (options.noDescription) { optimizers.push(removeDescriptions); diff --git a/patches/jest-leak-detector+29.7.0.patch b/patches/jest-leak-detector+29.7.0.patch new file mode 100644 index 00000000000..a26217e3fbc --- /dev/null +++ b/patches/jest-leak-detector+29.7.0.patch @@ -0,0 +1,33 @@ +diff --git a/node_modules/jest-leak-detector/build/index.js b/node_modules/jest-leak-detector/build/index.js +index a8ccb1e..70699fd 100644 +--- a/node_modules/jest-leak-detector/build/index.js ++++ b/node_modules/jest-leak-detector/build/index.js +@@ -74,26 +74,14 @@ class LeakDetector { + value = null; + } + async isLeaking() { +- this._runGarbageCollector(); ++ (0, _v().setFlagsFromString)('--allow-natives-syntax'); + + // wait some ticks to allow GC to run properly, see https://github.com/nodejs/node/issues/34636#issuecomment-669366235 + for (let i = 0; i < 10; i++) { ++ eval('%CollectGarbage(true)'); + await tick(); + } + return this._isReferenceBeingHeld; + } +- _runGarbageCollector() { +- // @ts-expect-error: not a function on `globalThis` +- const isGarbageCollectorHidden = globalThis.gc == null; +- +- // GC is usually hidden, so we have to expose it before running. +- (0, _v().setFlagsFromString)('--expose-gc'); +- (0, _vm().runInNewContext)('gc')(); +- +- // The GC was not initially exposed, so let's hide it again. +- if (isGarbageCollectorHidden) { +- (0, _v().setFlagsFromString)('--no-expose-gc'); +- } +- } + } + exports.default = LeakDetector; diff --git a/patches/typedoc-plugin-markdown+3.16.0.patch b/patches/typedoc-plugin-markdown+3.16.0.patch deleted file mode 100644 index 86dadc6c067..00000000000 --- a/patches/typedoc-plugin-markdown+3.16.0.patch +++ /dev/null @@ -1,67 +0,0 @@ -diff --git a/node_modules/typedoc-plugin-markdown/dist/resources/helpers/declaration-title.js b/node_modules/typedoc-plugin-markdown/dist/resources/helpers/declaration-title.js -index 0695653..c9d962d 100644 ---- a/node_modules/typedoc-plugin-markdown/dist/resources/helpers/declaration-title.js -+++ b/node_modules/typedoc-plugin-markdown/dist/resources/helpers/declaration-title.js -@@ -43,9 +43,9 @@ function default_1(theme) { - } - md.push(`${this.flags.isRest ? '... ' : ''} **${(0, utils_1.escapeChars)(this.name)}**`); - if (this instanceof typedoc_1.DeclarationReflection && this.typeParameters) { -- md.push(`<${this.typeParameters -+ md.push(`\\<${this.typeParameters // Escape `<` because MDX2 parse it as JSX tags - .map((typeParameter) => `\`${typeParameter.name}\``) -- .join(', ')}\\>`); -+ .join(', ')}>`); - } - md.push(getType(this)); - if (!(this.type instanceof typedoc_1.LiteralType) && -diff --git a/node_modules/typedoc-plugin-markdown/dist/resources/helpers/type.js b/node_modules/typedoc-plugin-markdown/dist/resources/helpers/type.js -index 26543f2..2e76088 100644 ---- a/node_modules/typedoc-plugin-markdown/dist/resources/helpers/type.js -+++ b/node_modules/typedoc-plugin-markdown/dist/resources/helpers/type.js -@@ -113,7 +113,7 @@ function getDeclarationType(model) { - ? `= ${(0, utils_1.escapeChars)(obj.defaultValue)}` - : ''}`; - }); -- return `{ ${indexSignature ? indexSignature : ''}${types ? types.join('; ') : ''} }${model.defaultValue && model.defaultValue !== '...' -+ return `\\{ ${indexSignature ? indexSignature : ''}${types ? types.join('; ') : ''} }${model.defaultValue && model.defaultValue !== '...' - ? `= ${(0, utils_1.escapeChars)(model.defaultValue)}` - : ''}`; - } -@@ -122,9 +122,9 @@ function getDeclarationType(model) { - function getFunctionType(modelSignatures) { - const functions = modelSignatures.map((fn) => { - const typeParams = fn.typeParameters -- ? `<${fn.typeParameters -+ ? `\\<${fn.typeParameters - .map((typeParameter) => typeParameter.name) -- .join(', ')}\\>` -+ .join(', ')}>` - : []; - const params = fn.parameters - ? fn.parameters.map((param) => { -@@ -150,9 +150,9 @@ function getReferenceType(model, emphasis) { - : `\`${model.name}\``); - } - if (model.typeArguments && model.typeArguments.length > 0) { -- reflection.push(`<${model.typeArguments -+ reflection.push(`\\<${model.typeArguments - .map((typeArgument) => Handlebars.helpers.type.call(typeArgument)) -- .join(', ')}\\>`); -+ .join(', ')}>`); - } - return reflection.join(''); - } -diff --git a/node_modules/typedoc-plugin-markdown/dist/utils.js b/node_modules/typedoc-plugin-markdown/dist/utils.js -index 9250591..23a6dd1 100644 ---- a/node_modules/typedoc-plugin-markdown/dist/utils.js -+++ b/node_modules/typedoc-plugin-markdown/dist/utils.js -@@ -11,7 +11,8 @@ function formatContents(contents) { - exports.formatContents = formatContents; - function escapeChars(str) { - return str -- .replace(/>/g, '\\>') -+ .replace(/ { // Delete existing docs directory await fsPromises.rm(OUTPUT_PATH, { recursive: true }).catch(() => null); - + console.log('๐Ÿงน ', chalk.green('Deleted existing docs directory'), OUTPUT_PATH); // Initialize TypeDoc - const typeDoc = await TypeDoc.Application.bootstrapWithPlugins( + const typeDoc = await Application.bootstrapWithPlugins( { excludePrivate: true, excludeProtected: true, @@ -51,8 +52,9 @@ async function buildApiDocs(): Promise { tsconfig: path.join(CWD, 'tsconfig.json'), entryPoints: modules.map(([_name, filePath]) => filePath), plugin: ['typedoc-plugin-markdown'], + logLevel: 'Verbose', }, - [new TypeDoc.TSConfigReader()], + [new TSConfigReader()], ); // Generate the API docs diff --git a/scripts/fix-shiki-packagejson.ts b/scripts/fix-shiki-packagejson.ts new file mode 100644 index 00000000000..8321c68c5ec --- /dev/null +++ b/scripts/fix-shiki-packagejson.ts @@ -0,0 +1,18 @@ +import { readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; + +const shikiJsVsCodeTextMatePackageJsonPath = join( + __dirname, + '../node_modules/@shikijs/vscode-textmate/package.json', +); +const shikiJsVsCodeTextMatePackageJson = JSON.parse( + readFileSync(shikiJsVsCodeTextMatePackageJsonPath, 'utf-8'), +); +shikiJsVsCodeTextMatePackageJson.exports['.'] = { + default: './dist/index.mjs', + types: './dist/index.d.mts', +}; +writeFileSync( + shikiJsVsCodeTextMatePackageJsonPath, + JSON.stringify(shikiJsVsCodeTextMatePackageJson, null, 2), +); diff --git a/scripts/postbuild.ts b/scripts/postbuild.ts index 6b957b332ec..5786ab9486b 100644 --- a/scripts/postbuild.ts +++ b/scripts/postbuild.ts @@ -25,4 +25,6 @@ ${content}`.trimStart(), console.timeEnd('done'); } -main(); +main().catch(e => { + console.warn(`Failed to modify ${filePath}`); +}); diff --git a/scripts/test-esm.mjs b/scripts/test-esm.mjs deleted file mode 100644 index 1744bf9be05..00000000000 --- a/scripts/test-esm.mjs +++ /dev/null @@ -1,54 +0,0 @@ -import { dirname } from 'path'; -import { fileURLToPath } from 'url'; -import chalk from 'chalk'; -import globby from 'globby'; - -const ignore = ['../packages/node-require/dist/index.mjs', '../packages/links/dist/index.mjs']; - -async function main() { - const mjsFiles = await globby(['../packages/*/dist/*.mjs', '../packages/loaders/*/dist/*.mjs'], { - cwd: dirname(fileURLToPath(import.meta.url)), - }); - - const ok = []; - const fail = []; - - let i = 0; - await Promise.all( - mjsFiles.map(mjsFile => { - if (ignore.includes(mjsFile)) return; - - const mjsPath = `./${mjsFile}`; - return import(mjsPath) - .then(() => { - ok.push(mjsPath); - }) - .catch(err => { - const color = i++ % 2 === 0 ? chalk.magenta : chalk.red; - console.error(color('\n\n-----\n' + i + '\n')); - console.error(mjsPath, err); - console.error(color('\n-----\n\n')); - fail.push(mjsPath); - }); - }), - ); - ignore.length && console.warn(chalk.yellow(`${ignore.length} Ignoring: ${ignore.join('ย | ')}`)); - ok.length && console.log(chalk.blue(`${ok.length} OK: ${ok.join(' | ')}`)); - fail.length && console.error(chalk.red(`${fail.length} Fail: ${fail.join(' | ')}`)); - - if (fail.length) { - console.error('\nFAILED'); - process.exit(1); - } else if (ok.length) { - console.error('\nOK'); - process.exit(0); - } else { - console.error('No files analyzed!'); - process.exit(1); - } -} - -main().catch(err => { - console.error(err); - process.exit(1); -}); diff --git a/tsconfig.json b/tsconfig.json index 651498258bb..31ef0d90ddd 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ "declaration": true, "downlevelIteration": true, - "suppressImplicitAnyIndexErrors": true, + "noImplicitAny": false, "ignoreDeprecations": "5.0", diff --git a/website/next-env.d.ts b/website/next-env.d.ts index 4f11a03dc6c..a4a7b3f5cfa 100644 --- a/website/next-env.d.ts +++ b/website/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/website/package.json b/website/package.json index 9902ab71757..553485ad8c9 100644 --- a/website/package.json +++ b/website/package.json @@ -9,16 +9,19 @@ "start": "next start" }, "dependencies": { - "@theguild/components": "7.1.0", - "next": "15.0.2", + "@theguild/components": "7.4.0", + "next": "15.1.2", "next-sitemap": "4.2.3", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "19.0.0", + "react-dom": "19.0.0" }, "devDependencies": { - "@theguild/tailwind-config": "0.5.0", - "@types/node": "22.9.0", - "@types/react": "18.3.12", - "typescript": "5.4.5" + "@theguild/tailwind-config": "0.6.2", + "@types/node": "22.10.2", + "@types/react": "19.0.2", + "postcss-import": "16.1.0", + "postcss-lightningcss": "1.0.1", + "tailwindcss": "3.4.17", + "typescript": "5.7.2" } } diff --git a/website/postcss.config.cjs b/website/postcss.config.cjs deleted file mode 100644 index 204207501e9..00000000000 --- a/website/postcss.config.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@theguild/tailwind-config/postcss.config'); diff --git a/website/postcss.config.mjs b/website/postcss.config.mjs new file mode 100644 index 00000000000..625a1a46f1d --- /dev/null +++ b/website/postcss.config.mjs @@ -0,0 +1,3 @@ +import postcssConfig from '@theguild/tailwind-config/postcss.config'; + +export default postcssConfig; diff --git a/website/tsconfig.json b/website/tsconfig.json index 8a6729ad76e..b15422995cf 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2019", - "module": "commonjs", + "target": "esnext", + "module": "esnext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, @@ -9,7 +9,7 @@ "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "noEmit": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", diff --git a/yarn.lock b/yarn.lock index f74e6441315..7911c4dddce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@0no-co/graphql.web@^1.0.5": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz#035cbc6523af43358b81993f10b13e8d7a79c816" - integrity sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.12.tgz#5fab8caaf5e6dae88e31111305f93dfd152de2fb" + integrity sha512-BTDjjsV/zSPy5fqItwm+KWUfh9CSe9tTtR6rCB72ddtkAxdcHbi4Ir4r/L1Et4lyxmL+i7Rb3m9sjLLi9tYrzA== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -20,7 +20,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@antfu/install-pkg@^0.4.0": +"@antfu/install-pkg@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.4.1.tgz#d1d7f3be96ecdb41581629cafe8626d1748c0cf1" integrity sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw== @@ -33,15 +33,10 @@ resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== -"@apollo/cache-control-types@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz#5da62cf64c3b4419dabfef4536b57a40c8ff0b47" - integrity sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g== - -"@apollo/client@3.11.10", "@apollo/client@^3.7.0", "@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0": - version "3.11.10" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.11.10.tgz#e16ae82ea9b16536ffd109847d24f9293fab5c4d" - integrity sha512-IfGc+X4il0rDqVQBBWdxIKM+ciDCiDzBq9+Bg9z4tJMi87uF6po4v+ddiac1wP0ARgVPsFwEIGxK7jhN4pW8jg== +"@apollo/client@3.12.3", "@apollo/client@^3.7.0", "@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0 || ~3.12.0": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.12.3.tgz#0d252749baad8328e06883fe118dc7e73e3bbb1f" + integrity sha512-KZ5zymRdb8bMbGUb1wP2U04ff7qIGgaC1BCdCVC+IPFiXkxEhHBc5fDEQOwAUT+vUo9KbBh3g7QK/JCOswn59w== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/caches" "^1.0.0" @@ -58,144 +53,6 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" -"@apollo/composition@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/composition/-/composition-2.9.3.tgz#cf9773a271e9cd5f047bfd81de75225124adb527" - integrity sha512-dcIZ5K+9sBNNPzXkYtZa91IegeMc350fXN7UMKTggqx5EBbWrakU/ltC0fp8Tr0qqlPGtEWFzXMmoqXKVPQJ1w== - dependencies: - "@apollo/federation-internals" "2.9.3" - "@apollo/query-graphs" "2.9.3" - -"@apollo/federation-internals@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/federation-internals/-/federation-internals-2.9.3.tgz#c6fa913dd10c74c0e0fffd6a7b369923b2a5d665" - integrity sha512-r50Ykc331CZUw4TxpcqprAZOlGkbzoHEiHObUqUhQopTx8i0aXNt+0pc3nzqUAoT9OD83yJqPJV1EiZF2vCupQ== - dependencies: - "@types/uuid" "^9.0.0" - chalk "^4.1.0" - js-levenshtein "^1.1.6" - uuid "^9.0.0" - -"@apollo/gateway@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/gateway/-/gateway-2.9.3.tgz#0070e91751cfdb280fa29bf9fd1d20d201e337a1" - integrity sha512-sYBrzwET6cO08m1r0OA/lxzhaxeny/hSMfWSPz27pCY0QAlnjc+jb7f/xeOjeGWaJ4fLV87uaR2u8Gtzzv5O7g== - dependencies: - "@apollo/composition" "2.9.3" - "@apollo/federation-internals" "2.9.3" - "@apollo/query-planner" "2.9.3" - "@apollo/server-gateway-interface" "^1.1.0" - "@apollo/usage-reporting-protobuf" "^4.1.0" - "@apollo/utils.createhash" "^2.0.0" - "@apollo/utils.fetcher" "^2.0.0" - "@apollo/utils.isnodelike" "^2.0.0" - "@apollo/utils.keyvaluecache" "^2.1.0" - "@apollo/utils.logger" "^2.0.0" - "@josephg/resolvable" "^1.0.1" - "@opentelemetry/api" "^1.0.1" - "@types/node-fetch" "^2.6.2" - async-retry "^1.3.3" - loglevel "^1.6.1" - make-fetch-happen "^11.0.0" - node-abort-controller "^3.0.1" - node-fetch "^2.6.7" - -"@apollo/protobufjs@1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.7.tgz#3a8675512817e4a046a897e5f4f16415f16a7d8a" - integrity sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - long "^4.0.0" - -"@apollo/query-graphs@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/query-graphs/-/query-graphs-2.9.3.tgz#a1ed54a6f72ce93fd9a7ee99b66e13f0943e44d0" - integrity sha512-FG0Jptr9wNTScWTRO3LFBD6mqCU5fLn4vI4NxEkK3IBNfLmWPUykyIXgrvjwg/TJkxfBBpfmBM47luvZpkbkYg== - dependencies: - "@apollo/federation-internals" "2.9.3" - deep-equal "^2.0.5" - ts-graphviz "^1.5.4" - uuid "^9.0.0" - -"@apollo/query-planner@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/query-planner/-/query-planner-2.9.3.tgz#982af5c66243041fc048247d0cd67e9d2db5f3cd" - integrity sha512-MlZa3Gemmh9rmtfwuWLBK88uZcrmi195k7/UWfyhVIPc19/epoZd0Z031M1zGoEH0mbFaU2C7uWYbaCFx3HK1w== - dependencies: - "@apollo/federation-internals" "2.9.3" - "@apollo/query-graphs" "2.9.3" - "@apollo/utils.keyvaluecache" "^2.1.0" - chalk "^4.1.0" - deep-equal "^2.0.5" - pretty-format "^29.0.0" - -"@apollo/server-gateway-interface@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz#a79632aa921edefcd532589943f6b97c96fa4d3c" - integrity sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ== - dependencies: - "@apollo/usage-reporting-protobuf" "^4.1.1" - "@apollo/utils.fetcher" "^2.0.0" - "@apollo/utils.keyvaluecache" "^2.1.0" - "@apollo/utils.logger" "^2.0.0" - -"@apollo/subgraph@2.9.3": - version "2.9.3" - resolved "https://registry.yarnpkg.com/@apollo/subgraph/-/subgraph-2.9.3.tgz#be248964c417d5b38d7cfba10634bd52e4b528a1" - integrity sha512-oaC79gM01kdXRBal8gGms1bpBwqe8AsX82yNYUPO/Tb7R1n+sCYcFrVqG25YeBYXWNP2qbJuD2yBGcsrEWnS1w== - dependencies: - "@apollo/cache-control-types" "^1.0.2" - "@apollo/federation-internals" "2.9.3" - -"@apollo/usage-reporting-protobuf@^4.1.0", "@apollo/usage-reporting-protobuf@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz#407c3d18c7fbed7a264f3b9a3812620b93499de1" - integrity sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA== - dependencies: - "@apollo/protobufjs" "1.2.7" - -"@apollo/utils.createhash@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz#9d982a166833ce08265ff70f8ef781d65109bdaa" - integrity sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg== - dependencies: - "@apollo/utils.isnodelike" "^2.0.1" - sha.js "^2.4.11" - -"@apollo/utils.fetcher@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz#2f6e3edc8ce79fbe916110d9baaddad7e13d955f" - integrity sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A== - -"@apollo/utils.isnodelike@^2.0.0", "@apollo/utils.isnodelike@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz#08a7e50f08d2031122efa25af089d1c6ee609f31" - integrity sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q== - -"@apollo/utils.keyvaluecache@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-2.1.1.tgz#f3f79a2f00520c6ab7a77a680a4e1fec4d19e1a6" - integrity sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw== - dependencies: - "@apollo/utils.logger" "^2.0.1" - lru-cache "^7.14.1" - -"@apollo/utils.logger@^2.0.0", "@apollo/utils.logger@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-2.0.1.tgz#74faeb97d7ad9f22282dfb465bcb2e6873b8a625" - integrity sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg== - "@ardatan/relay-compiler@12.0.0": version "12.0.0" resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" @@ -231,7 +88,7 @@ resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-2.10.3.tgz#852386445029f7765a70b4c1d1140e175e1d8c27" integrity sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -241,11 +98,11 @@ picocolors "^1.0.0" "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== -"@babel/core@7.26.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.22.9", "@babel/core@^7.23.9", "@babel/core@^7.24.0": +"@babel/core@7.26.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.22.9", "@babel/core@^7.23.9": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -266,13 +123,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.14.0", "@babel/generator@^7.23.6", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.14.0", "@babel/generator@^7.26.0", "@babel/generator@^7.26.2", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -284,14 +141,6 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" - integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" @@ -317,18 +166,18 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" - integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.1.1" + regexpu-core "^6.2.0" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== +"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -391,14 +240,6 @@ "@babel/helper-optimise-call-expression" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-simple-access@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" - integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" @@ -439,12 +280,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -763,11 +604,10 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-exponentiation-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" - integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-export-namespace-from@^7.25.9": @@ -839,13 +679,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" - integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" "@babel/plugin-transform-modules-systemjs@^7.25.9": version "7.25.9" @@ -1035,9 +874,9 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" - integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" + integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" "@babel/helper-create-class-features-plugin" "^7.25.9" @@ -1187,23 +1026,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.24.0", "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.25.9": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.20.7", "@babel/types@^7.24.0", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1218,14 +1057,14 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz#048e48aab4f1460e3121e22aa62459d16653dc85" integrity sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg== -"@changesets/apply-release-plan@^7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.5.tgz#3323c97afc08abc15e5136488f9c7cf1a864832e" - integrity sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw== +"@changesets/apply-release-plan@^7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.7.tgz#cabeaed77de07c6bd9878a9bc5ffd3ea7db7f7ff" + integrity sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA== dependencies: - "@changesets/config" "^3.0.3" + "@changesets/config" "^3.0.5" "@changesets/get-version-range-type" "^0.4.0" - "@changesets/git" "^3.0.1" + "@changesets/git" "^3.0.2" "@changesets/should-skip-package" "^0.1.1" "@changesets/types" "^6.0.0" "@manypkg/get-packages" "^1.1.3" @@ -1237,10 +1076,10 @@ resolve-from "^5.0.0" semver "^7.5.3" -"@changesets/assemble-release-plan@^6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.4.tgz#153d5154bb9f4162215ca69ad1c6e0886f686ccb" - integrity sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q== +"@changesets/assemble-release-plan@^6.0.5": + version "6.0.5" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz#d987b01c2d91c8b2f81eedd2df56ba355e4ce536" + integrity sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ== dependencies: "@changesets/errors" "^0.2.0" "@changesets/get-dependents-graph" "^2.1.2" @@ -1265,29 +1104,29 @@ "@changesets/types" "^6.0.0" dotenv "^8.1.0" -"@changesets/cli@2.27.9": - version "2.27.9" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.27.9.tgz#7b58a4c9eaf95d81fe0d1386705ecefe94a20062" - integrity sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg== +"@changesets/cli@2.27.11": + version "2.27.11" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.27.11.tgz#1d510044b350a7c78a8b55a0591637d7ad224469" + integrity sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg== dependencies: - "@changesets/apply-release-plan" "^7.0.5" - "@changesets/assemble-release-plan" "^6.0.4" + "@changesets/apply-release-plan" "^7.0.7" + "@changesets/assemble-release-plan" "^6.0.5" "@changesets/changelog-git" "^0.2.0" - "@changesets/config" "^3.0.3" + "@changesets/config" "^3.0.5" "@changesets/errors" "^0.2.0" "@changesets/get-dependents-graph" "^2.1.2" - "@changesets/get-release-plan" "^4.0.4" - "@changesets/git" "^3.0.1" + "@changesets/get-release-plan" "^4.0.6" + "@changesets/git" "^3.0.2" "@changesets/logger" "^0.1.1" "@changesets/pre" "^2.0.1" - "@changesets/read" "^0.6.1" + "@changesets/read" "^0.6.2" "@changesets/should-skip-package" "^0.1.1" "@changesets/types" "^6.0.0" "@changesets/write" "^0.3.2" "@manypkg/get-packages" "^1.1.3" ansi-colors "^4.1.3" ci-info "^3.7.0" - enquirer "^2.3.0" + enquirer "^2.4.1" external-editor "^3.1.0" fs-extra "^7.0.1" mri "^1.2.0" @@ -1296,13 +1135,13 @@ picocolors "^1.1.0" resolve-from "^5.0.0" semver "^7.5.3" - spawndamnit "^2.0.0" + spawndamnit "^3.0.1" term-size "^2.1.0" -"@changesets/config@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.0.3.tgz#19196558882b25c8aaf04941d4ac7e151f5a1b36" - integrity sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A== +"@changesets/config@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.0.5.tgz#cb59e9f338a4b35d3266af8a32799cb940d54ee0" + integrity sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ== dependencies: "@changesets/errors" "^0.2.0" "@changesets/get-dependents-graph" "^2.1.2" @@ -1310,7 +1149,7 @@ "@changesets/types" "^6.0.0" "@manypkg/get-packages" "^1.1.3" fs-extra "^7.0.1" - micromatch "^4.0.2" + micromatch "^4.0.8" "@changesets/errors@^0.2.0": version "0.2.0" @@ -1337,15 +1176,15 @@ dataloader "^1.4.0" node-fetch "^2.5.0" -"@changesets/get-release-plan@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.4.tgz#e7ef0d84d9079c69febb64f8018a18ac4b77ac90" - integrity sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw== +"@changesets/get-release-plan@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz#40d70c2524be51a70b7e1a778826854bb6c8562a" + integrity sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w== dependencies: - "@changesets/assemble-release-plan" "^6.0.4" - "@changesets/config" "^3.0.3" + "@changesets/assemble-release-plan" "^6.0.5" + "@changesets/config" "^3.0.5" "@changesets/pre" "^2.0.1" - "@changesets/read" "^0.6.1" + "@changesets/read" "^0.6.2" "@changesets/types" "^6.0.0" "@manypkg/get-packages" "^1.1.3" @@ -1354,16 +1193,16 @@ resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5" integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== -"@changesets/git@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.1.tgz#4499a07d35d8e783cd56f8295fb7d4d70282701b" - integrity sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ== +"@changesets/git@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.2.tgz#669c700049dc3b8ba53f46de45f5c4b1e6ddea3b" + integrity sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ== dependencies: "@changesets/errors" "^0.2.0" "@manypkg/get-packages" "^1.1.3" is-subdir "^1.1.1" - micromatch "^4.0.2" - spawndamnit "^2.0.0" + micromatch "^4.0.8" + spawndamnit "^3.0.1" "@changesets/logger@^0.1.1": version "0.1.1" @@ -1390,12 +1229,12 @@ "@manypkg/get-packages" "^1.1.3" fs-extra "^7.0.1" -"@changesets/read@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.1.tgz#32c91d97e602861717696c49a09c23eb492810f6" - integrity sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ== +"@changesets/read@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.2.tgz#816cf75dd22a70e75ac279474e44be52fb3fb91b" + integrity sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg== dependencies: - "@changesets/git" "^3.0.1" + "@changesets/git" "^3.0.2" "@changesets/logger" "^0.1.1" "@changesets/parse" "^0.4.0" "@changesets/types" "^6.0.0" @@ -1468,13 +1307,6 @@ resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-4.0.43.tgz#9bd42559ebb41cc5a7fb7cfeea5f231c20977dca" integrity sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1487,7 +1319,7 @@ dependencies: tslib "^2.4.0" -"@envelop/core@5.0.2", "@envelop/core@^5.0.1": +"@envelop/core@5.0.2", "@envelop/core@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@envelop/core/-/core-5.0.2.tgz#f9649c72e66d78b55aafa0d2d2cfa5f9c3bfc127" integrity sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw== @@ -1645,24 +1477,26 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/config-array@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" - integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== dependencies: - "@eslint/object-schema" "^2.1.4" + "@eslint/object-schema" "^2.1.5" debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" - integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== +"@eslint/core@^0.9.0": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.1.tgz#31763847308ef6b7084a4505573ac9402c51f9d1" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1674,20 +1508,20 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.14.0": - version "9.14.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.14.0.tgz#2347a871042ebd11a00fd8c2d3d56a265ee6857e" - integrity sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg== +"@eslint/js@9.17.0": + version "9.17.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.17.0.tgz#1523e586791f80376a6f8398a3964455ecc651ec" + integrity sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w== -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== -"@eslint/plugin-kit@^0.2.0": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz#5eff371953bc13e3f4d88150e2c53959f64f74f6" - integrity sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw== +"@eslint/plugin-kit@^0.2.3": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz#2b78e7bb3755784bb13faa8932a1d994d6537792" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== dependencies: levn "^0.4.1" @@ -1714,9 +1548,9 @@ "@floating-ui/dom" "^1.0.0" "@floating-ui/react@^0.26.16": - version "0.26.27" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.27.tgz#402f7b4b2702650662705fe9cbe0f1d5607846a1" - integrity sha512-jLP72x0Kr2CgY6eTYi/ra3VA9LOkTo4C+DUTrbFgFOExKy3omYVmwMjNKqxAHdsnyLS96BIDLcO2SlnsNf8KUQ== + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== dependencies: "@floating-ui/react-dom" "^2.1.2" "@floating-ui/utils" "^0.2.8" @@ -1728,9 +1562,9 @@ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== "@formatjs/intl-localematcher@^0.5.4": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz#f889d076881b785d11ff993b966f527d199436d0" - integrity sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA== + version "0.5.9" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz#43c6ee22be85b83340bcb09bdfed53657a2720db" + integrity sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA== dependencies: tslib "2" @@ -1741,98 +1575,86 @@ dependencies: giscus "^1.5.0" -"@graphql-tools/batch-delegate@^9.0.14": - version "9.0.14" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-9.0.14.tgz#82cc4d053f58024237ef6b0900fc670b10b96d88" - integrity sha512-MTskYAlz1qon2x4KFxttN/LWFOsLBWtVWA1v4jgv46hyPo0nDEiYwT0xjafoO/HI9rCYYdMwY/3BClxyHpPcmg== - dependencies: - "@graphql-tools/delegate" "^10.1.2" - "@graphql-tools/utils" "^10.5.6" - dataloader "2.2.2" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/batch-execute@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.6.tgz#0eee17ca7bd378f7313e963a32450e7b99ed955e" - integrity sha512-S0mLTUJQJuItGmwouYZyXeFaRWOVmVCAMLi33M5PuZbnsoTwKMB/YPPkAQ72ay3GfclnW66XcO4EClbVynw7eQ== - dependencies: - "@graphql-tools/utils" "^10.5.6" - dataloader "^2.2.2" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/delegate@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.1.2.tgz#44f3f4ca502051fb1215779f433f57b42cf81931" - integrity sha512-2XXJdxjud0ROiKxIiieCx4SxzSjYNdCz1bVDrI6+nTFxV5kB15OnJU6jvom44kv+NJo4Dym5GOJNqlBEjxoFVA== - dependencies: - "@graphql-tools/batch-execute" "^9.0.6" - "@graphql-tools/executor" "^1.3.3" - "@graphql-tools/schema" "^10.0.8" - "@graphql-tools/utils" "^10.5.6" +"@graphql-hive/gateway-abort-signal-any@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@graphql-hive/gateway-abort-signal-any/-/gateway-abort-signal-any-0.0.1.tgz#5af68181eb6bf39f51dc3ab78ccd235834f80b33" + integrity sha512-H2z8EwwzUf3y8U4ivlP5oCagS/bgom7hqcSr81oC3LQkf6NDKEzLRJ6Zw9aS7wCZcDPRQOwZXgT0P0CZu8pFwQ== + dependencies: + tslib "^2.8.1" + +"@graphql-tools/batch-delegate@^9.0.24": + version "9.0.24" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-9.0.24.tgz#3106b6d790490699ed3d17350df9dfd9ef4254ca" + integrity sha512-HjJqQcE4AgSUyYOEOiUXugwS6EH0efTOJu2OTYuxhnoAy2Qdo2kzWz0rbTP4RXXSUESWGJ/QuUnCObi5INZEvg== + dependencies: + "@graphql-tools/delegate" "^10.2.8" + "@graphql-tools/utils" "^10.6.2" + dataloader "^2.2.3" + tslib "^2.8.1" + +"@graphql-tools/batch-execute@^9.0.10": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.10.tgz#8c27cd8fcbc950807dafa686f3524df6722b7d53" + integrity sha512-nCRNFq2eqy+ONDknd8DfqidY/Ljgyq67Q0Hb9SMJ3FOWpKrApqmNT9J1BA3JW4r+/zIGtM1VKi+P9FYu3zMHHA== + dependencies: + "@graphql-tools/utils" "^10.6.2" + dataloader "^2.2.3" + tslib "^2.8.1" + +"@graphql-tools/delegate@^10.1.2", "@graphql-tools/delegate@^10.2.8": + version "10.2.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.2.8.tgz#8e004a303e32e935d38c4f06fab55fc67448ab6a" + integrity sha512-pUnsfsczDleGwixW18QLXBFGFqaJ12ApHaSZbbwoIqir/kZEl0Oqa9n5VDYxml0glVvK+AjYJzC3gJ+F/refvA== + dependencies: + "@graphql-tools/batch-execute" "^9.0.10" + "@graphql-tools/executor" "^1.3.8" + "@graphql-tools/schema" "^10.0.11" + "@graphql-tools/utils" "^10.6.2" "@repeaterjs/repeater" "^3.0.6" - dataloader "^2.2.2" + dataloader "^2.2.3" dset "^3.1.2" - tslib "^2.5.0" + tslib "^2.8.1" "@graphql-tools/executor-graphql-ws@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.3.2.tgz#00a82a683b8be88bae859ee464cde4c342d9d167" - integrity sha512-m+7+g3dSyaomuJAgDoG/9RcZC5/hGEpDQjmKmbLf/WvGdv5fLJNsuoJ7pIjlT5r7wQJNjEPGoHeh9pD/YykRww== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.3.5.tgz#3d0dbd6ddfb4a086196f540684e7d087ad06e5f3" + integrity sha512-8BZf9a9SkaJAkF5Byb4ZdiwzCNoTrfl515m206XvCkCHM7dM1AwvX1rYZTrnJWgXgQUxhPjvll5vgciOe1APaA== dependencies: - "@graphql-tools/utils" "^10.5.6" - "@types/ws" "^8.0.0" + "@graphql-tools/utils" "^10.6.2" + "@whatwg-node/disposablestack" "^0.0.5" graphql-ws "^5.14.0" isomorphic-ws "^5.0.0" - tslib "^2.4.0" + tslib "^2.8.1" ws "^8.17.1" "@graphql-tools/executor-http@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.1.9.tgz#9e672ccd88eeca2256c224adc0eda33a89c21af7" - integrity sha512-dJRj78QEGNNnlhkhqPUG9z+1uAr7znZ4dzabEVgY5uSXTmUIFcTKpOGYv2/QAuvyqGN40XxbcdVRJta6XHX2BQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.2.1.tgz#94abb6ddab83ce43c910a0de21c6d12514f09b57" + integrity sha512-tBmw6v/hYKS7/oK7gnz7Niqk1YYt3aCwwXRudbsEQTlBBi7b2HMhQzdABX5QSv1XlNBvQ6ey4fqQgJhY4oyPwQ== dependencies: - "@graphql-tools/utils" "^10.5.6" + "@graphql-hive/gateway-abort-signal-any" "^0.0.1" + "@graphql-tools/utils" "^10.6.2" "@repeaterjs/repeater" "^3.0.4" - "@whatwg-node/fetch" "^0.10.0" + "@whatwg-node/disposablestack" "^0.0.5" + "@whatwg-node/fetch" "^0.10.1" extract-files "^11.0.0" meros "^1.2.1" - tslib "^2.4.0" + tslib "^2.8.1" value-or-promise "^1.0.12" -"@graphql-tools/federation@2.2.27": - version "2.2.27" - resolved "https://registry.yarnpkg.com/@graphql-tools/federation/-/federation-2.2.27.tgz#d4b98fdf5e4e952095d48874aa729a83abd91dc3" - integrity sha512-mYzlURgF//OOB+yDwXqvTGRuQLIo9XM6KjPxJlMKo+VHUYfTbOU4QgFzU0xzotDTWL1V3k+SN05FZqhhgdmdAA== - dependencies: - "@graphql-tools/delegate" "^10.1.2" - "@graphql-tools/executor-http" "^1.1.9" - "@graphql-tools/merge" "^9.0.9" - "@graphql-tools/schema" "^10.0.8" - "@graphql-tools/stitch" "^9.3.4" - "@graphql-tools/utils" "^10.5.6" - "@graphql-tools/wrap" "^10.0.16" - "@whatwg-node/fetch" "^0.10.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - optionalDependencies: - "@apollo/client" "~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ~3.10.0 || ~3.11.0" - -"@graphql-tools/stitch@9.3.4", "@graphql-tools/stitch@^9.3.4": - version "9.3.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-9.3.4.tgz#a23fefa4a5056ac25ec29ef582a32d34c028ab49" - integrity sha512-8+Co3HpJJiT8OIebhHIdU0NEMoFKXEC6mWoSi6K3yY7QP3xEowVngyqIFJUSQo3fKEb9t7jn1ZgSHevitKYlIw== - dependencies: - "@graphql-tools/batch-delegate" "^9.0.14" - "@graphql-tools/delegate" "^10.1.2" - "@graphql-tools/executor" "^1.3.3" - "@graphql-tools/merge" "^9.0.9" - "@graphql-tools/schema" "^10.0.8" - "@graphql-tools/utils" "^10.5.6" - "@graphql-tools/wrap" "^10.0.16" - tslib "^2.4.0" - value-or-promise "^1.0.11" +"@graphql-tools/stitch@^9.3.4": + version "9.4.10" + resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-9.4.10.tgz#dcb08d289307b38009e2680a33bf3b3cd4fa31f7" + integrity sha512-RoFtwuCpBiIfAv4naIC4dL8paErx+Cymd2hjsEEIOTgipRU7bSST04b6JtHsOrmKuCtgp+aYj3cldN1cmSGuhQ== + dependencies: + "@graphql-tools/batch-delegate" "^9.0.24" + "@graphql-tools/delegate" "^10.2.8" + "@graphql-tools/executor" "^1.3.6" + "@graphql-tools/merge" "^9.0.12" + "@graphql-tools/schema" "^10.0.11" + "@graphql-tools/utils" "^10.6.2" + "@graphql-tools/wrap" "^10.0.26" + tslib "^2.8.1" "@graphql-tools/utils@^8.5.2": version "8.13.1" @@ -1841,18 +1663,17 @@ dependencies: tslib "^2.4.0" -"@graphql-tools/wrap@^10.0.16": - version "10.0.16" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.16.tgz#5ce787fd1d7fa95e9f927898e68ea1f27c216464" - integrity sha512-O/sOoPCnG2tWfhfIeWLQMPS7ipzjMiVOxwhjOUD9DaQd39XFBD4Al/MmKNc2343ua7NyqMwdfgXQjqGH1LFlPA== +"@graphql-tools/wrap@^10.0.16", "@graphql-tools/wrap@^10.0.26": + version "10.0.26" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.26.tgz#a31d5575cb04f291d1291c14d272448397949318" + integrity sha512-vCeM30vm5gtTswg1Tebn0bSBrn74axlqmu9kDrPwlqjum5ykZQjkSwuCXcGuBS/4pNhmaTirXLuUL1vP5FvEHA== dependencies: - "@graphql-tools/delegate" "^10.1.2" - "@graphql-tools/schema" "^10.0.8" - "@graphql-tools/utils" "^10.5.6" - tslib "^2.4.0" - value-or-promise "^1.0.12" + "@graphql-tools/delegate" "^10.2.8" + "@graphql-tools/schema" "^10.0.11" + "@graphql-tools/utils" "^10.6.2" + tslib "^2.8.1" -"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": +"@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== @@ -1864,43 +1685,31 @@ dependencies: tslib "^2.5.2" -"@graphql-yoga/plugin-defer-stream@3.10.2": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@graphql-yoga/plugin-defer-stream/-/plugin-defer-stream-3.10.2.tgz#d81041b8480a438696af4f2d18144ce66f6bfbec" - integrity sha512-KASiNJVzSwfmuUiWIS0p2JuEjcXne/cBJ7JbCAfQGF/t+64YsnDVChcL07m8Hy8ahxnAU64Mo0x610lMbAcqkw== +"@graphql-yoga/plugin-defer-stream@3.10.6": + version "3.10.6" + resolved "https://registry.yarnpkg.com/@graphql-yoga/plugin-defer-stream/-/plugin-defer-stream-3.10.6.tgz#8534bf769e6abd7083070370a5908d2d38030207" + integrity sha512-i7R2rsBLWm+vjtqJ9CGA84EtRAgVXICKbQmEamT69TzVyej0FGhJx9K9kDyyA13mYfg+qEgXnIvfnf6gUjvryA== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.6.1" -"@graphql-yoga/subscription@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-5.0.1.tgz#affe9b4bca4303300cc9492d30dfbe9f089fe0e8" - integrity sha512-1wCB1DfAnaLzS+IdoOzELGGnx1ODEg9nzQXFh4u2j02vAnne6d+v4A7HIH9EqzVdPLoAaMKXCZUUdKs+j3z1fg== +"@graphql-yoga/subscription@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-5.0.2.tgz#a68bbe64e2cb9cd14dc854a36ecc1fb81e6fa03b" + integrity sha512-KGacW1FtUXR5e3qk4YmEFQRGTov8lOkpW7syjTD3EN2t5HRWrSsut2LwjVdK+HcP3H9UEuZ9RXw/+shqV+1exQ== dependencies: - "@graphql-yoga/typed-event-target" "^3.0.0" + "@graphql-yoga/typed-event-target" "^3.0.1" "@repeaterjs/repeater" "^3.0.4" "@whatwg-node/events" "^0.1.0" tslib "^2.5.2" -"@graphql-yoga/typed-event-target@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.0.tgz#57dc42e052d8294555d26ee61854d72a0236fee0" - integrity sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg== +"@graphql-yoga/typed-event-target@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.1.tgz#16ef7516c6725d4a7f08d2214385afaa8441dc26" + integrity sha512-SWVkyFivzlDqGTBrGTWTNg+aFGP/cIiotirUFnvwuUGt2gla6UJoKhII6aPoHNg3/5vpUAL1KzyoaXMK2PO0JA== dependencies: "@repeaterjs/repeater" "^3.0.4" tslib "^2.5.2" -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - "@headlessui/react@^2.1.2": version "2.2.0" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" @@ -1934,21 +1743,20 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== -"@humanwhocodes/retry@^0.4.0": +"@humanwhocodes/retry@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== -"@ianvs/prettier-plugin-sort-imports@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.1.tgz#e588afa75a597a5d7c26dee1dcc0bb1198363367" - integrity sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg== - dependencies: - "@babel/core" "^7.24.0" - "@babel/generator" "^7.23.6" - "@babel/parser" "^7.24.0" - "@babel/traverse" "^7.24.0" - "@babel/types" "^7.24.0" +"@ianvs/prettier-plugin-sort-imports@4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.0.tgz#3391ca47d3a3267ecdcede04a9634d79155f6877" + integrity sha512-f4/e+/ANGk3tHuwRW0uh2YuBR50I4h1ZjGQ+5uD8sWfinHTivQsnieR5cz24t8M6Vx4rYvZ5v/IEKZhYpzQm9Q== + dependencies: + "@babel/generator" "^7.26.2" + "@babel/parser" "^7.26.2" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" semver "^7.5.2" "@iconify/types@^2.0.0": @@ -1957,17 +1765,18 @@ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@iconify/utils@^2.1.32": - version "2.1.33" - resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.33.tgz#cbf7242a52fd0ec58c42d37d28e4406b5327e8c0" - integrity sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.2.0.tgz#f1c516093157a682e0bdf080f5f35700ebb3e0ae" + integrity sha512-9A5eZQV9eKlNCXlI/SgYsGRS7YmGmB1oAsRpNVIYBmIzGJRgH+hfG+lo4069s+GFWFNnBAtDg10c53vQZBLfnA== dependencies: - "@antfu/install-pkg" "^0.4.0" + "@antfu/install-pkg" "^0.4.1" "@antfu/utils" "^0.7.10" "@iconify/types" "^2.0.0" - debug "^4.3.6" + debug "^4.4.0" + globals "^15.13.0" kolorist "^1.8.0" - local-pkg "^0.5.0" - mlly "^1.7.1" + local-pkg "^0.5.1" + mlly "^1.7.3" "@img/sharp-darwin-arm64@0.33.5": version "0.33.5" @@ -2302,21 +2111,16 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@josephg/resolvable@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" - integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== - "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -2339,15 +2143,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -2549,62 +2345,62 @@ "@napi-rs/simple-git-win32-arm64-msvc" "0.1.19" "@napi-rs/simple-git-win32-x64-msvc" "0.1.19" -"@next/bundle-analyzer@15.0.1": - version "15.0.1" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.0.1.tgz#99d66cc4b09a59ac0c0b1ad0544ba57fb895ba25" - integrity sha512-i/nCRBGBEkESPDpXJc+6SPLFDItnvTTJSaxiOvuNqHmQjQognRl3BANkKb3nWYy0V5rgzygxu++X349Z4dhs4Q== +"@next/bundle-analyzer@15.0.4": + version "15.0.4" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.0.4.tgz#0bd2690f41679dbe3d85e0380539de3900514bad" + integrity sha512-0If3/mxqUWYC0lAdV5cChGA1Xs1BENjaLyJkdqpI2df86HqprcDZagiB2IU1xc5ph7xZHRdi5mT2cY7VkyibTQ== dependencies: webpack-bundle-analyzer "4.10.1" -"@next/env@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.0.2.tgz#4e921af3faf8a16c6be98ec6a81a32a40050a8b7" - integrity sha512-c0Zr0ModK5OX7D4ZV8Jt/wqoXtitLNPwUfG9zElCZztdaZyNVnN40rDXVZ/+FGuR4CcNV5AEfM6N8f+Ener7Dg== +"@next/env@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.2.tgz#fa36e47bbaa33b9ecac228aa786bb05bbc15351c" + integrity sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ== "@next/env@^13.4.3": version "13.5.7" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.7.tgz#5006f4460a7fa598a03e1c2aa4e59e45c71082d3" integrity sha512-uVuRqoj28Ys/AI/5gVEgRAISd0KWI0HRjOO1CTpNgmX3ZsHb5mdn14Y59yk0IxizXdo7ZjsI2S7qbWnO+GNBcA== -"@next/swc-darwin-arm64@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.2.tgz#66f84083f1f564d09bbacff8d6b24bd833783bef" - integrity sha512-GK+8w88z+AFlmt+ondytZo2xpwlfAR8U6CRwXancHImh6EdGfHMIrTSCcx5sOSBei00GyLVL0ioo1JLKTfprgg== - -"@next/swc-darwin-x64@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.2.tgz#1aef085642f363b89acf264cf1b9848632b52914" - integrity sha512-KUpBVxIbjzFiUZhiLIpJiBoelqzQtVZbdNNsehhUn36e2YzKHphnK8eTUW1s/4aPy5kH/UTid8IuVbaOpedhpw== - -"@next/swc-linux-arm64-gnu@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.2.tgz#203b41742e60642587e004773a8c203053b6832e" - integrity sha512-9J7TPEcHNAZvwxXRzOtiUvwtTD+fmuY0l7RErf8Yyc7kMpE47MIQakl+3jecmkhOoIyi/Rp+ddq7j4wG6JDskQ== - -"@next/swc-linux-arm64-musl@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.2.tgz#d256932ec11051f376348862508be9017b23f3d8" - integrity sha512-BjH4ZSzJIoTTZRh6rG+a/Ry4SW0HlizcPorqNBixBWc3wtQtj4Sn9FnRZe22QqrPnzoaW0ctvSz4FaH4eGKMww== - -"@next/swc-linux-x64-gnu@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.2.tgz#06c52a23a7e13d5ccd0ded1cf295b32df58e0932" - integrity sha512-i3U2TcHgo26sIhcwX/Rshz6avM6nizrZPvrDVDY1bXcLH1ndjbO8zuC7RoHp0NSK7wjJMPYzm7NYL1ksSKFreA== - -"@next/swc-linux-x64-musl@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.2.tgz#eb70a81a1c66d4935d50bf6fe1021e440f27fe9f" - integrity sha512-AMfZfSVOIR8fa+TXlAooByEF4OB00wqnms1sJ1v+iu8ivwvtPvnkwdzzFMpsK5jA2S9oNeeQ04egIWVb4QWmtQ== - -"@next/swc-win32-arm64-msvc@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.2.tgz#29a763bdc3a1281633af10cf8428e916e02f079a" - integrity sha512-JkXysDT0/hEY47O+Hvs8PbZAeiCQVxKfGtr4GUpNAhlG2E0Mkjibuo8ryGD29Qb5a3IOnKYNoZlh/MyKd2Nbww== - -"@next/swc-win32-x64-msvc@15.0.2": - version "15.0.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.2.tgz#0f70d8146990886a85099875353539fc6dd68338" - integrity sha512-foaUL0NqJY/dX0Pi/UcZm5zsmSk5MtP/gxx3xOPyREkMFN+CTjctPfu3QaqrQHinaKdPnMWPJDKt4VjDfTBe/Q== +"@next/swc-darwin-arm64@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.2.tgz#822265999fc76f828f4c671a5ef861b8e2c5213e" + integrity sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w== + +"@next/swc-darwin-x64@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.2.tgz#78d277bce3d35c6e8d9ad423b6f5b0031aa9a1e2" + integrity sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA== + +"@next/swc-linux-arm64-gnu@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.2.tgz#4d48c8c37da869b0fdbb51f3f3f71df7a3b6b1bb" + integrity sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA== + +"@next/swc-linux-arm64-musl@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.2.tgz#0efbaffc2bc3fad4a6458c91b1655b0c3d509577" + integrity sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g== + +"@next/swc-linux-x64-gnu@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.2.tgz#fcdb19e2a7602f85f103190539d0cf42eca7f217" + integrity sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg== + +"@next/swc-linux-x64-musl@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.2.tgz#06b09f1712498dd5c61fac10c56a09535469b4c4" + integrity sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg== + +"@next/swc-win32-arm64-msvc@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.2.tgz#63159223241ff45e8df76b24fc979bbb933c74df" + integrity sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA== + +"@next/swc-win32-x64-msvc@15.1.2": + version "15.1.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.2.tgz#6e6b33b1d725c0e98fa76773fe437fb02ad6540b" + integrity sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2627,18 +2423,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" - integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== - dependencies: - semver "^7.3.5" - -"@opentelemetry/api@^1.0.1": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" - integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== - "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -2654,97 +2438,39 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@puppeteer/browsers@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.4.1.tgz#7afd271199cc920ece2ff25109278be0a3e8a225" - integrity sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng== +"@puppeteer/browsers@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.6.1.tgz#d75aec5010cae377c5e4742bf5e4f62a79c21315" + integrity sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg== dependencies: - debug "^4.3.7" + debug "^4.4.0" extract-zip "^2.0.1" progress "^2.0.3" - proxy-agent "^6.4.0" + proxy-agent "^6.5.0" semver "^7.6.3" tar-fs "^3.0.6" unbzip2-stream "^1.4.3" yargs "^17.7.2" -"@radix-ui/primitive@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" - integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== +"@radix-ui/primitive@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" + integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA== -"@radix-ui/react-collection@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" - integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== +"@radix-ui/react-collection@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.1.tgz#be2c7e01d3508e6d4b6d838f492e7d182f17d3b0" + integrity sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA== dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - -"@radix-ui/react-compose-refs@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" - integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-slot" "1.1.1" -"@radix-ui/react-context@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" - integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-compose-refs@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" + integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== "@radix-ui/react-context@1.1.1": version "1.1.1" @@ -2756,14 +2482,14 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== -"@radix-ui/react-dismissable-layer@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" - integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== +"@radix-ui/react-dismissable-layer@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.2.tgz#771594b202f32bc8ffeb278c565f10c513814aee" + integrity sha512-kEHnlhv7wUggvhuJPkyw4qspXLJOdYoAP4dO2c8ngGuXTq1w/HZp1YeVB+NQ2KbH1iEG+pvOCGYSqh9HZOz6hg== dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown" "1.1.0" @@ -2775,46 +2501,46 @@ "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-navigation-menu@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz#31989e026adecfbb2f7bd1108ee6fffb830b2ec1" - integrity sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q== + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.2.tgz#3731d42dd2425178814c21ada8c59eb51c5e1a60" + integrity sha512-7wHxgyNzOjsexOHFTXGJK/RDhKgrqj0siWJpm5i+sb7h+A6auY7efph6eMg0kOU4sVCLcbhHK7ZVueAXxOzvZA== dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-collection" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.2" "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-presence" "1.1.1" - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-use-previous" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.1" -"@radix-ui/react-presence@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" - integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== +"@radix-ui/react-presence@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" + integrity sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg== dependencies: - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-primitive@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" - integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== +"@radix-ui/react-primitive@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz#6d9efc550f7520135366f333d1e820cf225fad9e" + integrity sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg== dependencies: - "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-slot" "1.1.1" -"@radix-ui/react-slot@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== +"@radix-ui/react-slot@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.1.tgz#ab9a0ffae4027db7dc2af503c223c978706affc3" + integrity sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g== dependencies: - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-callback-ref@1.1.0": version "1.1.0" @@ -2845,63 +2571,63 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== -"@radix-ui/react-visually-hidden@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" - integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== +"@radix-ui/react-visually-hidden@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz#f7b48c1af50dfdc366e92726aee6d591996c5752" + integrity sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg== dependencies: - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-primitive" "2.0.1" "@react-aria/focus@^3.17.1": - version "3.18.4" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" - integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== + version "3.19.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.19.0.tgz#82b9a5b83f023b943a7970df3d059f49d61df05d" + integrity sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A== dependencies: - "@react-aria/interactions" "^3.22.4" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" + "@react-aria/interactions" "^3.22.5" + "@react-aria/utils" "^3.26.0" + "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": - version "3.22.4" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" - integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.5": + version "3.22.5" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.5.tgz#9cd8c93b8b6988f1d315d3efb450119d1432bbb8" + integrity sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ== dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" + "@react-aria/ssr" "^3.9.7" + "@react-aria/utils" "^3.26.0" + "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.9.6": - version "3.9.6" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" - integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== +"@react-aria/ssr@^3.9.7": + version "3.9.7" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770" + integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.25.3": - version "3.25.3" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" - integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== +"@react-aria/utils@^3.26.0": + version "3.26.0" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.26.0.tgz#833cbfa33e75d15835b757791b3f754432d2f948" + integrity sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ== dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-stately/utils" "^3.10.4" - "@react-types/shared" "^3.25.0" + "@react-aria/ssr" "^3.9.7" + "@react-stately/utils" "^3.10.5" + "@react-types/shared" "^3.26.0" "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-stately/utils@^3.10.4": - version "3.10.4" - resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" - integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== +"@react-stately/utils@^3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.5.tgz#47bb91cd5afd1bafe39353614e5e281b818ebccc" + integrity sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ== dependencies: "@swc/helpers" "^0.5.0" -"@react-types/shared@^3.25.0": - version "3.25.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" - integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== +"@react-types/shared@^3.26.0": + version "3.26.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.26.0.tgz#21a8b579f0097ee78de18e3e580421ced89e4c8c" + integrity sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw== "@repeaterjs/repeater@^3.0.4", "@repeaterjs/repeater@^3.0.6": version "3.0.6" @@ -2913,73 +2639,56 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@shikijs/core@1.22.2": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.22.2.tgz#9c22bd4cc8a4d6c062461cfd35e1faa6c617ca25" - integrity sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg== +"@shikijs/core@1.24.2": + version "1.24.2" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.24.2.tgz#6308697f84a5029983885d0a7651d1667444bbce" + integrity sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ== dependencies: - "@shikijs/engine-javascript" "1.22.2" - "@shikijs/engine-oniguruma" "1.22.2" - "@shikijs/types" "1.22.2" + "@shikijs/engine-javascript" "1.24.2" + "@shikijs/engine-oniguruma" "1.24.2" + "@shikijs/types" "1.24.2" "@shikijs/vscode-textmate" "^9.3.0" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.3" -"@shikijs/engine-javascript@1.22.2": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.22.2.tgz#62e90dbd2ed1d78b972ad7d0a1f8ffaaf5e43279" - integrity sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw== +"@shikijs/engine-javascript@1.24.2": + version "1.24.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz#af5920fdd76765d04dc5ec1a65cc77e355d6ceed" + integrity sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q== dependencies: - "@shikijs/types" "1.22.2" + "@shikijs/types" "1.24.2" "@shikijs/vscode-textmate" "^9.3.0" - oniguruma-to-js "0.4.3" + oniguruma-to-es "0.7.0" -"@shikijs/engine-oniguruma@1.22.2": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.2.tgz#b12a44e3faf486e19fbcf8952f4b56b9b9b8d9b8" - integrity sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA== +"@shikijs/engine-oniguruma@1.24.2": + version "1.24.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz#90924001a17a2551a2a9073aed4af3767ce68b1b" + integrity sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ== dependencies: - "@shikijs/types" "1.22.2" + "@shikijs/types" "1.24.2" "@shikijs/vscode-textmate" "^9.3.0" "@shikijs/twoslash@^1.0.0": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@shikijs/twoslash/-/twoslash-1.22.2.tgz#c055b60a0759d3e1c4cd5d5d94bc0c17a20eb39a" - integrity sha512-4R3A7aH/toZgtlveXHKk01nIsvn8hjAfPJ1aT550zcV4qK6vK/tfaEyYtaljOaY1wig2l5+8sKjNSEz3PcSiEw== + version "1.24.2" + resolved "https://registry.yarnpkg.com/@shikijs/twoslash/-/twoslash-1.24.2.tgz#5bea2b3cd3ca214f8b622b1d0aecee9a7cde530c" + integrity sha512-zcwYUNdSQDKquF1t+XrtoXM+lx9rCldAkZnT+e5fULKlLT6F8/F9fwICGhBm9lWp5/U4NptH+YcJUdvFOR0SRg== dependencies: - "@shikijs/core" "1.22.2" - "@shikijs/types" "1.22.2" + "@shikijs/core" "1.24.2" + "@shikijs/types" "1.24.2" twoslash "^0.2.12" -"@shikijs/types@1.22.2": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.22.2.tgz#695a283f19963fe0638fc2646862ba5cfc4623a8" - integrity sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg== +"@shikijs/types@1.24.2": + version "1.24.2" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.24.2.tgz#770313a0072a7c14ab1a130a36d02df7e4d87375" + integrity sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ== dependencies: "@shikijs/vscode-textmate" "^9.3.0" "@types/hast" "^3.0.4" "@shikijs/vscode-textmate@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" - integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== - -"@sideway/address@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" - integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + version "9.3.1" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz#afda31f8f42cab70a26f3603f52eae3f1c35d2f7" + integrity sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -3005,17 +2714,22 @@ resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@0.5.13", "@swc/helpers@^0.5.0": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" - integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== +"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== dependencies: - tslib "^2.4.0" + tslib "^2.8.0" + +"@tailwindcss/container-queries@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz#9a759ce2cb8736a4c6a0cb93aeb740573a731974" + integrity sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA== "@tanstack/react-virtual@^3.8.1": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" - integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== + version "3.11.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.11.1.tgz#708a5e27041f8678f78b96228376f7a35b6a29fa" + integrity sha512-orn2QNe5tF6SqjucHJ6cKTKcRDe3GG7bcYqPNn72Yejj7noECdzgAyRfGt2pGDPemhYim3d1HIR/dgruCnLfUA== dependencies: "@tanstack/virtual-core" "3.10.9" @@ -3024,32 +2738,31 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== -"@theguild/components@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@theguild/components/-/components-7.1.0.tgz#fc9fafa302099d1ec3e656751f84062e0ff36527" - integrity sha512-jrCVgsEU9RUoDz5kosJPEfNyXeZC8muDuBJCRi8YM7+acB55NfHU+geI8H49sTU9T3ZthNNh5uHrpaPJVcnvbw== +"@theguild/components@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@theguild/components/-/components-7.4.0.tgz#67ecc8851e50c5cc9a65f015f54ec46d7ffef786" + integrity sha512-tOh+Otfod9+oyrzUUCwAFVC6Gr1qZyTnGdzfb1us2tTPqCU8BH1w0ak9BCWk9nNnN9VkavZmRKsU1uJhvb7JLA== dependencies: "@giscus/react" "3.0.0" - "@next/bundle-analyzer" "15.0.1" + "@next/bundle-analyzer" "15.0.4" "@radix-ui/react-navigation-menu" "^1.2.0" - "@theguild/tailwind-config" "0.5.0" clsx "2.1.1" fuzzy "0.1.3" next-videos "1.5.0" - nextra "3.1.0" - nextra-theme-docs "3.1.0" + nextra "3.2.5" + nextra-theme-docs "3.2.5" react-paginate "8.2.0" react-player "2.16.0" remark-mdx-disable-explicit-jsx "0.1.0" semver "^7.3.8" tailwind-merge "^2.5.2" -"@theguild/prettier-config@2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@theguild/prettier-config/-/prettier-config-2.0.7.tgz#8e6c735990f49248050352fb2f753d957136725c" - integrity sha512-FqpgGAaAFbYHFQmkWEZjIhqmk+Oow82/t+0k408qoBd9RsB4QTwSQSDDbNSgFa/K7c8Dcwau5z3XbHUR/ksKqw== +"@theguild/prettier-config@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@theguild/prettier-config/-/prettier-config-3.0.0.tgz#4727272aef3c67769a8741ecd679e611c6b86741" + integrity sha512-8ABWdMnCoCKKXb+lS337ZVnCJFuKumhK7RhZkAvaTMLi4Z+3c6UUYk1ZAM4KEHEki9bL9yQbtqTlqZVlVSGvhg== dependencies: - "@ianvs/prettier-plugin-sort-imports" "4.3.1" + "@ianvs/prettier-plugin-sort-imports" "4.4.0" prettier-plugin-pkg "^0.18.0" prettier-plugin-sh "^0.14.0" @@ -3069,52 +2782,18 @@ npm-to-yarn "^3.0.0" unist-util-visit "^5.0.0" -"@theguild/tailwind-config@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@theguild/tailwind-config/-/tailwind-config-0.5.0.tgz#bab34878b8c570da2ecb6fa6f352de095639721f" - integrity sha512-TZTB1kOtnipBxePHCDEwX4G31PWuGiI9+Vim0rryP2t0210wTuz02dN17kz6ClQ/bnNPFaO+X2esy+acfh346A== +"@theguild/tailwind-config@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@theguild/tailwind-config/-/tailwind-config-0.6.2.tgz#d4fa0bb925979f7c1b92bf3b018666b3f27d5ae9" + integrity sha512-dl0P3qDjj8Us0PSuPQKE+N1ZJXjuhr4uWi66pdTy24PdSNODFSBe7YgK87/UOfDUCDNnImRgt3Do6uAYsP46oA== dependencies: - autoprefixer "^10.4.19" - cssnano "^7.0.0" - postcss "^8.4.38" - postcss-import "^16.1.0" - tailwindcss "^3.4.3" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@tailwindcss/container-queries" "^0.1.1" "@tootallnate/quickjs-emscripten@^0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -3312,9 +2991,9 @@ integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== "@types/d3-scale-chromatic@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" - integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== "@types/d3-scale@*": version "4.0.8" @@ -3341,9 +3020,9 @@ integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== "@types/d3-time@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" - integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== "@types/d3-timer@*": version "3.0.2" @@ -3406,19 +3085,17 @@ resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== -"@types/debug@4.1.12", "@types/debug@^4.0.0": +"@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/dompurify@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-3.0.5.tgz#02069a2fcb89a163bacf1a788f73cb415dd75cb7" - integrity sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg== - dependencies: - "@types/trusted-types" "*" +"@types/dlv@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/dlv/-/dlv-1.1.4.tgz#e92f76b78adf2b118b5a807956f36434baefbab0" + integrity sha512-m8KmImw4Jt+4rIgupwfivrWEOnj1LzkmKkqbh075uG13eTQ1ZxHWT6T0vIdSQhLIjQCiR0n0lZdtyDOPO1x2Mw== "@types/eslint-scope@^3.7.7": version "3.7.7" @@ -3443,15 +3120,15 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.1", "@types/estree@^1.0.5", "@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -3468,15 +3145,15 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/extract-files@*", "@types/extract-files@8.1.3": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@types/extract-files/-/extract-files-8.1.3.tgz#03b99c71298f21cd9c555ca7bcd7737756b63959" - integrity sha512-FQT1aXHL4NuSK44A9w3aFVG3p7q04uWnKNreGVoF0jno2SlWaMuaUjUZ6If0sVPEen3UVqYxdsEPJQLpvbkHEg== +"@types/extract-files@*": + version "13.0.1" + resolved "https://registry.yarnpkg.com/@types/extract-files/-/extract-files-13.0.1.tgz#3ec057a3fa25f778245a76a17271d23b71ee31d7" + integrity sha512-/fRbzc2lAd7jDJSSnxWiUyXWjdUZZ4HbISLJzVgt1AvrdOa7U49YRPcvuCUywkmURZ7uwJOheDjx19itbQ5KvA== "@types/geojson@*": - version "7946.0.14" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" - integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== + version "7946.0.15" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.15.tgz#f9d55fd5a0aa2de9dc80b1b04e437538b7298868" + integrity sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA== "@types/graceful-fs@^4.1.3": version "4.1.9" @@ -3536,11 +3213,6 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/js-yaml@^4.0.0": - version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" - integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== - "@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -3568,11 +3240,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== -"@types/long@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - "@types/mdast@^4.0.0": version "4.0.4" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" @@ -3609,20 +3276,20 @@ dependencies: "@types/unist" "*" -"@types/node-fetch@^2.6.2": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== +"@types/node-fetch@^2": + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: "@types/node" "*" form-data "^4.0.0" -"@types/node@*", "@types/node@22.9.0": - version "22.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" - integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== +"@types/node@*", "@types/node@22.10.2": + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== dependencies: - undici-types "~6.19.8" + undici-types "~6.20.0" "@types/node@^12.7.1": version "12.20.55" @@ -3634,11 +3301,6 @@ resolved "https://registry.yarnpkg.com/@types/object-path/-/object-path-0.11.4.tgz#a14529227500faf7891d003b2c7f5772c4a5dfdc" integrity sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw== -"@types/prop-types@*": - version "15.7.13" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" - integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== - "@types/qs@*": version "6.9.17" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" @@ -3649,12 +3311,11 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react@18.3.12": - version "18.3.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" - integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== +"@types/react@19.0.2": + version "19.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" + integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== dependencies: - "@types/prop-types" "*" csstype "^3.0.2" "@types/relay-compiler@8.0.4": @@ -3666,9 +3327,9 @@ graphql "^14.5.3" "@types/relay-runtime@*": - version "18.1.1" - resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-18.1.1.tgz#6c3a77dd5b35c8173f3772988f6896e3f91e208e" - integrity sha512-gnMBe2Vh8Qji0vfUhbXE9ReM7aNFUDz0a9LZ84f/UbJmtCYE2kWnT14OwLDTJud8jp9rL/2+xKyABK5V7pUIHQ== + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-18.2.1.tgz#b1e6146d05289dc21125411c7e1ce830c65f0056" + integrity sha512-mbOf83T21BQhZOir/37dhEmqMMnIGQPLpJgZQrYpUuhIRov9vnavOyacemUGbM096odlNn27RxCszcWTXyzExg== "@types/send@*": version "0.17.4" @@ -3692,7 +3353,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/trusted-types@*", "@types/trusted-types@^2.0.2": +"@types/trusted-types@^2.0.2", "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== @@ -3707,11 +3368,6 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/uuid@^9.0.0": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - "@types/valid-url@1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@types/valid-url/-/valid-url-1.0.7.tgz#f99e3d89dea90f34a7cc695a6f152728abfb245a" @@ -3752,62 +3408,62 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz#7dc0e419c87beadc8f554bf5a42e5009ed3748dc" - integrity sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w== +"@typescript-eslint/eslint-plugin@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz#992e5ac1553ce20d0d46aa6eccd79dc36dedc805" + integrity sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.14.0" - "@typescript-eslint/type-utils" "8.14.0" - "@typescript-eslint/utils" "8.14.0" - "@typescript-eslint/visitor-keys" "8.14.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/type-utils" "8.18.1" + "@typescript-eslint/utils" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.14.0.tgz#0a7e9dbc11bc07716ab2d7b1226217e9f6b51fc8" - integrity sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA== +"@typescript-eslint/parser@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.1.tgz#c258bae062778b7696793bc492249027a39dfb95" + integrity sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA== dependencies: - "@typescript-eslint/scope-manager" "8.14.0" - "@typescript-eslint/types" "8.14.0" - "@typescript-eslint/typescript-estree" "8.14.0" - "@typescript-eslint/visitor-keys" "8.14.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz#01f37c147a735cd78f0ff355e033b9457da1f373" - integrity sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw== +"@typescript-eslint/scope-manager@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz#52cedc3a8178d7464a70beffed3203678648e55b" + integrity sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ== dependencies: - "@typescript-eslint/types" "8.14.0" - "@typescript-eslint/visitor-keys" "8.14.0" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" -"@typescript-eslint/type-utils@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz#455c6af30c336b24a1af28bc4f81b8dd5d74d94d" - integrity sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ== +"@typescript-eslint/type-utils@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz#10f41285475c0bdee452b79ff7223f0e43a7781e" + integrity sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ== dependencies: - "@typescript-eslint/typescript-estree" "8.14.0" - "@typescript-eslint/utils" "8.14.0" + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/utils" "8.18.1" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.14.0.tgz#0d33d8d0b08479c424e7d654855fddf2c71e4021" - integrity sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g== +"@typescript-eslint/types@8.18.1", "@typescript-eslint/types@^8.2.0": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.1.tgz#d7f4f94d0bba9ebd088de840266fcd45408a8fff" + integrity sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw== -"@typescript-eslint/typescript-estree@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz#a7a3a5a53a6c09313e12fb4531d4ff582ee3c312" - integrity sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ== +"@typescript-eslint/typescript-estree@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz#2a86cd64b211a742f78dfa7e6f4860413475367e" + integrity sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg== dependencies: - "@typescript-eslint/types" "8.14.0" - "@typescript-eslint/visitor-keys" "8.14.0" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -3815,23 +3471,23 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.14.0.tgz#ac2506875e03aba24e602364e43b2dfa45529dbd" - integrity sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA== +"@typescript-eslint/utils@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.1.tgz#c4199ea23fc823c736e2c96fd07b1f7235fa92d5" + integrity sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.14.0" - "@typescript-eslint/types" "8.14.0" - "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" -"@typescript-eslint/visitor-keys@8.14.0": - version "8.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz#2418d5a54669af9658986ade4e6cfb7767d815ad" - integrity sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ== +"@typescript-eslint/visitor-keys@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz#344b4f6bc83f104f514676facf3129260df7610a" + integrity sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== dependencies: - "@typescript-eslint/types" "8.14.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "8.18.1" + eslint-visitor-keys "^4.2.0" "@typescript/vfs@^1.6.0": version "1.6.0" @@ -3841,66 +3497,66 @@ debug "^4.1.1" "@ungap/structured-clone@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== -"@urql/core@5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.8.tgz#eba39eaa2bf9a0a963383e87a65cba7a9ca794bd" - integrity sha512-1GOnUw7/a9bzkcM0+U8U5MmxW2A7FE5YquuEmcJzTtW5tIs2EoS4F2ITpuKBjRBbyRjZgO860nWFPo1m4JImGA== +"@urql/core@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.1.0.tgz#7f4b81f1aba1ca34ae6354763abeb87ff9af84ff" + integrity sha512-yC3sw8yqjbX45GbXxfiBY8GLYCiyW/hLBbQF9l3TJrv4ro00Y0ChkKaD9I2KntRxAVm9IYBqh0awX8fwWAe/Yw== dependencies: "@0no-co/graphql.web" "^1.0.5" wonka "^6.3.2" -"@vue/compiler-core@3.5.12": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.12.tgz#bd70b7dabd12b0b6f31bc53418ba3da77994c437" - integrity sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw== +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== dependencies: "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.12" + "@vue/shared" "3.5.13" entities "^4.5.0" estree-walker "^2.0.2" source-map-js "^1.2.0" -"@vue/compiler-dom@3.5.12": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz#456d631d11102535b7ee6fd954cf2c93158d0354" - integrity sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg== +"@vue/compiler-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== dependencies: - "@vue/compiler-core" "3.5.12" - "@vue/shared" "3.5.12" + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" -"@vue/compiler-sfc@3.5.12": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz#6688120d905fcf22f7e44d3cb90f8dabc4dd3cc8" - integrity sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw== +"@vue/compiler-sfc@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" + integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== dependencies: "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.12" - "@vue/compiler-dom" "3.5.12" - "@vue/compiler-ssr" "3.5.12" - "@vue/shared" "3.5.12" + "@vue/compiler-core" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" estree-walker "^2.0.2" magic-string "^0.30.11" - postcss "^8.4.47" + postcss "^8.4.48" source-map-js "^1.2.0" -"@vue/compiler-ssr@3.5.12": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz#5f1a3fbd5c44b79a6dbe88729f7801d9c9218bde" - integrity sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA== +"@vue/compiler-ssr@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" + integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== dependencies: - "@vue/compiler-dom" "3.5.12" - "@vue/shared" "3.5.12" + "@vue/compiler-dom" "3.5.13" + "@vue/shared" "3.5.13" -"@vue/shared@3.5.12": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3" - integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg== +"@vue/shared@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -3966,7 +3622,7 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1": +"@webassemblyjs/wasm-edit@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== @@ -4001,7 +3657,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -4021,6 +3677,13 @@ "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" +"@whatwg-node/disposablestack@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@whatwg-node/disposablestack/-/disposablestack-0.0.5.tgz#cd646b1ef60a36972e018ab21f412a3539c6deec" + integrity sha512-9lXugdknoIequO4OYvIjhygvfSEgnO8oASLqLelnDhkRjgBZhc39shC3QSlZuyDO9bgYSIVa2cHAiN+St3ty4w== + dependencies: + tslib "^2.6.3" + "@whatwg-node/events@^0.1.0": version "0.1.2" resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.2.tgz#23f7c7ad887d7fd448e9ce3261eac9ef319ddd7c" @@ -4037,20 +3700,22 @@ urlpattern-polyfill "^10.0.0" "@whatwg-node/node-fetch@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.7.1.tgz#2f0f009a44d61f5ad9151ec0b5bfbbf0683a41ff" - integrity sha512-+IVKtQhHnaOS39ErbdeQUh+pVKqCJxO0OokBxCo7SNtTHOZB2Tb+YN+YWwp4WizXwTWy85tsEv1AAprugpxNmg== + version "0.7.5" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.7.5.tgz#b81e9d5f4b9032e480032c73e7bac284c4e3bdb8" + integrity sha512-t7kGrt2fdfNvzy1LCAE9/OnIyMtizgFhgJmk7iLJwQsLmR7S86F8Q4aDRPbCfo7pISJP6Fx/tPdfFNjHS23WTA== dependencies: "@kamilkisiela/fast-url-parser" "^1.1.4" + "@whatwg-node/disposablestack" "^0.0.5" busboy "^1.6.0" fast-querystring "^1.1.1" tslib "^2.6.3" -"@whatwg-node/server@^0.9.55": - version "0.9.55" - resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.9.55.tgz#2ff56b42d3a7bfbf79399dcc5be0b53cdd3da064" - integrity sha512-FW04dJZfgBGaGoHQosCTeSOXKksCVzMLMV5YZPMpUfEmkH8VeDjCIMguvw2cKgrjnLjwQ1J3irLg2eNQbLxLNg== +"@whatwg-node/server@^0.9.63": + version "0.9.63" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.9.63.tgz#53801ff951a8f0c30da8d3fa4eb9b07b3d37a587" + integrity sha512-rHBN2murCcuuhQru/AQjA13lA9SzQAH9k8ENy4iZrAmY+C0yFYPud3HiFgPUgzR1B2KYUpIYKwC1UAUlkzASOQ== dependencies: + "@whatwg-node/disposablestack" "^0.0.5" "@whatwg-node/fetch" "^0.10.0" tslib "^2.6.3" @@ -4075,13 +3740,6 @@ dependencies: tslib "^2.3.0" -"@wry/trie@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" - integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== - dependencies: - tslib "^2.3.0" - "@wry/trie@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" @@ -4122,46 +3780,22 @@ acorn-typescript@^1.4.13: resolved "https://registry.yarnpkg.com/acorn-typescript/-/acorn-typescript-1.4.13.tgz#5f851c8bdda0aa716ffdd5f6ac084df8acc6f5ea" integrity sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q== -acorn-walk@^8.0.0, acorn-walk@^8.1.1: +acorn-walk@^8.0.0: version "8.3.4" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" -acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.12.1, acorn@^8.14.0, acorn@^8.4.1, acorn@^8.8.2: +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.12.1, acorn@^8.14.0, acorn@^8.8.2: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== ajv-formats@^2.1.1: version "2.1.1" @@ -4236,13 +3870,6 @@ ansi-sequence-parser@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== -ansi-styles@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -4280,22 +3907,7 @@ apollo-upload-client@17.0.0: dependencies: extract-files "^11.0.0" -arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -arg@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" - integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -arg@^5.0.2: +arg@^5.0.0, arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -4317,7 +3929,7 @@ aria-query@^5.3.1: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -4365,38 +3977,37 @@ array.prototype.findlastindex@^1.2.5: es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" asap@~2.0.3: version "2.0.6" @@ -4422,13 +4033,6 @@ astrojs-compiler-sync@^1.0.0: dependencies: synckit "^0.9.0" -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -4444,18 +4048,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.19: - version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" - integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== - dependencies: - browserslist "^4.23.3" - caniuse-lite "^1.0.30001646" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.1" - postcss-value-parser "^4.2.0" - available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -4463,15 +4055,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axios@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - axobject-query@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" @@ -4525,12 +4108,12 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.6: @@ -4542,11 +4125,11 @@ babel-plugin-polyfill-corejs3@^0.10.6: core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" @@ -4657,11 +4240,11 @@ bare-path@^2.0.0, bare-path@^2.1.0: bare-os "^2.1.0" bare-stream@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.3.2.tgz#3bc62b429bcf850d2f265719b7a49ee0630a3ae4" - integrity sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A== + version "2.6.1" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.1.tgz#b3b9874fab05b662c9aea2706a12fb0698c46836" + integrity sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g== dependencies: - streamx "^2.20.0" + streamx "^2.21.0" base64-js@^1.3.1: version "1.5.1" @@ -4732,11 +4315,6 @@ body-parser@1.20.3: type-is "~1.6.18" unpipe "1.0.0" -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4759,14 +4337,14 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.2: - version "4.24.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== +browserslist@^4.19.1, browserslist@^4.24.0, browserslist@^4.24.2: + version "4.24.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" + integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== dependencies: - caniuse-lite "^1.0.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" update-browserslist-db "^1.1.1" bs-logger@^0.2.6: @@ -4813,34 +4391,31 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^17.0.0: - version "17.1.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" - integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^7.7.1" - minipass "^7.0.3" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" callsites@^3.0.0: version "3.1.0" @@ -4867,20 +4442,10 @@ camelcase@^8.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: - version "1.0.30001680" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" - integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688: + version "1.0.30001688" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz#f9d3ede749f083ce0db4c13db9d828adaf2e8d0a" + integrity sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA== casual@1.6.2: version "1.6.2" @@ -4895,16 +4460,12 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" +chalk@5.4.0, chalk@^5.0.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.0.tgz#846fdb5d5d939d6fa3d565cd5545697b6f8b6923" + integrity sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q== -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4966,7 +4527,7 @@ chevrotain@~11.0.3: "@chevrotain/utils" "11.0.3" lodash-es "4.17.21" -chokidar@^3.5.3: +chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -4981,23 +4542,17 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -chromium-bidi@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.8.0.tgz#ffd79dad7db1fcc874f1c55fcf46ded05a884269" - integrity sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug== +chromium-bidi@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz#9c3c42ee7b42d8448e9fce8d649dc8bfbcc31153" + integrity sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA== dependencies: mitt "3.0.1" - urlpattern-polyfill "10.0.0" zod "3.23.8" ci-info@^3.2.0, ci-info@^3.7.0: @@ -5010,11 +4565,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - cli-cursor@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" @@ -5035,13 +4585,14 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clipboardy@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" - integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== +clipboardy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-4.0.0.tgz#e73ced93a76d19dd379ebf1f297565426dffdca1" + integrity sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w== dependencies: - arch "^2.1.0" - execa "^0.8.0" + execa "^8.0.1" + is-wsl "^3.1.0" + is64bit "^2.0.0" cliui@^6.0.0: version "6.0.0" @@ -5081,13 +4632,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -5095,11 +4639,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -5121,11 +4660,6 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" -colord@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -5218,10 +4752,10 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-tag@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-2.0.3.tgz#52b72285256ae0aa49e86b1b5923764df472d61c" - integrity sha512-htLIdtfhhKW2fHlFLnZH7GFzHSdSpHhDLrWVswkNiiPMZ5uXq5JfrGboQKFhNQuAAFF8VNB2EYUj3MsdJrKKpg== +content-tag@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-3.1.0.tgz#1a7ca7e36d85422808b8d426e2bdca95a98bcd75" + integrity sha512-gSESx+fia81/vKjorui0V6wY7IBpuitd84LcQnaPVF9Xe9ctLAf4saHwbUi3SAhYfi9kxs5ODfAVnm5MmjojCQ== content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" @@ -5287,11 +4821,6 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-env@7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -5306,122 +4835,20 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" - integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -css-declaration-sorter@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" - integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -css-tree@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" - integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== - dependencies: - mdn-data "2.0.28" - source-map-js "^1.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz#0220fa7507478369aa2a226bac03e1204cd024c1" - integrity sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ== - dependencies: - browserslist "^4.23.3" - css-declaration-sorter "^7.2.0" - cssnano-utils "^5.0.0" - postcss-calc "^10.0.2" - postcss-colormin "^7.0.2" - postcss-convert-values "^7.0.4" - postcss-discard-comments "^7.0.3" - postcss-discard-duplicates "^7.0.1" - postcss-discard-empty "^7.0.0" - postcss-discard-overridden "^7.0.0" - postcss-merge-longhand "^7.0.4" - postcss-merge-rules "^7.0.4" - postcss-minify-font-values "^7.0.0" - postcss-minify-gradients "^7.0.0" - postcss-minify-params "^7.0.2" - postcss-minify-selectors "^7.0.4" - postcss-normalize-charset "^7.0.0" - postcss-normalize-display-values "^7.0.0" - postcss-normalize-positions "^7.0.0" - postcss-normalize-repeat-style "^7.0.0" - postcss-normalize-string "^7.0.0" - postcss-normalize-timing-functions "^7.0.0" - postcss-normalize-unicode "^7.0.2" - postcss-normalize-url "^7.0.0" - postcss-normalize-whitespace "^7.0.0" - postcss-ordered-values "^7.0.1" - postcss-reduce-initial "^7.0.2" - postcss-reduce-transforms "^7.0.0" - postcss-svgo "^7.0.1" - postcss-unique-selectors "^7.0.3" - -cssnano-utils@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" - integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== - -cssnano@^7.0.0: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.6.tgz#63d54fd42bc017f6aaed69e47d9aaef85b7850ec" - integrity sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw== - dependencies: - cssnano-preset-default "^7.0.6" - lilconfig "^3.1.2" - -csso@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" - integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== - dependencies: - css-tree "~2.2.0" - csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -5442,9 +4869,9 @@ cytoscape-fcose@^2.2.0: cose-base "^2.2.0" cytoscape@^3.29.2: - version "3.30.3" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.3.tgz#1b2726bbfa6673f643488a81147354841c252352" - integrity sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g== + version "3.30.4" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.4.tgz#3404da0a159c00a1a3df2c85b2b43fdc66a0e28e" + integrity sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A== "d3-array@1 - 2": version "2.12.1" @@ -5757,16 +5184,16 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -dataloader@2.2.2, dataloader@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" - integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== - dataloader@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== +dataloader@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.3.tgz#42d10b4913515f5b37c6acedcb4960d6ae1b1517" + integrity sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA== + dateformat@4.6.3: version "4.6.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" @@ -5789,10 +5216,10 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@~4.3.6: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -5825,30 +5252,6 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5868,7 +5271,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -5918,6 +5321,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" @@ -5950,11 +5358,6 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5974,45 +5377,12 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -"dompurify@^3.0.11 <3.1.7": - version "3.1.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" - integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dotenv@^16.0.0: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +dompurify@^3.2.1: + version "3.2.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.3.tgz#05dd2175225324daabfca6603055a09b2382a4cd" + integrity sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA== + optionalDependencies: + "@types/trusted-types" "^2.0.7" dotenv@^8.1.0: version "8.6.0" @@ -6024,6 +5394,15 @@ dset@^3.1.1, dset@^3.1.2: resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248" integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -6046,16 +5425,21 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.41: - version "1.5.55" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz#73684752aa2e1aa49cafb355a41386c6637e76a9" - integrity sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg== +electron-to-chromium@^1.5.73: + version "1.5.73" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz#f32956ce40947fa3c8606726a96cd8fb5bb5f720" + integrity sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg== emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex-xs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" + integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== + emoji-regex@^10.3.0: version "10.4.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" @@ -6086,13 +5470,6 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -6108,7 +5485,7 @@ enhanced-resolve@^5.17.1: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.0: +enquirer@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== @@ -6116,7 +5493,7 @@ enquirer@^2.3.0: ansi-colors "^4.1.1" strip-ansi "^6.0.1" -entities@^4.2.0, entities@^4.5.0: +entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -6131,11 +5508,6 @@ environment@^1.0.0: resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -6143,10 +5515,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== +es-abstract@^1.23.2, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -6163,7 +5535,7 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" get-symbol-description "^1.0.2" - globalthis "^1.0.3" + globalthis "^1.0.4" gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" @@ -6179,10 +5551,10 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" + regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.2" safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" @@ -6195,33 +5567,16 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 unbox-primitive "^1.0.2" which-typed-array "^1.1.15" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - es-module-lexer@^1.2.1: version "1.5.4" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" @@ -6243,7 +5598,7 @@ es-set-tostringtag@^2.0.3: has-tostringtag "^1.0.2" hasown "^2.0.1" -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: +es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -6251,13 +5606,13 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: hasown "^2.0.0" es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" esast-util-from-estree@^2.0.0: version "2.0.0" @@ -6279,7 +5634,7 @@ esast-util-from-js@^2.0.0: esast-util-from-estree "^2.0.0" vfile-message "^4.0.0" -esbuild@^0.24.0: +esbuild@0.24.0, esbuild@~0.23.0: version "0.24.0" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== @@ -6319,11 +5674,6 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" @@ -6417,10 +5767,10 @@ eslint-plugin-import@2.31.0: string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" -eslint-plugin-n@17.13.1: - version "17.13.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.13.1.tgz#3178c87989ad23417d22c5f66a13ecb1e9c5245e" - integrity sha512-97qzhk1z3DdSJNCqT45EslwCu5+LB9GDadSyBItgKUfGsXAmN/aa7LRQ0ZxHffUxUzvgbTPJL27/pE9ZQWHy7A== +eslint-plugin-n@17.15.0: + version "17.15.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.15.0.tgz#c6ab639a7d7761085cff05313753413d898b087e" + integrity sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ== dependencies: "@eslint-community/eslint-utils" "^4.4.1" enhanced-resolve "^5.17.1" @@ -6431,10 +5781,12 @@ eslint-plugin-n@17.13.1: minimatch "^9.0.5" semver "^7.6.3" -eslint-plugin-promise@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.1.0.tgz#06b3ad6d36b3c3ef3ec201c8a8d97049cf5dbb20" - integrity sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ== +eslint-plugin-promise@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz#a0652195700aea40b926dc3c74b38e373377bfb0" + integrity sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" eslint-plugin-standard@5.0.0: version "5.0.0" @@ -6467,26 +5819,26 @@ eslint-visitor-keys@^4.2.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@9.14.0: - version "9.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.14.0.tgz#534180a97c00af08bcf2b60b0ebf0c4d6c1b2c95" - integrity sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g== +eslint@9.17.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.17.0.tgz#faa1facb5dd042172fdc520106984b5c2421bb0c" + integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.7.0" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.14.0" - "@eslint/plugin-kit" "^0.2.0" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.17.0" + "@eslint/plugin-kit" "^0.2.3" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.0" + "@humanwhocodes/retry" "^0.4.1" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" - cross-spawn "^7.0.2" + cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" eslint-scope "^8.2.0" @@ -6506,12 +5858,11 @@ eslint@9.14.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - text-table "^0.2.0" -esm-env@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.1.4.tgz#340c78b03ee2298d31c5b9fab9793468ede828b0" - integrity sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg== +esm-env@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.1.tgz#34c2a0ba60582948afbe7bd779bc66f9d3aece7e" + integrity sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng== esm@^3.2.25: version "3.2.25" @@ -6539,13 +5890,13 @@ esquery@^1.5.0: dependencies: estraverse "^5.1.0" -esrap@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/esrap/-/esrap-1.2.2.tgz#b9e3afee3f12238563a763b7fa86220de2c53203" - integrity sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw== +esrap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esrap/-/esrap-1.3.1.tgz#537861022bfda890a5658f2cd53af9a0d65e8ec9" + integrity sha512-KpAH3+QsDmtOP1KOW04CbD1PgzWsIHjB8tOCk3PCb8xzNGn8XkjI8zl80i09fmXdzQyaS8tcsKCCDzHF7AcowA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" - "@types/estree" "^1.0.1" + "@typescript-eslint/types" "^8.2.0" esrecurse@^4.3.0: version "4.3.0" @@ -6682,19 +6033,6 @@ execa@7.1.1: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -6710,7 +6048,7 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@~8.0.1: +execa@^8.0.1, execa@~8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== @@ -6741,10 +6079,10 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -express@4.21.1: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== +express@4.21.2: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -6765,7 +6103,7 @@ express@4.21.1: methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.13.0" range-parser "~1.2.1" @@ -7004,20 +6342,15 @@ flat-cache@^4.0.0: keyv "^4.5.4" flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== flexsearch@^0.7.43: version "0.7.43" resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.43.tgz#34f89b36278a466ce379c5bf6fb341965ed3f16c" integrity sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg== -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -7052,11 +6385,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -7067,7 +6395,7 @@ fs-capacitor@^8.0.0: resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-8.0.0.tgz#a95cbcf58dd50750fe718a03ec051961ef4e61f4" integrity sha512-+Lk6iSKajdGw+7XYxUkwIzreJ2G1JFlYOdnKJv5PzwFLVsoJYBpCuS7WPIUSNT1IbQaEWT1nhYU63Ud03DyzLA== -fs-extra@^11.1.0, fs-extra@^11.2.0: +fs-extra@^11.1.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== @@ -7104,26 +6432,12 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" - integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== - dependencies: - minipass "^7.0.3" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -7134,14 +6448,15 @@ function-bind@^1.1.2: integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + version "1.1.7" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.7.tgz#9df48ea5f746bf577d7e15b5da89df8952a98e7b" + integrity sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" @@ -7168,27 +6483,27 @@ get-east-asian-width@^1.0.0: resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.1, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.0.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -7215,12 +6530,7 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-symbol-from-current-process-h@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-from-current-process-h/-/get-symbol-from-current-process-h-1.0.2.tgz#510af52eaef873f7028854c3377f47f7bb200265" - integrity sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw== - -get-tsconfig@^4.8.1: +get-tsconfig@^4.7.5, get-tsconfig@^4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== @@ -7228,21 +6538,13 @@ get-tsconfig@^4.8.1: resolve-pkg-maps "^1.0.0" get-uri@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" - integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== dependencies: basic-ftp "^5.0.2" data-uri-to-buffer "^6.0.2" debug "^4.3.4" - fs-extra "^11.2.0" - -get-uv-event-loop-napi-h@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/get-uv-event-loop-napi-h/-/get-uv-event-loop-napi-h-1.0.6.tgz#42b0b06b74c3ed21fbac8e7c72845fdb7a200208" - integrity sha512-t5c9VNR84nRoF+eLiz6wFrEp1SE2Acg0wS+Ysa2zF0eROes+LzOfuTaVHxGy8AbS8rq7FHEJzjnCZo1BupwdJg== - dependencies: - get-symbol-from-current-process-h "^1.0.1" giscus@^1.5.0: version "1.5.0" @@ -7275,7 +6577,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.2.2, glob@^10.3.10: +glob@^10.3.10: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -7309,12 +6611,12 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.11.0: - version "15.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.12.0.tgz#1811872883ad8f41055b61457a130221297de5b5" - integrity sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ== +globals@^15.11.0, globals@^15.13.0: + version "15.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.13.0.tgz#bbec719d69aafef188ecd67954aae76a696010fc" + integrity sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g== -globalthis@^1.0.3: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -7345,12 +6647,10 @@ globby@^13.1.3: merge2 "^1.4.1" slash "^4.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" @@ -7362,18 +6662,10 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -graphql-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" - integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== - dependencies: - "@graphql-typed-document-node/core" "^3.2.0" - cross-fetch "^3.1.5" - -graphql-scalars@1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.23.0.tgz#486785d1a6f9449277054a92afc7e1fb73f459d6" - integrity sha512-YTRNcwitkn8CqYcleKOx9IvedA8JIERn8BRq21nlKgOr4NEcTaWEG0sT+H92eF3ALTFbPgsqfft4cw+MGgv0Gg== +graphql-scalars@1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.24.0.tgz#4153d310179f5cfd33c749ba4a77a1fb450d717d" + integrity sha512-olbFN39m0XsHHESACUdd7jWU/lGxMMS1B7NZ8XqpqhKZrjBxzeGYAnQ4Ax//huYds771wb7gCznA+65QDuUa+g== dependencies: tslib "^2.5.0" @@ -7382,13 +6674,6 @@ graphql-sse@2.5.3: resolved "https://registry.yarnpkg.com/graphql-sse/-/graphql-sse-2.5.3.tgz#c3557803f2db306d8ac87fd3bc089b6d4bac8353" integrity sha512-5IcFW3e7fPOG7oFkK1v3X1wWtCJArQKB/H1UJeNotjy7a/9EYA5K+EiHJF1BiDSVNx7y64bd0FlDETrNBSvIHQ== -graphql-subscriptions@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a" - integrity sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA== - dependencies: - iterall "^1.3.0" - graphql-tag@2.12.6, graphql-tag@^2.12.6: version "2.12.6" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" @@ -7419,27 +6704,27 @@ graphql-ws@^5.14.0: resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.16.0.tgz#849efe02f384b4332109329be01d74c345842729" integrity sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A== -graphql-yoga@5.10.2, graphql-yoga@^5.0.0: - version "5.10.2" - resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-5.10.2.tgz#4bf6269c9787150f8d19e214216e77c14ad4fcd3" - integrity sha512-LcbNUFCsCsv3enjGnXCUQNSKxM49iB4uF9H2Vb3WChBOSQjzqI1d83mvgMTgMVtrZYlKjgM/magMQZV211N2LA== +graphql-yoga@5.10.6, graphql-yoga@^5.0.0: + version "5.10.6" + resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-5.10.6.tgz#cb2c83adaba7b0451c617993da313a6d3fdea318" + integrity sha512-RqKTNN4ii/pnUhGBuFF3WyNy52AMs5ArTY/lGQUYH/1FQk5t2RgAZE5OxWRgobhmr+cuN066bvgVIlt4mnnRNA== dependencies: - "@envelop/core" "^5.0.1" - "@graphql-tools/executor" "^1.3.0" - "@graphql-tools/schema" "^10.0.4" - "@graphql-tools/utils" "^10.3.2" + "@envelop/core" "^5.0.2" + "@graphql-tools/executor" "^1.3.7" + "@graphql-tools/schema" "^10.0.11" + "@graphql-tools/utils" "^10.6.2" "@graphql-yoga/logger" "^2.0.0" - "@graphql-yoga/subscription" "^5.0.1" + "@graphql-yoga/subscription" "^5.0.2" "@whatwg-node/fetch" "^0.10.1" - "@whatwg-node/server" "^0.9.55" + "@whatwg-node/server" "^0.9.63" dset "^3.1.1" lru-cache "^10.0.0" - tslib "^2.5.2" + tslib "^2.8.1" -"graphql@14 - 16", graphql@16.9.0, graphql@^14.5.3, graphql@^16.6.0: - version "16.9.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" - integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== +"graphql@14 - 16", graphql@16.10.0, graphql@^14.5.3, graphql@^16.6.0: + version "16.10.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" + integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== gray-matter@^4.0.3: version "4.0.3" @@ -7475,16 +6760,11 @@ handlebars@^4.7.7: optionalDependencies: uglify-js "^3.1.4" -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -7497,15 +6777,17 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" @@ -7522,12 +6804,12 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: function-bind "^1.1.2" hast-util-from-dom@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz#d32edd25bf28f4b178b5ae318f8d05762e67bd16" - integrity sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz#c3c92fbd8d4e1c1625edeb3a773952b9e4ad64a8" + integrity sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q== dependencies: "@types/hast" "^3.0.0" - hastscript "^8.0.0" + hastscript "^9.0.0" web-namespaces "^2.0.0" hast-util-from-html-isomorphic@^2.0.0: @@ -7553,14 +6835,14 @@ hast-util-from-html@^2.0.0: vfile-message "^4.0.0" hast-util-from-parse5@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" - integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + version "8.0.2" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz#29b42758ba96535fd6021f0f533c000886c0f00f" + integrity sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" devlop "^1.0.0" - hastscript "^8.0.0" + hastscript "^9.0.0" property-information "^6.0.0" vfile "^6.0.0" vfile-location "^5.0.0" @@ -7581,9 +6863,9 @@ hast-util-parse-selector@^4.0.0: "@types/hast" "^3.0.0" hast-util-raw@^9.0.0: - version "9.0.4" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.4.tgz#2da03e37c46eb1a6f1391f02f9b84ae65818f7ed" - integrity sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA== + version "9.1.0" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz#79b66b26f6f68fb50dfb4716b2cdca90d92adf2e" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -7622,9 +6904,9 @@ hast-util-to-estree@^3.0.0, hast-util-to-estree@^3.1.0: zwitch "^2.0.0" hast-util-to-html@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" - integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== + version "9.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz#d689c118c875aab1def692c58603e34335a0f5c5" + integrity sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA== dependencies: "@types/hast" "^3.0.0" "@types/unist" "^3.0.0" @@ -7696,10 +6978,10 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" -hastscript@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" - integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== +hastscript@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.0.tgz#2b76b9aa3cba8bf6d5280869f6f6f7165c230763" + integrity sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw== dependencies: "@types/hast" "^3.0.0" comma-separated-tokens "^2.0.0" @@ -7724,11 +7006,6 @@ html-void-elements@^3.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - http-errors@2.0.0, http-errors@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -7740,15 +7017,6 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" @@ -7757,20 +7025,12 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" human-id@^1.0.2: @@ -7793,17 +7053,10 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@9.1.6: - version "9.1.6" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.6.tgz#e23aa996b6203ab33534bdc82306b0cf2cb07d6c" - integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== +husky@9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -7812,7 +7065,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6, iconv-lite@^0.6.2: +iconv-lite@0.6: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -7855,11 +7108,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7868,7 +7116,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1: +inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7883,14 +7131,14 @@ inline-style-parser@0.2.4: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== -internal-slot@^1.0.4, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" + hasown "^2.0.2" + side-channel "^1.1.0" "internmap@1 - 2", internmap@^1.0.0: version "1.0.1" @@ -7930,15 +7178,7 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: +is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -7956,12 +7196,19 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -7970,44 +7217,47 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" + integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.0.tgz#6c01ffdd5e33c49c1d2abfa93334a85cb56bd81c" + integrity sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== dependencies: hasown "^2.0.2" is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-decimal@^2.0.0: version "2.0.1" @@ -8019,6 +7269,11 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -8029,6 +7284,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== + dependencies: + call-bind "^1.0.7" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -8051,6 +7313,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -8063,12 +7332,14 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" -is-map@^2.0.2, is-map@^2.0.3: +is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -8078,12 +7349,13 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -8112,31 +7384,28 @@ is-reference@^3.0.3: dependencies: "@types/estree" "^1.0.6" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -is-set@^2.0.2, is-set@^2.0.3: +is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: +is-shared-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -8147,12 +7416,13 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-subdir@^1.1.1: version "1.2.0" @@ -8161,12 +7431,14 @@ is-subdir@^1.1.1: dependencies: better-path-resolve "1.0.0" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" is-typed-array@^1.1.13: version "1.1.13" @@ -8181,11 +7453,11 @@ is-weakmap@^2.0.2: integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.2" is-weakset@^2.0.3: version "2.0.3" @@ -8207,6 +7479,20 @@ is-wsl@^2.1.1: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +is64bit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is64bit/-/is64bit-2.0.0.tgz#198c627cbcb198bbec402251f88e5e1a51236c07" + integrity sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw== + dependencies: + system-architecture "^0.1.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -8275,7 +7561,7 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.2.1, iterall@^1.3.0: +iterall@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -8666,32 +7952,11 @@ jest@29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jiti@^1.21.0: +jiti@^1.21.6: version "1.21.6" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== -joi@^17.13.3: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -jose@^5.0.0: - version "5.9.6" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.6.tgz#77f1f901d88ebdc405e57cce08d2a91f47521883" - integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== - -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8705,7 +7970,7 @@ js-yaml@^3.13.1, js-yaml@^3.6.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0, js-yaml@^4.1.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -8796,9 +8061,9 @@ jsonify@^0.0.1: integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== katex@^0.16.0, katex@^0.16.9: - version "0.16.11" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5" - integrity sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ== + version "0.16.15" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.15.tgz#16b0d235aae8dfa3b2d5d63fd9874bfa394abfab" + integrity sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w== dependencies: commander "^8.3.0" @@ -8870,38 +8135,101 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0, lilconfig@^3.1.2, lilconfig@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== +lightningcss-darwin-arm64@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz#a906fd84cb43d753cb5db9c367f8f38482e8fb03" + integrity sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g== + +lightningcss-darwin-x64@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz#6c43249d4ae821416d0d78403eae56111d0c6a94" + integrity sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g== + +lightningcss-freebsd-x64@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz#804bc6652c6721e94a92e7bbb5e65165376cf108" + integrity sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA== + +lightningcss-linux-arm-gnueabihf@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz#c32595127b565690d854c9ff641831e4ad739ee1" + integrity sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg== + +lightningcss-linux-arm64-gnu@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz#85646f08c5efbfd7c94f8e5ed6392d5cf95fa42c" + integrity sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw== + +lightningcss-linux-arm64-musl@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz#4d9bc20cf6de28c4d0c586d81c577891555ad831" + integrity sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA== + +lightningcss-linux-x64-gnu@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz#74bd797d7157817c4e42ec45f1844a69636a9d82" + integrity sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg== + +lightningcss-linux-x64-musl@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz#13ce6db4c491ebbb93099d6427746ab7bff3774f" + integrity sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww== + +lightningcss-win32-arm64-msvc@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz#eaae12c4a58a545a3adf40b22ba9625e5c0ebd29" + integrity sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g== + +lightningcss-win32-x64-msvc@1.28.2: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz#1f7c4474b2dc3dd1c12e22de32e4de23bdfa41e7" + integrity sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A== + +lightningcss@^1.22.0: + version "1.28.2" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.28.2.tgz#cc26fad9ad64a621bd39ac6248095891cf584cce" + integrity sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA== + dependencies: + detect-libc "^1.0.3" + optionalDependencies: + lightningcss-darwin-arm64 "1.28.2" + lightningcss-darwin-x64 "1.28.2" + lightningcss-freebsd-x64 "1.28.2" + lightningcss-linux-arm-gnueabihf "1.28.2" + lightningcss-linux-arm64-gnu "1.28.2" + lightningcss-linux-arm64-musl "1.28.2" + lightningcss-linux-x64-gnu "1.28.2" + lightningcss-linux-x64-musl "1.28.2" + lightningcss-win32-arm64-msvc "1.28.2" + lightningcss-win32-x64-msvc "1.28.2" + +lilconfig@^3.0.0, lilconfig@^3.1.3, lilconfig@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@15.2.10: - version "15.2.10" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.10.tgz#92ac222f802ba911897dcf23671da5bb80643cd2" - integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== +lint-staged@15.2.11: + version "15.2.11" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.11.tgz#e88440982f4a4c1d55a9a7a839259ec3806bd81b" + integrity sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ== dependencies: chalk "~5.3.0" commander "~12.1.0" - debug "~4.3.6" + debug "~4.4.0" execa "~8.0.1" - lilconfig "~3.1.2" - listr2 "~8.2.4" + lilconfig "~3.1.3" + listr2 "~8.2.5" micromatch "~4.0.8" pidtree "~0.6.0" string-argv "~0.3.2" - yaml "~2.5.0" + yaml "~2.6.1" -listr2@~8.2.4: +listr2@~8.2.5: version "8.2.5" resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== @@ -8957,13 +8285,13 @@ loader-utils@^1.2.3: emojis-list "^3.0.0" json5 "^1.0.1" -local-pkg@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" - integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== +local-pkg@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" + integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== dependencies: - mlly "^1.4.2" - pkg-types "^1.0.3" + mlly "^1.7.3" + pkg-types "^1.2.1" locate-character@^3.0.0: version "3.0.0" @@ -9026,12 +8354,7 @@ lodash.startcase@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9047,22 +8370,12 @@ log-update@^6.1.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -loglevel@^1.6.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" - integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -9081,14 +8394,6 @@ lru-cache@^10.0.0, lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9096,7 +8401,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^7.14.1, lru-cache@^7.7.1: +lru-cache@^7.14.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -9107,9 +8412,9 @@ lunr@^2.3.9: integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== magic-string@^0.30.11: - version "0.30.12" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" - integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== + version "0.30.15" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.15.tgz#d5474a2c4c5f35f041349edaba8a5cb02733ed3c" + integrity sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -9120,32 +8425,11 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.1.1, make-error@^1.3.6: +make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -9173,6 +8457,11 @@ marked@^4.3.0: resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +math-intrinsics@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.0.0.tgz#4e04bf87c85aa51e90d078dac2252b4eb5260817" + integrity sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA== + mathjax-full@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/mathjax-full/-/mathjax-full-3.2.2.tgz#43f02e55219db393030985d2b6537ceae82f1fa7" @@ -9193,7 +8482,7 @@ mdast-util-find-and-replace@^3.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^2.0.0: +mdast-util-from-markdown@^2.0.0, mdast-util-from-markdown@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== @@ -9362,7 +8651,7 @@ mdast-util-phrasing@^4.0.0: "@types/mdast" "^4.0.0" unist-util-is "^6.0.0" -mdast-util-to-hast@^13.0.0: +mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.2.0: version "13.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== @@ -9399,16 +8688,6 @@ mdast-util-to-string@^4.0.0: dependencies: "@types/mdast" "^4.0.0" -mdn-data@2.0.28: - version "2.0.28" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" - integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -9435,15 +8714,14 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@^11.0.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-11.4.0.tgz#e510f45700ed4b31e1dc327b3a405ad9f6907ca3" - integrity sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA== + version "11.4.1" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-11.4.1.tgz#577fad5c31a01a06d9f793e298d411f1379eecc8" + integrity sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A== dependencies: "@braintree/sanitize-url" "^7.0.1" "@iconify/utils" "^2.1.32" "@mermaid-js/parser" "^0.3.0" "@types/d3" "^7.4.3" - "@types/dompurify" "^3.0.5" cytoscape "^3.29.2" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.2.0" @@ -9451,7 +8729,7 @@ mermaid@^11.0.0: d3-sankey "^0.12.3" dagre-d3-es "7.0.11" dayjs "^1.11.10" - dompurify "^3.0.11 <3.1.7" + dompurify "^3.2.1" katex "^0.16.9" khroma "^2.1.0" lodash-es "^4.17.21" @@ -9482,9 +8760,9 @@ mhchemparser@^4.1.0: integrity sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ== micromark-core-commonmark@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz#9a45510557d068605c6e9a80f282b2bb8581e43d" - integrity sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== dependencies: decode-named-character-reference "^1.0.0" devlop "^1.0.0" @@ -9673,18 +8951,18 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-types "^2.0.0" micromark-factory-destination@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" - integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: micromark-util-character "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-factory-label@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" - integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: devlop "^1.0.0" micromark-util-character "^2.0.0" @@ -9707,17 +8985,17 @@ micromark-factory-mdx-expression@^2.0.0: vfile-message "^4.0.0" micromark-factory-space@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" - integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" micromark-factory-title@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" - integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" @@ -9725,9 +9003,9 @@ micromark-factory-title@^2.0.0: micromark-util-types "^2.0.0" micromark-factory-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" - integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" @@ -9735,48 +9013,48 @@ micromark-factory-whitespace@^2.0.0: micromark-util-types "^2.0.0" micromark-util-character@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" - integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-util-chunked@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" - integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" - integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: micromark-util-character "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" micromark-util-combine-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" - integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" micromark-util-decode-numeric-character-reference@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" - integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: micromark-util-symbol "^2.0.0" micromark-util-decode-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" - integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^2.0.0" @@ -9784,9 +9062,9 @@ micromark-util-decode-string@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" - integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== micromark-util-events-to-acorn@^2.0.0: version "2.0.2" @@ -9803,37 +9081,37 @@ micromark-util-events-to-acorn@^2.0.0: vfile-message "^4.0.0" micromark-util-html-tag-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" - integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== micromark-util-normalize-identifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" - integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" - integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" - integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: micromark-util-character "^2.0.0" micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" micromark-util-subtokenize@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz#76129c49ac65da6e479c09d0ec4b5f29ec6eace5" - integrity sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q== + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz#70ffb99a454bd8c913c8b709c3dc97baefb65f96" + integrity sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg== dependencies: devlop "^1.0.0" micromark-util-chunked "^2.0.0" @@ -9841,19 +9119,19 @@ micromark-util-subtokenize@^2.0.0: micromark-util-types "^2.0.0" micromark-util-symbol@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" - integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== micromark-util-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" - integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== micromark@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" - integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -9873,7 +9151,7 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8, micromatch@~4.0.8: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8, micromatch@~4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -9939,70 +9217,11 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" - integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - mitt@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" @@ -10013,19 +9232,14 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mlly@^1.4.2, mlly@^1.7.1, mlly@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.2.tgz#21c0d04543207495b8d867eff0ac29fac9a023c0" - integrity sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA== +mlly@^1.7.2, mlly@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.3.tgz#d86c0fcd8ad8e16395eb764a5f4b831590cee48c" + integrity sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A== dependencies: - acorn "^8.12.1" + acorn "^8.14.0" pathe "^1.1.2" - pkg-types "^1.2.0" + pkg-types "^1.2.1" ufo "^1.5.4" moment@^2.15.2: @@ -10048,7 +9262,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -10068,16 +9282,16 @@ mz@^2.7.0: thenify-all "^1.0.0" nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -10107,10 +9321,10 @@ next-sitemap@4.2.3: fast-glob "^3.2.12" minimist "^1.2.8" -next-themes@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" - integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== +next-themes@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.4.4.tgz#ce6f68a4af543821bbc4755b59c0d3ced55c2d13" + integrity sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ== next-videos@1.5.0: version "1.5.0" @@ -10119,46 +9333,46 @@ next-videos@1.5.0: dependencies: file-loader "^4.2.0" -next@15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/next/-/next-15.0.2.tgz#4a2224c007856118010b8cef5e9b2383cd743388" - integrity sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ== +next@15.1.2: + version "15.1.2" + resolved "https://registry.yarnpkg.com/next/-/next-15.1.2.tgz#305d093a9f3d6900b53fa4abb5b213264b22047c" + integrity sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ== dependencies: - "@next/env" "15.0.2" + "@next/env" "15.1.2" "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.13" + "@swc/helpers" "0.5.15" busboy "1.6.0" caniuse-lite "^1.0.30001579" postcss "8.4.31" styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "15.0.2" - "@next/swc-darwin-x64" "15.0.2" - "@next/swc-linux-arm64-gnu" "15.0.2" - "@next/swc-linux-arm64-musl" "15.0.2" - "@next/swc-linux-x64-gnu" "15.0.2" - "@next/swc-linux-x64-musl" "15.0.2" - "@next/swc-win32-arm64-msvc" "15.0.2" - "@next/swc-win32-x64-msvc" "15.0.2" + "@next/swc-darwin-arm64" "15.1.2" + "@next/swc-darwin-x64" "15.1.2" + "@next/swc-linux-arm64-gnu" "15.1.2" + "@next/swc-linux-arm64-musl" "15.1.2" + "@next/swc-linux-x64-gnu" "15.1.2" + "@next/swc-linux-x64-musl" "15.1.2" + "@next/swc-win32-arm64-msvc" "15.1.2" + "@next/swc-win32-x64-msvc" "15.1.2" sharp "^0.33.5" -nextra-theme-docs@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-3.1.0.tgz#4b797465553dec9f4d40c9eb68290919343bfe9b" - integrity sha512-2zAC+xnqLzl/kLYCaoVfdupyA6pD5OgF+4iR3zQiPOzfnwJikPQePnr3SCT+tPPgYVuoqSDA5GNc9DvvAHtefQ== +nextra-theme-docs@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-3.2.5.tgz#10f4f8cbc3d1a2f210389aae5a98d909f81ea606" + integrity sha512-eF0j1VNNS1rFjZOfYqlrXISaCU3+MhZ9hhXY+TUydRlfELrFWpGzrpW6MiL7hq4JvUR7OBtHHs8+A+8AYcETBQ== dependencies: "@headlessui/react" "^2.1.2" clsx "^2.0.0" escape-string-regexp "^5.0.0" flexsearch "^0.7.43" - next-themes "^0.3.0" + next-themes "^0.4.0" scroll-into-view-if-needed "^3.1.0" zod "^3.22.3" -nextra@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nextra/-/nextra-3.1.0.tgz#ad7fa917955ead82afa0a0fde6414fb81c873434" - integrity sha512-IvG8Q/yLAqSju1zwRPUqC/6WpzAgfmNo6gDw6CIBZJ+3RKdJDsirM/v3BNeN6vx3tSjLFybytOt3spNXHFy/WQ== +nextra@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/nextra/-/nextra-3.2.5.tgz#d3bd2635095b6962a2b805a3b5fa91f20a299110" + integrity sha512-n665DRpI/brjHXM83G5LdlbYA2nOtjaLcWJs7mZS3gkuRDmEXpJj4XJ860xrhkYZW2iYoUMu32zzhPuFByU7VA== dependencies: "@formatjs/intl-localematcher" "^0.5.4" "@headlessui/react" "^2.1.2" @@ -10177,6 +9391,9 @@ nextra@3.1.0: gray-matter "^4.0.3" hast-util-to-estree "^3.1.0" katex "^0.16.9" + mdast-util-from-markdown "^2.0.1" + mdast-util-gfm "^3.0.0" + mdast-util-to-hast "^13.2.0" negotiator "^1.0.0" p-limit "^6.0.0" rehype-katex "^7.0.0" @@ -10189,7 +9406,7 @@ nextra@3.1.0: remark-smartypants "^3.0.0" shiki "^1.0.0" slash "^5.1.0" - title "^3.5.3" + title "^4.0.0" unist-util-remove "^4.0.0" unist-util-visit "^5.0.0" yaml "^2.3.2" @@ -10211,37 +9428,22 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - -node-addon-api@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-fetch@^2.5.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.5, node-fetch@^2.6.7: +node-fetch@^2.5.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.5: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.1: - version "4.8.2" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" - integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^2.1.1: version "2.1.1" @@ -10255,18 +9457,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -10286,13 +9476,6 @@ npm-to-yarn@^3.0.0: resolved "https://registry.yarnpkg.com/npm-to-yarn/-/npm-to-yarn-3.0.0.tgz#05006d97359e285f0316e249dbbe56f377ca1182" integrity sha512-76YnmsbfrYp0tMsWxM0RNX0Vs+x8JxpJGu6B/jDn4lW8+laiTcKmKi9MeMh4UikO4RkJ1oqURoDy9bXJmMXS6A== -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" @@ -10308,19 +9491,11 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1: +object-inspect@^1.13.3: version "1.13.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -10331,7 +9506,7 @@ object-path@^0.11.8: resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== -object.assign@^4.1.4, object.assign@^4.1.5: +object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -10404,12 +9579,14 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-js@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz#8d899714c21f5c7d59a3c0008ca50e848086d740" - integrity sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ== +oniguruma-to-es@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz#999fe7df1e6acae4507e2d77afc6de4fc8533116" + integrity sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg== dependencies: - regex "^4.3.2" + emoji-regex-xs "^1.0.0" + regex "^5.0.2" + regex-recursion "^4.3.0" open@^7.4.2: version "7.4.2" @@ -10425,13 +9602,13 @@ opener@^1.5.2: integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== optimism@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" - integrity sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ== + version "0.18.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.1.tgz#5cf16847921413dbb0ac809907370388b9c6335f" + integrity sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ== dependencies: "@wry/caches" "^1.0.0" "@wry/context" "^0.7.0" - "@wry/trie" "^0.4.3" + "@wry/trie" "^0.5.0" tslib "^2.3.0" optionator@^0.9.3: @@ -10463,11 +9640,6 @@ p-filter@^2.1.0: dependencies: p-map "^2.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - p-limit@3.1.0, p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -10522,31 +9694,24 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" - integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== +pac-proxy-agent@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz#da7c3b5c4cccc6655aaafb701ae140fb23f15df2" + integrity sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.5" + https-proxy-agent "^7.0.6" pac-resolver "^7.0.1" - socks-proxy-agent "^8.0.4" + socks-proxy-agent "^8.0.5" pac-resolver@^7.0.1: version "7.0.1" @@ -10562,9 +9727,9 @@ package-json-from-dist@^1.0.0: integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== package-manager-detector@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.2.tgz#fbbc8afe87cdaee471ca9b89c3700236c6d2d9e5" - integrity sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg== + version "0.2.7" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.7.tgz#6c3e47d7794fdd513512d02e2160c24ba559e39b" + integrity sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ== parent-module@^1.0.0: version "1.0.1" @@ -10574,12 +9739,11 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-entities@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" - integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" - character-entities "^2.0.0" character-entities-legacy "^3.0.0" character-reference-invalid "^2.0.0" decode-named-character-reference "^1.0.0" @@ -10675,11 +9839,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -10703,10 +9862,10 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^4.0.0: version "4.0.0" @@ -10723,7 +9882,7 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -10767,7 +9926,7 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-types@^1.0.3, pkg-types@^1.2.0: +pkg-types@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.1.tgz#6ac4e455a5bb4b9a6185c1c79abd544c901db2e5" integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw== @@ -10794,53 +9953,14 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-calc@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.2.tgz#15f01635a27b9d38913a98c4ef2877f5b715b439" - integrity sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg== - dependencies: - postcss-selector-parser "^6.1.2" - postcss-value-parser "^4.2.0" - -postcss-colormin@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e" - integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA== - dependencies: - browserslist "^4.23.3" - caniuse-api "^3.0.0" - colord "^2.9.3" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz#fc13ecedded6365f3c794b502dbcf77d298da12c" - integrity sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q== - dependencies: - browserslist "^4.23.3" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz#9c414e8ee99d3514ad06a3465ccc20ec1dbce780" - integrity sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA== +postcss-import@16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-16.1.0.tgz#258732175518129667fe1e2e2a05b19b5654b96a" + integrity sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg== dependencies: - postcss-selector-parser "^6.1.2" - -postcss-discard-duplicates@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3" - integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ== - -postcss-discard-empty@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033" - integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA== - -postcss-discard-overridden@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c" - integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w== + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" postcss-import@^15.1.0: version "15.1.0" @@ -10851,15 +9971,6 @@ postcss-import@^15.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-16.1.0.tgz#258732175518129667fe1e2e2a05b19b5654b96a" - integrity sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - postcss-js@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" @@ -10867,7 +9978,15 @@ postcss-js@^4.0.1: dependencies: camelcase-css "^2.0.1" -postcss-load-config@^4.0.1: +postcss-lightningcss@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-lightningcss/-/postcss-lightningcss-1.0.1.tgz#4a28c451e5205e0da6ec9110ad881f8d6b1b222f" + integrity sha512-9IrtZVt2HQ92iZJTkO43Qipx7E3PM+lLzZM8aGwMmMjNQHcir5jNC42U33p3Gh2lj1nES/ireYWEbMrJNiRBoQ== + dependencies: + browserslist "^4.19.1" + lightningcss "^1.22.0" + +postcss-load-config@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== @@ -10875,150 +9994,14 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-merge-longhand@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz#a52d0662b4b29420f3b64a8d5b0ac5133d8db776" - integrity sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^7.0.4" - -postcss-merge-rules@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz#648cc864d3121e6ec72c2a4f08df1cc801e60ce8" - integrity sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg== - dependencies: - browserslist "^4.23.3" - caniuse-api "^3.0.0" - cssnano-utils "^5.0.0" - postcss-selector-parser "^6.1.2" - -postcss-minify-font-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17" - integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959" - integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg== - dependencies: - colord "^2.9.3" - cssnano-utils "^5.0.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe" - integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ== - dependencies: - browserslist "^4.23.3" - cssnano-utils "^5.0.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz#2b69c99ec48a1c223fce4840609d9c53340a11f5" - integrity sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA== - dependencies: - cssesc "^3.0.0" - postcss-selector-parser "^6.1.2" - -postcss-nested@^6.0.1: +postcss-nested@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: postcss-selector-parser "^6.1.1" -postcss-normalize-charset@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001" - integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ== - -postcss-normalize-display-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342" - integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463" - integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b" - integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c" - integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b" - integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713" - integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg== - dependencies: - browserslist "^4.23.3" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6" - integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845" - integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0" - integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw== - dependencies: - cssnano-utils "^5.0.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5" - integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA== - dependencies: - browserslist "^4.23.3" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677" - integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -11026,22 +10009,7 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.1.tgz#2b63571d8e9568384df334bac9917baff4d23f58" - integrity sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^3.3.2" - -postcss-unique-selectors@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz#483fc11215b23d517d5d9bbe5833d9915619ca33" - integrity sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g== - dependencies: - postcss-selector-parser "^6.1.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -11055,10 +10023,10 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23, postcss@^8.4.38, postcss@^8.4.47: - version "8.4.48" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.48.tgz#765f3f8abaa2a2b065cdddbc57ad4cb5a76e515f" - integrity sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA== +postcss@^8.4.47, postcss@^8.4.48: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" picocolors "^1.1.1" @@ -11082,15 +10050,15 @@ prettier-plugin-sh@^0.14.0: mvdan-sh "^0.10.1" sh-syntax "^0.4.1" -prettier-plugin-tailwindcss@0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.8.tgz#8a178e1679e3f941cc9de396f109c6cffea676d8" - integrity sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA== +prettier-plugin-tailwindcss@0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.9.tgz#db84c32918eae9b44e5a5f0aa4d1249cc39fa739" + integrity sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg== -prettier@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== prettier@^2.7.1: version "2.8.8" @@ -11111,14 +10079,6 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -11156,30 +10116,25 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-agent@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" - integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" http-proxy-agent "^7.0.1" - https-proxy-agent "^7.0.3" + https-proxy-agent "^7.0.6" lru-cache "^7.14.1" - pac-proxy-agent "^7.0.1" + pac-proxy-agent "^7.1.0" proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.2" + socks-proxy-agent "^8.0.5" proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - pump@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" @@ -11193,28 +10148,28 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -puppeteer-core@23.8.0: - version "23.8.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.8.0.tgz#745be0a509734c65bd678c08bc9418b0f142cf36" - integrity sha512-c2ymGN2M//We7pC+JhP2dE/g4+qnT89BO+EMSZyJmecN3DN6RNqErA7eH7DrWoNIcU75r2nP4VHa4pswAL6NVg== +puppeteer-core@23.11.1: + version "23.11.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.11.1.tgz#3e064de11b3cb3a2df1a8060ff2d05b41be583db" + integrity sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg== dependencies: - "@puppeteer/browsers" "2.4.1" - chromium-bidi "0.8.0" - debug "^4.3.7" + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.11.0" + debug "^4.4.0" devtools-protocol "0.0.1367902" typed-query-selector "^2.12.0" ws "^8.18.0" -puppeteer@23.8.0: - version "23.8.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.8.0.tgz#24f623223ee7fd74f495a36620f940a2eca9ac88" - integrity sha512-MFWDMWoCcOpwNwQIjA9gPKWrEUbj8bLCzkK56w5lZPMUT6wK4FfpgOEPxKffVmXEMYMZzgcjxzqy15b/Q1ibaw== +puppeteer@23.11.1: + version "23.11.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.11.1.tgz#98fd9040786b1219b1a4f639c270377586e8899c" + integrity sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw== dependencies: - "@puppeteer/browsers" "2.4.1" - chromium-bidi "0.8.0" + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.11.0" cosmiconfig "^9.0.0" devtools-protocol "0.0.1367902" - puppeteer-core "23.8.0" + puppeteer-core "23.11.1" typed-query-selector "^2.12.0" pure-rand@^6.0.0: @@ -11261,13 +10216,12 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== +react-dom@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" + integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" + scheduler "^0.25.0" react-fast-compare@^3.0.1: version "3.2.2" @@ -11302,12 +10256,10 @@ react-player@2.16.0: prop-types "^15.7.2" react-fast-compare "^3.0.1" -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" +react@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" + integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== read-cache@^1.0.0: version "1.0.0" @@ -11378,6 +10330,20 @@ recma-stringify@^1.0.0: unified "^11.0.0" vfile "^6.0.0" +reflect.getprototypeof@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz#c58afb17a4007b4d1118c07b92c23fca422c5d82" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + dunder-proto "^1.0.0" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + gopd "^1.2.0" + which-builtin-type "^1.2.0" + regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" @@ -11402,12 +10368,26 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regex@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/regex/-/regex-4.4.0.tgz#cb731e2819f230fad69089e1bd854fef7569e90a" - integrity sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ== +regex-recursion@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-4.3.0.tgz#32c3a42a57d78bf2d0c83875074c2f7ebaf2a4f6" + integrity sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A== + dependencies: + regex-utilities "^2.3.0" -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: +regex-utilities@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== + +regex@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/regex/-/regex-5.0.2.tgz#291d960467e6499a79ceec022d20a4e0df67c54f" + integrity sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ== + dependencies: + regex-utilities "^2.3.0" + +regexp.prototype.flags@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== @@ -11417,15 +10397,15 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.2" -regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" - regjsparser "^0.11.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -11434,10 +10414,10 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" - integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" @@ -11649,16 +10629,16 @@ resolve-pkg-maps@^1.0.0: integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.22.8: + version "1.22.9" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.9.tgz#6da76e4cdc57181fa4471231400e8851d0a924f3" + integrity sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -11712,16 +10692,6 @@ retext@^9.0.0: retext-stringify "^4.0.0" unified "^11.0.0" -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -11774,40 +10744,39 @@ rxjs@^7.8.1: tslib "^2.1.0" safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0: +safe-buffer@5.2.1, safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" - is-regex "^1.1.4" + is-regex "^1.2.1" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" +scheduler@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" + integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== schema-utils@^2.5.0: version "2.7.1" @@ -11818,7 +10787,7 @@ schema-utils@^2.5.0: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -11827,10 +10796,10 @@ schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== +schema-utils@^4.0.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -11844,11 +10813,6 @@ scroll-into-view-if-needed@^3.1.0: dependencies: compute-scroll-into-view "^3.0.2" -scuid@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" - integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== - section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -11862,7 +10826,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: +semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -11886,7 +10850,7 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^6.0.1: +serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -11908,7 +10872,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -11930,14 +10894,6 @@ set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" -setimmediate-napi@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/setimmediate-napi/-/setimmediate-napi-1.0.6.tgz#43cd797ef25d66eb69c782170ea01898787b8720" - integrity sha512-sdNXN15Av1jPXuSal4Mk4tEAKn0+8lfF9Z50/negaQMrAIO9c1qM0eiCh8fT6gctp0RiCObk+6/Xfn5RMGdZoA== - dependencies: - get-symbol-from-current-process-h "^1.0.1" - get-uv-event-loop-napi-h "^1.0.5" - setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -11955,14 +10911,6 @@ sh-syntax@^0.4.1: dependencies: tslib "^2.6.2" -sha.js@^2.4.11: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - sharp@^0.33.5: version "0.33.5" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" @@ -11992,13 +10940,6 @@ sharp@^0.33.5: "@img/sharp-win32-ia32" "0.33.5" "@img/sharp-win32-x64" "0.33.5" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -12006,20 +10947,15 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== shiki@^0.14.7: version "0.14.7" @@ -12032,28 +10968,58 @@ shiki@^0.14.7: vscode-textmate "^8.0.0" shiki@^1.0.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.22.2.tgz#ed109a3d0850504ad5a1edf8496470a2121c5b7b" - integrity sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA== - dependencies: - "@shikijs/core" "1.22.2" - "@shikijs/engine-javascript" "1.22.2" - "@shikijs/engine-oniguruma" "1.22.2" - "@shikijs/types" "1.22.2" + version "1.24.2" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.24.2.tgz#9db5b2ebe452d24769377c733ae1944f996ad584" + integrity sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg== + dependencies: + "@shikijs/core" "1.24.2" + "@shikijs/engine-javascript" "1.24.2" + "@shikijs/engine-oniguruma" "1.24.2" + "@shikijs/types" "1.24.2" "@shikijs/vscode-textmate" "^9.3.0" "@types/hast" "^3.0.4" -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -12130,25 +11096,16 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" - integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - agent-base "^7.1.1" + agent-base "^7.1.2" debug "^4.3.4" socks "^2.8.3" -socks@^2.6.2, socks@^2.8.3: +socks@^2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -12156,7 +11113,7 @@ socks@^2.6.2, socks@^2.8.3: ip-address "^9.0.5" smart-buffer "^4.2.0" -source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: +source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -12192,13 +11149,13 @@ space-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== -spawndamnit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" - integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== +spawndamnit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-3.0.1.tgz#44410235d3dc4e21f8e4f740ae3266e4486c2aed" + integrity sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg== dependencies: - cross-spawn "^5.1.0" - signal-exit "^3.0.2" + cross-spawn "^7.0.5" + signal-exit "^4.0.1" speech-rule-engine@^4.0.6: version "4.0.7" @@ -12219,13 +11176,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^10.0.0: - version "10.0.6" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" - integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== - dependencies: - minipass "^7.0.3" - stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -12238,22 +11188,15 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.15.0, streamx@^2.20.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.1.tgz#471c4f8b860f7b696feb83d5b125caab2fdbb93c" - integrity sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA== +streamx@^2.15.0, streamx@^2.21.0: + version "2.21.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" + integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== dependencies: fast-fifo "^1.3.2" queue-tick "^1.0.1" @@ -12311,21 +11254,25 @@ string-width@^7.0.0: strip-ansi "^7.1.0" string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.5" es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -12382,11 +11329,6 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -12423,14 +11365,6 @@ styled-jsx@5.1.6: dependencies: client-only "0.0.1" -stylehacks@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.4.tgz#9c21f7374f4bccc0082412b859b3c89d77d3277c" - integrity sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww== - dependencies: - browserslist "^4.23.3" - postcss-selector-parser "^6.1.2" - stylis@^4.3.1: version "4.3.4" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" @@ -12447,7 +11381,7 @@ subscriptions-transport-ws@0.11.0: symbol-observable "^1.0.4" ws "^5.2.0 || ^6.0.0 || ^7.0.0" -sucrase@^3.32.0: +sucrase@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -12460,13 +11394,6 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== - dependencies: - has-flag "^2.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -12486,18 +11413,18 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svelte2tsx@0.7.24: - version "0.7.24" - resolved "https://registry.yarnpkg.com/svelte2tsx/-/svelte2tsx-0.7.24.tgz#d508e29b4486620c2213dbb66bcb01038e31038f" - integrity sha512-KbKD+5aqTYdRPfAroA72xc3kEz3Dj0Vq7X3IjHLWbwfco7pwioEx4x/V9lOpKmkHlYh9YNPkqXWlbrH7Cc580A== +svelte2tsx@0.7.31: + version "0.7.31" + resolved "https://registry.yarnpkg.com/svelte2tsx/-/svelte2tsx-0.7.31.tgz#28c76b15f97c3c48da8d4cc1ab979372b9d25100" + integrity sha512-exrN1o9mdCLAA7hTCudz731FIxomH/0SN9ZIX+WrY/XnlLuno/NNC1PF6JXPZVqp/4sMMDKteqyKoG44hliljQ== dependencies: dedent-js "^1.0.1" pascal-case "^3.1.1" -svelte@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.2.0.tgz#ba5c909947dbf0f929e3b097000fe09b7920f5bb" - integrity sha512-LOowFhMB0CoTzDsa90snaICFMftrxKlYsOhH4YP1AamjCSDBZvtDq0yB5QY8LJA1tFftcmpAhmLCK/gAOFNrtw== +svelte@5.14.4: + version "5.14.4" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.14.4.tgz#d1f8add8cf91cb5c6b8d7bfe5c3a660676e01aa7" + integrity sha512-2iR/UHHA2Dsldo4JdXDcdqT+spueuh+uNYw1FoTKBbpnFEECVISeqSo0uubPS4AfBE0xI6u7DGHxcdq3DTDmoQ== dependencies: "@ampproject/remapping" "^2.3.0" "@jridgewell/sourcemap-codec" "^1.5.0" @@ -12506,26 +11433,13 @@ svelte@5.2.0: acorn-typescript "^1.4.13" aria-query "^5.3.1" axobject-query "^4.1.0" - esm-env "^1.0.0" - esrap "^1.2.2" + esm-env "^1.2.1" + esrap "^1.3.1" is-reference "^3.0.3" locate-character "^3.0.0" magic-string "^0.30.11" zimmerframe "^1.1.2" -svgo@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" - integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^5.1.0" - css-tree "^2.3.1" - css-what "^6.1.0" - csso "^5.0.5" - picocolors "^1.0.0" - symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -12544,43 +11458,48 @@ synckit@^0.9.0: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +system-architecture@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/system-architecture/-/system-architecture-0.1.0.tgz#71012b3ac141427d97c67c56bc7921af6bff122d" + integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA== + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tailwind-merge@^2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz#4bf574e81fa061adeceba099ae4df56edcee78d1" - integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q== + version "2.5.5" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.5.tgz#98167859b856a2a6b8d2baf038ee171b9d814e39" + integrity sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA== -tailwindcss@^3.4.3: - version "3.4.14" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.14.tgz#6dd23a7f54ec197b19159e91e3bb1e55e7aa73ac" - integrity sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA== +tailwindcss@3.4.17: + version "3.4.17" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63" + integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.5.3" + chokidar "^3.6.0" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.0" + fast-glob "^3.3.2" glob-parent "^6.0.2" is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" + jiti "^1.21.6" + lilconfig "^3.1.3" + micromatch "^4.0.8" normalize-path "^3.0.0" object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" + picocolors "^1.1.1" + postcss "^8.4.47" postcss-import "^15.1.0" postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" @@ -12607,38 +11526,26 @@ tar-stream@^3.1.5: fast-fifo "^1.2.0" streamx "^2.15.0" -tar@^6.1.11: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - term-size@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + version "5.3.11" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz#93c21f44ca86634257cac176f884f942b7ba3832" + integrity sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ== dependencies: - "@jridgewell/trace-mapping" "^0.3.20" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" -terser@^5.26.0: - version "5.36.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" - integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== +terser@^5.31.1: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -12655,14 +11562,11 @@ test-exclude@^6.0.0: minimatch "^3.0.4" text-decoder@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.1.tgz#e173f5121d97bfa3ff8723429ad5ba92e1ead67e" - integrity sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" thenify-all@^1.0.0: version "1.6.0" @@ -12688,20 +11592,14 @@ tinyexec@^0.3.0: resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== -title@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" - integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== +title@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/title/-/title-4.0.1.tgz#f5226a0fbec7b3a1c42c2772d67a493d2f189c87" + integrity sha512-xRnPkJx9nvE5MF6LkB5e8QJjE2FW8269wTu/LQdf7zZqBgPly0QJPf/CWAo7srj5so4yXfoLEdCFgurlpi47zg== dependencies: - arg "1.0.0" - chalk "2.3.0" - clipboardy "1.2.2" - titleize "1.0.0" - -titleize@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" - integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== + arg "^5.0.0" + chalk "^5.0.0" + clipboardy "^4.0.0" tmp@^0.0.33: version "0.0.33" @@ -12753,20 +11651,15 @@ trough@^2.0.0: integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-api-utils@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" - integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -ts-graphviz@^1.5.4: - version "1.8.2" - resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-1.8.2.tgz#6c4768d05f8a36e37abe34855ffe89a4c4bd96cc" - integrity sha512-5YhbFoHmjxa7pgQLkB07MtGnGJ/yhvjmc9uhsnDBEICME6gkPf83SBwLDQqGDoCa3XzUMWLk1AU2Wn1u1naDtA== - ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -12794,25 +11687,6 @@ ts-jest@29.2.5: semver "^7.6.3" yargs-parser "^21.1.1" -ts-node@10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -12823,11 +11697,21 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.6.3: +tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.8.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tsx@4.19.2: + version "4.19.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.2.tgz#2d7814783440e0ae42354d0417d9c2989a2ae92c" + integrity sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + twoslash-protocol@0.2.12: version "0.2.12" resolved "https://registry.yarnpkg.com/twoslash-protocol/-/twoslash-protocol-0.2.12.tgz#4c22fc287bc0fc32eec8e7faa6092b0dc5cc4ecb" @@ -12887,9 +11771,9 @@ typed-array-byte-length@^1.0.1: is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -12897,35 +11781,36 @@ typed-array-byte-offset@^1.0.2: gopd "^1.0.1" has-proto "^1.0.3" is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typed-query-selector@^2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== -typedoc-plugin-markdown@3.16.0: - version "3.16.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.16.0.tgz#98da250271aafade8b6740a8116a97cd3941abcd" - integrity sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw== +typedoc-plugin-markdown@3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz#c33f42363c185adf842f4699166015f7fe0ed02b" + integrity sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw== dependencies: handlebars "^4.7.7" -typedoc-plugin-rename-defaults@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-rename-defaults/-/typedoc-plugin-rename-defaults-0.7.0.tgz#8cd477b4e914c6021a1a0e1badaa869159bb6945" - integrity sha512-NudSQ1o/XLHNF9c4y7LzIZxfE9ltz09yCDklBPJpP5VMRvuBpYGIbQ0ZgmPz+EIV8vPx9Z/OyKwzp4HT2vDtfg== +typedoc-plugin-rename-defaults@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/typedoc-plugin-rename-defaults/-/typedoc-plugin-rename-defaults-0.7.2.tgz#376b701f8b73fd62dbf083d5c6eab8e057f0a92c" + integrity sha512-9oa1CsMN4p/xuVR2JW2YDD6xE7JcrIth3KAfjR8YBi6NnrDk2Q72o4lbArybLDjxKAkOzk7N1uUdGwJlooLEOg== dependencies: camelcase "^8.0.0" @@ -12939,10 +11824,10 @@ typedoc@0.25.13: minimatch "^9.0.3" shiki "^0.14.7" -typescript@5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== ua-parser-js@^1.0.35: version "1.0.39" @@ -12977,10 +11862,10 @@ unbzip2-stream@^1.4.3: buffer "^5.2.1" through "^2.3.8" -undici-types@~6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -13031,20 +11916,6 @@ unified@^11.0.0, unified@^11.0.4, unified@^11.0.5: trough "^2.0.0" vfile "^6.0.0" -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - unist-util-find-after@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" @@ -13215,7 +12086,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urlpattern-polyfill@10.0.0, urlpattern-polyfill@^10.0.0: +urlpattern-polyfill@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== @@ -13230,16 +12101,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^9.0.0, uuid@^9.0.1: +uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - v8-to-istanbul@^9.0.1: version "9.3.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" @@ -13346,17 +12212,6 @@ vscode-uri@~3.0.8: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== -wait-on@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-8.0.1.tgz#13c8ec77115517f8fbc2d670521a444201f03f53" - integrity sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig== - dependencies: - axios "^1.7.7" - joi "^17.13.3" - lodash "^4.17.21" - minimist "^1.2.8" - rxjs "^7.8.1" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -13372,15 +12227,6 @@ watchpack@^2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -weak-napi@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/weak-napi/-/weak-napi-2.0.2.tgz#40662d0931498397979edb38a571409f5afce6d3" - integrity sha512-LcOSVFrghtVXf4QH+DLIy8iPiCktV7lVbqRDYP+bDPpLzC41RCHQPMyQOnPpWO41Ie4CmnDxS+mbL72r5xFMMQ== - dependencies: - node-addon-api "^3.0.0" - node-gyp-build "^4.2.1" - setimmediate-napi "^1.0.3" - web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" @@ -13415,16 +12261,16 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.96.1, webpack@^5: - version "5.96.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" - integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== +webpack@5.97.1, webpack@^5: + version "5.97.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" + integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.14.0" browserslist "^4.24.0" chrome-trace-event "^1.0.2" @@ -13452,18 +12298,37 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" + +which-builtin-type@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-collection@^1.0.1: +which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -13478,10 +12343,10 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.16: + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -13489,13 +12354,6 @@ which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: gopd "^1.0.1" has-tostringtag "^1.0.2" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -13606,30 +12464,15 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@^0.0.43: - version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^2.2.2, yaml@^2.3.2, yaml@^2.3.4, yaml@~2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" - integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== +yaml@^2.2.2, yaml@^2.3.2, yaml@^2.3.4, yaml@~2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yargs-parser@^18.1.2: version "18.1.3" @@ -13682,11 +12525,6 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"