From 8e9d26767695836b7d7b6540e0012cc8f3741f72 Mon Sep 17 00:00:00 2001 From: riceharvest Date: Tue, 24 Mar 2026 01:55:48 +0100 Subject: [PATCH 1/4] feat: fork identity-obj-proxy as @opensourceframework/identity-obj-proxy Fixes #100 --- .../src/__tests__/smoke.test.js | 7 + pnpm-lock.yaml | 138 ++++++++++-------- 2 files changed, 87 insertions(+), 58 deletions(-) create mode 100644 packages/identity-obj-proxy/src/__tests__/smoke.test.js diff --git a/packages/identity-obj-proxy/src/__tests__/smoke.test.js b/packages/identity-obj-proxy/src/__tests__/smoke.test.js new file mode 100644 index 00000000..75540fa4 --- /dev/null +++ b/packages/identity-obj-proxy/src/__tests__/smoke.test.js @@ -0,0 +1,7 @@ +const idObj = require('..'); + +describe('identity-obj-proxy fork', () => { + it('should return the key as a string (smoke test)', () => { + expect(idObj.smoke).toBe('smoke'); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b0f07cb..a5d6dfda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: devDependencies: '@opensourceframework/tsconfig': specifier: '*' - version: 1.0.0 + version: link:../../tools/tsconfig '@vitest/coverage-v8': specifier: ^2.1.9 version: 2.1.9(vitest@2.1.9(@types/node@25.4.0)(happy-dom@20.8.3)(jsdom@25.0.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.4.0)(typescript@5.9.3))(terser@5.46.0)) @@ -225,7 +225,7 @@ importers: version: 29.7.0(@babel/core@7.29.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) packages/next-auth: dependencies: @@ -1270,7 +1270,7 @@ importers: version: 2.1.1 lucide-react: specifier: latest - version: 0.577.0(react@19.2.4) + version: 1.0.1(react@19.2.4) next: specifier: '>=16.1.7' version: 16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -1301,7 +1301,7 @@ importers: version: 8.5.8 tailwindcss: specifier: latest - version: 4.2.1 + version: 4.2.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -3321,9 +3321,6 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@opensourceframework/tsconfig@1.0.0': - resolution: {integrity: sha512-T1fr6BMd+VnSdsjfU8s9SXHysC/ghPqAMX1eLF1uyNfRHTr2sKnUAXeputattGTN3IULlcHiKjFf8TI99M8BHg==} - '@panva/asn1.js@1.0.0': resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} engines: {node: '>=10.13.0'} @@ -5105,19 +5102,22 @@ packages: bare-buffer: optional: true - bare-os@3.8.0: - resolution: {integrity: sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==} + bare-os@3.8.4: + resolution: {integrity: sha512-4JboWUl7/2LhgU536tjUszzaVC8/WEWKtyX5crayvlN71ih8+O2SdvBhotQeDsuhhmPZmLCrPBJEcwVPhI/kkQ==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.10.0: - resolution: {integrity: sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==} + bare-stream@2.11.0: + resolution: {integrity: sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw==} peerDependencies: + bare-abort-controller: '*' bare-buffer: '*' bare-events: '*' peerDependenciesMeta: + bare-abort-controller: + optional: true bare-buffer: optional: true bare-events: @@ -8372,8 +8372,8 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.577.0: - resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} + lucide-react@1.0.1: + resolution: {integrity: sha512-lih7tKEczCYOQjVEzpFuxEuNzlwf+1yhvlMlEkGWJM3va8Pugv8bYXc/pRtcjPncaP7k84X0Pt/71ufxvqEPtQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -10867,9 +10867,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.2.1: - resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} - tailwindcss@4.2.2: resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} @@ -14704,8 +14701,6 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opensourceframework/tsconfig@1.0.0': {} - '@panva/asn1.js@1.0.0': {} '@pkgjs/parseargs@0.11.0': @@ -16964,7 +16959,7 @@ snapshots: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.10.0(bare-events@2.8.2) + bare-stream: 2.11.0(bare-events@2.8.2) bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: @@ -16972,22 +16967,21 @@ snapshots: - react-native-b4a optional: true - bare-os@3.8.0: + bare-os@3.8.4: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.8.0 + bare-os: 3.8.4 optional: true - bare-stream@2.10.0(bare-events@2.8.2): + bare-stream@2.11.0(bare-events@2.8.2): dependencies: streamx: 2.25.0 teex: 1.0.1 optionalDependencies: bare-events: 2.8.2 transitivePeerDependencies: - - bare-abort-controller - react-native-b4a optional: true @@ -17487,13 +17481,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@24.10.13): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@24.10.13) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17501,14 +17495,15 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true - create-jest@29.7.0(@types/node@24.10.13): + create-jest@29.7.0(@types/node@25.4.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.10.13) + jest-config: 29.7.0(@types/node@25.4.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17518,13 +17513,13 @@ snapshots: - ts-node optional: true - create-jest@29.7.0(@types/node@25.4.0): + create-jest@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@25.4.0) + jest-config: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17532,7 +17527,6 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - optional: true cross-fetch@4.0.0(encoding@0.1.13): dependencies: @@ -20268,37 +20262,36 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest-cli@29.7.0(@types/node@24.10.13): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@24.10.13) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@24.10.13) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true - jest-cli@29.7.0(@types/node@24.10.13): + jest-cli@29.7.0(@types/node@25.4.0): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.10.13) + create-jest: 29.7.0(@types/node@25.4.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.10.13) + jest-config: 29.7.0(@types/node@25.4.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -20309,25 +20302,26 @@ snapshots: - ts-node optional: true - jest-cli@29.7.0(@types/node@25.4.0): + jest-cli@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@25.4.0) + create-jest: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@25.4.0) + jest-config: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 + optionalDependencies: + node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - optional: true jest-config@28.1.3(@types/node@22.19.15): dependencies: @@ -20573,6 +20567,36 @@ snapshots: - supports-color optional: true + jest-config@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.29.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 25.4.0 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-dev-server@9.0.2: dependencies: chalk: 4.1.2 @@ -21186,26 +21210,25 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest@29.7.0(@types/node@24.10.13): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.19.15)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 + jest-cli: 29.7.0(@types/node@24.10.13) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true - jest@29.7.0(@types/node@24.10.13): + jest@29.7.0(@types/node@25.4.0): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.10.13) + jest-cli: 29.7.0(@types/node@25.4.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21213,18 +21236,19 @@ snapshots: - ts-node optional: true - jest@29.7.0(@types/node@25.4.0): + jest@29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@25.4.0) + jest-cli: 29.7.0(@types/node@25.4.0)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + optionalDependencies: + node-notifier: 8.0.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - optional: true jiti@1.21.7: {} @@ -21682,7 +21706,7 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.577.0(react@19.2.4): + lucide-react@1.0.1(react@19.2.4): dependencies: react: 19.2.4 @@ -25062,8 +25086,6 @@ snapshots: - tsx - yaml - tailwindcss@4.2.1: {} - tailwindcss@4.2.2: {} tapable@2.3.0: {} From 00f39d8055b1d1cf22749724b17775ad16fd312e Mon Sep 17 00:00:00 2001 From: riceharvest Date: Tue, 24 Mar 2026 02:05:58 +0100 Subject: [PATCH 2/4] feat: fork next-sitemap as @opensourceframework/next-sitemap Fixes #101 --- packages/next-sitemap/.npmignore | 2 + packages/next-sitemap/README.md | 538 +-- packages/next-sitemap/bin/next-sitemap.cjs | 10 + packages/next-sitemap/bin/next-sitemap.mjs | 9 + packages/next-sitemap/package.json | 95 +- packages/next-sitemap/scripts/fix-cjs.cjs | 38 + .../next-sitemap/src/__fixtures__/config.ts | 34 + .../next-sitemap/src/__fixtures__/manifest.ts | 125 + .../generate-robots-txt.test.ts.snap | 26 + .../generate-robots-txt.test.ts | 14 + .../build-sitemap-xml.test.ts.snap | 37 + .../sitemap-builder/build-sitemap-xml.test.ts | 157 + .../__snapshots__/absolute-url.test.ts.snap | 3 + .../url-set-builder/absolute-url.test.ts | 37 + .../url-set-builder/create-url-set.test.ts | 753 ++++ .../normalize-sitemap-field.test.ts | 64 + .../src/builders/exportable-builder.ts | 237 ++ .../src/builders/robots-txt-builder.ts | 71 + .../src/builders/sitemap-builder.ts | 302 ++ .../src/builders/url-set-builder.ts | 158 + packages/next-sitemap/src/cli.ts | 57 + packages/next-sitemap/src/index.ts | 10 + packages/next-sitemap/src/interface.ts | 307 ++ packages/next-sitemap/src/logger.ts | 99 + .../next-sitemap/src/parsers/config-parser.ts | 114 + .../src/parsers/manifest-parser.ts | 80 + packages/next-sitemap/src/ssr/response.ts | 46 + .../next-sitemap/src/ssr/sitemap-index.ts | 38 + packages/next-sitemap/src/ssr/sitemap.ts | 39 + .../src/utils/__tests__/array.test.ts | 40 + .../src/utils/__tests__/defaults.test.ts | 198 + .../src/utils/__tests__/url.test.ts | 80 + packages/next-sitemap/src/utils/array.ts | 46 + packages/next-sitemap/src/utils/defaults.ts | 73 + packages/next-sitemap/src/utils/file.ts | 55 + packages/next-sitemap/src/utils/matcher.ts | 142 + packages/next-sitemap/src/utils/merge.ts | 13 + packages/next-sitemap/src/utils/path.ts | 70 + packages/next-sitemap/src/utils/url.ts | 61 + packages/next-sitemap/tsconfig.json | 14 +- pnpm-lock.yaml | 3552 +---------------- 41 files changed, 3836 insertions(+), 4008 deletions(-) create mode 100644 packages/next-sitemap/.npmignore create mode 100755 packages/next-sitemap/bin/next-sitemap.cjs create mode 100755 packages/next-sitemap/bin/next-sitemap.mjs create mode 100644 packages/next-sitemap/scripts/fix-cjs.cjs create mode 100644 packages/next-sitemap/src/__fixtures__/config.ts create mode 100644 packages/next-sitemap/src/__fixtures__/manifest.ts create mode 100644 packages/next-sitemap/src/builders/__tests__/robots-txt-builder/__snapshots__/generate-robots-txt.test.ts.snap create mode 100644 packages/next-sitemap/src/builders/__tests__/robots-txt-builder/generate-robots-txt.test.ts create mode 100644 packages/next-sitemap/src/builders/__tests__/sitemap-builder/__snapshots__/build-sitemap-xml.test.ts.snap create mode 100644 packages/next-sitemap/src/builders/__tests__/sitemap-builder/build-sitemap-xml.test.ts create mode 100644 packages/next-sitemap/src/builders/__tests__/url-set-builder/__snapshots__/absolute-url.test.ts.snap create mode 100644 packages/next-sitemap/src/builders/__tests__/url-set-builder/absolute-url.test.ts create mode 100644 packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts create mode 100644 packages/next-sitemap/src/builders/__tests__/url-set-builder/normalize-sitemap-field.test.ts create mode 100644 packages/next-sitemap/src/builders/exportable-builder.ts create mode 100644 packages/next-sitemap/src/builders/robots-txt-builder.ts create mode 100644 packages/next-sitemap/src/builders/sitemap-builder.ts create mode 100644 packages/next-sitemap/src/builders/url-set-builder.ts create mode 100644 packages/next-sitemap/src/cli.ts create mode 100644 packages/next-sitemap/src/index.ts create mode 100644 packages/next-sitemap/src/interface.ts create mode 100644 packages/next-sitemap/src/logger.ts create mode 100644 packages/next-sitemap/src/parsers/config-parser.ts create mode 100644 packages/next-sitemap/src/parsers/manifest-parser.ts create mode 100644 packages/next-sitemap/src/ssr/response.ts create mode 100644 packages/next-sitemap/src/ssr/sitemap-index.ts create mode 100644 packages/next-sitemap/src/ssr/sitemap.ts create mode 100644 packages/next-sitemap/src/utils/__tests__/array.test.ts create mode 100644 packages/next-sitemap/src/utils/__tests__/defaults.test.ts create mode 100644 packages/next-sitemap/src/utils/__tests__/url.test.ts create mode 100644 packages/next-sitemap/src/utils/array.ts create mode 100644 packages/next-sitemap/src/utils/defaults.ts create mode 100644 packages/next-sitemap/src/utils/file.ts create mode 100644 packages/next-sitemap/src/utils/matcher.ts create mode 100644 packages/next-sitemap/src/utils/merge.ts create mode 100644 packages/next-sitemap/src/utils/path.ts create mode 100644 packages/next-sitemap/src/utils/url.ts mode change 100755 => 100644 packages/next-sitemap/tsconfig.json diff --git a/packages/next-sitemap/.npmignore b/packages/next-sitemap/.npmignore new file mode 100644 index 00000000..b6ff2ccb --- /dev/null +++ b/packages/next-sitemap/.npmignore @@ -0,0 +1,2 @@ +src +tsconfig.json diff --git a/packages/next-sitemap/README.md b/packages/next-sitemap/README.md index cb62bb01..a8b2a990 100644 --- a/packages/next-sitemap/README.md +++ b/packages/next-sitemap/README.md @@ -1,537 +1 @@ -[![BANNER](./assets/banner.svg)](https://vercel.com/?utm_source=@opensourceframework/next-sitemap&utm_campaign=oss) - -
- -[![Build Status](https://dev.azure.com/iamvishnusankar/Public/_apis/build/status/iamvishnusankar.@opensourceframework/next-sitemap?branchName=master)](https://dev.azure.com/iamvishnusankar/Public/_build/latest?definitionId=126&branchName=master) -[![npm version](https://badge.fury.io/js/@opensourceframework/next-sitemap.svg)](https://badge.fury.io/js/@opensourceframework/next-sitemap) -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/iamvishnusankar/@opensourceframework/next-sitemap/pulls) - -follow on Twitter - - -
- -## Table of contents - -- [Getting started](#getting-started) - - [Installation](#installation) - - [Create config file](#create-config-file) - - [Building sitemaps](#building-sitemaps) - - [Custom config file](#custom-config-file) - - [Building sitemaps with pnpm](#building-sitemaps-with-pnpm) -- [Index sitemaps](#index-sitemaps-optional) -- [Splitting large sitemap into multiple files](#splitting-large-sitemap-into-multiple-files) -- [Configuration Options](#configuration-options) -- [Custom transformation function](#custom-transformation-function) -- [Full configuration example](#full-configuration-example) -- [Generating dynamic/server-side sitemaps](#generating-dynamicserver-side-sitemaps) -- [Typescript JSDoc](#typescript-jsdoc) - -## Getting started - -#### Attribution - -- **Original Author**: Unknown -- **Original Repository**: https://github.com/iamvishnusankar/next-sitemap -- **Original License**: MIT - - - -```shell -yarn add @opensourceframework/next-sitemap -``` - -### Create config file - -`@opensourceframework/next-sitemap` requires a basic config file (`@opensourceframework/next-sitemap.config.js`) under your project root - -> ✅ `@opensourceframework/next-sitemap` will load environment variables from `.env` files by default. - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - siteUrl: process.env.SITE_URL || 'https://example.com', - generateRobotsTxt: true, // (optional) - // ...other options -} -``` - -### Building sitemaps - -Add @opensourceframework/next-sitemap as your postbuild script - -```json -{ - "build": "next build", - "postbuild": "@opensourceframework/next-sitemap" -} -``` - -#### Custom config file - -You can also use a custom config file instead of `@opensourceframework/next-sitemap.config.js`. Just pass `--config .js` to build command (Example: [custom-config-file](https://github.com/iamvishnusankar/@opensourceframework/next-sitemap/tree/master/examples/custom-config-file)) - -```json -{ - "build": "next build", - "postbuild": "@opensourceframework/next-sitemap --config awesome.config.js" -} -``` - -#### Building sitemaps with pnpm - -When using pnpm you need to create a `.npmrc` file in the root of your project if you want to use a postbuild step: - -``` -//.npmrc -enable-pre-post-scripts=true -``` - -## Index sitemaps (Optional) - -📣 From `@opensourceframework/next-sitemap` v2.x onwards, `sitemap.xml` will be [Index Sitemap](https://developers.google.com/search/docs/advanced/sitemaps/large-sitemaps). It will contain urls of all other generated sitemap endpoints. - -Index sitemap generation can be turned off by setting `generateIndexSitemap: false` in @opensourceframework/next-sitemap config file. (This is useful for small/hobby sites which does not require an index sitemap) (Example: [no-index-sitemaps](https://github.com/iamvishnusankar/@opensourceframework/next-sitemap/tree/master/examples/no-index-sitemaps)) - -## Splitting large sitemap into multiple files - -Define the `sitemapSize` property in `@opensourceframework/next-sitemap.config.js` to split large sitemap into multiple files. - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - siteUrl: 'https://example.com', - generateRobotsTxt: true, - sitemapSize: 7000, -} -``` - -Above is the minimal configuration to split a large sitemap. When the number of URLs in a sitemap is more than 7000, `@opensourceframework/next-sitemap` will create sitemap (e.g. sitemap-0.xml, sitemap-1.xml) and index (e.g. sitemap.xml) files. - -## Configuration Options - -| property | description | type | -| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | -| siteUrl | Base url of your website | string | -| output (optional) | Next.js output modes. [Check documentation](https://nextjs.org/docs/pages/api-reference/next-config-js/output). | `standalone`, `export` | -| changefreq (optional) | Change frequency. Default `daily` | string | -| priority (optional) | Priority. Default `0.7` | number | -| sitemapBaseFileName (optional) | The name of the generated sitemap file before the file extension. Default `"sitemap"` | string | -| alternateRefs (optional) | Denote multi-language support by unique URL. Default `[]` | AlternateRef[] | -| sitemapSize(optional) | Split large sitemap into multiple files by specifying sitemap size. Default `5000` | number | -| autoLastmod (optional) | Add `` property. Default `true` | true | -| exclude (optional) | Array of **relative** paths ([wildcard pattern supported](https://www.npmjs.com/package/matcher#usage)) to exclude from listing on `sitemap.xml` or `sitemap-*.xml`. e.g.: `['/page-0', '/page-*', '/private/*']`.

Apart from this option `@opensourceframework/next-sitemap` also offers a custom `transform` option which could be used to exclude urls that match specific patterns | string[] | -| sourceDir (optional) | next.js build directory. Default `.next` | string | -| outDir (optional) | All the generated files will be exported to this directory. Default `public` | string | -| transform (optional) | A transformation function, which runs **for each** `relative-path` in the sitemap. Returning `null` value from the transformation function will result in the exclusion of that specific `path` from the generated sitemap list. | async function | -| additionalPaths (optional) | Async function that returns a list of additional paths to be added to the generated sitemap list. | async function | -| generateIndexSitemap | Generate index sitemaps. Default `true` | boolean | -| generateRobotsTxt (optional) | Generate a `robots.txt` file and list the generated sitemaps. Default `false` | boolean | -| robotsTxtOptions.transformRobotsTxt (optional) | Custom robots.txt transformer function. (Example: [custom-robots-txt-transformer](https://github.com/iamvishnusankar/@opensourceframework/next-sitemap/tree/master/examples/custom-robots-txt-transformer))

Default: `async(config, robotsTxt)=> robotsTxt` | async function | -| robotsTxtOptions.policies (optional) | Policies for generating `robots.txt`.

Default:
`[{ userAgent: '*', allow: '/' }]` | [IRobotPolicy[]](https://github.com/iamvishnusankar/@opensourceframework/next-sitemap/blob/master/packages/@opensourceframework/next-sitemap/src/interface.ts#L14) | -| robotsTxtOptions.additionalSitemaps (optional) | Options to add additional sitemaps to `robots.txt` host entry | string[] | -| robotsTxtOptions.includeNonIndexSitemaps (optional) | From v2.4x onwards, generated `robots.txt` will only contain url of `index sitemap` and custom provided endpoints from `robotsTxtOptions.additionalSitemaps`.

This is to prevent duplicate url submission (once through index-sitemap -> sitemap-url and once through robots.txt -> HOST)

Set this option `true` to add all generated sitemap endpoints to `robots.txt`

Default `false` (Recommended) | boolean | - -## Custom transformation function - -Custom transformation provides an extension method to add, remove or exclude `path` or `properties` from a url-set. Transform function runs **for each** `relative path` in the sitemap. And use the `key`: `value` object to add properties in the XML. - -Returning `null` value from the transformation function will result in the exclusion of that specific `relative-path` from the generated sitemap list. - -```jsx -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - transform: async (config, path) => { - // custom function to ignore the path - if (customIgnoreFunction(path)) { - return null - } - - // only create changefreq along with path - // returning partial properties will result in generation of XML field with only returned values. - if (customLimitedField(path)) { - // This returns `path` & `changefreq`. Hence it will result in the generation of XML field with `path` and `changefreq` properties only. - return { - loc: path, // => this will be exported as http(s):/// - changefreq: 'weekly', - } - } - - // Use default transformation for all other cases - return { - loc: path, // => this will be exported as http(s):/// - changefreq: config.changefreq, - priority: config.priority, - lastmod: config.autoLastmod ? new Date().toISOString() : undefined, - alternateRefs: config.alternateRefs ?? [], - } - }, -} -``` - -## Additional paths function - -`additionalPaths` this function can be useful if you have a large list of pages, but you don't want to render them all and use [fallback: true](https://nextjs.org/docs/basic-features/data-fetching#fallback-true). Result of executing this function will be added to the general list of paths and processed with `sitemapSize`. You are free to add dynamic paths, but unlike `additionalSitemap`, you do not need to split the list of paths into different files in case there are a lot of paths for one file. - -If your function returns a path that already exists, then it will simply be updated, duplication will not happen. - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - additionalPaths: async (config) => { - const result = [] - - // required value only - result.push({ loc: '/additional-page-1' }) - - // all possible values - result.push({ - loc: '/additional-page-2', - changefreq: 'yearly', - priority: 0.7, - lastmod: new Date().toISOString(), - - // acts only on '/additional-page-2' - alternateRefs: [ - { - href: 'https://es.example.com', - hreflang: 'es', - }, - { - href: 'https://fr.example.com', - hreflang: 'fr', - }, - ], - }) - - // using transformation from the current configuration - result.push(await config.transform(config, '/additional-page-3')) - - return result - }, -} -``` - -## Google News, image and video sitemap - -Url set can contain additional sitemaps defined by google. These are -[Google News sitemap](https://developers.google.com/search/docs/advanced/sitemaps/news-sitemap), -[image sitemap](https://developers.google.com/search/docs/advanced/sitemaps/image-sitemaps) or -[video sitemap](https://developers.google.com/search/docs/advanced/sitemaps/video-sitemaps). -You can add the values for these sitemaps by updating entry in `transform` function or adding it with -`additionalPaths`. You have to return a sitemap entry in both cases, so it's the best place for updating -the output. This example will add an image and news tag to each entry but IRL you would of course use it with -some condition or within `additionalPaths` result. - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -const config = { - transform: async (config, path) => { - return { - loc: path, // => this will be exported as http(s):/// - changefreq: config.changefreq, - priority: config.priority, - lastmod: config.autoLastmod ? new Date().toISOString() : undefined, - images: [{ loc: 'https://example.com/image.jpg' }], - news: { - title: 'Article 1', - publicationName: 'Google Scholar', - publicationLanguage: 'en', - date: new Date(), - }, - } - }, -} - -export default config -``` - -## Full configuration example - -Here's an example `@opensourceframework/next-sitemap.config.js` configuration with all options - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ - -module.exports = { - siteUrl: 'https://example.com', - changefreq: 'daily', - priority: 0.7, - sitemapSize: 5000, - generateRobotsTxt: true, - exclude: ['/protected-page', '/awesome/secret-page'], - alternateRefs: [ - { - href: 'https://es.example.com', - hreflang: 'es', - }, - { - href: 'https://fr.example.com', - hreflang: 'fr', - }, - ], - // Default transformation function - transform: async (config, path) => { - return { - loc: path, // => this will be exported as http(s):/// - changefreq: config.changefreq, - priority: config.priority, - lastmod: config.autoLastmod ? new Date().toISOString() : undefined, - alternateRefs: config.alternateRefs ?? [], - } - }, - additionalPaths: async (config) => [ - await config.transform(config, '/additional-page'), - ], - robotsTxtOptions: { - policies: [ - { - userAgent: '*', - allow: '/', - }, - { - userAgent: 'test-bot', - allow: ['/path', '/path-2'], - }, - { - userAgent: 'black-listed-bot', - disallow: ['/sub-path-1', '/path-2'], - }, - ], - additionalSitemaps: [ - 'https://example.com/my-custom-sitemap-1.xml', - 'https://example.com/my-custom-sitemap-2.xml', - 'https://example.com/my-custom-sitemap-3.xml', - ], - }, -} -``` - -Above configuration will generate sitemaps based on your project and a `robots.txt` like this. - -```txt -# * -User-agent: * -Allow: / - -# test-bot -User-agent: test-bot -Allow: /path -Allow: /path-2 - -# black-listed-bot -User-agent: black-listed-bot -Disallow: /sub-path-1 -Disallow: /path-2 - -# Host -Host: https://example.com - -# Sitemaps -Sitemap: https://example.com/sitemap.xml # Index sitemap -Sitemap: https://example.com/my-custom-sitemap-1.xml -Sitemap: https://example.com/my-custom-sitemap-2.xml -Sitemap: https://example.com/my-custom-sitemap-3.xml -``` - -## Generating dynamic/server-side sitemaps - -`@opensourceframework/next-sitemap` now provides two APIs to generate server side sitemaps. This will help to dynamically generate `index-sitemap`(s) and `sitemap`(s) by sourcing data from CMS or custom source. - -- `getServerSideSitemapIndex`: Generates index sitemaps based on urls provided and returns `application/xml` response. Supports next13+ route.{ts,js} file. - - - To continue using inside pages directory, import `getServerSideSitemapIndexLegacy` instead. - -- `getServerSideSitemap`: Generates sitemap based on field entires and returns `application/xml` response. Supports next13+ route.{ts,js} file. - - To continue using inside pages directory, import `getServerSideSitemapLegacy` instead. - -### Server side index-sitemaps (getServerSideSitemapIndex) - -Here's a sample script to generate index-sitemap on server side. - -
-1. Index sitemap (app directory) - -Create `app/server-sitemap-index.xml/route.ts` file. - -```ts -// app/server-sitemap-index.xml/route.ts -import { getServerSideSitemapIndex } from '@opensourceframework/next-sitemap' - -export async function GET(request: Request) { - // Method to source urls from cms - // const urls = await fetch('https//example.com/api') - - return getServerSideSitemapIndex([ - 'https://example.com/path-1.xml', - 'https://example.com/path-2.xml', - ]) -} -``` - -
- -
-2. Index sitemap (pages directory) (legacy) - -Create `pages/server-sitemap-index.xml/index.tsx` file. - -```ts -// pages/server-sitemap-index.xml/index.tsx -import { getServerSideSitemapIndexLegacy } from '@opensourceframework/next-sitemap' -import { GetServerSideProps } from 'next' - -export const getServerSideProps: GetServerSideProps = async (ctx) => { - // Method to source urls from cms - // const urls = await fetch('https//example.com/api') - - return getServerSideSitemapIndexLegacy(ctx, [ - 'https://example.com/path-1.xml', - 'https://example.com/path-2.xml', - ]) -} - -// Default export to prevent next.js errors -export default function SitemapIndex() {} -``` - -
- -#### Exclude server index sitemap from robots.txt - -Now, `next.js` is serving the dynamic index-sitemap from `http://localhost:3000/server-sitemap-index.xml`. - -List the dynamic sitemap page in `robotsTxtOptions.additionalSitemaps` and exclude this path from static sitemap list. - -```js -// @opensourceframework/next-sitemap.config.js - -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - siteUrl: 'https://example.com', - generateRobotsTxt: true, - exclude: ['/server-sitemap-index.xml'], // <= exclude here - robotsTxtOptions: { - additionalSitemaps: [ - 'https://example.com/server-sitemap-index.xml', // <==== Add here - ], - }, -} -``` - -In this way, `@opensourceframework/next-sitemap` will manage the sitemaps for all your static pages and your dynamic `index-sitemap` will be listed on robots.txt. - ---- - -### server side sitemap (getServerSideSitemap) - -Here's a sample script to generate sitemaps on server side. - -
-1. Sitemaps (app directory) - -Create `app/server-sitemap.xml/route.ts` file. - -```ts -// app/server-sitemap.xml/route.ts -import { getServerSideSitemap } from '@opensourceframework/next-sitemap' - -export async function GET(request: Request) { - // Method to source urls from cms - // const urls = await fetch('https//example.com/api') - - return getServerSideSitemap([ - { - loc: 'https://example.com', - lastmod: new Date().toISOString(), - // changefreq - // priority - }, - { - loc: 'https://example.com/dynamic-path-2', - lastmod: new Date().toISOString(), - // changefreq - // priority - }, - ]) -} -``` - -
- -
-2. Sitemaps (pages directory) (legacy) - -Create `pages/server-sitemap.xml/index.tsx` file. - -```ts -// pages/server-sitemap.xml/index.tsx -import { getServerSideSitemapLegacy } from '@opensourceframework/next-sitemap' -import { GetServerSideProps } from 'next' - -export const getServerSideProps: GetServerSideProps = async (ctx) => { - // Method to source urls from cms - // const urls = await fetch('https//example.com/api') - - const fields = [ - { - loc: 'https://example.com', // Absolute url - lastmod: new Date().toISOString(), - // changefreq - // priority - }, - { - loc: 'https://example.com/dynamic-path-2', // Absolute url - lastmod: new Date().toISOString(), - // changefreq - // priority - }, - ] - - return getServerSideSitemapLegacy(ctx, fields) -} - -// Default export to prevent next.js errors -export default function Sitemap() {} -``` - -
- -Now, `next.js` is serving the dynamic sitemap from `http://localhost:3000/server-sitemap.xml`. - -List the dynamic sitemap page in `robotsTxtOptions.additionalSitemaps` and exclude this path from static sitemap list. - -```js -// @opensourceframework/next-sitemap.config.js - -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - siteUrl: 'https://example.com', - generateRobotsTxt: true, - exclude: ['/server-sitemap.xml'], // <= exclude here - robotsTxtOptions: { - additionalSitemaps: [ - 'https://example.com/server-sitemap.xml', // <==== Add here - ], - }, -} -``` - -In this way, `@opensourceframework/next-sitemap` will manage the sitemaps for all your static pages and your dynamic sitemap will be listed on robots.txt. - -## Typescript JSDoc - -Add the following line of code in your `@opensourceframework/next-sitemap.config.js` for nice typescript autocomplete! 💖 - -```js -/** @type {import('@opensourceframework/next-sitemap').IConfig} */ -module.exports = { - // YOUR CONFIG -} -``` - -![TS_JSDOC](./assets/ts-jsdoc.png) - -## Contribution - -All PRs are welcome :) +[Documentation](https://github.com/iamvishnusankar/next-sitemap) diff --git a/packages/next-sitemap/bin/next-sitemap.cjs b/packages/next-sitemap/bin/next-sitemap.cjs new file mode 100755 index 00000000..71d47ef5 --- /dev/null +++ b/packages/next-sitemap/bin/next-sitemap.cjs @@ -0,0 +1,10 @@ +#!/usr/bin/env node +/* eslint-disable @typescript-eslint/no-var-requires */ +const envLoader = require('@next/env') +const { CLI } = require('../dist/cjs/cli.js') + +// Load environment variables +envLoader.loadEnvConfig(process.cwd(), process.env.NODE_ENV === 'development') + +// Execute CLI +new CLI().execute() diff --git a/packages/next-sitemap/bin/next-sitemap.mjs b/packages/next-sitemap/bin/next-sitemap.mjs new file mode 100755 index 00000000..4fbc0ba0 --- /dev/null +++ b/packages/next-sitemap/bin/next-sitemap.mjs @@ -0,0 +1,9 @@ +#!/usr/bin/env node +import envLoader from '@next/env' +import { CLI } from '../dist/esm/cli.js' + +// Load environment variables +envLoader.loadEnvConfig(process.cwd(), process.env.NODE_ENV === 'development') + +// Execute CLI +new CLI().execute() diff --git a/packages/next-sitemap/package.json b/packages/next-sitemap/package.json index 795f16f4..84ddbaf6 100644 --- a/packages/next-sitemap/package.json +++ b/packages/next-sitemap/package.json @@ -1,57 +1,74 @@ { "name": "@opensourceframework/next-sitemap", "version": "1.0.0", - "main": "index.js", + "description": "Sitemap generator for next.js (maintained fork)", + "type": "module", + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.js", + "types": "./dist/@types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.cjs", + "types": "./dist/@types/index.d.ts" + } + }, + "files": [ + "dist", + "bin" + ], "repository": { "type": "git", "url": "git+https://github.com/riceharvest/opensourceframework.git", "directory": "packages/next-sitemap" }, - "author": "OpenSource Framework Contributors (fork), Original: Unknown", - "license": "MIT", - "type": "module", - "workspaces": { - "packages": [ - "packages/*", - "examples/*", - "docs" - ] + "bugs": { + "url": "https://github.com/riceharvest/opensourceframework/issues?q=is%3Aissue+is%3Aopen+next-sitemap" }, - "scripts": { - "clean": "tsc --build --clean", - "dev:test": "bun test --watch", - "dev:tsc": "tsc --build --watch", - "build": "turbo run deploy --force", - "test": "bun test --ci --coverage --verbose", - "lint": "eslint .", - "prettier:check": "prettier --check \"**/*.{js,mjs,cjs,jsx,json,ts,tsx,md,mdx,css,html,yml,yaml,scss,less,graphql,graphqls,gql}\"", - "format": "prettier --write \"**/*.{js,mjs,cjs,jsx,json,ts,tsx,md,mdx,css,html,yml,yaml,scss,less,graphql,graphqls,gql}\"" - }, - "devDependencies": { - "@corex/workspace": "^4.0.43", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "eslint": "^8.52.0", - "eslint-config-next": "^14.0.0", - "fast-xml-parser": "^4.3.2", - "prettier": "^3.0.3", - "turbo": "^1.10.16" - }, - "contributors": [ + "homepage": "https://github.com/riceharvest/opensourceframework/tree/main/packages/next-sitemap#readme", + "funding": [ { - "name": "Unknown", - "url": "https://github.com/next-sitemap" + "url": "https://github.com/riceharvest/opensourceframework" } ], - "homepage": "https://github.com/riceharvest/opensourceframework/tree/main/packages/next-sitemap#readme", + "engines": { + "node": ">=18" + }, + "keywords": [ + "nextjs", + "next", + "sitemap", + "seo", + "react" + ], + "author": "OpenSource Framework Contributors (fork), Original: Vishnu Sankar", + "contributors": [ + "Vishnu Sankar " + ], + "license": "MIT", + "sideEffects": false, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18.0.0" + "bin": { + "next-sitemap": "./bin/next-sitemap.mjs", + "next-sitemap-cjs": "./bin/next-sitemap.cjs" + }, + "scripts": { + "build": "tsc && tsc --module commonjs --outDir dist/cjs && node scripts/fix-cjs.cjs", + "test": "pnpm build && node -e \"const p=require('./dist/cjs/index.cjs'); console.log('Package loads OK, exports:', Object.keys(p));\"" }, - "funding": { - "type": "GitHub", - "url": "https://github.com/sponsors/riceharvest" + "dependencies": { + "@corex/deepmerge": "^4.0.43", + "@next/env": "^13.5.6", + "fast-glob": "^3.3.1", + "minimist": "^1.2.8" + }, + "peerDependencies": { + "next": "*" + }, + "devDependencies": { + "@corex/tsconfig": "^4.0.43", + "typescript": "^5.2.2" } } diff --git a/packages/next-sitemap/scripts/fix-cjs.cjs b/packages/next-sitemap/scripts/fix-cjs.cjs new file mode 100644 index 00000000..133b3b4f --- /dev/null +++ b/packages/next-sitemap/scripts/fix-cjs.cjs @@ -0,0 +1,38 @@ +const fs = require('fs'); +const path = require('path'); + +function getAllFiles(dir, ext) { + let results = []; + const list = fs.readdirSync(dir); + list.forEach(file => { + const full = path.join(dir, file); + const stat = fs.statSync(full); + if (stat.isDirectory()) { + results = results.concat(getAllFiles(full, ext)); + } else if (full.endsWith(ext)) { + results.push(full); + } + }); + return results; +} + +const cwd = process.cwd(); +const cjsDir = path.join(cwd, 'dist', 'cjs'); + +// Rename all .js files in dist/cjs to .cjs +const jsFiles = getAllFiles(cjsDir, '.js'); +jsFiles.forEach(file => { + const newFile = file.replace(/\.js$/, '.cjs'); + fs.renameSync(file, newFile); +}); + +// After renaming, update require statements in .cjs files to point to .cjs +const cjsFiles = getAllFiles(cjsDir, '.cjs'); +cjsFiles.forEach(file => { + let content = fs.readFileSync(file, 'utf8'); + // Replace require('...js') or require("...js") with .cjs extension, handling any relative paths (e.g., './', '../') + content = content.replace(/require\((['"])([^'"]+)\.js\1\)/g, "require($1$2.cjs$1)"); + fs.writeFileSync(file, content); +}); + +console.log('Fixed CJS output: renamed .js to .cjs and updated require statements.'); diff --git a/packages/next-sitemap/src/__fixtures__/config.ts b/packages/next-sitemap/src/__fixtures__/config.ts new file mode 100644 index 00000000..8aa23069 --- /dev/null +++ b/packages/next-sitemap/src/__fixtures__/config.ts @@ -0,0 +1,34 @@ +import type { IConfig } from '../interface.js' +import { withDefaultConfig } from '../utils/defaults.js' + +export const sampleConfig: IConfig = withDefaultConfig({ + siteUrl: 'https://example.com', + sourceDir: 'public', + changefreq: 'daily', + priority: 0.7, + sitemapSize: 5000, + generateRobotsTxt: true, + trailingSlash: false, + robotsTxtOptions: { + policies: [ + { + userAgent: '*', + allow: '/', + }, + { + userAgent: 'black-listed-bot', + disallow: ['/sub-path-1', '/path-2'], + }, + { + userAgent: 'friendly-bot', + allow: '/', + crawlDelay: 10, + }, + ], + additionalSitemaps: [ + 'https://example.com/my-custom-sitemap-1.xml', + 'https://example.com/my-custom-sitemap-2.xml', + 'https://example.com/my-custom-sitemap-3.xml', + ], + }, +}) diff --git a/packages/next-sitemap/src/__fixtures__/manifest.ts b/packages/next-sitemap/src/__fixtures__/manifest.ts new file mode 100644 index 00000000..6c5285fd --- /dev/null +++ b/packages/next-sitemap/src/__fixtures__/manifest.ts @@ -0,0 +1,125 @@ +import type { + IBuildManifest, + IPreRenderManifest, + IRoutesManifest, + INextManifest, +} from '../interface.js' + +export const sampleBuildManifest: IBuildManifest = { + pages: { + '/': [], + '/[dynamic]': [], + '/_app': [], + '/_error': [], + }, +} + +export const samplePreRenderManifest: IPreRenderManifest = { + routes: { + '/page-0': {}, + '/page-1': {}, + '/page-2': {}, + '/page-3': {}, + }, + notFoundRoutes: [], +} + +export const sampleManifest: INextManifest = { + build: sampleBuildManifest, + preRender: samplePreRenderManifest, +} + +export const sampleI18nBuildManifest: IBuildManifest = { + pages: { + '/': [], + '/about': [], + '/[dynamic]': [], + '/_app': [], + '/_error': [], + }, +} + +export const sampleI18nPreRenderManifest: IPreRenderManifest = { + routes: { + '/en-US': {}, + '/fr': {}, + '/en-US/about': {}, + '/fr/about': {}, + '/page-0': {}, + '/page-1': {}, + '/en-US/page-1': {}, + '/page-2': {}, + '/fr/page-2': {}, + '/page-3': {}, + }, + notFoundRoutes: [], +} + +export const sampleRenderManifest: IRoutesManifest = { + i18n: { + locales: ['en-US', 'fr', 'nl-NL', 'nl-BE'], + defaultLocale: 'en-US', + }, +} + +export const sampleI18nManifest: INextManifest = { + build: sampleI18nBuildManifest, + preRender: sampleI18nPreRenderManifest, + routes: sampleRenderManifest, +} + +export const sampleNotFoundRoutesBuildManifest: IBuildManifest = { + pages: { + '/': [], + '/about': [], + '/only-nl': [], + '/[dynamic]': [], + '/_app': [], + '/_error': [], + }, +} +export const sampleNotFoundRoutesPreRenderManifest: IPreRenderManifest = { + routes: { + '/en-US': {}, + '/fr': {}, + '/nl-NL': {}, + + '/en-US/about': {}, + '/fr/about': {}, + '/nl-NL/about': {}, + + '/en-US/only-nl': {}, + '/fr/only-nl': {}, + '/nl-NL/only-nl': {}, + + '/en-US/page-0': {}, + '/fr/page-0': {}, + '/nl-NL/page-0': {}, + + '/en-US/page-1': {}, + '/fr/page-1': {}, + '/nl-NL/page-1': {}, + }, + notFoundRoutes: [ + '/fr', + '/nl-NL/about', + '/en-US/only-nl', + '/fr/only-nl', + '/nl-NL/page-0', + '/fr/page-1', + '/nl-NL/page-1', + ], +} + +export const sampleNotFoundRoutesRenderManifest: IRoutesManifest = { + i18n: { + locales: ['en-US', 'fr', 'nl-NL'], + defaultLocale: 'en-US', + }, +} + +export const sampleNotFoundRoutesManifest: INextManifest = { + build: sampleNotFoundRoutesBuildManifest, + preRender: sampleNotFoundRoutesPreRenderManifest, + routes: sampleNotFoundRoutesRenderManifest, +} diff --git a/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/__snapshots__/generate-robots-txt.test.ts.snap b/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/__snapshots__/generate-robots-txt.test.ts.snap new file mode 100644 index 00000000..d31ec8ff --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/__snapshots__/generate-robots-txt.test.ts.snap @@ -0,0 +1,26 @@ +// Bun Snapshot v1, https://goo.gl/fbAQLP + +exports[`RobotsTxtBuilder generateRobotsTxt: additionalSitemap 1`] = ` +"# * +User-agent: * +Allow: / + +# black-listed-bot +User-agent: black-listed-bot +Disallow: /sub-path-1 +Disallow: /path-2 + +# friendly-bot +User-agent: friendly-bot +Allow: / +Crawl-delay: 10 + +# Host +Host: https://example.com + +# Sitemaps +Sitemap: https://example.com/my-custom-sitemap-1.xml +Sitemap: https://example.com/my-custom-sitemap-2.xml +Sitemap: https://example.com/my-custom-sitemap-3.xml +" +`; diff --git a/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/generate-robots-txt.test.ts b/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/generate-robots-txt.test.ts new file mode 100644 index 00000000..1b5e63f2 --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/robots-txt-builder/generate-robots-txt.test.ts @@ -0,0 +1,14 @@ +import { sampleConfig } from '../../../__fixtures__/config.js' +import { RobotsTxtBuilder } from '../../robots-txt-builder.js' + +let builder: RobotsTxtBuilder + +beforeEach(() => { + builder = new RobotsTxtBuilder() +}) + +describe('RobotsTxtBuilder', () => { + test('generateRobotsTxt: additionalSitemap', () => { + expect(builder.generateRobotsTxt(sampleConfig as any)).toMatchSnapshot() + }) +}) diff --git a/packages/next-sitemap/src/builders/__tests__/sitemap-builder/__snapshots__/build-sitemap-xml.test.ts.snap b/packages/next-sitemap/src/builders/__tests__/sitemap-builder/__snapshots__/build-sitemap-xml.test.ts.snap new file mode 100644 index 00000000..790b1c9c --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/sitemap-builder/__snapshots__/build-sitemap-xml.test.ts.snap @@ -0,0 +1,37 @@ +// Bun Snapshot v1, https://goo.gl/fbAQLP + +exports[`SitemapBuilder snapshot test to exclude undefined values from final sitemap 1`] = ` +" + +https://example.com +https://example.comsome-value +" +`; + +exports[`SitemapBuilder snapshot test for google news sitemap 1`] = ` +" + +https://example.comThe Example Timesen2008-01-01T23:00:00.000+00:00Companies A, B in Merger Talks +" +`; + +exports[`SitemapBuilder snapshot test for image sitemap 1`] = ` +" + +https://example.comhttps://example.com/https://example.com/Image caption & descriptionImage titlePrague, Czech Republichttps://example.com/ +" +`; + +exports[`SitemapBuilder image sitemap generates correctly encoded results 1`] = ` +" + +https://example.comhttps://example.com/?ref=test&test=1 +" +`; + +exports[`SitemapBuilder snapshot test for video sitemap 1`] = ` +" + +https://example.comVideo titlehttps://example.com/Video descriptionhttps://example.com/Grilling steaks for summerhttps://example.com/Alkis shows you how to get perfectly done steaks every timehttps://example.com/https://example.com/6001234video1.02030-03-01T23:00:00.000+00:002020-04-19T22:00:00.000+00:00yesnonoCZwebJohn Doe +" +`; diff --git a/packages/next-sitemap/src/builders/__tests__/sitemap-builder/build-sitemap-xml.test.ts b/packages/next-sitemap/src/builders/__tests__/sitemap-builder/build-sitemap-xml.test.ts new file mode 100644 index 00000000..a5b691b7 --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/sitemap-builder/build-sitemap-xml.test.ts @@ -0,0 +1,157 @@ +import { SitemapBuilder } from '../../sitemap-builder.js' +import { XMLValidator } from 'fast-xml-parser' + +describe('SitemapBuilder', () => { + test('snapshot test to exclude undefined values from final sitemap', () => { + // Builder instance + const builder = new SitemapBuilder() + + // Build content + const content = builder.buildSitemapXml([ + { + loc: 'https://example.com', + lastmod: undefined, + }, + { + loc: 'https://example.com', + lastmod: 'some-value', + alternateRefs: [ + { + href: 'https://example.com/en', + hreflang: 'en', + }, + { + href: 'https://example.com/fr', + hreflang: 'fr', + }, + ], + }, + ]) + const isValid = XMLValidator.validate(content) + expect(isValid).toBe(true) + // Expect the generated sitemap to match snapshot. + expect(content).toMatchSnapshot() + }) + test('snapshot test for google news sitemap', () => { + // Builder instance + const builder = new SitemapBuilder() + + // Build content + const content = builder.buildSitemapXml([ + { + loc: 'https://example.com', + news: { + title: 'Companies A, B in Merger Talks', + date: new Date('2008-01-02T00:00:00.000+01:00'), + publicationLanguage: 'en', + publicationName: 'The Example Times', + }, + }, + ]) + const isValid = XMLValidator.validate(content) + expect(isValid).toBe(true) + // Expect the generated sitemap to match snapshot. + expect(content).toMatchSnapshot() + }) + test('snapshot test for image sitemap', () => { + // Builder instance + const builder = new SitemapBuilder() + + // Build content + const content = builder.buildSitemapXml([ + { + loc: 'https://example.com', + images: [ + { + loc: new URL('https://example.com'), + }, + { + caption: 'Image caption & description', + geoLocation: 'Prague, Czech Republic', + license: new URL('https://example.com'), + loc: new URL('https://example.com'), + title: 'Image title', + }, + ], + }, + ]) + const isValid = XMLValidator.validate(content) + expect(isValid).toBe(true) + // Expect the generated sitemap to match snapshot. + expect(content).toMatchSnapshot() + }) + + test('image sitemap generates correctly encoded results', () => { + // Builder instance + const builder = new SitemapBuilder() + + // Build content + const content = builder.buildSitemapXml([ + { + loc: 'https://example.com', + images: [ + { + loc: new URL('https://example.com?ref=test&test=1'), + }, + ], + }, + ]) + + // Expect the generated sitemap to match snapshot. + const isValid = XMLValidator.validate(content) + expect(isValid).toBe(true) + expect(content).toMatchSnapshot() + }) + test('snapshot test for video sitemap', () => { + // Builder instance + const builder = new SitemapBuilder() + + // Build content + const content = builder.buildSitemapXml([ + { + loc: 'https://example.com', + videos: [ + { + title: 'Video title', + contentLoc: new URL('https://example.com'), + description: 'Video description', + thumbnailLoc: new URL('https://example.com'), + }, + { + title: 'Grilling steaks for summer', + contentLoc: new URL('https://example.com'), + description: + 'Alkis shows you how to get perfectly done steaks every time', + thumbnailLoc: new URL('https://example.com'), + duration: 600, + expirationDate: new Date('2030-03-02T00:00:00.000+01:00'), + familyFriendly: true, + live: false, + platform: { + relationship: 'allow', + content: 'web', + }, + playerLoc: new URL('https://example.com'), + publicationDate: new Date('2020-04-20T00:00:00.000+02:00'), + rating: 1, + requiresSubscription: false, + restriction: { + relationship: 'deny', + content: 'CZ', + }, + tag: 'video', + uploader: { + name: 'John Doe', + info: new URL('https://example.com'), + }, + viewCount: 1234, + }, + ], + }, + ]) + const isValid = XMLValidator.validate(content) + expect(isValid).toBe(true) + // Expect the generated sitemap to match snapshot. + expect(content).toMatchSnapshot() + }) +}) diff --git a/packages/next-sitemap/src/builders/__tests__/url-set-builder/__snapshots__/absolute-url.test.ts.snap b/packages/next-sitemap/src/builders/__tests__/url-set-builder/__snapshots__/absolute-url.test.ts.snap new file mode 100644 index 00000000..da762ffe --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/url-set-builder/__snapshots__/absolute-url.test.ts.snap @@ -0,0 +1,3 @@ +// Bun Snapshot v1, https://goo.gl/fbAQLP + +exports[`UrlSetBuilder absoluteUrl: With uri encoding 1`] = `"https://example.com/&/'/"/>/</"`; diff --git a/packages/next-sitemap/src/builders/__tests__/url-set-builder/absolute-url.test.ts b/packages/next-sitemap/src/builders/__tests__/url-set-builder/absolute-url.test.ts new file mode 100644 index 00000000..b1ba17e4 --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/url-set-builder/absolute-url.test.ts @@ -0,0 +1,37 @@ +import { sampleConfig } from '../../../__fixtures__/config.js' +import { sampleManifest } from '../../../__fixtures__/manifest.js' +import { UrlSetBuilder } from '../../url-set-builder.js' + +let urlSetBuilder: UrlSetBuilder + +beforeEach(() => { + urlSetBuilder = new UrlSetBuilder(sampleConfig, sampleManifest) +}) + +describe('UrlSetBuilder', () => { + test('absoluteUrl: Without trailing slash', () => { + expect(urlSetBuilder.absoluteUrl('https://example.com', '/', false)).toBe( + 'https://example.com', + ) + + expect( + urlSetBuilder.absoluteUrl('https://example.com/hello/', '/', false), + ).toBe('https://example.com/hello') + }) + + test('absoluteUrl: With trailing slash', () => { + expect(urlSetBuilder.absoluteUrl('https://example.com', '/', true)).toBe( + 'https://example.com/', + ) + + expect( + urlSetBuilder.absoluteUrl('https://example.com/hello/', '/', true), + ).toBe('https://example.com/hello/') + }) + + test('absoluteUrl: With uri encoding', () => { + expect( + urlSetBuilder.absoluteUrl(`https://example.com/&/'/"/>/<`, '/', true), + ).toMatchSnapshot() + }) +}) diff --git a/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts b/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts new file mode 100644 index 00000000..080f5f6a --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts @@ -0,0 +1,753 @@ +import { sampleConfig } from '../../../__fixtures__/config.js' +import { + sampleManifest, + sampleI18nManifest, + sampleNotFoundRoutesManifest, +} from '../../../__fixtures__/manifest.js' +import type { IConfig, ISitemapField } from '../../../interface.js' +import { UrlSetBuilder } from '../../url-set-builder.js' +import { defaultSitemapTransformer } from '../../../utils/defaults.js' + +describe('UrlSetBuilder', () => { + test('createUrlSet: Without exclusion', async () => { + const builder = new UrlSetBuilder(sampleConfig, sampleManifest) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With exclusion', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + exclude: ['/', '/page-0', '/page-2'], + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With i18n exclusion', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + exclude: ['/', '/page-0', '/page-2', '/about', '/fr*'], + }, + sampleI18nManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With wildcard exclusion', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + exclude: ['/page*'], + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With async exclusion', async () => { + const sleep = (ms: number) => + new Promise((resolve) => setTimeout(resolve, ms)) + const builder = new UrlSetBuilder( + { + ...sampleConfig, + exclude: async () => { + await sleep(10) + return ['/', '/page-0', '/page-2'] + }, + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: Without trailing slash', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + trailingSlash: false, + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With trailing slash', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + trailingSlash: true, + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/', + alternateRefs: [], + trailingSlash: true, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0/', + alternateRefs: [], + trailingSlash: true, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1/', + alternateRefs: [], + trailingSlash: true, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2/', + alternateRefs: [], + trailingSlash: true, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3/', + alternateRefs: [], + trailingSlash: true, + }, + ]) + }) + + test('createUrlSet: With custom transform', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + trailingSlash: true, + transform: (_, url) => { + if (!['/', '/page-2'].includes(url)) { + return + } + + return { + loc: url, + changefreq: 'yearly', + } as any + }, + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'yearly', + loc: 'https://example.com/', + alternateRefs: [], + trailingSlash: true, + }, + { + changefreq: 'yearly', + loc: 'https://example.com/page-2/', + alternateRefs: [], + trailingSlash: true, + }, + ]) + }) + + test('createUrlSet: With alternateRefs', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + siteUrl: 'https://example.com/', + alternateRefs: [ + { href: 'https://en.example.com/', hreflang: 'en' }, + { href: 'https://fr.example.com/', hreflang: 'fr' }, + ], + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [ + { href: 'https://en.example.com', hreflang: 'en' }, + { href: 'https://fr.example.com', hreflang: 'fr' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0', + alternateRefs: [ + { href: 'https://en.example.com/page-0', hreflang: 'en' }, + { href: 'https://fr.example.com/page-0', hreflang: 'fr' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [ + { href: 'https://en.example.com/page-1', hreflang: 'en' }, + { href: 'https://fr.example.com/page-1', hreflang: 'fr' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2', + alternateRefs: [ + { href: 'https://en.example.com/page-2', hreflang: 'en' }, + { href: 'https://fr.example.com/page-2', hreflang: 'fr' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [ + { href: 'https://en.example.com/page-3', hreflang: 'en' }, + { href: 'https://fr.example.com/page-3', hreflang: 'fr' }, + ], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With absolute alternateRefs', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + siteUrl: 'https://example.com/', + alternateRefs: [ + { href: 'https://example.com/en', hreflang: 'en' }, + { href: 'https://example.com/fr', hreflang: 'fr' }, + { href: 'https://example.com/it', hreflang: 'it' }, + { href: 'https://example.com/de', hreflang: 'de' }, + ], + transform: (config, url) => { + const sitemapField = { + loc: url, + changefreq: config.changefreq, + priority: config.priority, + alternateRefs: config.alternateRefs, + lastmod: new Date().toISOString(), + } as ISitemapField + if (url.startsWith('/page')) { + sitemapField.alternateRefs = [ + { + href: 'https://example.com/en', + hreflang: 'en', + }, + { + href: 'https://example.com/fr', + hreflang: 'fr', + }, + { + href: `https://example.com/it${url.replace( + '/page', + '/pagina', + )}`, + hreflang: 'it', + hrefIsAbsolute: true, + }, + { + href: `https://example.com/de${url.replace('/page', '/seite')}`, + hreflang: 'de', + hrefIsAbsolute: true, + }, + ] + } + return sitemapField + }, + }, + sampleManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [ + { href: 'https://example.com/en', hreflang: 'en' }, + { href: 'https://example.com/fr', hreflang: 'fr' }, + { href: 'https://example.com/it', hreflang: 'it' }, + { href: 'https://example.com/de', hreflang: 'de' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0', + alternateRefs: [ + { href: 'https://example.com/en/page-0', hreflang: 'en' }, + { href: 'https://example.com/fr/page-0', hreflang: 'fr' }, + { href: 'https://example.com/it/pagina-0', hreflang: 'it' }, + { href: 'https://example.com/de/seite-0', hreflang: 'de' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [ + { href: 'https://example.com/en/page-1', hreflang: 'en' }, + { href: 'https://example.com/fr/page-1', hreflang: 'fr' }, + { href: 'https://example.com/it/pagina-1', hreflang: 'it' }, + { href: 'https://example.com/de/seite-1', hreflang: 'de' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2', + alternateRefs: [ + { href: 'https://example.com/en/page-2', hreflang: 'en' }, + { href: 'https://example.com/fr/page-2', hreflang: 'fr' }, + { href: 'https://example.com/it/pagina-2', hreflang: 'it' }, + { href: 'https://example.com/de/seite-2', hreflang: 'de' }, + ], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [ + { href: 'https://example.com/en/page-3', hreflang: 'en' }, + { href: 'https://example.com/fr/page-3', hreflang: 'fr' }, + { href: 'https://example.com/it/pagina-3', hreflang: 'it' }, + { href: 'https://example.com/de/seite-3', hreflang: 'de' }, + ], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With additionalPaths', async () => { + const transform: IConfig['transform'] = async (config, url) => { + if (['/', '/page-0', '/page-1'].includes(url)) { + return + } + + if (url === '/additional-page-3') { + return { + loc: url, + changefreq: 'yearly', + priority: 0.8, + } + } + + return defaultSitemapTransformer(config, url) + } + + const mockTransform = jest.fn(transform) + + const config: IConfig = { + ...sampleConfig, + siteUrl: 'https://example.com/', + transform: mockTransform, + additionalPaths: async (config) => [ + { loc: '/page-1', priority: 1, changefreq: 'yearly' }, + { loc: '/page-3', priority: 0.9, changefreq: 'yearly' }, + { loc: '/additional-page-1' }, + { loc: '/additional-page-2', priority: 1, changefreq: 'yearly' }, + await config.transform(config, '/additional-page-3'), + ], + } + + const builder = new UrlSetBuilder(config, sampleManifest) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-2', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'yearly', + lastmod: expect.any(String), + priority: 0.9, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'yearly', + priority: 1, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/additional-page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'yearly', + priority: 1, + loc: 'https://example.com/additional-page-2', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'yearly', + priority: 0.8, + loc: 'https://example.com/additional-page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + expect(mockTransform.mock.calls.map(([_, url]) => url)).toEqual([ + '/', + '/page-0', + '/page-1', + '/page-2', + '/page-3', + '/additional-page-3', + ]) + }) + + test('createUrlSet: With next i18n enabled', async () => { + const builder = new UrlSetBuilder(sampleConfig, sampleI18nManifest) + + const actual = await builder.createUrlSet() + expect(actual).toStrictEqual([ + { + loc: 'https://example.com', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/about', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/fr', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/fr/about', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/page-0', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/page-1', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/page-2', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/fr/page-2', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + { + loc: 'https://example.com/page-3', + lastmod: expect.any(String), + changefreq: 'daily', + priority: 0.7, + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + + test('createUrlSet: With i18n, without notFound routes', async () => { + const builder = new UrlSetBuilder( + { + ...sampleConfig, + }, + sampleNotFoundRoutesManifest, + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/about', + alternateRefs: [], + trailingSlash: false, + }, + // /about + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/nl-NL', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/fr/about', + alternateRefs: [], + trailingSlash: false, + }, + // only localized page + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/nl-NL/only-nl', + alternateRefs: [], + trailingSlash: false, + }, + // page-0 + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-0', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/fr/page-0', + alternateRefs: [], + trailingSlash: false, + }, + // page-1 + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) +}) diff --git a/packages/next-sitemap/src/builders/__tests__/url-set-builder/normalize-sitemap-field.test.ts b/packages/next-sitemap/src/builders/__tests__/url-set-builder/normalize-sitemap-field.test.ts new file mode 100644 index 00000000..09e30889 --- /dev/null +++ b/packages/next-sitemap/src/builders/__tests__/url-set-builder/normalize-sitemap-field.test.ts @@ -0,0 +1,64 @@ +import { sampleConfig } from '../../../__fixtures__/config.js' +import { sampleManifest } from '../../../__fixtures__/manifest.js' +import { UrlSetBuilder } from '../../url-set-builder.js' + +describe('UrlSetBuilder', () => { + test('normalizeSitemapField: No sitemap field trailingSlash provided => Use config.trailingSlash', async () => { + // Create builder instance + const builder = new UrlSetBuilder( + { + ...sampleConfig, + trailingSlash: false, + }, + sampleManifest, + ) + + // Normalize field + const normalizedField = builder.normalizeSitemapField({ + changefreq: 'daily', + lastmod: '2021-08-01T00:00:00.000Z', + priority: 0.7, + loc: '/page-2', + alternateRefs: [], + }) + + expect(normalizedField).toStrictEqual({ + alternateRefs: [], + changefreq: 'daily', + lastmod: '2021-08-01T00:00:00.000Z', + loc: 'https://example.com/page-2', + priority: 0.7, + trailingSlash: false, + }) + }) + + test('normalizeSitemapField: Sitemap field trailingSlash provided => Use field.trailingSlash', async () => { + // Create builder instance + const builder = new UrlSetBuilder( + { + ...sampleConfig, + trailingSlash: false, + }, + sampleManifest, + ) + + // Normalize field + const normalizedField = builder.normalizeSitemapField({ + changefreq: 'daily', + lastmod: '2021-08-01T00:00:00.000Z', + priority: 0.7, + loc: '/page-2', + alternateRefs: [], + trailingSlash: true, + }) + + expect(normalizedField).toStrictEqual({ + alternateRefs: [], + changefreq: 'daily', + lastmod: '2021-08-01T00:00:00.000Z', + loc: 'https://example.com/page-2/', + priority: 0.7, + trailingSlash: true, + }) + }) +}) diff --git a/packages/next-sitemap/src/builders/exportable-builder.ts b/packages/next-sitemap/src/builders/exportable-builder.ts new file mode 100644 index 00000000..fecdfe4e --- /dev/null +++ b/packages/next-sitemap/src/builders/exportable-builder.ts @@ -0,0 +1,237 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { + IConfig, + IExportable, + INextSitemapResult, + IRuntimePaths, + ISitemapField, +} from '../interface.js' +import { SitemapBuilder } from './sitemap-builder.js' +import path from 'node:path' +import { generateUrl } from '../utils/url.js' +import { combineMerge } from '../utils/merge.js' +import { RobotsTxtBuilder } from './robots-txt-builder.js' +import { defaultRobotsTxtTransformer } from '../utils/defaults.js' +import { exportFile } from '../utils/file.js' + +export class ExportableBuilder { + exportableList: IExportable[] = [] + + config: IConfig + + runtimePaths: IRuntimePaths + + sitemapBuilder: SitemapBuilder + + robotsTxtBuilder: RobotsTxtBuilder + + exportDir: string + + constructor(config: IConfig, runtimePaths: IRuntimePaths) { + this.config = config + + this.runtimePaths = runtimePaths + + this.sitemapBuilder = new SitemapBuilder() + + this.robotsTxtBuilder = new RobotsTxtBuilder() + + this.exportDir = path.resolve(process.cwd(), this.config.outDir!) + } + + /** + * Register sitemap index files + */ + async registerIndexSitemap() { + // Get generated sitemap list + const sitemaps = [ + ...this.generatedSitemaps(), + // Include additionalSitemaps provided via robots.txt options + ...(this.config?.robotsTxtOptions?.additionalSitemaps ?? []), + ] + + // Generate sitemap-index content + const content = this.sitemapBuilder.buildSitemapIndexXml(sitemaps) + + // Create exportable + const item: IExportable = { + type: 'sitemap-index', + filename: this.runtimePaths.SITEMAP_INDEX_FILE!, + url: this.runtimePaths.SITEMAP_INDEX_URL!, + content, + } + + // Add to exportable list + this.exportableList.push(item) + } + + /** + * Resolve filename if index sitemap is generated + * @param index + * @returns + */ + resolveFilenameWithIndexSitemap(index: number) { + return `${this.config.sitemapBaseFileName}-${index}.xml` + } + + /** + * Resolve filename if index sitemaps is not generated + * @param index + * @returns + */ + resolveFilenameWithoutIndexSitemap(index: number) { + if (index === 0) { + return `${this.config.sitemapBaseFileName}.xml` + } + + return this.resolveFilenameWithIndexSitemap(index) + } + + /** + * Register sitemaps with exportable builder + * @param chunks + */ + async registerSitemaps(chunks: ISitemapField[][]) { + // Check whether user config allows sitemap generation + const hasIndexSitemap = this.config.generateIndexSitemap + + // Create exportable items + const items = chunks?.map((chunk, index) => { + // Get sitemap base filename + const baseFilename = hasIndexSitemap + ? this.resolveFilenameWithIndexSitemap(index) + : this.resolveFilenameWithoutIndexSitemap(index) + + return { + type: 'sitemap', + url: generateUrl(this.config.siteUrl, baseFilename), + filename: path.resolve(this.exportDir, baseFilename), + content: this.sitemapBuilder.buildSitemapXml(chunk), + } as IExportable + }) + + // Add to exportable list + this.exportableList.push(...items) + } + + /** + * Get robots.txt export config + * @returns + */ + robotsTxtExportConfig() { + // Endpoints list + const endpoints: string[] = [] + + // Include non-index sitemaps + // Optionally allow user to include non-index sitemaps along with generated sitemap list + // Set to true if index-sitemap is not generated + const includeNonIndexSitemaps = this.config.generateIndexSitemap + ? this.config?.robotsTxtOptions?.includeNonIndexSitemaps + : true + + // Add all sitemap indices + if (this.config.generateIndexSitemap) { + endpoints.push(...this.generatedSitemapIndices()) + } + + // Add all non-index sitemaps + if (includeNonIndexSitemaps) { + endpoints.push(...this.generatedSitemaps()) + } + + // Combine merge with additional sitemaps + return combineMerge( + { + robotsTxtOptions: { + additionalSitemaps: endpoints, + }, + } as IConfig, + this.config, + ) + } + + /** + * Register robots.txt export + */ + async registerRobotsTxt() { + // File name of robots.txt + const baseFilename = 'robots.txt' + + // Export config of robots.txt + const robotsConfig = this.robotsTxtExportConfig() + + // Generate robots content + let content = this.robotsTxtBuilder.generateRobotsTxt(robotsConfig) + + // Get robots transformer + const robotsTransformer = + robotsConfig?.robotsTxtOptions?.transformRobotsTxt ?? + defaultRobotsTxtTransformer + + // Transform generated robots txt + content = await robotsTransformer(robotsConfig, content) + + // Generate exportable item + const item: IExportable = { + type: 'robots.txt', + filename: path.resolve(this.exportDir, baseFilename), + url: generateUrl(robotsConfig?.siteUrl, baseFilename), + content, + } + + // Add to exportableList + this.exportableList.push(item) + } + + /** + * Generic reducer to extract by type + * @param condition + * @returns + */ + exportableUrlReducer(condition: (curr: IExportable) => boolean) { + return this.exportableList.reduce((prev, curr) => { + const matches = condition(curr) + + if (matches) { + prev.push(curr.url) + } + + return prev + }, []) + } + + /** + * Return a lit of sitemap urls + * @returns + */ + generatedSitemaps() { + return this.exportableUrlReducer((x) => x.type == 'sitemap') + } + + /** + * Generate sitemap indices + * @returns + */ + generatedSitemapIndices() { + return this.exportableUrlReducer((x) => x.type == 'sitemap-index') + } + + /** + * Export all registered files + * @returns + */ + async exportAll(): Promise { + await Promise.all( + this.exportableList?.map(async (item) => + exportFile(item.filename, item.content), + ), + ) + + // Create result object + return { + runtimePaths: this.runtimePaths, + sitemaps: this.generatedSitemaps(), + sitemapIndices: this.generatedSitemapIndices(), + } + } +} diff --git a/packages/next-sitemap/src/builders/robots-txt-builder.ts b/packages/next-sitemap/src/builders/robots-txt-builder.ts new file mode 100644 index 00000000..6dd1c84b --- /dev/null +++ b/packages/next-sitemap/src/builders/robots-txt-builder.ts @@ -0,0 +1,71 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { IConfig, IRobotPolicy } from '../interface.js' +import { toArray } from '../utils/array.js' + +export class RobotsTxtBuilder { + /** + * Normalize robots.txt policies + * @param policies + * @returns + */ + normalizePolicy(policies: IRobotPolicy[]): IRobotPolicy[] { + return policies.map((x) => ({ + ...x, + allow: toArray(x.allow ?? []), + disallow: toArray(x.disallow ?? []), + })) + } + + /** + * Add new policy + * @param key + * @param rules + * @returns + */ + addPolicies(key: string, rules: string[]): string { + return rules.reduce((prev, curr) => `${prev}${key}: ${curr}\n`, '') + } + + /** + * Generates robots.txt content + * @param config + * @returns + */ + generateRobotsTxt(config: IConfig): string { + const { additionalSitemaps, policies } = config.robotsTxtOptions! + const normalizedPolices = this.normalizePolicy(policies!) + + let content = '' + + normalizedPolices.forEach((x) => { + content += `# ${x.userAgent}\nUser-agent: ${x.userAgent}\n` + + if (x.allow) { + content += `${this.addPolicies('Allow', x.allow as string[])}` + } + + if (x.disallow) { + content += `${this.addPolicies('Disallow', x.disallow as string[])}` + } + + if (x.crawlDelay) { + content += `Crawl-delay: ${x.crawlDelay}\n` + } + + content += '\n' + }) + + // Append host + content += `# Host\nHost: ${config.siteUrl}\n` + + if (additionalSitemaps && additionalSitemaps.length > 0) { + content += `\n# Sitemaps\n` + + additionalSitemaps.forEach((x) => { + content += `Sitemap: ${x}\n` + }) + } + + return content + } +} diff --git a/packages/next-sitemap/src/builders/sitemap-builder.ts b/packages/next-sitemap/src/builders/sitemap-builder.ts new file mode 100644 index 00000000..205a263b --- /dev/null +++ b/packages/next-sitemap/src/builders/sitemap-builder.ts @@ -0,0 +1,302 @@ +import type { + IAlternateRef, + IGoogleNewsEntry, + IImageEntry, + ISitemapField, + IVideoEntry, +} from '../interface.js' +import { entityEscapedUrl } from '../utils/url.js' + +/** + * Builder class to generate xml and robots.txt + * Returns only string values + */ +export class SitemapBuilder { + /** + * Create XML Template + * @param content + * @returns + */ + withXMLTemplate(content: string): string { + return `\n\n${content}` + } + + /** + * Generates sitemap-index.xml + * @param allSitemaps + * @returns + */ + buildSitemapIndexXml(allSitemaps: string[]) { + return [ + '', + '', + ...(allSitemaps?.map((x) => `${x}`) ?? []), + '', + ].join('\n') + } + + /** + * Normalize sitemap field keys to stay consistent with order + * @link https://www.w3schools.com/xml/el_sequence.asp + * @link https://github.com/iamvishnusankar/next-sitemap/issues/345 + * @param x + * @returns + */ + normalizeSitemapField(x: ISitemapField) { + const { loc, lastmod, changefreq, priority, ...restProps } = x + + // Return keys in following order + return { + loc, + lastmod, + changefreq, + priority, + ...restProps, + } + } + + /** + * Composes YYYY-MM-DDThh:mm:ssTZD date format (with TZ offset) + * (ref: https://stackoverflow.com/a/49332027) + * @param date + * @private + */ + private formatDate(date: Date | string): string { + const d = typeof date === 'string' ? new Date(date) : date + const z = (n) => ('0' + n).slice(-2) + const zz = (n) => ('00' + n).slice(-3) + let off = d.getTimezoneOffset() + const sign = off > 0 ? '-' : '+' + off = Math.abs(off) + + return ( + d.getFullYear() + + '-' + + z(d.getMonth() + 1) + + '-' + + z(d.getDate()) + + 'T' + + z(d.getHours()) + + ':' + + z(d.getMinutes()) + + ':' + + z(d.getSeconds()) + + '.' + + zz(d.getMilliseconds()) + + sign + + z((off / 60) | 0) + + ':' + + z(off % 60) + ) + } + + private formatBoolean(value: boolean): string { + return value ? 'yes' : 'no' + } + + private escapeHtml(s: string) { + return s.replace(/[^\dA-Za-z ]/g, (c) => '&#' + c.charCodeAt(0) + ';') + } + + /** + * Generates sitemap.xml + * @param fields + * @returns + */ + buildSitemapXml(fields: ISitemapField[]): string { + const content = fields + .map((x: ISitemapField) => { + // Normalize sitemap field keys to stay consistent with order + const field = this.normalizeSitemapField(x) + + // Field array to keep track of properties + const fieldArr: Array = [] + + // Iterate all object keys and key value pair to field-set + for (const key of Object.keys(field)) { + // Skip reserved keys + if (['trailingSlash'].includes(key)) { + continue + } + + if (field[key]) { + if (key === 'alternateRefs') { + const altRefField = this.buildAlternateRefsXml( + field.alternateRefs, + ) + + fieldArr.push(altRefField) + } else if (key === 'news') { + if (field.news) { + const newsField = this.buildNewsXml(field.news) + fieldArr.push(newsField) + } + } else if (key === 'images') { + if (field.images) { + for (const image of field.images) { + const imageField = this.buildImageXml(image) + fieldArr.push(imageField) + } + } + } else if (key === 'videos') { + if (field.videos) { + for (const video of field.videos) { + const videoField = this.buildVideoXml(video) + fieldArr.push(videoField) + } + } + } else { + fieldArr.push(`<${key}>${field[key]}`) + } + } + } + + // Append previous value and return + return `${fieldArr.join('')}\n` + }) + .join('') + + return this.withXMLTemplate(content) + } + + /** + * Generate alternate refs.xml + * @param alternateRefs + * @returns + */ + buildAlternateRefsXml(alternateRefs: Array = []): string { + return alternateRefs + .map((alternateRef) => { + return `` + }) + .join('') + } + + /** + * Generate Google News sitemap entry + * @param news + * @returns string + */ + buildNewsXml(news: IGoogleNewsEntry): string { + // using array just because it looks more structured + return [ + ``, + ...[ + ``, + ...[ + `${this.escapeHtml(news.publicationName)}`, + `${news.publicationLanguage}`, + ], + ``, + `${this.formatDate( + news.date, + )}`, + `${this.escapeHtml(news.title)}`, + ], + ``, + ] + .filter(Boolean) + .join('') + } + + /** + * Generate Image sitemap entry + * @param image + * @returns string + */ + buildImageXml(image: IImageEntry): string { + // using array just because it looks more structured + if (!image || !image.loc) { + return '' + } + return [ + ``, + ...[ + `${entityEscapedUrl( + typeof image.loc === 'string' ? image.loc : image.loc.href, + )}`, + image.caption && + `${this.escapeHtml(image.caption)}`, + image.title && + `${this.escapeHtml(image.title)}`, + image.geoLocation && + `${this.escapeHtml( + image.geoLocation, + )}`, + image.license && + `${entityEscapedUrl( + image.license.href, + )}`, + ], + ``, + ] + .filter(Boolean) + .join('') + } + + /** + * Generate Video sitemap entry + * @param video + * @returns string + */ + buildVideoXml(video: IVideoEntry): string { + // using array just because it looks more structured + return [ + ``, + ...[ + `${this.escapeHtml(video.title)}`, + `${entityEscapedUrl( + video.thumbnailLoc.href, + )}`, + `${this.escapeHtml( + video.description, + )}`, + video.contentLoc && + `${entityEscapedUrl( + video.contentLoc.href, + )}`, + video.playerLoc && + `${entityEscapedUrl( + video.playerLoc.href, + )}`, + video.duration && `${video.duration}`, + video.viewCount && + `${video.viewCount}`, + video.tag && `${this.escapeHtml(video.tag)}`, + video.rating && + `${video.rating + .toFixed(1) + .replace(',', '.')}`, + video.expirationDate && + `${this.formatDate( + video.expirationDate, + )}`, + video.publicationDate && + `${this.formatDate( + video.publicationDate, + )}`, + typeof video.familyFriendly !== 'undefined' && + `${this.formatBoolean( + video.familyFriendly, + )}`, + typeof video.requiresSubscription !== 'undefined' && + `${this.formatBoolean( + video.requiresSubscription, + )}`, + typeof video.live !== 'undefined' && + `${this.formatBoolean(video.live)}`, + video.restriction && + `${video.restriction.content}`, + video.platform && + `${video.platform.content}`, + video.uploader && + `${this.escapeHtml(video.uploader.name)}`, + ], + ``, + ] + .filter(Boolean) + .join('') + } +} diff --git a/packages/next-sitemap/src/builders/url-set-builder.ts b/packages/next-sitemap/src/builders/url-set-builder.ts new file mode 100644 index 00000000..d870dc41 --- /dev/null +++ b/packages/next-sitemap/src/builders/url-set-builder.ts @@ -0,0 +1,158 @@ +import { removeIfMatchPattern } from '../utils/array.js' +import { defaultSitemapTransformer } from '../utils/defaults.js' +import { + createDefaultLocaleReplace, + entityEscapedUrl, + generateUrl, + isNextInternalUrl, +} from '../utils/url.js' +import type { IConfig, ISitemapField, INextManifest } from '../interface.js' + +export class UrlSetBuilder { + config: IConfig + + manifest: INextManifest + + constructor(config: IConfig, manifest: INextManifest) { + this.config = config + this.manifest = manifest + } + + /** + * Returns absolute url by combining siteUrl and path w.r.t trailingSlash config + * @param siteUrl + * @param path + * @param trailingSlash + * @returns + */ + absoluteUrl(siteUrl: string, path: string, trailingSlash?: boolean): string { + const url = generateUrl(siteUrl, trailingSlash ? `${path}/` : path) + + if (!trailingSlash && url.endsWith('/')) { + return url.slice(0, url.length - 1) + } + + return entityEscapedUrl(url) + } + + /** + * Normalize sitemap fields to include absolute urls + * @param field + */ + normalizeSitemapField(field: ISitemapField): ISitemapField { + // Handle trailing Slash + const trailingSlash = + 'trailingSlash' in field + ? field.trailingSlash + : this.config?.trailingSlash + + return { + ...field, + trailingSlash, + loc: this.absoluteUrl(this.config?.siteUrl, field?.loc, trailingSlash), // create absolute urls based on sitemap fields + alternateRefs: (field.alternateRefs ?? []).map((alternateRef) => ({ + href: alternateRef.hrefIsAbsolute + ? alternateRef.href + : this.absoluteUrl(alternateRef.href, field.loc, trailingSlash), + hreflang: alternateRef.hreflang, + })), + } + } + + /** + * Create a unique url set + */ + async createUrlSet(): Promise { + // Load i18n routes + const i18n = this.manifest?.routes?.i18n + + // Init all page keys + const allKeys = [ + ...Object.keys(this.manifest?.build?.pages ?? {}), + ...(this.manifest?.build?.ampFirstPages ?? []), + ...(this.manifest?.preRender + ? Object.keys(this.manifest?.preRender?.routes ?? {}) + : []), + ...(this.manifest?.staticExportPages ?? []), + ] + + // Filter out next.js internal urls and generate urls based on sitemap + let urlSet = allKeys.filter((x) => !isNextInternalUrl(x)) + + // Remove default locale if i18n is enabled + let defaultLocale + if (i18n) { + defaultLocale = i18n.defaultLocale + const replaceDefaultLocale = createDefaultLocaleReplace(defaultLocale) + urlSet = urlSet.map(replaceDefaultLocale) + } + + // Remove the urls based on this.config?.exclude array + if (this.config?.exclude) { + if (typeof this.config.exclude === 'function') { + const asyncExcludes = await this.config.exclude() + urlSet = removeIfMatchPattern(urlSet, asyncExcludes) + } else { + urlSet = removeIfMatchPattern(urlSet, this.config?.exclude) + } + } + + urlSet = [...new Set(urlSet)] + + // Remove routes which don't exist + const notFoundRoutes = (this.manifest?.preRender?.notFoundRoutes ?? + []) as string[] + urlSet = urlSet.filter((url) => { + return ( + !notFoundRoutes.includes(url) && + !notFoundRoutes.includes(`/${defaultLocale}${url}`) + ) + }) + + // Create sitemap fields based on transformation + const sitemapFields: ISitemapField[] = [] // transform using relative urls + + // Create a map of fields by loc to quickly find collisions + const mapFieldsByLoc: { [key in string]: ISitemapField } = {} + + for (const url of urlSet) { + const sitemapField = await this.config?.transform?.(this.config, url) + + if (!sitemapField?.loc) continue + + sitemapFields.push(sitemapField) + + // Add link on field to map by loc + if (this.config?.additionalPaths) { + mapFieldsByLoc[sitemapField.loc] = sitemapField + } + } + + if (this.config?.additionalPaths) { + const additions = + (await this.config?.additionalPaths({ + ...this.config, + transform: this.config?.transform ?? defaultSitemapTransformer, + })) ?? [] + + for (const field of additions) { + if (!field?.loc) continue + + const collision = mapFieldsByLoc[field.loc] + + // Update first entry + if (collision) { + // Mutate common entry between sitemapFields and mapFieldsByLoc (spread operator don't work) + Object.entries(field).forEach( + ([key, value]) => (collision[key] = value), + ) + continue + } + + sitemapFields.push(field) + } + } + + return sitemapFields.map((x) => this.normalizeSitemapField(x)) + } +} diff --git a/packages/next-sitemap/src/cli.ts b/packages/next-sitemap/src/cli.ts new file mode 100644 index 00000000..96dcdce0 --- /dev/null +++ b/packages/next-sitemap/src/cli.ts @@ -0,0 +1,57 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { Logger } from './logger.js' +import { toChunks } from './utils/array.js' +import { ConfigParser } from './parsers/config-parser.js' +import { ManifestParser } from './parsers/manifest-parser.js' +import { UrlSetBuilder } from './builders/url-set-builder.js' +import { ExportableBuilder } from './builders/exportable-builder.js' + +export class CLI { + /** + * Main method + * @returns + */ + async main() { + // Load config from `next-sitemap.config.js` along with runtimePaths info + const configParser = new ConfigParser() + const { config, runtimePaths } = await configParser.loadConfig() + + // Load next.js manifest + const manifestParser = new ManifestParser(config, runtimePaths) + const manifest = await manifestParser.loadManifest() + + // Generate url set + const urlSetBuilder = new UrlSetBuilder(config, manifest) + const urlSet = await urlSetBuilder.createUrlSet() + + // Split sitemap into multiple files + const chunks = toChunks(urlSet, config.sitemapSize!) + + // Create ExportableBuilder instance + const expoBuilder = new ExportableBuilder(config, runtimePaths) + + // Register sitemap exports + await expoBuilder.registerSitemaps(chunks) + + // Register index sitemap if user config allows generation + if (config.generateIndexSitemap) { + await expoBuilder.registerIndexSitemap() + } + + // Register robots.txt export if user config allows generation + if (config?.generateRobotsTxt) { + await expoBuilder.registerRobotsTxt() + } + + // Export all files + return expoBuilder.exportAll() + } + + /** + * Execute and log result + * @returns + */ + async execute() { + return this.main().then(Logger.generationCompleted).catch(Logger.error) + } +} diff --git a/packages/next-sitemap/src/index.ts b/packages/next-sitemap/src/index.ts new file mode 100644 index 00000000..a56c5012 --- /dev/null +++ b/packages/next-sitemap/src/index.ts @@ -0,0 +1,10 @@ +// Export types +export * from './interface.js' + +// Export server side sitemaps +export * from './ssr/response.js' +export * from './ssr/sitemap-index.js' +export * from './ssr/sitemap.js' + +// Export sitemap builder +export * from './builders/sitemap-builder.js' diff --git a/packages/next-sitemap/src/interface.ts b/packages/next-sitemap/src/interface.ts new file mode 100644 index 00000000..403ad1be --- /dev/null +++ b/packages/next-sitemap/src/interface.ts @@ -0,0 +1,307 @@ +type MaybeUndefined = T | undefined +type MaybePromise = T | Promise + +type Changefreq = + | 'always' + | 'hourly' + | 'daily' + | 'weekly' + | 'monthly' + | 'yearly' + | 'never' + +/** + * Robot.txt policy options + */ +export interface IRobotPolicy { + /** + * User agent name + */ + userAgent: string + + /** + * Disallow option(s) + */ + disallow?: string | string[] + + /** + * Allow option(s) + */ + allow?: string | string[] + + /** + * Crawl delay + */ + crawlDelay?: number +} + +/** + * robots.txt Options + */ +export interface IRobotsTxt { + /** + * Crawl policies + */ + policies?: IRobotPolicy[] + + /** + * Additional sitemaps which need to be added to robots + */ + additionalSitemaps?: string[] + + /** + * From v2.4x onwards, generated `robots.txt` will only contain url of `index sitemap` and custom provided endpoints from `robotsTxtOptions.additionalSitemaps` + * + * This is to prevent duplicate url submission (once through index-sitemap -> sitemap-url and once through robots.txt -> HOST) + * + * Set this option `true` to add all generated sitemap endpoints to `robots.txt` + * @default false + */ + includeNonIndexSitemaps?: boolean + + /** + * Custom robots.txt transformer + */ + transformRobotsTxt?: (config: IConfig, robotsTxt: string) => Promise +} + +/** + * Sitemap configuration + */ +export interface IConfig { + /** + * Base url of your website + */ + siteUrl: string + + /** + * Change frequency. + * @default 'daily' + */ + changefreq?: Changefreq + + /** + * The type of build output. + * @see https://nextjs.org/docs/pages/api-reference/next-config-js/output + */ + output?: 'standalone' | 'export' | undefined + + /** + * Priority + * @default 0.7 + */ + priority?: any + + /** + * The name of the generated sitemap file before the file extension. + * @default "sitemap" + */ + sitemapBaseFileName?: string + + /** + * next.js build directory. + * @default .next + */ + sourceDir?: string + + /** + * All the generated files will be exported to this directory. + * @default public + */ + outDir?: string + + /** + * Split large sitemap into multiple files by specifying sitemap size. + * @default 5000 + */ + sitemapSize?: number + + /** + * Generate a robots.txt file and list the generated sitemaps. + * @default false + */ + generateRobotsTxt?: boolean + + /** + * robots.txt options + */ + robotsTxtOptions?: IRobotsTxt + + /** + * Add property. + * @default true + */ + autoLastmod?: boolean + + /** + * Array of relative paths (wildcard pattern supported) to exclude from listing on sitemap.xml or sitemap-*.xml. + * Apart from this option next-sitemap also offers a custom transform option which could be used to exclude urls that match specific patterns + * @example ['/page-0', '/page-*', '/private/*'] + */ + exclude?: string[] | (() => Promise) + + alternateRefs?: Array + + /** + * A transformation function, which runs for each relative-path in the sitemap. Returning null value from the transformation function will result in the exclusion of that specific path from the generated sitemap list. + * @link https://github.com/iamvishnusankar/next-sitemap#custom-transformation-function + */ + transform?: ( + config: IConfig, + url: string, + ) => MaybePromise> + + /** + * A function that returns a list of additional paths to be added to the generated sitemap list. + * @link https://github.com/iamvishnusankar/next-sitemap#additional-paths-function + */ + additionalPaths?: ( + config: AdditionalPathsConfig, + ) => MaybePromise[]> + + /** + * Include trailing slash + */ + trailingSlash?: boolean + + /** + * Boolean to enable/disable index sitemap generation + * If enabled next-sitemap will generate sitemap-*.xml and sitemap.xml (index sitemap) + * @default true + */ + generateIndexSitemap?: boolean +} + +export type AdditionalPathsConfig = Readonly< + IConfig & { + transform: NonNullable + } +> + +export interface IBuildManifest { + pages: { + [key: string]: string[] + } + ampFirstPages?: string[] +} + +export interface IPreRenderManifest { + routes: { + [key: string]: any + } + notFoundRoutes: string[] +} + +export interface IRoutesManifest { + i18n?: { + locales: string[] + defaultLocale: string + } +} + +export interface IExportMarker { + exportTrailingSlash: boolean +} + +export interface INextManifest { + build?: IBuildManifest + preRender?: IPreRenderManifest + routes?: IRoutesManifest + staticExportPages?: string[] +} + +/** + * Use IExportable instead + * @deprecated + */ +export interface ISitemapChunk { + path: string + fields: ISitemapField[] + filename: string +} + +export interface IExportable { + url: string + filename: string + content: string + type: 'robots.txt' | 'sitemap' | 'sitemap-index' +} + +export interface IRuntimePaths { + BUILD_MANIFEST: string + PRERENDER_MANIFEST: string + ROUTES_MANIFEST: string + ROBOTS_TXT_FILE: string + EXPORT_MARKER: string + SITEMAP_INDEX_FILE?: string + SITEMAP_INDEX_URL?: string + STATIC_EXPORT_ROOT: string +} + +export type IAlternateRef = { + href: string + hreflang: string + hrefIsAbsolute?: boolean +} + +export type IGoogleNewsEntry = { + title: string + date: Date | string + publicationName: string + publicationLanguage: string +} + +export type IImageEntry = { + loc: URL | string + caption?: string + geoLocation?: string + title?: string + license?: URL +} + +export type IRestriction = { + relationship: 'allow' | 'deny' + content: string +} + +export type IVideoEntry = { + title: string + thumbnailLoc: URL + description: string + contentLoc?: URL + playerLoc?: URL + duration?: number + expirationDate?: Date | string + rating?: number + viewCount?: number + publicationDate?: Date | string + familyFriendly?: boolean + restriction?: IRestriction + platform?: IRestriction + requiresSubscription?: boolean + uploader?: { + name: string + info?: URL + } + live?: boolean + tag?: string +} + +export type ISitemapField = { + loc: string + lastmod?: string + changefreq?: Changefreq + priority?: number + alternateRefs?: Array + trailingSlash?: boolean + + news?: IGoogleNewsEntry + images?: Array + videos?: Array +} + +export interface INextSitemapResult { + sitemaps: string[] + sitemapIndices: string[] + runtimePaths: IRuntimePaths +} diff --git a/packages/next-sitemap/src/logger.ts b/packages/next-sitemap/src/logger.ts new file mode 100644 index 00000000..7bbd19e6 --- /dev/null +++ b/packages/next-sitemap/src/logger.ts @@ -0,0 +1,99 @@ +import type { INextSitemapResult } from './interface.js' + +/** + * Generic console logger + */ +export class Logger { + /** + * Missing build + */ + static noBuildManifest() { + Logger.error( + 'Unable to find build-manifest.\nMake sure to build the project using `next build` command\n', + ) + } + + /** + * Missing build + */ + static noExportMarker() { + Logger.error( + 'Unable to find export-maker.\nMake sure to build the project using `next build` command\n', + ) + } + + /** + * Log missing config file + */ + static noConfigFile() { + Logger.error( + 'Unable to find next-sitemap.config.js or custom config file.\n\nIMPORTANT: Default config file has been renamed to `next-sitemap.config.js`\n\nIf you are using custom config file, make sure to invoke `next-sitemap --config .js`\n', + ) + } + + /** + * Generic error logger + * @param text + * @returns + */ + static error(...text: string[]) { + return console.error(`\x1b[31m`, `❌`, `[next-sitemap]`, ...text) + } + + /** + * Generic log + * @param emoji + * @param text + */ + static log(emoji: string, ...text: string[]): any { + return console.log(emoji, `[next-sitemap]`, ...text) + } + + static logList(title: string, list: string[]) { + console.log( + `-----------------------------------------------------\n`, + title, + `\n-----------------------------------------------------\n`, + ) + + // Only show 5 entries on console + if (list?.length > 7) { + list = [...list.splice(0, 3), '...', ...list.splice(list.length - 2, 2)] + } + + // log all sitemap list + list?.forEach((x) => + x === '...' ? console.log(` ${x}`) : console.log(` ○ ${x}`), + ) + + console.log(`\n`) + } + + /** + * Log stats when the generation is completed + * @param result + * @returns + */ + static generationCompleted(result: INextSitemapResult) { + // Initial stats + Logger.log(`✅`, 'Generation completed') + + const indexCount = result.sitemapIndices.length + const sitemapCount = result.sitemaps.length + + console.table({ + indexSitemaps: indexCount, + sitemaps: sitemapCount, + }) + + // Log sitemap index list + if (indexCount > 0) { + Logger.logList('SITEMAP INDICES', result.sitemapIndices) + } + + // Log sitemap list + if (sitemapCount > 0) { + Logger.logList('SITEMAPS', result.sitemaps) + } + } +} diff --git a/packages/next-sitemap/src/parsers/config-parser.ts b/packages/next-sitemap/src/parsers/config-parser.ts new file mode 100644 index 00000000..e26d304a --- /dev/null +++ b/packages/next-sitemap/src/parsers/config-parser.ts @@ -0,0 +1,114 @@ +import { Logger } from '../logger.js' +import { withDefaultConfig } from '../utils/defaults.js' +import { getConfigFilePath, getRuntimePaths } from '../utils/path.js' +import type { IConfig, IRuntimePaths, IExportMarker } from '../interface.js' +import { overwriteMerge } from '../utils/merge.js' +import { loadJSON } from '../utils/file.js' + +export class ConfigParser { + /** + * Get runtime config + * @param runtimePaths + * @returns + */ + private async getRuntimeConfig( + config: IConfig, + runtimePaths: IRuntimePaths, + ): Promise> { + // Skip export marker loading if output is set to "export" + if (config?.output === 'export') { + return {} + } + + // Load export marker + const exportMarkerConfig = await loadJSON( + runtimePaths.EXPORT_MARKER, + ).catch((err) => { + Logger.noExportMarker() + throw err + }) + + return { + trailingSlash: exportMarkerConfig?.exportTrailingSlash, + } + } + + /** + * Update existing config with runtime config + * @param config + * @param runtimePaths + * @returns + */ + private async withRuntimeConfig( + config: IConfig, + runtimePaths: IRuntimePaths, + ): Promise { + // Runtime configs + const runtimeConfig = await this.getRuntimeConfig(config, runtimePaths) + + // Prioritize `trailingSlash` value from `next-sitemap.js` + const trailingSlashConfig: Partial = {} + if ('trailingSlash' in config) { + trailingSlashConfig.trailingSlash = config?.trailingSlash + } + + return overwriteMerge(config, runtimeConfig, trailingSlashConfig) + } + + /** + * Load next-sitemap.config.js as module + * @returns + */ + private async loadBaseConfig(): Promise { + // Get config file path + const path = await getConfigFilePath() + + // Config loading message + Logger.log('✨', `Loading next-sitemap config:`, path) + + // Load base config + const baseConfig = await import(path) + + if (!baseConfig.default) { + throw new Error('Unable to next-sitemap config file') + } + + return withDefaultConfig(baseConfig.default) + } + + /** + * Basic validation + * @param config + */ + async validateConfig(config: IConfig) { + if (!config?.siteUrl) { + throw new Error('Validation error: Missing siteUrl') + } + + return config + } + + /** + * Load full config + * @returns + */ + async loadConfig() { + // Load base config + const baseConfig = await this.loadBaseConfig() + + // Find the runtime paths using base config + const runtimePaths = getRuntimePaths(baseConfig) + + // Update base config with runtime config + const config = await this.withRuntimeConfig(baseConfig, runtimePaths) + + // Validate config + await this.validateConfig(config) + + // Return full result + return { + config, + runtimePaths, + } + } +} diff --git a/packages/next-sitemap/src/parsers/manifest-parser.ts b/packages/next-sitemap/src/parsers/manifest-parser.ts new file mode 100644 index 00000000..375b8975 --- /dev/null +++ b/packages/next-sitemap/src/parsers/manifest-parser.ts @@ -0,0 +1,80 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { + INextManifest, + IPreRenderManifest, + IBuildManifest, + IRuntimePaths, + IRoutesManifest, + IConfig, +} from '../interface.js' +import { Logger } from '../logger.js' +import { loadJSON } from '../utils/file.js' +import fg from 'fast-glob' + +export class ManifestParser { + config: IConfig + runtimePaths: IRuntimePaths + + constructor(config: IConfig, runtimePaths: IRuntimePaths) { + this.config = config + this.runtimePaths = runtimePaths + } + /** + * Return paths of html files if config.output = "export" + * @param exportFolder + * @returns + */ + async getStaticExportPages(config: IConfig, exportFolder: string) { + // Skip this step if config.output is not export mode + if (config?.output !== 'export') { + return [] + } + + // Get html file paths using glob + const htmlFiles = await fg(`${exportFolder}/**/*.html`) + + // Cleanup files + return htmlFiles?.map((file) => + file + .replace(exportFolder, '') + .replace('index', '') + .replace('.html', '') + .trim(), + ) + } + + async loadManifest(): Promise { + // Load build manifest + const buildManifest = await loadJSON( + this.runtimePaths.BUILD_MANIFEST, + )! + + // Throw error if no build manifest exist + if (this.config?.output !== 'export' && !buildManifest) { + throw Logger.noBuildManifest() + } + + // Load pre-render manifest + const preRenderManifest = await loadJSON( + this.runtimePaths.PRERENDER_MANIFEST, + ) + + // Load routes manifest + const routesManifest = await loadJSON( + this.runtimePaths.ROUTES_MANIFEST, + ) + + // Get static export path when output is set as "export" + const staticExportPages = await this.getStaticExportPages( + this.config, + this.runtimePaths.STATIC_EXPORT_ROOT, + ) + + return { + build: buildManifest ?? ({} as any), + preRender: preRenderManifest, + routes: routesManifest, + staticExportPages, + } + } +} diff --git a/packages/next-sitemap/src/ssr/response.ts b/packages/next-sitemap/src/ssr/response.ts new file mode 100644 index 00000000..46a97d34 --- /dev/null +++ b/packages/next-sitemap/src/ssr/response.ts @@ -0,0 +1,46 @@ +import type { GetServerSidePropsContext } from 'next' + +/** + * Send XML response, supports legacy pages directory + * @param ctx + * @param content + * @returns + */ +export const withXMLResponseLegacy = ( + ctx: GetServerSidePropsContext, + content: string, +) => { + if (ctx?.res) { + const { res } = ctx + + // Set header + res.setHeader('Content-Type', 'text/xml') + + // Write the sitemap context to resonse + res.write(content) + + // End response + res.end() + } + + // Empty props + return { + props: {}, + } +} + +/** + * Send XML response, as next13+ route response + * @param content + * @param headers Custom request headers + * @returns + */ +export const withXMLResponse = (content: string, headers = {}) => { + return new Response(content, { + status: 200, + headers: { + 'Content-Type': 'text/xml', + ...headers, + }, + }) +} diff --git a/packages/next-sitemap/src/ssr/sitemap-index.ts b/packages/next-sitemap/src/ssr/sitemap-index.ts new file mode 100644 index 00000000..a9dbc8de --- /dev/null +++ b/packages/next-sitemap/src/ssr/sitemap-index.ts @@ -0,0 +1,38 @@ +import type { GetServerSidePropsContext } from 'next' +import { SitemapBuilder } from '../builders/sitemap-builder.js' +import { withXMLResponseLegacy, withXMLResponse } from './response.js' + +/** + * Generate index sitemaps on server side, support pages directory + * @param ctx + * @param sitemaps + * @returns + */ +export const getServerSideSitemapIndexLegacy = async ( + ctx: GetServerSidePropsContext, + sitemaps: string[], +) => { + // Generate index sitemap xml content + const indexContents = new SitemapBuilder().buildSitemapIndexXml(sitemaps) + + // Return response + return withXMLResponseLegacy(ctx, indexContents) +} + +/** + * Generate index sitemaps on server side, support next13+ route.{ts,js} file. + * To continue using inside pages directory, import `getServerSideSitemapIndexLegacy` instead. + * @param sitemaps + * @param headers Custom request headers + * @returns + */ +export const getServerSideSitemapIndex = async ( + sitemaps: string[], + headers = {}, +) => { + // Generate index sitemap xml content + const indexContents = new SitemapBuilder().buildSitemapIndexXml(sitemaps) + + // Return response + return withXMLResponse(indexContents, headers) +} diff --git a/packages/next-sitemap/src/ssr/sitemap.ts b/packages/next-sitemap/src/ssr/sitemap.ts new file mode 100644 index 00000000..f5ac28f5 --- /dev/null +++ b/packages/next-sitemap/src/ssr/sitemap.ts @@ -0,0 +1,39 @@ +import type { GetServerSidePropsContext } from 'next' +import { withXMLResponseLegacy, withXMLResponse } from './response.js' +import { SitemapBuilder } from '../builders/sitemap-builder.js' +import type { ISitemapField } from '../interface.js' + +/** + * Generate server side sitemaps, supports legacy pages directory + * @param ctx + * @param fields + * @returns + */ +export const getServerSideSitemapLegacy = async ( + ctx: GetServerSidePropsContext, + fields: ISitemapField[], +) => { + // Generate sitemap xml + const contents = new SitemapBuilder().buildSitemapXml(fields) + + // Send response + return withXMLResponseLegacy(ctx, contents) +} + +/** + * Generate server side sitemaps, support next13+ route.{ts,js} file. + * To continue using inside pages directory, import `getServerSideSitemapLegacy` instead. + * @param fields + * @param headers Custom request headers + * @returns + */ +export const getServerSideSitemap = async ( + fields: ISitemapField[], + headers = {}, +) => { + // Generate sitemap xml + const contents = new SitemapBuilder().buildSitemapXml(fields) + + // Send response + return withXMLResponse(contents, headers) +} diff --git a/packages/next-sitemap/src/utils/__tests__/array.test.ts b/packages/next-sitemap/src/utils/__tests__/array.test.ts new file mode 100644 index 00000000..f44c8d53 --- /dev/null +++ b/packages/next-sitemap/src/utils/__tests__/array.test.ts @@ -0,0 +1,40 @@ +import { + removeFromArray, + removeIfMatchPattern, + toArray, + toChunks, +} from '../array.js' + +describe('next-sitemap/array', () => { + test('toChunks', () => { + const inputArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + const chunkSize = 3 + + const chunks = toChunks(inputArray, chunkSize) + expect(chunks).toStrictEqual([ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [9, 10], + ]) + }) + + test('toArray', () => { + expect(toArray('hello')).toStrictEqual(['hello']) + expect(toArray(['hello', 'world'])).toStrictEqual(['hello', 'world']) + }) + + test('removeFromArray', () => { + expect(removeFromArray([1, 2, 3], [2])).toStrictEqual([1, 3]) + expect(removeFromArray([1, 2, 3], [2, 3, 4])).toStrictEqual([1]) + }) + + test('removeIfMatchPattern', () => { + expect( + removeIfMatchPattern( + ['/hello', '/world', '/something'], + ['/hello*', '/som*'], + ), + ).toStrictEqual(['/world']) + }) +}) diff --git a/packages/next-sitemap/src/utils/__tests__/defaults.test.ts b/packages/next-sitemap/src/utils/__tests__/defaults.test.ts new file mode 100644 index 00000000..834526b0 --- /dev/null +++ b/packages/next-sitemap/src/utils/__tests__/defaults.test.ts @@ -0,0 +1,198 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +import type { IConfig, ISitemapField } from '../../interface.js' +import { + defaultConfig, + defaultRobotsTxtTransformer, + defaultSitemapTransformer, + withDefaultConfig, +} from '../defaults.js' + +describe('next-sitemap/defaults', () => { + test('defaultConfig', () => { + expect(defaultConfig).toStrictEqual>({ + sourceDir: '.next', + outDir: 'public', + sitemapBaseFileName: 'sitemap', + generateIndexSitemap: true, + priority: 0.7, + changefreq: 'daily', + sitemapSize: 5000, + autoLastmod: true, + exclude: [], + transform: defaultSitemapTransformer, + robotsTxtOptions: { + transformRobotsTxt: defaultRobotsTxtTransformer, + policies: [ + { + userAgent: '*', + allow: '/', + }, + ], + additionalSitemaps: [], + }, + }) + }) + + test('withDefaultConfig', () => { + const myConfig = withDefaultConfig({ + sourceDir: 'custom-source', + generateRobotsTxt: true, + generateIndexSitemap: true, + sitemapSize: 50000, + exclude: ['1', '2'], + robotsTxtOptions: { + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + + expect(myConfig).toStrictEqual>({ + sourceDir: 'custom-source', + outDir: 'public', + sitemapBaseFileName: 'sitemap', + generateIndexSitemap: true, + priority: 0.7, + changefreq: 'daily', + sitemapSize: 50000, + autoLastmod: true, + generateRobotsTxt: true, + exclude: ['1', '2'], + transform: defaultSitemapTransformer, + robotsTxtOptions: { + transformRobotsTxt: defaultRobotsTxtTransformer, + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + }) + + test('withDefaultConfig: Static export', () => { + const myConfig = withDefaultConfig({ + output: 'export', // Static output mode + generateRobotsTxt: true, + generateIndexSitemap: true, + sitemapSize: 50000, + exclude: ['1', '2'], + robotsTxtOptions: { + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + + expect(myConfig).toStrictEqual>({ + output: 'export', + sourceDir: 'out', + outDir: 'out', + sitemapBaseFileName: 'sitemap', + generateIndexSitemap: true, + priority: 0.7, + changefreq: 'daily', + sitemapSize: 50000, + autoLastmod: true, + generateRobotsTxt: true, + exclude: ['1', '2'], + transform: defaultSitemapTransformer, + robotsTxtOptions: { + transformRobotsTxt: defaultRobotsTxtTransformer, + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + }) + + test('withDefaultConfig: Default transformation', async () => { + const myConfig = withDefaultConfig({ + trailingSlash: false, + sourceDir: 'custom-source', + generateRobotsTxt: true, + generateIndexSitemap: true, + sitemapSize: 50000, + exclude: ['1', '2'], + priority: 0.6, + changefreq: 'weekly', + robotsTxtOptions: { + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + + // Default transform + await expect( + myConfig.transform!(myConfig, 'https://example.com'), + ).resolves.toStrictEqual({ + loc: 'https://example.com', + lastmod: expect.any(String), + changefreq: 'weekly', + priority: 0.6, + alternateRefs: [], + trailingSlash: myConfig.trailingSlash, + }) + + // Default transform with custom config override + await expect( + myConfig.transform!( + { + ...myConfig, + trailingSlash: true, + }, + 'https://example.com', + ), + ).resolves.toStrictEqual({ + loc: 'https://example.com', + lastmod: expect.any(String), + changefreq: 'weekly', + priority: 0.6, + alternateRefs: [], + trailingSlash: true, + }) + }) + + test('withDefaultConfig: Custom transformation', async () => { + const myConfig = withDefaultConfig({ + sourceDir: 'custom-source', + generateRobotsTxt: true, + sitemapSize: 50000, + exclude: ['1', '2'], + priority: 0.6, + changefreq: 'weekly', + transform: async (): Promise => { + return { + loc: 'something-else', + lastmod: 'lastmod-cutom', + } + }, + robotsTxtOptions: { + transformRobotsTxt: defaultRobotsTxtTransformer, + policies: [], + additionalSitemaps: [ + 'https://example.com/awesome-sitemap.xml', + 'https://example.com/awesome-sitemap-2.xml', + ], + }, + }) + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const value = await myConfig.transform!(myConfig, 'https://example.com') + + expect(value).toStrictEqual({ + loc: 'something-else', + lastmod: 'lastmod-cutom', + }) + }) +}) diff --git a/packages/next-sitemap/src/utils/__tests__/url.test.ts b/packages/next-sitemap/src/utils/__tests__/url.test.ts new file mode 100644 index 00000000..fa3665e8 --- /dev/null +++ b/packages/next-sitemap/src/utils/__tests__/url.test.ts @@ -0,0 +1,80 @@ +import { + isURL, + cleanPath, + generateUrl, + isNextInternalUrl, + createDefaultLocaleReplace, +} from '../url.js' + +describe('next-sitemap/url', () => { + test('isURL : Valid', () => { + expect(isURL('https://example.com')).toBeTruthy() + }) + + test('isURL : Invalid', () => { + expect(isURL('/someone-relative/path/item.jpg')).toBeFalsy() + }) + + test('cleanPath : Relative Path', () => { + expect(cleanPath('./epic///awesome///path')).toBe('./epic/awesome/path') + }) + + test('cleanPath: Public Url', () => { + expect(cleanPath('https://www.example.com//epic///awesome///path')).toBe( + 'https://www.example.com/epic/awesome/path', + ) + }) + + test('generateUrl: with relative slug', () => { + const url = generateUrl('https://base.example.com', '//awesome/path') + expect(url).toBe('https://base.example.com/awesome/path') + }) + + test('generateUrl: with external slug', () => { + const url = generateUrl( + 'https://base.example.com', + 'https://cdn.another.site/new//path', + ) + expect(url).toBe('https://cdn.another.site/new/path') + }) + + test('isNextInternalUrl', () => { + expect(isNextInternalUrl('/_app')).toBeTruthy() + expect(isNextInternalUrl('/404')).toBeTruthy() + expect(isNextInternalUrl('/500')).toBeTruthy() + expect(isNextInternalUrl('/_random')).toBeTruthy() + expect(isNextInternalUrl('/_middleware')).toBeTruthy() + expect(isNextInternalUrl('/about/_middleware')).toBeTruthy() + expect(isNextInternalUrl('/some_url/about/_middleware')).toBeTruthy() + expect(isNextInternalUrl('/projects/[id]/_middleware')).toBeTruthy() + expect(isNextInternalUrl('/favicon.ico')).toBeTruthy() + }) + + test('isNextInternalUrl: url params', () => { + expect(isNextInternalUrl('/[id]')).toBeTruthy() + expect(isNextInternalUrl('/blog/[id]')).toBeTruthy() + }) + + test('isNextInternalUrl: allow urls with underscore`', () => { + expect(isNextInternalUrl('/_some_url')).toBeTruthy() + expect(isNextInternalUrl('/some_url/[param]')).toBeTruthy() + + expect(isNextInternalUrl('/some_url')).toBeFalsy() + expect(isNextInternalUrl('/some-404')).toBeFalsy() + expect(isNextInternalUrl('/some-500')).toBeFalsy() + }) + + test('createDefaultLocaleReplace: replaces default locale within path`', () => { + const replaceDefaultLocale = createDefaultLocaleReplace('en-US') + + expect(replaceDefaultLocale('/')).toBe('/') + expect(replaceDefaultLocale('/en-US')).toBe('/') + expect(replaceDefaultLocale('/en-US/')).toBe('/') + expect(replaceDefaultLocale('/en-US/home')).toBe('/home') + expect(replaceDefaultLocale('/en-US/home/')).toBe('/home/') + expect(replaceDefaultLocale('/en-US-home')).toBe('/en-US-home') + expect(replaceDefaultLocale('/en-USA/home')).toBe('/en-USA/home') + expect(replaceDefaultLocale('/fr')).toBe('/fr') + expect(replaceDefaultLocale('/fr/about')).toBe('/fr/about') + }) +}) diff --git a/packages/next-sitemap/src/utils/array.ts b/packages/next-sitemap/src/utils/array.ts new file mode 100644 index 00000000..c0466b93 --- /dev/null +++ b/packages/next-sitemap/src/utils/array.ts @@ -0,0 +1,46 @@ +import { matcher } from './matcher.js' + +/** + * Split an array based on size + * @param arr + * @param chunkSize + * @returns + */ +export const toChunks = (arr: T[], chunkSize: number): T[][] => { + return arr.reduce>( + (prev, _, i) => + i % chunkSize ? prev : [...prev, arr.slice(i, i + chunkSize)], + [], + ) +} + +/** + * simple method to normalize any string to array + * @param inp + */ +export const toArray = (inp: string | string[]): string[] => { + return typeof inp === 'string' ? [inp] : inp +} + +/** + * Returns the difference between two arrays + * @param inputArr input array + * @param toRemoveArr array of elements to be removed + */ +export const removeFromArray = (inputArr: T[], toRemoveArr: T[]): T[] => { + return inputArr.filter((x) => !toRemoveArr.includes(x)) +} + +/** + * Returns the difference between two arrays, which match input array pattern + * @param inputArr input array + * @param toRemoveArr array of elements to be removed + */ +export const removeIfMatchPattern = ( + inputArr: string[], + toRemoveArr: string[], +): string[] => { + const matchedArr = matcher(inputArr, toRemoveArr) + + return removeFromArray(inputArr, matchedArr) +} diff --git a/packages/next-sitemap/src/utils/defaults.ts b/packages/next-sitemap/src/utils/defaults.ts new file mode 100644 index 00000000..3ac66fda --- /dev/null +++ b/packages/next-sitemap/src/utils/defaults.ts @@ -0,0 +1,73 @@ +import { IConfig, ISitemapField } from '../interface.js' +import { overwriteMerge } from './merge.js' + +export const defaultSitemapTransformer = async ( + config: IConfig, + loc: string, +): Promise => { + return { + loc, + lastmod: config?.autoLastmod ? new Date().toISOString() : undefined, + changefreq: config?.changefreq, + priority: config?.priority, + alternateRefs: config.alternateRefs ?? [], + trailingSlash: config?.trailingSlash, + } +} + +export const defaultRobotsTxtTransformer = async (_: IConfig, text: string) => + text + +export const defaultConfig: Partial = { + sourceDir: '.next', + outDir: 'public', + priority: 0.7, + sitemapBaseFileName: 'sitemap', + changefreq: 'daily', + sitemapSize: 5000, + autoLastmod: true, + exclude: [], + transform: defaultSitemapTransformer, + generateIndexSitemap: true, + robotsTxtOptions: { + transformRobotsTxt: defaultRobotsTxtTransformer, + policies: [ + { + userAgent: '*', + allow: '/', + }, + ], + additionalSitemaps: [], + }, +} + +/** + * Set a preset for static export mode + * @param config + * @returns + */ +export const getStaticExportConfigPreset = ( + config: Partial, +): Partial => { + // Return empty preset for non static export + if (config?.output !== 'export') { + return {} + } + + return { + sourceDir: 'out', + outDir: 'out', + } +} + +/** + * Get default config + * @param config + * @returns + */ +export const withDefaultConfig = (config: Partial): IConfig => { + // Add output.export config + const staticExportConfig = getStaticExportConfigPreset(config) + + return overwriteMerge(defaultConfig, staticExportConfig, config) +} diff --git a/packages/next-sitemap/src/utils/file.ts b/packages/next-sitemap/src/utils/file.ts new file mode 100644 index 00000000..186478c2 --- /dev/null +++ b/packages/next-sitemap/src/utils/file.ts @@ -0,0 +1,55 @@ +import * as fs from 'node:fs/promises' +import path from 'node:path' + +/** + * Load file + * @param path + * @param throwError + * @returns + */ +export const loadJSON = async (path: string): Promise => { + // Get path stat + const stat = await fs.stat(path).catch(() => { + return { + isFile: () => false, // Handle errors gracefully + } + }) + + // Return undefined or throw error + if (!stat.isFile()) { + return // Handle errors gracefully + } + + const jsonString = await fs.readFile(path, { encoding: 'utf-8' }) + + return JSON.parse(jsonString) +} + +/** + * Export file + * @param filePath + * @param content + * @returns + */ +export const exportFile = async ( + filePath: string, + content: string, +): Promise => { + // Target folder + const folder = path.dirname(filePath) + + // Get file stat + const stat = await fs.stat(folder).catch(() => ({ + isDirectory: () => false, + })) + + // Directory + if (!stat.isDirectory()) { + await fs.mkdir(folder).catch(() => { + return + }) + } + + // Write file + return fs.writeFile(filePath, content) +} diff --git a/packages/next-sitemap/src/utils/matcher.ts b/packages/next-sitemap/src/utils/matcher.ts new file mode 100644 index 00000000..a60ad305 --- /dev/null +++ b/packages/next-sitemap/src/utils/matcher.ts @@ -0,0 +1,142 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +export const escapeStringRegexp = (text: string): string => { + if (typeof text !== 'string') { + throw new TypeError('Expected a string') + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return text?.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d') +} + +const regexpCache = new Map() + +const sanitizeArray = (input: T[], inputName: any) => { + if (!Array.isArray(input)) { + switch (typeof input) { + case 'string': + input = [input] + break + case 'undefined': + input = [] + break + default: + throw new TypeError( + `Expected '${inputName}' to be a string or an array, but got a type of '${typeof input}'`, + ) + } + } + + return input.filter((string) => { + if (typeof string !== 'string') { + if (typeof string === 'undefined') { + return false + } + + throw new TypeError( + `Expected '${inputName}' to be an array of strings, but found a type of '${typeof string}' in the array`, + ) + } + + return true + }) +} + +const makeRegexp = (pattern: T, options = {}) => { + options = { + caseSensitive: false, + ...options, + } + + const cacheKey = pattern + JSON.stringify(options) + + if (regexpCache.has(cacheKey)) { + return regexpCache.get(cacheKey) + } + + const negated = (pattern as any)[0] === '!' + + if (negated) { + pattern = (pattern as any).slice(1) + } + + pattern = escapeStringRegexp(pattern as any).replace( + /\\\*/g, + '[\\s\\S]*', + ) as any + + const regexp = new RegExp( + `^${pattern}$`, + (options as any).caseSensitive ? '' : 'i', + ) + ;(regexp as any).negated = negated + regexpCache.set(cacheKey, regexp) + + return regexp +} + +const baseMatcher = ( + inputs: T[], + patterns: T[], + options: any = {}, + firstMatchOnly = false, +) => { + inputs = sanitizeArray(inputs, 'inputs') + patterns = sanitizeArray(patterns, 'patterns') + + if (patterns.length === 0) { + return [] + } + + patterns = patterns.map((pattern) => makeRegexp(pattern, options)) + + const { allPatterns } = options || {} + const result: T[] = [] + + for (const input of inputs) { + // String is included only if it matches at least one non-negated pattern supplied. + // Note: the `allPatterns` option requires every non-negated pattern to be matched once. + // Matching a negated pattern excludes the string. + let matches + const didFit: T[] = [...patterns].fill(false as unknown as T) + + for (const [index, pattern] of (patterns as any).entries()) { + if ((pattern as any).test(input)) { + didFit[index] = true as unknown as T + matches = !(pattern as any).negated + + if (!matches) { + break + } + } + } + + if ( + !( + matches === false || + (matches === undefined && + patterns.some((pattern) => !(pattern as any).negated)) || + (allPatterns && + didFit.some( + (yes, index) => !yes && !(patterns[index] as any).negated, + )) + ) + ) { + result.push(input) + + if (firstMatchOnly) { + break + } + } + } + + return result +} + +export const matcher = (inputs: T[], patterns: T[], options = {}) => { + return baseMatcher(inputs, patterns, options, false) +} + +export const isMatch = (inputs: T[], patterns: T[], options = {}) => { + return baseMatcher(inputs, patterns, options, true).length > 0 +} diff --git a/packages/next-sitemap/src/utils/merge.ts b/packages/next-sitemap/src/utils/merge.ts new file mode 100644 index 00000000..84cbf190 --- /dev/null +++ b/packages/next-sitemap/src/utils/merge.ts @@ -0,0 +1,13 @@ +import { merge } from '@corex/deepmerge' + +export const overwriteMerge = (...configs: Array>): T => { + return merge(configs, { + arrayMergeType: 'overwrite', + }) as T +} + +export const combineMerge = (...configs: Array>): T => { + return merge(configs, { + arrayMergeType: 'combine', + }) as T +} diff --git a/packages/next-sitemap/src/utils/path.ts b/packages/next-sitemap/src/utils/path.ts new file mode 100644 index 00000000..f9099713 --- /dev/null +++ b/packages/next-sitemap/src/utils/path.ts @@ -0,0 +1,70 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import minimist from 'minimist' +import fs from 'node:fs/promises' +import path from 'node:path' +import { Logger } from '../logger.js' +import { generateUrl } from './url.js' +import type { IConfig, IRuntimePaths } from '../interface.js' +import { pathToFileURL } from 'url' + +/** + * Return absolute path from path segments + * @param pathSegment + * @returns + */ +export const getPath = (...pathSegment: string[]): string => { + return path.resolve(process.cwd(), ...pathSegment) +} + +/** + * Return all runtime paths + * @param config + * @returns + */ +export const getRuntimePaths = (config: IConfig): IRuntimePaths => { + // Check whether user enabled index sitemap or not + const sitemapIndexEnabled = config?.generateIndexSitemap + + // Set sitemap index file + const SITEMAP_INDEX_FILE = sitemapIndexEnabled + ? getPath(config.outDir!, `${config.sitemapBaseFileName}.xml`) + : undefined + + // Set sitemap index url + const SITEMAP_INDEX_URL = sitemapIndexEnabled + ? generateUrl(config?.siteUrl, `${config.sitemapBaseFileName}.xml`) + : undefined + + return { + BUILD_MANIFEST: getPath(config.sourceDir!, 'build-manifest.json'), + PRERENDER_MANIFEST: getPath(config.sourceDir!, 'prerender-manifest.json'), + ROUTES_MANIFEST: getPath(config.sourceDir!, 'routes-manifest.json'), + EXPORT_MARKER: getPath(config.sourceDir!, 'export-marker.json'), + ROBOTS_TXT_FILE: getPath(config.outDir!, 'robots.txt'), + STATIC_EXPORT_ROOT: getPath(config.outDir!), + SITEMAP_INDEX_URL, + SITEMAP_INDEX_FILE, + } +} + +/** + * Get config file path + * @returns + */ +export const getConfigFilePath = async () => { + // Extract args from command + const args = minimist(process.argv.slice(2)) + + // Config file path + const configPath = getPath(args.config || 'next-sitemap.config.js') + + // Check file stat + return fs + .stat(configPath) + .then(() => pathToFileURL(configPath).toString()) + .catch((err) => { + Logger.noConfigFile() + throw err + }) +} diff --git a/packages/next-sitemap/src/utils/url.ts b/packages/next-sitemap/src/utils/url.ts new file mode 100644 index 00000000..e81b6de0 --- /dev/null +++ b/packages/next-sitemap/src/utils/url.ts @@ -0,0 +1,61 @@ +export const cleanPath = (text: string): string => { + return text.replace(/([^:])(\/\/+)/g, '$1/') +} + +export const isURL = (text: string): boolean => { + // old: /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/ + return /^https?:\/\//i.test(text) +} + +export const generateUrl = (baseUrl: string, slug: string): string => { + return isURL(slug) ? cleanPath(slug) : cleanPath(`${baseUrl}/${slug}`) +} + +/** + * Checks whether a url is next.js specific or not + * @param path path check + */ +export const isNextInternalUrl = (path: string): boolean => { + return new RegExp( + /[^/]*^.[_]|^\/(404|500)$|\/_middleware$|favicon.ico|(?:\[)/g, + ).test(path) +} + +/** + * Creates a replace function to replace the default locale + * Avoids creating the same RegExp within each replace + * + * Replaces only if the path does not contain the locale as an actual valid path + * + * Given a default locale of en-US it replaces: + * /en-US -> / + * /en-US/home -> /home + * /en-US/home/ -> /home/ + * + * Does not replace if its actual page + * /en-USA -> /en-USA + * /en-USA/home -> /en-USA/home + * /en-US-home -> /en-US-home + * + * @param defaultLocale defaultLocale as provided by i18n within next config + */ +export const createDefaultLocaleReplace = (defaultLocale: string): any => { + const defaultLocaleRegExp = new RegExp(`^/${defaultLocale}($|/)`) + return (path: string): string => path.replace(defaultLocaleRegExp, '/') +} + +/** + * Return UTF-8 encoded urls + * @param path + * @returns + * @link https://developers.google.com/search/docs/advanced/sitemaps/build-sitemap#general-guidelines + */ +export const entityEscapedUrl = (path: string): string => { + return path + .replace(/&/g, '&') // decode & to & first, so that we don't replace & again to &amp; + .replace(/&/g, '&') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/>/g, '>') + .replace(/=16.1.7' + version: 16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) devDependencies: - '@corex/workspace': + '@corex/tsconfig': specifier: ^4.0.43 - version: 4.0.43(@babel/core@7.29.0)(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.15)(@types/react@19.2.14)(babel-jest@28.1.3(@babel/core@7.29.0))(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(node-notifier@8.0.2)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@4.9.5) - eslint: - specifier: ^8.52.0 - version: 8.57.1 - eslint-config-next: - specifier: ^14.0.0 - version: 14.2.35(eslint@8.57.1)(typescript@4.9.5) - fast-xml-parser: - specifier: ^4.3.2 - version: 4.5.5 - prettier: - specifier: ^3.0.3 - version: 3.8.1 - turbo: - specifier: ^1.10.16 - version: 1.13.4 + version: 4.0.43 + typescript: + specifier: ^5.2.2 + version: 5.9.3 packages/next-transpile-modules: dependencies: @@ -1044,7 +1042,7 @@ importers: version: 6.9.1 '@testing-library/react': specifier: ^16.0.0 - version: 16.3.2(@testing-library/dom@8.20.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@7.31.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@types/node': specifier: ^22.0.0 version: 22.19.11 @@ -1095,7 +1093,7 @@ importers: version: 6.9.1 '@testing-library/react': specifier: ^16.1.0 - version: 16.3.2(@testing-library/dom@8.20.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@7.31.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@types/node': specifier: ^22.10.1 version: 22.19.11 @@ -1460,13 +1458,6 @@ packages: resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.28.6': - resolution: {integrity: sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} @@ -1603,33 +1594,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-class-properties@7.18.6': - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-decorators@7.29.0': - resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-numeric-separator@7.18.6': - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-optional-catch-binding@7.18.6': resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -1637,33 +1601,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-optional-chaining@7.21.0': - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.11': - resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1685,12 +1628,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.28.6': - resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.28.6': resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} engines: {node: '>=6.9.0'} @@ -2174,6 +2111,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.29.0': + resolution: {integrity: sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -2355,27 +2296,12 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@corex/eslint-config@4.0.43': - resolution: {integrity: sha512-k8jaiCQfFvIB7pK5v4qvEQMJfUKpJxiYOMCbEm1qHSv53xwA0sMTdhd3q5HRfpyFsd8SHJBCCRYJEhARGApAWQ==} - - '@corex/jest-require-stub@2.6.148': - resolution: {integrity: sha512-zplyHGcipOTRzuoFhJuVCsp9PBZv3vDwioB6WDIERVAw0yuM5AT4L5XtYkvBCEjqQNKApseDDjLNCQMFsMGKZw==} - - '@corex/jest@4.0.43': - resolution: {integrity: sha512-XeOiHUpGRA5eI3a+7OvH9HIDalPBZbsqxb+PYpaWdpSxfA+nLnc7Q6ImYN+B5OLSWLqQXtmA7JjhNUHxt6IJCA==} - - '@corex/prettier@4.0.43': - resolution: {integrity: sha512-rgeoQeoUOGKm5wdsO0ip9MUdeUc7lAqMKl7xm/b0BDvzh7roR6Zr3xIMOYCamefS0v3j7J0LGhh3pI6cgvg0wg==} - - '@corex/stylelint@3.0.611': - resolution: {integrity: sha512-/4umcRBBhg9PI639s2sUCB8vb53t+eH+qkVbDBTBF9mZoMQmb5fE4vDIFl2RP2l4oGz5Yxc7sN3Br4tZ1B4sMA==} + '@corex/deepmerge@4.0.43': + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} '@corex/tsconfig@4.0.43': resolution: {integrity: sha512-kCb1okwoehFQIimqwVPrb1HZg5y8MEdfL7wRbScSDPJ1I4n15jDyDkB0UEPsjCvXcapFBKmV2UIO4uEVvylOTg==} - '@corex/workspace@4.0.43': - resolution: {integrity: sha512-YAcphn5UqN1nu0oafnnwXz8PC94wOwQwjHLjePWbGgD/t6ibuAA8mgURyj6BEWrKB5qVTZhoU/Y0Y6NT+fnHRg==} - '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -2404,21 +2330,9 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@csstools/selector-specificity@2.2.0': - resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.10 - - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -2609,10 +2523,6 @@ packages: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@10.0.1': resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -2622,10 +2532,6 @@ packages: eslint: optional: true - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.39.3': resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2687,11 +2593,6 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/config-array@0.5.0': resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -2705,10 +2606,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} deprecated: Use @eslint/object-schema instead - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -2916,23 +2813,10 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@28.1.3': - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/console@29.7.0': resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/core@28.1.3': - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/core@29.7.0': resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2942,38 +2826,18 @@ packages: node-notifier: optional: true - '@jest/diff-sequences@30.3.0': - resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment@27.5.1': resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/environment@28.1.3': - resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect-utils@28.1.3': - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/expect-utils@29.7.0': resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect-utils@30.3.0': - resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect@28.1.3': - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/expect@29.7.0': resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2982,39 +2846,14 @@ packages: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/fake-timers@28.1.3': - resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/fake-timers@29.7.0': resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/globals@28.1.3': - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/globals@29.7.0': resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/reporters@28.1.3': - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/reporters@29.7.0': resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3024,66 +2863,38 @@ packages: node-notifier: optional: true - '@jest/schemas@28.1.3': - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/source-map@28.1.2': - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/source-map@29.6.3': resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/test-result@28.1.3': - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/test-result@29.7.0': resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/test-sequencer@28.1.3': - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/test-sequencer@29.7.0': resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@28.1.3': - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/transform@29.7.0': resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + '@jest/types@27.5.1': resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - '@jest/types@28.1.3': - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@30.3.0': - resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -3222,15 +3033,12 @@ packages: resolution: {integrity: sha512-bMVoAKhpjTOPHkW/lprDPwv5aD4R4C3Irt8vn+SKA9wudLe9COLxOhurrKRsxmZccUbWXRF7vukNeGUAj5P8kA==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@next/env@13.5.11': + resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==} '@next/env@16.2.0': resolution: {integrity: sha512-OZIbODWWAi0epQRCRjNe1VO45LOFBzgiyqmTLzIqWq6u1wrxKnAyz1HH6tgY/Mc81YzIjRPoYsPAEr4QV4l9TA==} - '@next/eslint-plugin-next@14.2.35': - resolution: {integrity: sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ==} - '@next/mdx@15.5.14': resolution: {integrity: sha512-AZc3EHUfsQeKEEZoN+5GW0dvekIHLZ8nOBw2emT5GHs6KJlUYqg53a0bl62wH2lvmMbnsLh1lpZljOObwXekGQ==} peerDependencies: @@ -3293,9 +3101,6 @@ packages: '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -3308,10 +3113,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -3599,12 +3400,6 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.16.1': - resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} - '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} @@ -3640,15 +3435,9 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} - '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -3665,9 +3454,6 @@ packages: '@sinonjs/fake-timers@8.1.0': resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - '@sinonjs/fake-timers@9.1.2': - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} @@ -3860,25 +3646,14 @@ packages: '@tanstack/virtual-core@3.13.21': resolution: {integrity: sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw==} - '@testing-library/dom@8.20.1': - resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} - engines: {node: '>=12'} - - '@testing-library/jest-dom@5.17.0': - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + '@testing-library/dom@7.31.2': + resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} + engines: {node: '>=10'} '@testing-library/jest-dom@6.9.1': resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@13.4.0': - resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} - engines: {node: '>=12'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@testing-library/react@16.3.2': resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} engines: {node: '>=18'} @@ -3914,11 +3689,8 @@ packages: '@ts-morph/common@0.28.1': resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/aria-query@4.2.2': + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -4090,18 +3862,12 @@ packages: '@types/jest-environment-puppeteer@5.0.3': resolution: {integrity: sha512-vWGfeb+0TOPZy7+VscKURWzE5lzYjclSWLxtjVpDAYcjUv8arAS1av06xK3mpgeNCDVx7XvavD8Elq1a4w9wIA==} - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@types/jscodeshift@17.3.0': resolution: {integrity: sha512-ogvGG8VQQqAQQ096uRh+d6tBHrYuZjsumHirKtvBa5qEyTMN3IQJ7apo+sw9lxaB/iKWIhbbLlF3zmAWk9XQIg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} @@ -4114,9 +3880,6 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -4144,15 +3907,9 @@ packages: '@types/nodemailer@6.4.23': resolution: {integrity: sha512-aFV3/NsYFLSx9mbb5gtirBSXJnAlrusoKNuPbxsASWc7vrKLmIrTQRpdcxNcSFL3VW2A2XpeLEavwb2qMi6nlQ==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/puppeteer@5.4.7': resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} @@ -4170,18 +3927,12 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/testing-library__jest-dom@5.14.9': - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -4200,6 +3951,9 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@types/yargs@15.0.20': + resolution: {integrity: sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==} + '@types/yargs@16.0.11': resolution: {integrity: sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==} @@ -4209,28 +3963,6 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/eslint-plugin@8.56.1': resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4247,32 +3979,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/experimental-utils@5.62.0': - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.56.1': resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4299,14 +4005,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@8.56.1': resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4327,26 +4025,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/type-utils@8.56.1': resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4361,14 +4039,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@8.56.1': resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4377,24 +4047,6 @@ packages: resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.56.1': resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4407,18 +4059,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.56.1': resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4433,14 +4073,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@8.56.1': resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4457,101 +4089,6 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} - cpu: [x64] - os: [win32] - '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} @@ -4849,8 +4386,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@4.2.2: + resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} + engines: {node: '>=6.0'} aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} @@ -4863,10 +4401,6 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} @@ -4874,41 +4408,14 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -4963,10 +4470,6 @@ packages: axios@1.13.5: resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} peerDependencies: @@ -4980,12 +4483,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-jest@28.1.3: - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5003,10 +4500,6 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5038,9 +4531,6 @@ packages: babel-plugin-transform-async-to-promises@0.8.18: resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} - babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - babel-plugin-transform-replace-expressions@0.2.0: resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} peerDependencies: @@ -5051,12 +4541,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@28.1.3: - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5066,9 +4550,6 @@ packages: babel-preset-preact@2.0.0: resolution: {integrity: sha512-gqJCALE4XXEienLkzgAQ351XyoVHTIiZRAKjEJupK7cTVhFyovEuSrVoNrTNrUu3R78vAarjxkrR6j0vr+Rg8Q==} - babel-preset-react-app@10.1.0: - resolution: {integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==} - bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -5078,9 +4559,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -5180,10 +4658,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -5246,10 +4720,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5283,10 +4753,6 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -5356,10 +4822,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -5524,9 +4986,6 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -5535,9 +4994,6 @@ packages: resolution: {integrity: sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==} engines: {node: '>=10'} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -5556,6 +5012,9 @@ packages: core-js-compat@3.48.0: resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-js-pure@3.48.0: + resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -5619,10 +5078,6 @@ packages: peerDependencies: postcss: ^8.0.9 - css-functions-list@3.3.3: - resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} - engines: {node: '>=12'} - css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -5864,9 +5319,6 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -5897,14 +5349,6 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -5923,23 +5367,12 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedent@1.7.1: resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} peerDependencies: @@ -5952,10 +5385,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -6023,10 +5452,6 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6038,10 +5463,6 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -6117,10 +5538,6 @@ packages: electron-to-chromium@1.5.302: resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} - emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} - emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -6193,13 +5610,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.3.1: - resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -6214,10 +5624,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -6258,15 +5664,6 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@14.2.35: - resolution: {integrity: sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -6279,97 +5676,6 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-react-app@7.0.1: - resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-flowtype@8.0.3: - resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@babel/plugin-syntax-flow': ^7.14.5 - '@babel/plugin-transform-react-jsx': ^7.14.9 - eslint: ^8.1.0 - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jest@25.7.0: - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jest@26.9.0: - resolution: {integrity: sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - eslint-plugin-jest@29.15.0: resolution: {integrity: sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} @@ -6386,55 +5692,10 @@ packages: typescript: optional: true - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-prettier@4.2.5: - resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-testing-library@5.11.1: - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@9.1.1: resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -6489,12 +5750,6 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -6507,10 +5762,6 @@ packages: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -6610,18 +5861,10 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expect@28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - expect@30.3.0: - resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -6640,9 +5883,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -6659,14 +5899,6 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@4.5.5: - resolution: {integrity: sha512-cK9c5I/DwIOI7/Q7AlGN3DuTdwN61gwSfL8rvuVPK+0mcCNHHGxRrpiFtaZZRfRMJL3Gl8B2AFlBG6qXf03w9A==} - hasBin: true - - fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -6945,12 +6177,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -6974,18 +6200,10 @@ packages: resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} engines: {node: '>=0.10.0'} - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - global-prefix@0.1.5: resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} engines: {node: '>=0.10.0'} - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -7009,9 +6227,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globjoin@0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -7022,9 +6237,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql@16.13.1: resolution: {integrity: sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -7051,10 +6263,6 @@ packages: resolution: {integrity: sha512-lMHQRRwIPyJ70HV0kkFT7jH/gXzSI7yDkQFe07E2flwmNDFoWUTRMKpW2sglsnpeA7b6S2TJPp98EbQxai8eaQ==} engines: {node: '>=20.0.0'} - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -7148,10 +6356,6 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -7159,10 +6363,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -7252,10 +6452,6 @@ packages: resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} engines: {node: '>=8'} - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -7312,10 +6508,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -7343,9 +6535,6 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -7451,14 +6640,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -7471,10 +6652,6 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -7591,14 +6768,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -7611,32 +6780,14 @@ packages: engines: {node: '>=10'} hasBin: true - jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-circus@29.7.0: resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-cli@28.1.3: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - jest-cli@29.7.0: resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7647,18 +6798,6 @@ packages: node-notifier: optional: true - jest-config@28.1.3: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - jest-config@29.7.0: resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7675,30 +6814,14 @@ packages: resolution: {integrity: sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==} engines: {node: '>=16'} - jest-diff@28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-diff@30.3.0: - resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-each@29.7.0: resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7707,10 +6830,6 @@ packages: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7719,78 +6838,38 @@ packages: resolution: {integrity: sha512-t7+W4LUiPoOz+xpKREgnu6IElMuRthOWTkrThDZqVKPmLhwbK3yx7OCiX8xT1Pw/Cv5WnSoNhwtN7czdCC3fQg==} engines: {node: '>=16'} - jest-get-type@28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-junit@13.2.0: - resolution: {integrity: sha512-B0XNlotl1rdsvFZkFfoa19mc634+rrd8E4Sskb92Bb8MmSXeWV9XJGUyctunZS1W410uAxcyYuPUGVnbcOH8cg==} - engines: {node: '>=10.12.0'} - - jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@30.3.0: - resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-message-util@28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-message-util@30.3.0: - resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-mock@28.1.3: - resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-mock@29.7.0: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-mock@30.3.0: - resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -7806,54 +6885,26 @@ packages: peerDependencies: puppeteer: '>=19' - jest-regex-util@28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-snapshot@28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7862,30 +6913,14 @@ packages: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - jest-util@28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@30.3.0: - resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-watcher@28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7898,24 +6933,10 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest@28.1.3: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - jest@29.7.0: resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8015,10 +7036,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -8038,10 +7055,6 @@ packages: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} @@ -8070,20 +7083,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.26.0: - resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==} - langium@4.2.1: resolution: {integrity: sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -8364,10 +7367,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -8402,20 +7401,9 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -8447,9 +7435,6 @@ packages: resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} deprecated: Version 4 replaces this package with the scoped package @mathjax/src - mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - maxmin@2.1.0: resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} engines: {node: '>=0.12'} @@ -8533,10 +7518,6 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -8703,18 +7684,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8728,11 +7701,6 @@ packages: mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -8780,14 +7748,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8869,10 +7829,6 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -8898,10 +7854,6 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -8952,10 +7904,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -8964,22 +7912,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -9684,15 +8616,6 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-resolve-nested-selector@0.1.6: - resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - - postcss-safe-parser@6.0.0: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.3.3 - postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -9752,10 +8675,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - prettier-plugin-packagejson@2.5.10: resolution: {integrity: sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==} peerDependencies: @@ -9787,14 +8706,14 @@ packages: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9802,10 +8721,6 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - pretty-format@30.3.0: - resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} @@ -9894,10 +8809,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - random-bytes@1.0.0: resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} engines: {node: '>= 0.8'} @@ -9979,18 +8890,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -10166,10 +9069,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} - resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -10179,11 +9078,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} - engines: {node: '>= 0.4'} - hasBin: true - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -10584,9 +9478,6 @@ packages: resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} engines: {node: '>=14'} - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -10629,9 +9520,6 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} - string-natural-compare@3.0.1: - resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10648,10 +9536,6 @@ packages: resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -10660,9 +9544,6 @@ packages: resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -10729,15 +9610,9 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} - style-search@0.1.0: - resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} - style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -10769,25 +9644,6 @@ packages: peerDependencies: postcss: ^8.4.32 - stylelint-config-prettier@9.0.5: - resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==} - engines: {node: '>= 12'} - hasBin: true - peerDependencies: - stylelint: '>= 11.x < 15' - - stylelint-prettier@2.0.0: - resolution: {integrity: sha512-jvT3G+9lopkeB0ARmDPszyfaOnvnIF+30QCjZxyt7E6fynI1T9mOKgYDNb9bXX17M7PXMZaX3j/26wqakjp1tw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - prettier: '>=2.0.0' - stylelint: '>=14.0.0' - - stylelint@14.16.1: - resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -10812,10 +9668,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - supports-hyperlinks@3.2.0: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} @@ -10824,9 +9676,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - svgo@2.8.2: resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==} engines: {node: '>=10.13.0'} @@ -10899,10 +9748,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - terser-webpack-plugin@5.4.0: resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} @@ -11057,22 +9902,12 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} @@ -11086,33 +9921,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@28.0.3: - resolution: {integrity: sha512-HzgbEDQ2KgVtDmpXToqAcKTyGHdHsG23i/iUjfxji92G5eT09S1m9UHZd7csF0Bfgh9txM4JzwHnv7r1waFPlw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@types/jest': ^27.0.0 - babel-jest: ^28.0.0 - esbuild: '*' - jest: ^28.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/jest': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - ts-morph@27.0.2: resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -11161,22 +9972,11 @@ packages: typescript: optional: true - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tsx@4.19.3: resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@1.13.4: - resolution: {integrity: sha512-A0eKd73R7CGnRinTiS7txkMElg+R5rKFp9HV7baDiEL4xTG1FIg/56Vm7A5RVgg8UNgG2qNnrfatJtb+dRmNdw==} - cpu: [x64] - os: [darwin] - turbo-darwin-64@2.8.10: resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==} cpu: [x64] @@ -11187,11 +9987,6 @@ packages: cpu: [x64] os: [darwin] - turbo-darwin-arm64@1.13.4: - resolution: {integrity: sha512-eG769Q0NF6/Vyjsr3mKCnkG/eW6dKMBZk6dxWOdrHfrg6QgfkBUk0WUUujzdtVPiUIvsh4l46vQrNVd9EOtbyA==} - cpu: [arm64] - os: [darwin] - turbo-darwin-arm64@2.8.10: resolution: {integrity: sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==} cpu: [arm64] @@ -11202,11 +9997,6 @@ packages: cpu: [arm64] os: [darwin] - turbo-linux-64@1.13.4: - resolution: {integrity: sha512-Bq0JphDeNw3XEi+Xb/e4xoKhs1DHN7OoLVUbTIQz+gazYjigVZvtwCvgrZI7eW9Xo1eOXM2zw2u1DGLLUfmGkQ==} - cpu: [x64] - os: [linux] - turbo-linux-64@2.8.10: resolution: {integrity: sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==} cpu: [x64] @@ -11217,11 +10007,6 @@ packages: cpu: [x64] os: [linux] - turbo-linux-arm64@1.13.4: - resolution: {integrity: sha512-BJcXw1DDiHO/okYbaNdcWN6szjXyHWx9d460v6fCHY65G8CyqGU3y2uUTPK89o8lq/b2C8NK0yZD+Vp0f9VoIg==} - cpu: [arm64] - os: [linux] - turbo-linux-arm64@2.8.10: resolution: {integrity: sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==} cpu: [arm64] @@ -11232,11 +10017,6 @@ packages: cpu: [arm64] os: [linux] - turbo-windows-64@1.13.4: - resolution: {integrity: sha512-OFFhXHOFLN7A78vD/dlVuuSSVEB3s9ZBj18Tm1hk3aW1HTWTuAw0ReN6ZNlVObZUHvGy8d57OAGGxf2bT3etQw==} - cpu: [x64] - os: [win32] - turbo-windows-64@2.8.10: resolution: {integrity: sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==} cpu: [x64] @@ -11247,11 +10027,6 @@ packages: cpu: [x64] os: [win32] - turbo-windows-arm64@1.13.4: - resolution: {integrity: sha512-u5A+VOKHswJJmJ8o8rcilBfU5U3Y1TTAfP9wX8bFh8teYF1ghP0EhtMRLjhtp6RPa+XCxHHVA2CiC3gbh5eg5g==} - cpu: [arm64] - os: [win32] - turbo-windows-arm64@2.8.10: resolution: {integrity: sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==} cpu: [arm64] @@ -11262,10 +10037,6 @@ packages: cpu: [arm64] os: [win32] - turbo@1.13.4: - resolution: {integrity: sha512-1q7+9UJABuBAHrcC4Sxp5lOqYS5mvxRrwa33wpIyM18hlOCpRD/fTJNxZ0vhbMcJmz15o9kkVm743mPn7p6jpQ==} - hasBin: true - turbo@2.8.10: resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} hasBin: true @@ -11294,10 +10065,6 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -11306,14 +10073,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@5.4.4: resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} engines: {node: '>=20'} @@ -11537,9 +10296,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -12021,9 +10777,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -12034,9 +10787,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -12209,14 +10959,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.28.6(@babel/core@7.29.0)(eslint@8.57.1)': - dependencies: - '@babel/core': 7.29.0 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 @@ -12397,72 +11139,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -12483,11 +11169,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -13092,6 +11773,10 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 + '@babel/runtime-corejs3@7.29.0': + dependencies: + core-js-pure: 3.48.0 + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -13421,95 +12106,10 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@corex/eslint-config@4.0.43(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(prettier@3.8.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5) - eslint-plugin-prettier: 4.2.5(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(eslint@8.57.1)(prettier@3.8.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-config-prettier - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - prettier - - supports-color - - typescript - - '@corex/jest-require-stub@2.6.148': {} - - '@corex/jest@4.0.43(@babel/core@7.29.0)(@types/node@22.19.15)(@types/react@19.2.14)(babel-jest@28.1.3(@babel/core@7.29.0))(node-notifier@8.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@4.9.5)': - dependencies: - '@testing-library/jest-dom': 5.17.0 - '@testing-library/react': 13.4.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - jest: 28.1.3(@types/node@22.19.15)(node-notifier@8.0.2) - jest-junit: 13.2.0 - ts-jest: 28.0.3(@babel/core@7.29.0)(babel-jest@28.1.3(@babel/core@7.29.0))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5) - transitivePeerDependencies: - - '@babel/core' - - '@types/jest' - - '@types/node' - - '@types/react' - - babel-jest - - esbuild - - node-notifier - - react - - react-dom - - supports-color - - ts-node - - typescript - - '@corex/prettier@4.0.43': - dependencies: - prettier: 2.8.8 - - '@corex/stylelint@3.0.611(prettier@3.8.1)': - dependencies: - stylelint: 14.16.1 - stylelint-config-prettier: 9.0.5(stylelint@14.16.1) - stylelint-prettier: 2.0.0(prettier@3.8.1)(stylelint@14.16.1) - transitivePeerDependencies: - - prettier - - supports-color + '@corex/deepmerge@4.0.43': {} '@corex/tsconfig@4.0.43': {} - '@corex/workspace@4.0.43(@babel/core@7.29.0)(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.15)(@types/react@19.2.14)(babel-jest@28.1.3(@babel/core@7.29.0))(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(node-notifier@8.0.2)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@corex/eslint-config': 4.0.43(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(prettier@3.8.1)(typescript@4.9.5) - '@corex/jest': 4.0.43(@babel/core@7.29.0)(@types/node@22.19.15)(@types/react@19.2.14)(babel-jest@28.1.3(@babel/core@7.29.0))(node-notifier@8.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@4.9.5) - '@corex/jest-require-stub': 2.6.148 - '@corex/prettier': 4.0.43 - '@corex/stylelint': 3.0.611(prettier@3.8.1) - '@corex/tsconfig': 4.0.43 - typescript: 4.9.5 - transitivePeerDependencies: - - '@babel/core' - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@types/jest' - - '@types/node' - - '@types/react' - - babel-jest - - esbuild - - eslint-config-prettier - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - node-notifier - - prettier - - react - - react-dom - - supports-color - - ts-node - '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -13530,26 +12130,11 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': - dependencies: - postcss-selector-parser: 6.1.2 - - '@emnapi/core@1.9.1': - dependencies: - '@emnapi/wasi-threads': 1.2.0 - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': - dependencies: - tslib: 2.8.1 - optional: true - '@esbuild/aix-ppc64@0.25.12': optional: true @@ -13638,11 +12223,6 @@ snapshots: eslint: 10.0.3(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.23.2': @@ -13687,26 +12267,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.14.0 - debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/js@10.0.1(eslint@10.0.3(jiti@2.6.1))': optionalDependencies: eslint: 10.0.3(jiti@2.6.1) - '@eslint/js@8.57.1': {} - '@eslint/js@9.39.3': {} '@eslint/object-schema@3.0.3': {} @@ -13773,14 +12337,6 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -13793,8 +12349,6 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} @@ -14046,15 +12600,6 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@28.1.3': - dependencies: - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 @@ -14064,50 +12609,13 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@28.1.3(node-notifier@8.0.2)': + '@jest/core@29.7.0': dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3(node-notifier@8.0.2) - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@22.19.15) - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 - micromatch: 4.0.8 - pretty-format: 28.1.3 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - supports-color - - ts-node - - '@jest/core@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0(node-notifier@8.0.2) + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 22.19.15 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -14174,8 +12682,6 @@ snapshots: - supports-color - ts-node - '@jest/diff-sequences@30.3.0': {} - '@jest/environment@27.5.1': dependencies: '@jest/fake-timers': 27.5.1 @@ -14183,13 +12689,6 @@ snapshots: '@types/node': 22.19.15 jest-mock: 27.5.1 - '@jest/environment@28.1.3': - dependencies: - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - jest-mock: 28.1.3 - '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 @@ -14197,25 +12696,10 @@ snapshots: '@types/node': 22.19.15 jest-mock: 29.7.0 - '@jest/expect-utils@28.1.3': - dependencies: - jest-get-type: 28.0.2 - '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - '@jest/expect-utils@30.3.0': - dependencies: - '@jest/get-type': 30.1.0 - - '@jest/expect@28.1.3': - dependencies: - expect: 28.1.3 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - '@jest/expect@29.7.0': dependencies: expect: 29.7.0 @@ -14232,15 +12716,6 @@ snapshots: jest-mock: 27.5.1 jest-util: 27.5.1 - '@jest/fake-timers@28.1.3': - dependencies: - '@jest/types': 28.1.3 - '@sinonjs/fake-timers': 9.1.2 - '@types/node': 22.19.15 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-util: 28.1.3 - '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 @@ -14250,16 +12725,6 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/get-type@30.1.0': {} - - '@jest/globals@28.1.3': - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/types': 28.1.3 - transitivePeerDependencies: - - supports-color - '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 @@ -14269,43 +12734,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/pattern@30.0.1': - dependencies: - '@types/node': 22.19.15 - jest-regex-util: 30.0.1 - - '@jest/reporters@28.1.3(node-notifier@8.0.2)': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.19.15 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - terminal-link: 2.1.1 - v8-to-istanbul: 9.3.0 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - supports-color - '@jest/reporters@29.7.0(node-notifier@8.0.2)': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -14337,37 +12765,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/schemas@28.1.3': - dependencies: - '@sinclair/typebox': 0.24.51 - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.10 - '@jest/schemas@30.0.5': - dependencies: - '@sinclair/typebox': 0.34.49 - - '@jest/source-map@28.1.2': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - callsites: 3.1.0 - graceful-fs: 4.2.11 - '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@28.1.3': - dependencies: - '@jest/console': 28.1.3 - '@jest/types': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.3 - '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 @@ -14375,13 +12782,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@28.1.3': - dependencies: - '@jest/test-result': 28.1.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - slash: 3.0.0 - '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 @@ -14389,26 +12789,6 @@ snapshots: jest-haste-map: 29.7.0 slash: 3.0.0 - '@jest/transform@28.1.3': - dependencies: - '@babel/core': 7.29.0 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - '@jest/transform@29.7.0': dependencies: '@babel/core': 7.29.0 @@ -14429,21 +12809,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/types@27.5.1': + '@jest/types@26.6.2': dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 22.19.15 - '@types/yargs': 16.0.11 + '@types/yargs': 15.0.20 chalk: 4.1.2 - '@jest/types@28.1.3': + '@jest/types@27.5.1': dependencies: - '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 22.19.15 - '@types/yargs': 17.0.35 + '@types/yargs': 16.0.11 chalk: 4.1.2 '@jest/types@29.6.3': @@ -14455,16 +12834,6 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@jest/types@30.3.0': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.15 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -14628,19 +12997,10 @@ snapshots: '@napi-rs/simple-git-win32-ia32-msvc': 0.1.22 '@napi-rs/simple-git-win32-x64-msvc': 0.1.22 - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.8.1 - '@tybys/wasm-util': 0.10.1 - optional: true + '@next/env@13.5.11': {} '@next/env@16.2.0': {} - '@next/eslint-plugin-next@14.2.35': - dependencies: - glob: 10.3.10 - '@next/mdx@15.5.14(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))': dependencies: source-map: 0.7.6 @@ -14674,10 +13034,6 @@ snapshots: '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': optional: true - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14690,8 +13046,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nolyfill/is-core-module@1.0.39': {} - '@open-draft/deferred-promise@2.2.0': {} '@open-draft/logger@0.3.0': @@ -14948,10 +13302,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.16.1': {} - '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -15002,12 +13352,8 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sinclair/typebox@0.24.51': {} - '@sinclair/typebox@0.27.10': {} - '@sinclair/typebox@0.34.49': {} - '@sindresorhus/is@4.6.0': {} '@sinonjs/commons@1.8.6': @@ -15026,10 +13372,6 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 - '@sinonjs/fake-timers@9.1.2': - dependencies: - '@sinonjs/commons': 1.8.6 - '@sqltools/formatter@1.2.5': {} '@standard-schema/spec@1.1.0': {} @@ -15181,28 +13523,16 @@ snapshots: '@tanstack/virtual-core@3.13.21': {} - '@testing-library/dom@8.20.1': + '@testing-library/dom@7.31.2': dependencies: '@babel/code-frame': 7.29.0 '@babel/runtime': 7.28.6 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + '@types/aria-query': 4.2.2 + aria-query: 4.2.2 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@5.17.0': - dependencies: - '@adobe/css-tools': 4.4.4 - '@babel/runtime': 7.28.6 - '@types/testing-library__jest-dom': 5.14.9 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 - lodash: 4.17.23 - redent: 3.0.0 + pretty-format: 26.6.2 '@testing-library/jest-dom@6.9.1': dependencies: @@ -15213,29 +13543,19 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@13.4.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@babel/runtime': 7.28.6 - '@testing-library/dom': 8.20.1 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@types/react' - - '@testing-library/react@16.3.2(@testing-library/dom@8.20.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@testing-library/react@16.3.2(@testing-library/dom@7.31.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 - '@testing-library/dom': 8.20.1 + '@testing-library/dom': 7.31.2 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@testing-library/user-event@14.6.1(@testing-library/dom@8.20.1)': + '@testing-library/user-event@14.6.1(@testing-library/dom@7.31.2)': dependencies: - '@testing-library/dom': 8.20.1 + '@testing-library/dom': 7.31.2 '@theguild/remark-mermaid@0.3.0(react@18.3.1)': dependencies: @@ -15256,12 +13576,7 @@ snapshots: path-browserify: 1.0.1 tinyglobby: 0.2.15 - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/aria-query@5.0.4': {} + '@types/aria-query@4.2.2': {} '@types/babel__core@7.20.5': dependencies: @@ -15474,11 +13789,6 @@ snapshots: '@types/puppeteer': 5.4.7 jest-environment-node: 27.5.1 - '@types/jest@30.0.0': - dependencies: - expect: 30.3.0 - pretty-format: 30.3.0 - '@types/jscodeshift@17.3.0': dependencies: ast-types: 0.16.1 @@ -15486,8 +13796,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/katex@0.16.8': {} '@types/mdast@3.0.15': @@ -15500,8 +13808,6 @@ snapshots: '@types/mdx@2.0.13': {} - '@types/minimist@1.2.5': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -15534,12 +13840,8 @@ snapshots: dependencies: '@types/node': 22.19.15 - '@types/normalize-package-data@2.4.4': {} - '@types/parse-json@4.0.2': {} - '@types/prettier@2.7.3': {} - '@types/puppeteer@5.4.7': dependencies: '@types/node': 22.19.15 @@ -15558,16 +13860,10 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/semver@7.7.1': {} - '@types/stack-utils@2.0.3': {} '@types/statuses@2.0.6': {} - '@types/testing-library__jest-dom@5.14.9': - dependencies: - '@types/jest': 30.0.0 - '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -15582,6 +13878,10 @@ snapshots: '@types/yargs-parser@21.0.3': {} + '@types/yargs@15.0.20': + dependencies: + '@types/yargs-parser': 21.0.3 + '@types/yargs@16.0.11': dependencies: '@types/yargs-parser': 21.0.3 @@ -15595,45 +13895,6 @@ snapshots: '@types/node': 22.19.15 optional: true - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.4 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.4 - ts-api-utils: 1.4.3(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -15682,55 +13943,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.57.0 - eslint: 8.57.1 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.56.1 @@ -15767,18 +13979,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.57.0 - debug: 4.4.3 - eslint: 8.57.1 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) @@ -15788,15 +13988,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@4.9.5) - '@typescript-eslint/types': 8.57.0 - debug: 4.4.3 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) @@ -15806,16 +13997,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@8.56.1': dependencies: '@typescript-eslint/types': 8.56.1 @@ -15830,38 +14011,10 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@4.9.5)': - dependencies: - typescript: 4.9.5 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.56.1 @@ -15898,55 +14051,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.57.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@4.9.5) - '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 2.4.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@8.56.1': {} '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.4 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@6.21.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.4 - ts-api-utils: 1.4.3(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) @@ -15962,21 +14070,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.57.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@4.9.5) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@4.9.5) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 - debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) @@ -15992,35 +14085,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) - eslint: 8.57.1 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) @@ -16054,27 +14118,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@4.9.5)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@4.9.5) - eslint: 8.57.1 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.56.1': dependencies: '@typescript-eslint/types': 8.56.1 @@ -16094,65 +14137,6 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true - '@upsetjs/venn.js@2.0.0': optionalDependencies: d3-selection: 3.0.0 @@ -16628,79 +14612,28 @@ snapshots: arg@5.0.2: {} argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-ify@1.0.0: {} - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array-iterate@2.0.1: {} + dependencies: + sprintf-js: 1.0.3 - array-union@2.1.0: {} + argparse@2.0.1: {} - array.prototype.findlast@1.2.5: + aria-query@4.2.2: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + '@babel/runtime': 7.28.6 + '@babel/runtime-corejs3': 7.29.0 + + aria-query@5.3.2: {} - array.prototype.findlastindex@1.2.6: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + is-array-buffer: 3.0.5 - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-shim-unscopables: 1.1.0 + array-ify@1.0.0: {} - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-shim-unscopables: 1.1.0 + array-iterate@2.0.1: {} - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 + array-union@2.1.0: {} arraybuffer.prototype.slice@1.0.4: dependencies: @@ -16712,12 +14645,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@1.0.1: {} - assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -16769,27 +14698,12 @@ snapshots: transitivePeerDependencies: - debug - axobject-query@4.1.0: {} - b4a@1.8.0: {} babel-core@7.0.0-bridge.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - babel-jest@28.1.3(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@jest/transform': 28.1.3 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.29.0) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - babel-jest@29.7.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -16822,13 +14736,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@28.1.3: - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.28.6 @@ -16876,8 +14783,6 @@ snapshots: babel-plugin-transform-async-to-promises@0.8.18: {} - babel-plugin-transform-react-remove-prop-types@0.4.24: {} - babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -16902,12 +14807,6 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - babel-preset-jest@28.1.3(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - babel-preset-jest@29.6.3(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -16921,36 +14820,12 @@ snapshots: - '@babel/core' - supports-color - babel-preset-react-app@10.1.0: - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.29.0) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.29.0) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) - '@babel/preset-env': 7.29.0(@babel/core@7.29.0) - '@babel/preset-react': 7.28.5(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@babel/runtime': 7.28.6 - babel-plugin-macros: 3.1.0 - babel-plugin-transform-react-remove-prop-types: 0.4.24 - transitivePeerDependencies: - - supports-color - bail@1.0.5: {} bail@2.0.2: {} balanced-match@1.0.2: {} - balanced-match@2.0.0: {} - balanced-match@4.0.4: {} bare-events@2.8.2: {} @@ -17040,10 +14915,6 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -17108,12 +14979,6 @@ snapshots: camelcase-css@2.0.1: {} - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -17153,11 +15018,6 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -17224,8 +15084,6 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.4.0: {} - cjs-module-lexer@1.4.3: {} cli-cursor@5.0.0: @@ -17378,8 +15236,6 @@ snapshots: confbox@0.1.8: {} - confusing-browser-globals@1.0.11: {} - consola@3.4.2: {} conventional-changelog-conventionalcommits@4.4.0: @@ -17388,8 +15244,6 @@ snapshots: lodash: 4.17.23 q: 1.5.1 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -17402,6 +15256,8 @@ snapshots: dependencies: browserslist: 4.28.1 + core-js-pure@3.48.0: {} + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -17566,8 +15422,6 @@ snapshots: dependencies: postcss: 8.5.8 - css-functions-list@3.3.3: {} - css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -17897,8 +15751,6 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.23 - damerau-levenshtein@1.0.8: {} - data-uri-to-buffer@6.0.2: {} data-urls@5.0.0: @@ -17932,10 +15784,6 @@ snapshots: dayjs@1.11.19: {} - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -17944,48 +15792,18 @@ snapshots: dependencies: ms: 2.1.3 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - decimal.js@10.6.0: {} decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 - dedent@0.7.0: {} - dedent@1.7.1(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 deep-eql@5.0.2: {} - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 - is-arguments: 1.2.0 - is-array-buffer: 3.0.5 - is-date-object: 1.1.0 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.20 - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -18038,8 +15856,6 @@ snapshots: didyoumean@1.2.2: {} - diff-sequences@28.1.1: {} - diff-sequences@29.6.3: {} dir-glob@3.0.1: @@ -18048,10 +15864,6 @@ snapshots: dlv@1.1.3: {} - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -18133,8 +15945,6 @@ snapshots: electron-to-chromium@1.5.302: {} - emittery@0.10.2: {} - emittery@0.13.1: {} emoji-regex@10.6.0: {} @@ -18246,38 +16056,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - is-arguments: 1.2.0 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.1.1 - isarray: 2.0.5 - stop-iteration-iterator: 1.1.0 - - es-iterator-helpers@1.3.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - math-intrinsics: 1.1.0 - safe-array-concat: 1.1.3 - es-module-lexer@1.7.0: {} es-module-lexer@2.0.0: {} @@ -18293,10 +16071,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 @@ -18364,26 +16138,6 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@14.2.35(eslint@8.57.1)(typescript@4.9.5): - dependencies: - '@next/eslint-plugin-next': 14.2.35 - '@rushstack/eslint-patch': 1.16.1 - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) @@ -18392,164 +16146,6 @@ snapshots: dependencies: eslint: 10.0.3(jiti@2.6.1) - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5): - dependencies: - '@babel/core': 7.29.0 - '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@8.57.1) - '@rushstack/eslint-patch': 1.16.1 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - babel-preset-react-app: 10.1.0 - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.1)(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 8.57.1 - get-tsconfig: 4.13.6 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.15 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0))(eslint@8.57.1): - dependencies: - '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) - eslint: 8.57.1 - lodash: 4.17.23 - string-natural-compare: 3.0.1 - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - jest: 28.1.3(@types/node@22.19.15)(node-notifier@8.0.2) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - jest: 28.1.3(@types/node@22.19.15)(node-notifier@8.0.2) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(jest@29.7.0(@types/node@25.4.0))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -18612,96 +16208,26 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) jest: 29.7.0(@types/node@24.10.13) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(jest@29.7.0(@types/node@25.4.0))(typescript@5.9.3): - dependencies: - '@typescript-eslint/utils': 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - jest: 29.7.0(@types/node@25.4.0) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.11.1 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-prettier@4.2.5(eslint-config-prettier@10.1.8(eslint@10.0.3(jiti@2.6.1)))(eslint@8.57.1)(prettier@3.8.1): - dependencies: - eslint: 8.57.1 - prettier: 3.8.1 - prettier-linter-helpers: 1.0.1 - optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.0.3(jiti@2.6.1)) - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.5(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.3.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.6 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - eslint-plugin-testing-library@5.11.1(eslint@8.57.1)(typescript@4.9.5): + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(jest@29.7.0(@types/node@25.4.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 + '@typescript-eslint/utils': 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + jest: 29.7.0(@types/node@25.4.0) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@9.1.1: dependencies: '@types/esrecurse': 4.3.1 @@ -18847,49 +16373,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.14.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - esm@3.2.25: {} espree@11.1.1: @@ -18904,12 +16387,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 - espree@9.6.1: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} esquery@1.7.0: @@ -19027,14 +16504,6 @@ snapshots: expect-type@1.3.0: {} - expect@28.1.3: - dependencies: - '@jest/expect-utils': 28.1.3 - jest-get-type: 28.0.2 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -19043,15 +16512,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expect@30.3.0: - dependencies: - '@jest/expect-utils': 30.3.0 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.3.0 - jest-message-util: 30.3.0 - jest-mock: 30.3.0 - jest-util: 30.3.0 - extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -19072,8 +16532,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-fifo@1.3.2: {} fast-glob@3.3.3: @@ -19090,12 +16548,6 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-parser@4.5.5: - dependencies: - strnum: 1.1.2 - - fastest-levenshtein@1.0.16: {} - fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -19376,14 +16828,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: - dependencies: - foreground-child: 3.3.1 - jackspeak: 2.3.6 - minimatch: 9.0.9 - minipass: 7.1.3 - path-scurry: 1.11.1 - glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -19422,10 +16866,6 @@ snapshots: global-prefix: 0.1.5 is-windows: 0.2.0 - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - global-prefix@0.1.5: dependencies: homedir-polyfill: 1.0.3 @@ -19433,12 +16873,6 @@ snapshots: is-windows: 0.2.0 which: 1.3.1 - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -19463,16 +16897,12 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globjoin@0.1.4: {} - globrex@0.1.2: {} gopd@1.2.0: {} graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - graphql@16.13.1: {} gray-matter@4.0.3: @@ -19507,8 +16937,6 @@ snapshots: - bufferutil - utf-8-validate - hard-rejection@2.1.0: {} - has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 @@ -19692,18 +17120,12 @@ snapshots: hosted-git-info@2.8.9: {} - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 html-escaper@2.0.2: {} - html-tags@3.3.1: {} - html-void-elements@3.0.0: {} htmlparser2@9.1.0: @@ -19778,8 +17200,6 @@ snapshots: dependencies: resolve-from: 5.0.0 - import-lazy@4.0.0: {} - import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -19828,11 +17248,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -19864,10 +17279,6 @@ snapshots: is-buffer@2.0.5: {} - is-bun-module@2.0.0: - dependencies: - semver: 7.7.4 - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -19948,10 +17359,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - - is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} is-plain-obj@4.1.0: {} @@ -19960,8 +17367,6 @@ snapshots: dependencies: isobject: 3.0.1 - is-plain-object@5.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-reference@1.2.1: @@ -20088,21 +17493,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -20119,41 +17509,12 @@ snapshots: filelist: 1.0.5 picocolors: 1.1.1 - jest-changed-files@28.1.3: - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - p-limit: 3.1.0 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 @@ -20180,27 +17541,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2): - dependencies: - '@jest/core': 28.1.3(node-notifier@8.0.2) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.2.0 - jest-config: 28.1.3(@types/node@22.19.15) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@20.17.24): dependencies: '@jest/core': 29.7.0 @@ -20323,35 +17663,6 @@ snapshots: - supports-color - ts-node - jest-config@28.1.3(@types/node@22.19.15): - dependencies: - '@babel/core': 7.29.0 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.29.0) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 28.1.3 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.19.15 - transitivePeerDependencies: - - supports-color - jest-config@29.7.0(@types/node@20.17.24): dependencies: '@babel/core': 7.29.0 @@ -20609,13 +17920,6 @@ snapshots: transitivePeerDependencies: - debug - jest-diff@28.1.3: - dependencies: - chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -20623,29 +17927,10 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-diff@30.3.0: - dependencies: - '@jest/diff-sequences': 30.3.0 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.3.0 - - jest-docblock@28.1.1: - dependencies: - detect-newline: 3.1.0 - jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - jest-each@28.1.3: - dependencies: - '@jest/types': 28.1.3 - chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 - jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -20663,15 +17948,6 @@ snapshots: jest-mock: 27.5.1 jest-util: 27.5.1 - jest-environment-node@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - jest-mock: 28.1.3 - jest-util: 28.1.3 - jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -20692,26 +17968,8 @@ snapshots: - debug - typescript - jest-get-type@28.0.2: {} - jest-get-type@29.6.3: {} - jest-haste-map@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.19.15 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - jest-worker: 28.1.3 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -20728,30 +17986,11 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-junit@13.2.0: - dependencies: - mkdirp: 1.0.4 - strip-ansi: 6.0.1 - uuid: 8.3.2 - xml: 1.0.1 - - jest-leak-detector@28.1.3: - dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@28.1.3: - dependencies: - chalk: 4.1.2 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 @@ -20759,13 +17998,6 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@30.3.0: - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.3.0 - pretty-format: 30.3.0 - jest-message-util@27.5.1: dependencies: '@babel/code-frame': 7.29.0 @@ -20778,18 +18010,6 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@28.1.3: - dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 28.1.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.29.0 @@ -20802,44 +18022,17 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.3.0: - dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 30.3.0 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - picomatch: 4.0.3 - pretty-format: 30.3.0 - slash: 3.0.0 - stack-utils: 2.0.6 - jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 '@types/node': 22.19.15 - jest-mock@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 22.19.15 jest-util: 29.7.0 - jest-mock@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 22.19.15 - jest-util: 30.3.0 - - jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): - optionalDependencies: - jest-resolve: 28.1.3 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: jest-resolve: 29.7.0 @@ -20853,19 +18046,8 @@ snapshots: - debug - typescript - jest-regex-util@28.0.2: {} - jest-regex-util@29.6.3: {} - jest-regex-util@30.0.1: {} - - jest-resolve-dependencies@28.1.3: - dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 - transitivePeerDependencies: - - supports-color - jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 @@ -20873,18 +18055,6 @@ snapshots: transitivePeerDependencies: - supports-color - jest-resolve@28.1.3: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) - jest-util: 28.1.3 - jest-validate: 28.1.3 - resolve: 1.22.11 - resolve.exports: 1.1.1 - slash: 3.0.0 - jest-resolve@29.7.0: dependencies: chalk: 4.1.2 @@ -20897,32 +18067,6 @@ snapshots: resolve.exports: 2.0.3 slash: 3.0.0 - jest-runner@28.1.3: - dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - chalk: 4.1.2 - emittery: 0.10.2 - graceful-fs: 4.2.11 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 @@ -20938,41 +18082,14 @@ snapshots: jest-environment-node: 29.7.0 jest-haste-map: 29.7.0 jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@28.1.3: - dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.3 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - strip-bom: 4.0.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 transitivePeerDependencies: - supports-color @@ -21003,34 +18120,6 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@28.1.3: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jest/expect-utils': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/babel__traverse': 7.28.0 - '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - chalk: 4.1.2 - expect: 28.1.3 - graceful-fs: 4.2.11 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - jest-haste-map: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - natural-compare: 1.4.0 - pretty-format: 28.1.3 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - jest-snapshot@29.7.0: dependencies: '@babel/core': 7.29.0 @@ -21065,15 +18154,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -21083,24 +18163,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 22.19.15 - chalk: 4.1.2 - ci-info: 4.4.0 - graceful-fs: 4.2.11 - picomatch: 4.0.3 - - jest-validate@28.1.3: - dependencies: - '@jest/types': 28.1.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 28.0.2 - leven: 3.1.0 - pretty-format: 28.1.3 - jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -21110,17 +18172,6 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watcher@28.1.3: - dependencies: - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.15 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 - string-length: 4.0.2 - jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 @@ -21144,12 +18195,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@28.1.3: - dependencies: - '@types/node': 22.19.15 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jest-worker@29.7.0: dependencies: '@types/node': 22.19.15 @@ -21157,19 +18202,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2): - dependencies: - '@jest/core': 28.1.3(node-notifier@8.0.2) - '@jest/types': 28.1.3 - import-local: 3.2.0 - jest-cli: 28.1.3(@types/node@22.19.15)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jest@29.7.0(@types/node@20.17.24): dependencies: '@jest/core': 29.7.0 @@ -21382,10 +18414,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonfile@4.0.0: @@ -21413,13 +18441,6 @@ snapshots: ms: 2.1.3 semver: 7.7.4 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 @@ -21447,8 +18468,6 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.26.0: {} - langium@4.2.1: dependencies: chevrotain: 11.1.2 @@ -21457,12 +18476,6 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -21700,10 +18713,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru-cache@7.18.3: {} lucide-react@1.0.1(react@19.2.4): @@ -21739,16 +18748,10 @@ snapshots: dependencies: semver: 7.7.4 - make-error@1.3.6: {} - makeerror@1.0.12: dependencies: tmpl: 1.0.5 - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -21777,8 +18780,6 @@ snapshots: mj-context-menu: 0.6.1 speech-rule-engine: 4.1.2 - mathml-tag-names@2.1.3: {} - maxmin@2.1.0: dependencies: chalk: 1.1.3 @@ -22011,21 +19012,6 @@ snapshots: memorystream@0.3.1: {} - meow@9.0.0: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -22421,20 +19407,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass@7.1.3: {} @@ -22443,8 +19419,6 @@ snapshots: mj-context-menu@0.6.1: {} - mkdirp@1.0.4: {} - mlly@1.8.0: dependencies: acorn: 8.16.0 @@ -22578,10 +19552,6 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.3.4: {} - - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} negotiator@1.0.0: {} @@ -22771,13 +19741,6 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-exports-info@1.6.0: - dependencies: - array.prototype.flatmap: 1.3.3 - es-errors: 1.3.0 - object.entries: 1.1.9 - semver: 6.3.1 - node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -22807,13 +19770,6 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.16.1 - semver: 7.7.4 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-url@6.1.0: {} @@ -22856,11 +19812,6 @@ snapshots: object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.7: @@ -22872,33 +19823,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - obug@2.1.1: {} once@1.4.0: @@ -23575,12 +20499,6 @@ snapshots: postcss: 8.5.8 thenby: 1.3.4 - postcss-resolve-nested-selector@0.1.6: {} - - postcss-safe-parser@6.0.0(postcss@8.5.8): - dependencies: - postcss: 8.5.8 - postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -23642,10 +20560,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - prettier-plugin-packagejson@2.5.10(prettier@3.5.3): dependencies: sort-package-json: 2.15.1 @@ -23665,18 +20579,18 @@ snapshots: pretty-bytes@5.6.0: {} - pretty-format@27.5.1: + pretty-format@26.6.2: dependencies: + '@jest/types': 26.6.2 ansi-regex: 5.0.1 - ansi-styles: 5.2.0 + ansi-styles: 4.3.0 react-is: 17.0.2 - pretty-format@28.1.3: + pretty-format@27.5.1: dependencies: - '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.2.0 - react-is: 18.3.1 + react-is: 17.0.2 pretty-format@29.7.0: dependencies: @@ -23686,12 +20600,6 @@ snapshots: pretty-format@3.8.0: {} - pretty-format@30.3.0: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 - pretty-hrtime@1.0.3: {} pretty-quick@3.3.1(prettier@2.8.8): @@ -23801,8 +20709,6 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@4.0.1: {} - random-bytes@1.0.0: {} raw-loader@4.0.2(webpack@5.105.4(@swc/core@1.15.13)): @@ -23884,25 +20790,12 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -24173,8 +21066,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@1.1.1: {} - resolve.exports@2.0.3: {} resolve@1.22.11: @@ -24183,15 +21074,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.6: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 - object-keys: 1.1.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -24700,8 +21582,6 @@ snapshots: sql-highlight@6.1.0: {} - stable-hash@0.0.5: {} - stable@0.1.8: {} stack-utils@2.0.6: @@ -24749,8 +21629,6 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-natural-compare@3.0.1: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -24774,12 +21652,6 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.1.2 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -24803,11 +21675,6 @@ snapshots: es-abstract: 1.24.1 es-object-atoms: 1.1.1 - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.1 - string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -24876,12 +21743,8 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@1.1.2: {} - style-inject@0.3.0: {} - style-search@0.1.0: {} - style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -24922,59 +21785,6 @@ snapshots: postcss: 8.5.8 postcss-selector-parser: 7.1.1 - stylelint-config-prettier@9.0.5(stylelint@14.16.1): - dependencies: - stylelint: 14.16.1 - - stylelint-prettier@2.0.0(prettier@3.8.1)(stylelint@14.16.1): - dependencies: - prettier: 3.8.1 - prettier-linter-helpers: 1.0.1 - stylelint: 14.16.1 - - stylelint@14.16.1: - dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) - balanced-match: 2.0.0 - colord: 2.9.3 - cosmiconfig: 7.1.0 - css-functions-list: 3.3.3 - debug: 4.4.3 - fast-glob: 3.3.3 - fastest-levenshtein: 1.0.16 - file-entry-cache: 6.0.1 - global-modules: 2.0.0 - globby: 11.1.0 - globjoin: 0.1.4 - html-tags: 3.3.1 - ignore: 5.3.2 - import-lazy: 4.0.0 - imurmurhash: 0.1.4 - is-plain-object: 5.0.0 - known-css-properties: 0.26.0 - mathml-tag-names: 2.1.3 - meow: 9.0.0 - micromatch: 4.0.8 - normalize-path: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.8 - postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 6.0.0(postcss@8.5.8) - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - style-search: 0.1.0 - supports-hyperlinks: 2.3.0 - svg-tags: 1.0.0 - table: 6.9.0 - v8-compile-cache: 2.4.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - stylis@4.3.6: {} sucrase@3.35.1: @@ -25001,11 +21811,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-hyperlinks@3.2.0: dependencies: has-flag: 4.0.0 @@ -25013,8 +21818,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svg-tags@1.0.0: {} - svgo@2.8.2: dependencies: commander: 7.2.0 @@ -25134,11 +21937,6 @@ snapshots: term-size@2.2.1: {} - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.4.0(@swc/core@1.15.13)(webpack@5.105.2(@swc/core@1.15.13)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -25290,20 +22088,10 @@ snapshots: trim-lines@3.0.1: {} - trim-newlines@3.0.1: {} - trough@1.0.5: {} trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@4.9.5): - dependencies: - typescript: 4.9.5 - - ts-api-utils@2.4.0(typescript@4.9.5): - dependencies: - typescript: 4.9.5 - ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -25312,34 +22100,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@28.0.3(@babel/core@7.29.0)(babel-jest@28.1.3(@babel/core@7.29.0))(jest@28.1.3(@types/node@22.19.15)(node-notifier@8.0.2))(typescript@4.9.5): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 28.1.3(@types/node@22.19.15)(node-notifier@8.0.2) - jest-util: 28.1.3 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.4 - typescript: 4.9.5 - yargs-parser: 20.2.9 - optionalDependencies: - '@babel/core': 7.29.0 - babel-jest: 28.1.3(@babel/core@7.29.0) - ts-morph@27.0.2: dependencies: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@1.14.1: {} tslib@2.8.1: {} @@ -25432,11 +22197,6 @@ snapshots: - tsx - yaml - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - tsx@4.19.3: dependencies: esbuild: 0.25.12 @@ -25444,69 +22204,42 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@1.13.4: - optional: true - turbo-darwin-64@2.8.10: optional: true turbo-darwin-64@2.8.15: optional: true - turbo-darwin-arm64@1.13.4: - optional: true - turbo-darwin-arm64@2.8.10: optional: true turbo-darwin-arm64@2.8.15: optional: true - turbo-linux-64@1.13.4: - optional: true - turbo-linux-64@2.8.10: optional: true turbo-linux-64@2.8.15: optional: true - turbo-linux-arm64@1.13.4: - optional: true - turbo-linux-arm64@2.8.10: optional: true turbo-linux-arm64@2.8.15: optional: true - turbo-windows-64@1.13.4: - optional: true - turbo-windows-64@2.8.10: optional: true turbo-windows-64@2.8.15: optional: true - turbo-windows-arm64@1.13.4: - optional: true - turbo-windows-arm64@2.8.10: optional: true turbo-windows-arm64@2.8.15: optional: true - turbo@1.13.4: - optionalDependencies: - turbo-darwin-64: 1.13.4 - turbo-darwin-arm64: 1.13.4 - turbo-linux-64: 1.13.4 - turbo-linux-arm64: 1.13.4 - turbo-windows-64: 1.13.4 - turbo-windows-arm64: 1.13.4 - turbo@2.8.10: optionalDependencies: turbo-darwin-64: 2.8.10 @@ -25543,16 +22276,10 @@ snapshots: type-fest@0.16.0: {} - type-fest@0.18.1: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - type-fest@5.4.4: dependencies: tagged-tag: 1.0.0 @@ -25795,30 +22522,6 @@ snapshots: universalify@2.0.1: {} - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.4 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - until-async@3.0.2: {} upath@1.2.0: {} @@ -25855,7 +22558,8 @@ snapshots: uuid@11.1.0: {} - uuid@8.3.2: {} + uuid@8.3.2: + optional: true v8-compile-cache@2.4.0: {} @@ -26701,16 +23405,12 @@ snapshots: xml-name-validator@5.0.0: {} - xml@1.0.1: {} - xmlchars@2.2.0: {} y18n@5.0.8: {} yallist@3.1.1: {} - yallist@4.0.0: {} - yaml@1.10.2: {} yaml@2.8.2: {} From 1736ce6693f751c0f519cdc13f494a18f57da54b Mon Sep 17 00:00:00 2001 From: riceharvest Date: Tue, 24 Mar 2026 02:07:03 +0100 Subject: [PATCH 3/4] chore: add fast-xml-parser dev dependency for tests --- packages/next-sitemap/package.json | 1 + pnpm-lock.yaml | 31 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/packages/next-sitemap/package.json b/packages/next-sitemap/package.json index 84ddbaf6..0a4ffe0b 100644 --- a/packages/next-sitemap/package.json +++ b/packages/next-sitemap/package.json @@ -69,6 +69,7 @@ }, "devDependencies": { "@corex/tsconfig": "^4.0.43", + "fast-xml-parser": "^5.5.9", "typescript": "^5.2.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d983f32..8a802ff0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -967,6 +967,9 @@ importers: '@corex/tsconfig': specifier: ^4.0.43 version: 4.0.43 + fast-xml-parser: + specifier: ^5.5.9 + version: 5.5.9 typescript: specifier: ^5.2.2 version: 5.9.3 @@ -5899,6 +5902,13 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + + fast-xml-parser@5.5.9: + resolution: {integrity: sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==} + hasBin: true + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -8073,6 +8083,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.2.0: + resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -9610,6 +9624,9 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.2.2: + resolution: {integrity: sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==} + style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} @@ -16548,6 +16565,16 @@ snapshots: fast-uri@3.1.0: {} + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.2.0 + + fast-xml-parser@5.5.9: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.2.0 + strnum: 2.2.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -20009,6 +20036,8 @@ snapshots: path-exists@4.0.0: {} + path-expression-matcher@1.2.0: {} + path-is-absolute@1.0.1: {} path-key@2.0.1: {} @@ -21743,6 +21772,8 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.2.2: {} + style-inject@0.3.0: {} style-to-js@1.1.21: From 20c545141fe6c021f251a51029cc2af0656373c2 Mon Sep 17 00:00:00 2001 From: riceharvest Date: Tue, 24 Mar 2026 02:08:06 +0100 Subject: [PATCH 4/4] chore: add changeset for next-sitemap --- .changeset/next-sitemap-fork.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/next-sitemap-fork.md diff --git a/.changeset/next-sitemap-fork.md b/.changeset/next-sitemap-fork.md new file mode 100644 index 00000000..46df2325 --- /dev/null +++ b/.changeset/next-sitemap-fork.md @@ -0,0 +1,7 @@ +--- +"@opensourceframework/next-sitemap": major +--- + +Add `@opensourceframework/next-sitemap` as a maintained fork of the stale `next-sitemap` package. Provides a drop-in replacement with corrected CommonJS support (uses `.cjs` extension). Includes a smoke test to verify package loads. + +Fixes #101 \ No newline at end of file