diff --git a/.eslintrc.js b/.eslintrc.js
index 24949684e5d..a985cc4c07d 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -111,6 +111,7 @@ module.exports = {
},
{
files: [
+ 'scripts/__tests__/**',
'packages/**/src/__tests__/**',
'packages/lexical-playground/**',
'packages/lexical-devtools/**',
@@ -166,7 +167,6 @@ module.exports = {
// import helps to configure simple-import-sort
'import',
- 'jest',
'no-function-declare-after-return',
'react',
'no-only-tests',
diff --git a/.github/workflows/call-integration-tests.yml b/.github/workflows/call-integration-tests.yml
index 6e2c418ad27..b0eeed6eb35 100644
--- a/.github/workflows/call-integration-tests.yml
+++ b/.github/workflows/call-integration-tests.yml
@@ -25,3 +25,4 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
- run: pnpm run test-integration
+ - run: pnpm run test-eslint-integration
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index 93715f2625b..00000000000
--- a/jest.config.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Copyright (c) Meta Platforms, Inc. and affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-'use strict';
-
-const common = {
- modulePathIgnorePatterns: ['/npm'],
-};
-
-module.exports = {
- projects: [
- {
- ...common,
- displayName: 'integration',
- globalSetup: './scripts/__tests__/integration/setup.js',
- testMatch: ['**/scripts/__tests__/integration/**/*.test.js'],
- },
- ],
-};
diff --git a/package.json b/package.json
index dda8995297c..e646d95695f 100644
--- a/package.json
+++ b/package.json
@@ -38,9 +38,10 @@
"collab": "cross-env HOST=localhost PORT=1234 npx y-websocket",
"validation": "npx ts-node --cwdMode packages/lexical-playground/src/server/validation.ts",
"vitest": "vitest",
- "test-unit": "vitest --no-watch",
- "test-unit-watch": "vitest",
- "test-integration": "jest --selectProjects integration --testPathPattern",
+ "test-unit": "vitest --project unit --project scripts-unit --no-watch",
+ "test-unit-watch": "vitest --project unit --project scripts-unit",
+ "test-eslint-integration": "node packages/lexical-eslint-plugin/__tests__/integration/integration-test.mjs",
+ "test-integration": "vitest --project integration --no-watch",
"test-e2e-chromium": "cross-env E2E_BROWSER=chromium playwright test --project=\"chromium\"",
"test-e2e-firefox": "cross-env E2E_BROWSER=firefox playwright test --project=\"firefox\"",
"test-e2e-webkit": "cross-env E2E_BROWSER=webkit playwright test --project=\"webkit\"",
@@ -123,7 +124,6 @@
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"@types/fs-extra": "^8.1.5",
- "@types/jest": "^29.5.12",
"@types/jsdom": "^21.1.6",
"@types/katex": "^0.16.7",
"@types/node": "^17.0.31",
@@ -148,7 +148,6 @@
"eslint-plugin-ft-flow": "^3.0.7",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jest": "^28.5.0",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-no-function-declare-after-return": "^1.1.0",
"eslint-plugin-no-only-tests": "^3.1.0",
@@ -166,8 +165,6 @@
"hermes-parser": "^0.26.0",
"hermes-transform": "^0.26.0",
"husky": "^7.0.1",
- "jest": "^29.7.0",
- "jest-environment-jsdom": "^29.7.0",
"jsdom": "^24.0.0",
"lint-staged": "^11.1.0",
"minimist": "^1.2.5",
@@ -182,7 +179,6 @@
"react-test-renderer": "^19.1.1",
"rollup": "^4.59.0",
"tmp": "^0.2.1",
- "ts-jest": "^29.1.2",
"ts-morph": "^25.0.1",
"ts-node": "^10.9.1",
"typedoc": "^0.28.10",
diff --git a/packages/lexical-eslint-plugin-internal/package.json b/packages/lexical-eslint-plugin-internal/package.json
index e078b616bd9..345a6970607 100644
--- a/packages/lexical-eslint-plugin-internal/package.json
+++ b/packages/lexical-eslint-plugin-internal/package.json
@@ -5,6 +5,6 @@
"main": "src/index.js",
"private": true,
"peerDependencies": {
- "eslint": "^7.31.0 || ^8.0.0"
+ "eslint": ">=7.31.0"
}
}
diff --git a/packages/lexical-eslint-plugin-internal/src/index.js b/packages/lexical-eslint-plugin-internal/src/index.js
index 793a67b9859..3ee0357164e 100644
--- a/packages/lexical-eslint-plugin-internal/src/index.js
+++ b/packages/lexical-eslint-plugin-internal/src/index.js
@@ -10,20 +10,41 @@
const rules = require('./rules');
-module.exports = {
+// Legacy config format (ESLint 7-8)
+const legacyAll = {
+ rules: {
+ '@lexical/internal/no-imports-from-self': 'error',
+ '@lexical/internal/no-optional-chaining': 'error',
+ },
+};
+
+const plugin = {
configs: {
- all: {
- rules: {
- '@lexical/internal/no-imports-from-self': 'error',
- '@lexical/internal/no-optional-chaining': 'error',
- },
- },
- recommended: {
- rules: {
- '@lexical/internal/no-imports-from-self': 'error',
- '@lexical/internal/no-optional-chaining': 'error',
- },
- },
+ // Legacy configs (ESLint 7-8) - available under multiple names for compatibility
+ all: legacyAll,
+ // Flat configs (ESLint 9-10+) - placeholders, will be set below
+ 'flat/all': /** @type {any} */ (null),
+ 'flat/recommended': /** @type {any} */ (null),
+ 'legacy-all': legacyAll,
+ 'legacy-recommended': legacyAll,
+ recommended: legacyAll,
},
rules,
};
+
+// Flat config format (ESLint 9-10+)
+// Must be created after plugin is defined to avoid circular reference
+const flatAll = {
+ plugins: {
+ '@lexical/internal': plugin,
+ },
+ rules: {
+ '@lexical/internal/no-imports-from-self': 'error',
+ '@lexical/internal/no-optional-chaining': 'error',
+ },
+};
+
+plugin.configs['flat/all'] = flatAll;
+plugin.configs['flat/recommended'] = flatAll;
+
+module.exports = plugin;
diff --git a/packages/lexical-eslint-plugin-internal/src/rules/no-optional-chaining.js b/packages/lexical-eslint-plugin-internal/src/rules/no-optional-chaining.js
index 4605cb71c45..c99f50d6c5e 100644
--- a/packages/lexical-eslint-plugin-internal/src/rules/no-optional-chaining.js
+++ b/packages/lexical-eslint-plugin-internal/src/rules/no-optional-chaining.js
@@ -15,7 +15,9 @@
/** @type {import('eslint').Rule.RuleModule} */
module.exports = {
create(context) {
- const sourceCode = context.getSourceCode();
+ // ESLint 9+ provides sourceCode directly on context (required in ESLint 10+)
+ // ESLint 7-8 requires calling getSourceCode() method
+ const sourceCode = context.sourceCode || context.getSourceCode();
/**
* Checks if the given token is a `?.` token or not.
diff --git a/packages/lexical-eslint-plugin/README.md b/packages/lexical-eslint-plugin/README.md
index b2267fec79f..d594761b465 100644
--- a/packages/lexical-eslint-plugin/README.md
+++ b/packages/lexical-eslint-plugin/README.md
@@ -2,6 +2,8 @@
This ESLint plugin enforces the [Lexical $function convention](https://lexical.dev/docs/intro#reading-and-updating-editor-state).
+**ESLint Compatibility:** This plugin supports ESLint 7, 8, 9, and 10+. Both legacy (`.eslintrc`) and flat config (`eslint.config.js`) formats are supported.
+
## Installation
Assuming you already have ESLint installed, run:
@@ -10,20 +12,54 @@ Assuming you already have ESLint installed, run:
npm install @lexical/eslint-plugin --save-dev
```
-Then extend the recommended eslint config:
+### ESLint 9+ (Flat Config)
+
+If you're using ESLint 9 or later with the new flat config format (required in ESLint 10+), add this to your `eslint.config.js`:
+
+```js
+import lexical from '@lexical/eslint-plugin';
+
+export default [
+ // ... other configs
+ lexical.configs['flat/recommended']
+];
+```
+
+### ESLint 7-8 (Legacy Config)
+
+For ESLint 7 or 8 with the legacy `.eslintrc` format, extend the recommended config:
```js
{
"extends": [
// ...
- "plugin:@lexical/recommended"
+ "plugin:@lexical/legacy-recommended"
]
}
```
+> **Note:** The `recommended` and `all` configs are currently aliases to `legacy-recommended` and `legacy-all`. `all` and `recommended` will be migrated to flat config in a future version.
+
### Custom Configuration
-If you want more fine-grained configuration, you can instead add a snippet like this to your ESLint configuration file:
+#### ESLint 9+ (Flat Config)
+
+```js
+import lexical from '@lexical/eslint-plugin';
+
+export default [
+ {
+ plugins: {
+ '@lexical': lexical
+ },
+ rules: {
+ '@lexical/rules-of-lexical': 'error'
+ }
+ }
+];
+```
+
+#### ESLint 7-8 (Legacy Config)
```js
{
@@ -53,6 +89,39 @@ If the string begins with a `"^"` or `"("` then it is treated as a RegExp,
otherwise it will be an exact match. A string may also be used instead
of an array of strings.
+#### ESLint 9+ (Flat Config)
+
+```js
+import lexical from '@lexical/eslint-plugin';
+
+export default [
+ {
+ plugins: {
+ '@lexical': lexical
+ },
+ rules: {
+ '@lexical/rules-of-lexical': [
+ 'error',
+ {
+ isDollarFunction: ['^\\$[a-z_]'],
+ isIgnoredFunction: [],
+ isLexicalProvider: [
+ 'parseEditorState',
+ 'read',
+ 'registerCommand',
+ 'registerNodeTransform',
+ 'update'
+ ],
+ isSafeDollarFunction: ['^\\$is']
+ }
+ ]
+ }
+ }
+];
+```
+
+#### ESLint 7-8 (Legacy Config)
+
```js
{
"plugins": [
@@ -111,6 +180,21 @@ These \$functions are considered safe to call from anywhere, generally
these functions are runtime type checks that do not depend on any other
state.
+## Testing
+
+To verify that the plugin works with different ESLint versions, run the integration tests:
+
+```bash
+node packages/lexical-eslint-plugin/__tests__/integration-test.js
+```
+
+This will test:
+- ✓ ESLint 8 with legacy `.eslintrc.json` configuration
+- ✓ ESLint 10 with flat `eslint.config.js` configuration
+- ✓ Legacy config name aliases (`recommended` vs `legacy-recommended`)
+
+The tests use `pnpm dlx` to run different ESLint versions without modifying `package.json` or `pnpm-lock.yaml`.
+
## Valid and Invalid Examples
### Valid Examples
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/README.md b/packages/lexical-eslint-plugin/__tests__/integration/README.md
new file mode 100644
index 00000000000..053168e1a4d
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/README.md
@@ -0,0 +1,71 @@
+# ESLint Plugin Integration Tests
+
+This directory contains integration tests that verify `@lexical/eslint-plugin` works correctly with different ESLint versions.
+
+## Test Coverage
+
+The integration tests verify:
+
+- **ESLint 8.x** with legacy `.eslintrc.json` configuration
+- **ESLint 10.x** with flat `eslint.config.js` configuration
+- **Config name aliases** (`recommended` vs `legacy-recommended`)
+
+## Running the Tests
+
+From the repository root:
+
+```bash
+node packages/lexical-eslint-plugin/__tests__/integration-test.js
+```
+
+Or from the package directory:
+
+```bash
+cd packages/lexical-eslint-plugin
+node __tests__/integration-test.js
+```
+
+## How It Works
+
+The test script uses `pnpx` to run different ESLint versions without modifying `package.json` or `pnpm-lock.yaml`. This ensures:
+
+- No dependency conflicts
+- Clean testing environment
+- Multiple ESLint versions can be tested in the same run
+
+## Test Fixtures
+
+### ESLint 8 (Legacy Config)
+
+Located in `fixtures/eslint8-legacy/`:
+- `.eslintrc.json` - Legacy ESLint configuration
+- `valid.js` - Code that should pass linting
+- `invalid.js` - Code that should trigger `@lexical/rules-of-lexical` errors
+
+### ESLint 10 (Flat Config)
+
+Located in `fixtures/eslint10-flat/`:
+- `eslint.config.js` - Flat ESLint configuration
+- `valid.js` - Code that should pass linting
+- `invalid.js` - Code that should trigger `@lexical/rules-of-lexical` errors
+
+## Expected Behavior
+
+### Valid Code Examples
+
+These should **pass** linting:
+- Functions with `$` prefix calling other `$` functions
+- Code inside `editor.update()` callbacks calling `$` functions
+- Class methods calling `$` functions
+
+### Invalid Code Examples
+
+These should **fail** linting with `@lexical/rules-of-lexical` error:
+- Functions without `$` prefix calling `$` functions directly
+
+## Test Output
+
+The test script provides colored output:
+- ✓ Green = Test passed
+- ✗ Red = Test failed
+- Summary at the end with total/passed/failed counts
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/.gitignore b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/.gitignore
new file mode 100644
index 00000000000..2370e461f0f
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/.gitignore
@@ -0,0 +1,3 @@
+# Test files copied during integration tests
+./*/valid.js
+./*/invalid.js
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/eslint.config.js b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/eslint.config.js
new file mode 100644
index 00000000000..20702e66b95
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/eslint.config.js
@@ -0,0 +1,20 @@
+const lexical = require('@lexical/eslint-plugin');
+
+module.exports = [
+ {
+ files: ['**/*.js'],
+ ignores: [],
+ ...lexical.configs['flat/recommended'],
+ rules: {
+ '@lexical/rules-of-lexical': 'error',
+ },
+ languageOptions: {
+ ecmaVersion: 2020,
+ sourceType: 'module',
+ globals: {
+ module: 'readonly',
+ require: 'readonly',
+ },
+ },
+ },
+];
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/package.json b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/package.json
new file mode 100644
index 00000000000..7919fd524b4
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint10-flat/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "eslint10-flat-fixture",
+ "private": true,
+ "type": "commonjs",
+ "devDependencies": {
+ "@lexical/eslint-plugin": "file:../../../.."
+ }
+}
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/.eslintrc.json b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/.eslintrc.json
new file mode 100644
index 00000000000..345b5bcf749
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/.eslintrc.json
@@ -0,0 +1,11 @@
+{
+ "root": true,
+ "extends": ["plugin:@lexical/recommended"],
+ "rules": {
+ "@lexical/rules-of-lexical": "error"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2020,
+ "sourceType": "module"
+ }
+}
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/package.json b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/package.json
new file mode 100644
index 00000000000..9d23f2e31cc
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy-deprecated/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "eslint8-legacy-fixture",
+ "private": true,
+ "type": "commonjs",
+ "devDependencies": {
+ "@lexical/eslint-plugin": "file:../../../.."
+ }
+}
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/.eslintrc.json b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/.eslintrc.json
new file mode 100644
index 00000000000..a7e6eabcb26
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/.eslintrc.json
@@ -0,0 +1,11 @@
+{
+ "root": true,
+ "extends": ["plugin:@lexical/legacy-recommended"],
+ "rules": {
+ "@lexical/rules-of-lexical": "error"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2020,
+ "sourceType": "module"
+ }
+}
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/package.json b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/package.json
new file mode 100644
index 00000000000..9d23f2e31cc
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/eslint8-legacy/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "eslint8-legacy-fixture",
+ "private": true,
+ "type": "commonjs",
+ "devDependencies": {
+ "@lexical/eslint-plugin": "file:../../../.."
+ }
+}
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/invalid.js b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/invalid.js
new file mode 100644
index 00000000000..5daa17c9479
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/invalid.js
@@ -0,0 +1,9 @@
+/**
+ * Invalid example - should trigger rules-of-lexical error
+ * This function calls $getRoot() but doesn't have $ prefix
+ */
+function invalidFunction() {
+ return $getRoot();
+}
+
+module.exports = {invalidFunction};
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/fixtures/valid.js b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/valid.js
new file mode 100644
index 00000000000..68c085efada
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/fixtures/valid.js
@@ -0,0 +1,27 @@
+/**
+ * Valid example - $function calling another $function
+ */
+function $createMyNode() {
+ return $getRoot();
+}
+
+/**
+ * Valid example - using editor.update
+ */
+function validUsesUpdate(editor) {
+ editor.update(() => {
+ const root = $getRoot();
+ return root;
+ });
+}
+
+/**
+ * Valid example - class method can call $functions
+ */
+class MyNode {
+ createChild() {
+ return $createTextNode('hello');
+ }
+}
+
+module.exports = {$createMyNode, validUsesUpdate, MyNode};
diff --git a/packages/lexical-eslint-plugin/__tests__/integration/integration-test.mjs b/packages/lexical-eslint-plugin/__tests__/integration/integration-test.mjs
new file mode 100755
index 00000000000..bf6aeb0f9f0
--- /dev/null
+++ b/packages/lexical-eslint-plugin/__tests__/integration/integration-test.mjs
@@ -0,0 +1,250 @@
+#!/usr/bin/env node
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+/**
+ * Integration test to verify @lexical/eslint-plugin works with:
+ * - ESLint 8 (legacy .eslintrc config)
+ * - ESLint 10 (flat eslint.config.js)
+ *
+ * This test uses pnpx to run different ESLint versions without
+ * modifying package.json or pnpm-lock.yaml
+ */
+/* eslint-disable no-console */
+
+import {execSync} from 'child_process';
+import fs from 'fs';
+import path from 'path';
+import {fileURLToPath} from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+const FIXTURES_DIR = path.join(__dirname, 'fixtures');
+const ESLINT8_DIR = path.join(FIXTURES_DIR, 'eslint8-legacy');
+const ESLINT8_DEPRECATED_DIR = path.join(
+ FIXTURES_DIR,
+ 'eslint8-legacy-deprecated',
+);
+const ESLINT10_DIR = path.join(FIXTURES_DIR, 'eslint10-flat');
+
+// ANSI color codes
+const RESET = '\x1b[0m';
+const RED = '\x1b[31m';
+const GREEN = '\x1b[32m';
+const YELLOW = '\x1b[33m';
+const BLUE = '\x1b[34m';
+const BOLD = '\x1b[1m';
+
+let totalTests = 0;
+let passedTests = 0;
+let failedTests = 0;
+
+function log(message, color = RESET) {
+ console.log(`${color}${message}${RESET}`);
+}
+
+function logTest(name, passed, details = '') {
+ totalTests++;
+ if (passed) {
+ passedTests++;
+ log(` ✓ ${name}`, GREEN);
+ } else {
+ failedTests++;
+ log(` ✗ ${name}`, RED);
+ if (details) {
+ log(` ${details}`, YELLOW);
+ }
+ }
+}
+
+function runESLint(version, configDir, configFile, file, shouldFail = false) {
+ const testName = `ESLint ${version} - ${path.basename(file)} (${shouldFail ? 'should fail' : 'should pass'})`;
+
+ // Copy the file into the config directory to ensure consistent behavior
+ // and avoid parent config file discovery issues
+ const fileName = path.basename(file);
+ const copiedFile = path.join(configDir, fileName);
+ try {
+ fs.copyFileSync(file, copiedFile);
+ } catch (error) {
+ logTest(testName, false, `Failed to copy test file: ${error.message}`);
+ return false;
+ }
+
+ try {
+ // Use -c with relative path (relative to cwd) to explicitly specify config
+ // Use --no-eslintrc to prevent parent config lookup (ESLint 8 only)
+ // For ESLint 8, set ESLINT_USE_FLAT_CONFIG=false to avoid flat config detection
+ const envPrefix = version === '8' ? 'ESLINT_USE_FLAT_CONFIG=false ' : '';
+ const noEslintrc = version === '8' ? '--no-eslintrc ' : '';
+ const cmd = `${envPrefix}pnpm dlx eslint@${version} ${noEslintrc}--no-ignore -c "${configFile}" "${fileName}"`;
+ const _output = execSync(cmd, {
+ cwd: configDir,
+ encoding: 'utf8',
+ shell: '/bin/bash',
+ stdio: 'pipe',
+ });
+
+ // Clean up copied file
+ if (fs.existsSync(copiedFile)) {
+ fs.unlinkSync(copiedFile);
+ }
+
+ // If we expected it to fail but it passed
+ if (shouldFail) {
+ logTest(
+ testName,
+ false,
+ 'Expected ESLint to report errors but it passed',
+ );
+ return false;
+ }
+
+ logTest(testName, true);
+ return true;
+ } catch (error) {
+ // Clean up copied file
+ if (fs.existsSync(copiedFile)) {
+ fs.unlinkSync(copiedFile);
+ }
+
+ const output = error.stdout + error.stderr;
+
+ // If we expected it to fail and it did
+ if (shouldFail) {
+ // Verify it failed for the right reason (rules-of-lexical)
+ if (
+ output.includes('@lexical/rules-of-lexical') ||
+ output.includes('rules-of-lexical')
+ ) {
+ logTest(testName, true);
+ return true;
+ } else {
+ logTest(testName, false, 'Failed but not due to rules-of-lexical rule');
+ return false;
+ }
+ }
+
+ // If we expected it to pass but it failed
+ logTest(testName, false, error.message.split('\n')[0]);
+ return false;
+ }
+}
+
+function testESLint8(dirName) {
+ log(`\n${BOLD}${BLUE}Testing ESLint 8 (${path.basename(dirName)})${RESET}`);
+ log(`Directory: ${dirName}`);
+
+ // Check if config exists
+ const configPath = path.join(dirName, '.eslintrc.json');
+ if (!fs.existsSync(configPath)) {
+ log(` ✗ Config file not found: ${configPath}`, RED);
+ return false;
+ }
+
+ runESLint(
+ '8',
+ dirName,
+ '.eslintrc.json',
+ path.join(FIXTURES_DIR, 'valid.js'),
+ false,
+ );
+ runESLint(
+ '8',
+ dirName,
+ '.eslintrc.json',
+ path.join(FIXTURES_DIR, 'invalid.js'),
+ true,
+ );
+}
+
+function testESLint10Flat() {
+ log(`\n${BOLD}${BLUE}Testing ESLint 10 (Flat Config)${RESET}`);
+ log(`Directory: ${ESLINT10_DIR}`);
+
+ // Check if config exists
+ const configPath = path.join(ESLINT10_DIR, 'eslint.config.js');
+ if (!fs.existsSync(configPath)) {
+ log(` ✗ Config file not found: ${configPath}`, RED);
+ return false;
+ }
+
+ runESLint(
+ '10',
+ ESLINT10_DIR,
+ 'eslint.config.js',
+ path.join(FIXTURES_DIR, 'valid.js'),
+ false,
+ );
+ runESLint(
+ '10',
+ ESLINT10_DIR,
+ 'eslint.config.js',
+ path.join(FIXTURES_DIR, 'invalid.js'),
+ true,
+ );
+}
+
+function setupFixtures() {
+ log(`\n${BOLD}${BLUE}Setting up test fixtures...${RESET}`);
+
+ [ESLINT8_DIR, ESLINT8_DEPRECATED_DIR, ESLINT10_DIR].forEach((cwd) => {
+ try {
+ log(` Installing dependencies for ${path.basename(cwd)} fixture...`);
+ execSync('pnpm install --no-lockfile', {
+ cwd,
+ stdio: 'pipe',
+ });
+ log(` ✓ ${path.basename(cwd)} fixture ready`, GREEN);
+ } catch (error) {
+ log(
+ ` ✗ Failed to setup ${path.basename(cwd)} fixture: ${error.message}`,
+ RED,
+ );
+ throw error;
+ }
+ });
+}
+
+function main() {
+ log(`${BOLD}${'='.repeat(70)}${RESET}`);
+ log(`${BOLD}ESLint Plugin Integration Tests${RESET}`);
+ log(`${BOLD}${'='.repeat(70)}${RESET}`);
+ log(`\nTesting @lexical/eslint-plugin compatibility with:`);
+ log(` - ESLint 8.x (legacy deprecated .eslintrc config)`);
+ log(` - ESLint 8.x (legacy prefixed .eslintrc config)`);
+ log(` - ESLint 10.x (flat eslint.config.js)`);
+
+ try {
+ setupFixtures();
+ testESLint8(ESLINT8_DIR);
+ testESLint8(ESLINT8_DEPRECATED_DIR);
+ testESLint10Flat();
+
+ log(`\n${BOLD}${'='.repeat(70)}${RESET}`);
+ log(`${BOLD}Test Summary${RESET}`);
+ log(`${BOLD}${'='.repeat(70)}${RESET}`);
+ log(`Total tests: ${totalTests}`);
+ log(`Passed: ${passedTests}`, GREEN);
+
+ if (failedTests > 0) {
+ log(`Failed: ${failedTests}`, RED);
+ log(`\n${RED}${BOLD}✗ Some tests failed${RESET}`);
+ process.exit(1);
+ } else {
+ log(`\n${GREEN}${BOLD}✓ All tests passed!${RESET}`);
+ process.exit(0);
+ }
+ } catch (error) {
+ log(`\n${RED}${BOLD}Fatal error: ${error.message}${RESET}`, RED);
+ process.exit(1);
+ }
+}
+
+main();
diff --git a/packages/lexical-eslint-plugin/package.json b/packages/lexical-eslint-plugin/package.json
index 26224efaa24..b5fd6be706b 100644
--- a/packages/lexical-eslint-plugin/package.json
+++ b/packages/lexical-eslint-plugin/package.json
@@ -23,7 +23,7 @@
"homepage": "https://lexical.dev/docs/packages/lexical-eslint-plugin",
"sideEffects": false,
"peerDependencies": {
- "eslint": ">=7.31.0 || ^8.0.0"
+ "eslint": ">=7.31.0"
},
"exports": {
".": {
diff --git a/packages/lexical-eslint-plugin/src/LexicalEslintPlugin.js b/packages/lexical-eslint-plugin/src/LexicalEslintPlugin.js
index 8e6d357a09f..361481666b4 100644
--- a/packages/lexical-eslint-plugin/src/LexicalEslintPlugin.js
+++ b/packages/lexical-eslint-plugin/src/LexicalEslintPlugin.js
@@ -11,17 +11,24 @@
const {name, version} = require('../package.json');
const {rulesOfLexical} = require('./rules/rules-of-lexical.js');
-const all = {
+// Legacy config format (ESLint 7-8)
+const legacyAll = {
plugins: ['@lexical'],
rules: {
- '@lexical/rules-of-lexical': 'warn',
+ '@lexical/rules-of-lexical': /** @type {'warn'|'error'|'off'}*/ ('warn'),
},
};
const plugin = {
configs: {
- all,
- recommended: all,
+ // Legacy configs (ESLint 7-8) - available under multiple names for compatibility
+ all: legacyAll,
+ // Flat configs (ESLint 9-10+) - placeholders, will be set below
+ 'flat/all': /** @type {any} */ (null),
+ 'flat/recommended': /** @type {any} */ (null),
+ 'legacy-all': legacyAll,
+ 'legacy-recommended': legacyAll,
+ recommended: legacyAll,
},
meta: {name, version},
rules: {
@@ -29,4 +36,18 @@ const plugin = {
},
};
+// Flat config format (ESLint 9-10+)
+// Must be created after plugin is defined to avoid circular reference
+const flatAll = {
+ plugins: {
+ '@lexical': plugin,
+ },
+ rules: {
+ '@lexical/rules-of-lexical': 'warn' /** @type {'warn'|'error'|'off'}*/,
+ },
+};
+
+plugin.configs['flat/all'] = flatAll;
+plugin.configs['flat/recommended'] = flatAll;
+
module.exports = plugin;
diff --git a/packages/lexical-eslint-plugin/src/index.ts b/packages/lexical-eslint-plugin/src/index.ts
index 59bcc3857e8..d2474d0df21 100644
--- a/packages/lexical-eslint-plugin/src/index.ts
+++ b/packages/lexical-eslint-plugin/src/index.ts
@@ -11,8 +11,51 @@
* compilation is necessary
*/
-import * as plugin from './LexicalEslintPlugin.js';
+import type {Rule} from 'eslint';
+
+import * as jsPlugin from './LexicalEslintPlugin.js';
export type {RulesOfLexicalOptions} from './rules/rules-of-lexical.js';
+
+// Legacy config format (ESLint 7-8)
+export interface LegacyConfig {
+ plugins: string[];
+ rules: {
+ '@lexical/rules-of-lexical': 'warn' | 'error' | 'off';
+ };
+}
+
+// Flat config format (ESLint 9-10+)
+export interface FlatConfig {
+ plugins: {
+ '@lexical': Plugin;
+ };
+ rules: {
+ '@lexical/rules-of-lexical': 'warn' | 'error' | 'off';
+ };
+}
+
+export interface Plugin {
+ meta: {
+ name: string;
+ version: string;
+ };
+ rules: {
+ 'rules-of-lexical': Rule.RuleModule;
+ };
+ configs: {
+ // Legacy configs (ESLint 7-8) - available under multiple names
+ all: LegacyConfig;
+ 'legacy-all': LegacyConfig;
+ 'legacy-recommended': LegacyConfig;
+ recommended: LegacyConfig;
+ // Flat configs (ESLint 9-10+)
+ 'flat/all': FlatConfig;
+ 'flat/recommended': FlatConfig;
+ };
+}
+
+const plugin: Plugin = jsPlugin;
+
// eslint-disable-next-line no-restricted-exports
export default plugin;
diff --git a/packages/lexical-eslint-plugin/src/rules/rules-of-lexical.js b/packages/lexical-eslint-plugin/src/rules/rules-of-lexical.js
index b24e2dc3e6e..3c45d465c2b 100644
--- a/packages/lexical-eslint-plugin/src/rules/rules-of-lexical.js
+++ b/packages/lexical-eslint-plugin/src/rules/rules-of-lexical.js
@@ -239,8 +239,10 @@ function parseMatcherOption(context, optionName) {
/** @param {RuleContext} context */
function getSourceCode(context) {
- // Deprecated in 8.x but we are still on 7.x
- return context.getSourceCode();
+ // ESLint 9+ provides sourceCode directly on context (required in ESLint 10+)
+ // ESLint 7-8 requires calling getSourceCode() method
+ // This maintains compatibility across ESLint 7, 8, 9, and 10+
+ return context.sourceCode || context.getSourceCode();
}
const matcherSchema = {
diff --git a/packages/lexical-link/src/LexicalLinkNode.ts b/packages/lexical-link/src/LexicalLinkNode.ts
index 40fd5aee4dc..8239cf15fc0 100644
--- a/packages/lexical-link/src/LexicalLinkNode.ts
+++ b/packages/lexical-link/src/LexicalLinkNode.ts
@@ -111,6 +111,14 @@ export class LinkNode extends ElementNode {
this.__title = title;
}
+ afterCloneFrom(prevNode: this): void {
+ super.afterCloneFrom(prevNode);
+ this.__url = prevNode.__url;
+ this.__rel = prevNode.__rel;
+ this.__target = prevNode.__target;
+ this.__title = prevNode.__target;
+ }
+
createDOM(config: EditorConfig): LinkHTMLElementType {
const element = document.createElement('a');
this.updateLinkDOM(null, element, config);
@@ -240,11 +248,7 @@ export class LinkNode extends ElementNode {
_: RangeSelection,
restoreSelection = true,
): null | ElementNode {
- const linkNode = $createLinkNode(this.__url, {
- rel: this.__rel,
- target: this.__target,
- title: this.__title,
- });
+ const linkNode = $copyNode(this);
this.insertAfter(linkNode, restoreSelection);
return linkNode;
}
@@ -257,7 +261,7 @@ export class LinkNode extends ElementNode {
return false;
}
- canBeEmpty(): false {
+ canBeEmpty(): boolean {
return false;
}
@@ -326,6 +330,7 @@ export function $linkNodeTransform(link: LinkNode): void {
focusPair = $saveCaretPair(selection.focus);
}
+ let transformed = false;
for (const caret of $getChildCaret(link, 'next')) {
const node = caret.origin;
if ($isElementNode(node) && !node.isInline()) {
@@ -334,13 +339,17 @@ export function $linkNodeTransform(link: LinkNode): void {
const innerLink = $copyNode(link);
innerLink.append(...blockChildren);
node.append(innerLink);
+ transformed = true;
}
$insertNodeToNearestRootAtCaret(node, $rewindSiblingCaret(caret), {
$shouldSplit: () => false,
});
}
}
- if (link.isEmpty()) {
+ if (!transformed) {
+ return;
+ }
+ if (!link.canBeEmpty() && link.isEmpty()) {
const parent = link.getParent();
link.remove();
if (parent && parent.isEmpty()) {
@@ -420,6 +429,11 @@ export class AutoLinkNode extends LinkNode {
: false;
}
+ afterCloneFrom(prevNode: this): void {
+ super.afterCloneFrom(prevNode);
+ this.__isUnlinked = prevNode.__isUnlinked;
+ }
+
static getType(): string {
return 'autolink';
}
@@ -647,11 +661,7 @@ function $splitLinkAtSelection(
const trailingChildren = allChildren.slice(lastExtractedIndex + 1);
if (trailingChildren.length > 0) {
- const newLink = $createLinkNode(parentLink.getURL(), {
- rel: parentLink.getRel(),
- target: parentLink.getTarget(),
- title: parentLink.getTitle(),
- });
+ const newLink = $copyNode(parentLink);
extractedChildren[extractedChildren.length - 1].insertAfter(newLink);
trailingChildren.forEach((child) => newLink.append(child));
diff --git a/packages/lexical-link/src/__tests__/unit/LexicalLinkNode.test.ts b/packages/lexical-link/src/__tests__/unit/LexicalLinkNode.test.ts
index c8872af3371..fb3ac439dcb 100644
--- a/packages/lexical-link/src/__tests__/unit/LexicalLinkNode.test.ts
+++ b/packages/lexical-link/src/__tests__/unit/LexicalLinkNode.test.ts
@@ -1266,4 +1266,25 @@ describe('LinkNode transform (Regression #8083)', () => {
expect(selection.anchor.offset).toBe(7);
});
});
+
+ test('an empty link is not deleted if the transformation did not occur', () => {
+ const editor = buildEditorFromExtensions(transformExtension);
+ let linkKey: string;
+ editor.update(
+ () => {
+ const root = $getRoot();
+ const link = $createLinkNode('https://lexical.dev');
+ linkKey = link.getKey();
+ const paragraph = $createParagraphNode();
+ paragraph.append(link);
+ root.clear().append(paragraph);
+ link.select();
+ },
+ {discrete: true},
+ );
+ editor.read(() => {
+ const linkNode = $getNodeByKey(linkKey);
+ expect(linkNode).not.toBe(null);
+ });
+ });
});
diff --git a/packages/lexical-list/src/LexicalListItemNode.ts b/packages/lexical-list/src/LexicalListItemNode.ts
index 6ee0284ccee..f3be1852e0e 100644
--- a/packages/lexical-list/src/LexicalListItemNode.ts
+++ b/packages/lexical-list/src/LexicalListItemNode.ts
@@ -229,7 +229,7 @@ export class ListItemNode extends ElementNode {
list.insertAfter(replaceWithNode);
} else {
// Split the list
- const newList = $createListNode(list.getListType());
+ const newList = $copyNode(list);
let nextSibling = this.getNextSibling();
while (nextSibling) {
const nodeToAppend = nextSibling;
@@ -275,7 +275,7 @@ export class ListItemNode extends ElementNode {
listNode.insertAfter(node, restoreSelection);
if (siblings.length !== 0) {
- const newListNode = $createListNode(listNode.getListType());
+ const newListNode = $copyNode(listNode);
siblings.forEach((sibling) => newListNode.append(sibling));
diff --git a/packages/lexical-list/src/LexicalListNode.ts b/packages/lexical-list/src/LexicalListNode.ts
index 990d4d068f2..1a70de13028 100644
--- a/packages/lexical-list/src/LexicalListNode.ts
+++ b/packages/lexical-list/src/LexicalListNode.ts
@@ -13,6 +13,7 @@ import {
} from '@lexical/utils';
import {
$applyNodeReplacement,
+ $copyNode,
$createTextNode,
$isElementNode,
buildImportMap,
@@ -197,6 +198,13 @@ export class ListNode extends ElementNode {
deleteCount: number,
nodesToInsert: LexicalNode[],
): this {
+ const exampleListItem =
+ nodesToInsert.find($isListItemNode) ??
+ this.getChildren().find($isListItemNode);
+ const $newListItem = exampleListItem
+ ? () => $copyNode(exampleListItem)
+ : $createListItemNode;
+
let listItemNodesToInsert = nodesToInsert;
for (let i = 0; i < nodesToInsert.length; i++) {
const node = nodesToInsert[i];
@@ -204,7 +212,7 @@ export class ListNode extends ElementNode {
if (listItemNodesToInsert === nodesToInsert) {
listItemNodesToInsert = [...nodesToInsert];
}
- listItemNodesToInsert[i] = $createListItemNode().append(
+ listItemNodesToInsert[i] = $newListItem().append(
$isElementNode(node) && !($isListNode(node) || node.isInline())
? $createTextNode(node.getTextContent())
: node,
diff --git a/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts b/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts
index eaf9648139a..b8b76e29942 100644
--- a/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts
+++ b/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts
@@ -6,15 +6,6 @@
*
*/
import {$createLinkNode, $isLinkNode, LinkNode} from '@lexical/link';
-import {$createTextNode, $getRoot, ParagraphNode, TextNode} from 'lexical';
-import {
- expectHtmlToBeEqual,
- html,
- initializeUnitTest,
-} from 'lexical/src/__tests__/utils';
-import {waitForReact} from 'packages/lexical-react/src/__tests__/unit/utils';
-import {describe, expect, test} from 'vitest';
-
import {
$createListItemNode,
$createListNode,
@@ -22,7 +13,15 @@ import {
$isListNode,
ListItemNode,
ListNode,
-} from '../..';
+} from '@lexical/list';
+import {$createTextNode, $getRoot, ParagraphNode, TextNode} from 'lexical';
+import {
+ expectHtmlToBeEqual,
+ html,
+ initializeUnitTest,
+} from 'lexical/src/__tests__/utils';
+import {waitForReact} from 'packages/lexical-react/src/__tests__/unit/utils';
+import {assert, describe, expect, test} from 'vitest';
const editorConfig = Object.freeze({
namespace: '',
@@ -306,6 +305,39 @@ describe('LexicalListNode tests', () => {
});
});
+ test('ListNode.splice() should wrap multiple non-ListItem nodes in individual ListItem nodes', async () => {
+ const {editor} = testEnv;
+
+ await editor.update(() => {
+ const list = $createListNode('bullet').append(
+ $createListItemNode().append($createTextNode('A')),
+ $createListItemNode().append($createTextNode('D')),
+ );
+ const root = $getRoot();
+ root.append(list);
+
+ const textA = $createTextNode('B');
+ const textB = $createTextNode('C');
+
+ list.splice(1, 0, [textA, textB]);
+ });
+
+ await editor.read(() => {
+ const list = $getRoot().getFirstChild();
+ assert($isListNode(list), 'First child must be a ListNode');
+
+ const children = list.getChildren();
+ expect(children).toHaveLength(4);
+
+ // Each child must be its own ListItemNode, not the same instance
+ expect($isListItemNode(children[1])).toBe(true);
+ expect($isListItemNode(children[2])).toBe(true);
+ expect(children[1]).not.toBe(children[2]);
+ expect(children[1].getTextContent()).toBe('B');
+ expect(children[2].getTextContent()).toBe('C');
+ });
+ });
+
test('Should update list children when switching from checklist to bullet', async () => {
const {editor} = testEnv;
diff --git a/packages/lexical-list/src/__tests__/unit/formatList.test.ts b/packages/lexical-list/src/__tests__/unit/formatList.test.ts
index 66ca5eab4a1..ee35026db49 100644
--- a/packages/lexical-list/src/__tests__/unit/formatList.test.ts
+++ b/packages/lexical-list/src/__tests__/unit/formatList.test.ts
@@ -5,6 +5,17 @@
* LICENSE file in the root directory of this source tree.
*
*/
+import {
+ $createListItemNode,
+ $createListNode,
+ $insertList,
+ $isListItemNode,
+ $isListNode,
+ ListItemNode,
+ ListNode,
+ ListType,
+ registerList,
+} from '@lexical/list';
import {registerRichText} from '@lexical/rich-text';
import {
$createTableCellNode,
@@ -26,6 +37,7 @@ import {
$nodesOfType,
$selectAll,
INSERT_PARAGRAPH_COMMAND,
+ LexicalNode,
} from 'lexical';
import {
$createTestDecoratorNode,
@@ -33,10 +45,39 @@ import {
} from 'lexical/src/__tests__/utils';
import {describe, expect, test} from 'vitest';
-import {registerList} from '../../';
-import {$insertList} from '../../formatList';
-import {$createListItemNode, $isListItemNode} from '../../LexicalListItemNode';
-import {$createListNode, $isListNode, ListNode} from '../../LexicalListNode';
+import {$handleIndent, $handleOutdent} from '../../formatList';
+
+class ExtendedTestListNode extends ListNode {
+ $config() {
+ return this.config('extended-test-list', {extends: ListNode});
+ }
+}
+
+function $createExtendedTestListNode(listType: ListType): ExtendedTestListNode {
+ return new ExtendedTestListNode(listType);
+}
+
+function $isExtendedTestListNode(node?: LexicalNode | null) {
+ return node instanceof ExtendedTestListNode;
+}
+
+class ExtendedTestListItemNode extends ListItemNode {
+ $config() {
+ return this.config('extended-test-list-item', {extends: ListItemNode});
+ }
+}
+
+function $createExtendedTestListItemNode(): ExtendedTestListItemNode {
+ return new ExtendedTestListItemNode();
+}
+
+function $isExtendedTestListItemNode(node?: LexicalNode | null) {
+ return node instanceof ExtendedTestListItemNode;
+}
+
+const initOptions = {
+ nodes: [ExtendedTestListNode, ExtendedTestListItemNode],
+};
describe('insertList', () => {
initializeUnitTest((testEnv) => {
@@ -298,5 +339,114 @@ describe('$handleListInsertParagraph', () => {
expect((children[0] as ListNode).getChildrenSize()).toBe(3);
});
});
- });
+
+ test('splits list when the empty element is not the last one', async () => {
+ const {editor} = testEnv;
+ registerList(editor);
+
+ let emptyListItemKey: string;
+ await editor.update(() => {
+ const firstListItemWithContent = $createExtendedTestListItemNode();
+ const secondListItemWithContent = $createExtendedTestListItemNode();
+ const listItemEmpty = $createExtendedTestListItemNode();
+ emptyListItemKey = listItemEmpty.getKey();
+ const listNode = $createExtendedTestListNode('bullet');
+ firstListItemWithContent.append($createTextNode('item1'));
+ secondListItemWithContent.append($createTextNode('item2'));
+ listNode.append(
+ firstListItemWithContent,
+ listItemEmpty,
+ secondListItemWithContent,
+ );
+ $getRoot().append(listNode);
+ listItemEmpty.select();
+ editor.dispatchCommand(INSERT_PARAGRAPH_COMMAND, undefined);
+ });
+
+ editor.read(() => {
+ const children = $getRoot().getChildren();
+ const firstList = children[0] as ExtendedTestListNode;
+ const secondList = children[2] as ExtendedTestListNode;
+
+ expect(children.length).toBe(3);
+ expect($isListNode(children[0])).toBe(true);
+ expect($isParagraphNode(children[1])).toBe(true);
+ expect($isListNode(children[2])).toBe(true);
+ expect(firstList.getChildrenSize()).toBe(1);
+ expect(secondList.getChildrenSize()).toBe(1);
+ expect($getNodeByKey(emptyListItemKey)).toBeNull();
+ // check that the new list is of the same type
+ expect(secondList).toBeInstanceOf(firstList.constructor);
+ expect(firstList.getListType()).toBe(secondList.getListType());
+ });
+ });
+ }, initOptions);
+});
+
+describe('$handleIndent', () => {
+ initializeUnitTest(
+ (testEnv) => {
+ test('creates a new nested sublist', async () => {
+ const {editor} = testEnv;
+
+ await editor.update(() => {
+ const root = $getRoot();
+ const listNode = $createExtendedTestListNode('bullet');
+ const listItem1 = $createExtendedTestListItemNode();
+ const listItem2 = $createExtendedTestListItemNode();
+
+ listNode.append(listItem1, listItem2);
+ root.append(listNode);
+
+ $handleIndent(listItem2);
+
+ // new item keeps the same type
+ const newListItem2 =
+ listNode.getChildren()[1] as ExtendedTestListItemNode;
+ expect($isExtendedTestListItemNode(newListItem2)).toBe(true);
+ expect(newListItem2.getChildren().length).toBe(1);
+
+ // nested list contains the original list item
+ const nestedList =
+ newListItem2.getChildren()[0] as ExtendedTestListNode;
+ expect($isExtendedTestListNode(nestedList)).toBe(true);
+ expect(nestedList.getChildren().length).toBe(1);
+ expect(nestedList.getChildren()[0].is(listItem2)).toBe(true);
+ });
+ });
+ },
+ {nodes: [ExtendedTestListNode, ExtendedTestListItemNode]},
+ );
+});
+
+describe('$handleOutdent', () => {
+ initializeUnitTest((testEnv) => {
+ test('removes the nested list and replaces list item', async () => {
+ const {editor} = testEnv;
+
+ await editor.update(() => {
+ const root = $getRoot();
+ const listNode = $createExtendedTestListNode('bullet');
+ const listItem1 = $createExtendedTestListItemNode();
+ const listItem2 = $createExtendedTestListItemNode();
+ const indentedListItem = $createExtendedTestListItemNode();
+
+ listNode.append(
+ listItem1,
+ listItem2.append(
+ $createExtendedTestListNode('bullet').append(indentedListItem),
+ ),
+ );
+ root.append(listNode);
+
+ $handleOutdent(indentedListItem);
+
+ const children = listNode.getChildren();
+ // item is outdented and doesn't have nested list
+ expect(children.length).toBe(2);
+ expect(children[1].is(indentedListItem)).toBe(true);
+ expect(indentedListItem.getChildren().length).toBe(0);
+ });
+ });
+ }, initOptions);
});
diff --git a/packages/lexical-list/src/formatList.ts b/packages/lexical-list/src/formatList.ts
index 65a13605c9b..5802e0a8028 100644
--- a/packages/lexical-list/src/formatList.ts
+++ b/packages/lexical-list/src/formatList.ts
@@ -8,6 +8,7 @@
import {$getNearestNodeOfType} from '@lexical/utils';
import {
+ $copyNode,
$createParagraphNode,
$getChildCaret,
$getSelection,
@@ -415,12 +416,8 @@ export function $handleIndent(listItemNode: ListItemNode): void {
// otherwise, we need to create a new nested ListNode
if ($isListNode(parent)) {
- const newListItem = $createListItemNode()
- .setTextFormat(listItemNode.getTextFormat())
- .setTextStyle(listItemNode.getTextStyle());
- const newList = $createListNode(parent.getListType())
- .setTextFormat(parent.getTextFormat())
- .setTextStyle(parent.getTextStyle());
+ const newListItem = $copyNode(listItemNode);
+ const newList = $copyNode(parent);
newListItem.append(newList);
newList.append(listItemNode);
@@ -480,15 +477,14 @@ export function $handleOutdent(listItemNode: ListItemNode): void {
}
} else {
// otherwise, we need to split the siblings into two new nested lists
- const listType = parentList.getListType();
- const previousSiblingsListItem = $createListItemNode();
- const previousSiblingsList = $createListNode(listType);
+ const previousSiblingsListItem = $copyNode(listItemNode);
+ const previousSiblingsList = $copyNode(parentList);
previousSiblingsListItem.append(previousSiblingsList);
listItemNode
.getPreviousSiblings()
.forEach((sibling) => previousSiblingsList.append(sibling));
- const nextSiblingsListItem = $createListItemNode();
- const nextSiblingsList = $createListNode(listType);
+ const nextSiblingsListItem = $copyNode(listItemNode);
+ const nextSiblingsList = $copyNode(parentList);
nextSiblingsListItem.append(nextSiblingsList);
append(nextSiblingsList, listItemNode.getNextSiblings());
// put the sibling nested lists on either side of the grandparent list item in the great grandparent.
@@ -560,7 +556,7 @@ export function $handleListInsertParagraph(
replacementNode = $createParagraphNode();
topListNode.insertAfter(replacementNode);
} else if ($isListItemNode(grandparent)) {
- replacementNode = $createListItemNode();
+ replacementNode = $copyNode(grandparent);
grandparent.insertAfter(replacementNode);
} else {
return false;
@@ -574,10 +570,10 @@ export function $handleListInsertParagraph(
if (nextSiblings.length > 0) {
const newStart = restoreNumbering ? $getNewListStart(parent, listItem) : 1;
- const newList = $createListNode(parent.getListType(), newStart);
+ const newList = $copyNode(parent).setStart(newStart);
if ($isListItemNode(replacementNode)) {
- const newListItem = $createListItemNode();
+ const newListItem = $copyNode(replacementNode);
newListItem.append(newList);
replacementNode.insertAfter(newListItem);
} else {
diff --git a/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs b/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs
new file mode 100644
index 00000000000..5cecd1c901b
--- /dev/null
+++ b/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+import {
+ assertHTML,
+ click,
+ focus,
+ focusEditor,
+ html,
+ initialize,
+ selectFromInsertDropdown,
+ test,
+ waitForSelector,
+} from '../utils/index.mjs';
+
+export async function insertBlockEquation(page, equation) {
+ await selectFromInsertDropdown(page, '.equation');
+ await click(page, 'input[data-test-id="equation-inline-checkbox"]');
+ await focus(page, 'textarea[data-test-id="equation-input"]');
+ await page.keyboard.type(equation);
+ await click(page, 'button[data-test-id="equation-submit-btn"]');
+}
+
+function equationHtml(inline = true) {
+ const tag = inline ? 'span' : 'div';
+ return `<${tag}
+ class="editor-equation"
+ contenteditable="false"
+ data-lexical-decorator="true">
+
+
+ ${inline ? '' : ``}
+
+
+
+
+ 1
+
+
+
+ ${inline ? '' : ``}
+
+
+ ${tag}>`;
+}
+
+test.describe('EquationNode', () => {
+ test.beforeEach(({isCollab, isPlainText, page}) => {
+ test.skip(isPlainText);
+ return initialize({
+ isCollab,
+ page,
+ });
+ });
+ test('inline EquationNode is wrapped in a paragraph', async ({
+ page,
+ isCollab,
+ }) => {
+ await focusEditor(page);
+ await page.keyboard.type('$1$');
+ await waitForSelector(page, '.editor-equation');
+
+ await assertHTML(
+ page,
+ html`
+
+ ${equationHtml(true)}
+
+
+ `,
+ );
+ });
+ test('block EquationNode is a child of the root', async ({
+ page,
+ isCollab,
+ }) => {
+ await focusEditor(page);
+ await insertBlockEquation(page, '1');
+ await waitForSelector(page, '.editor-equation');
+
+ await assertHTML(
+ page,
+ html`
+
+
+
+ ${equationHtml(false)}
+
+
+
+ `,
+ );
+ });
+});
diff --git a/packages/lexical-playground/src/index.css b/packages/lexical-playground/src/index.css
index 9e18413d342..23a57f94e93 100644
--- a/packages/lexical-playground/src/index.css
+++ b/packages/lexical-playground/src/index.css
@@ -1699,6 +1699,10 @@ button.toolbar-item.active i {
user-select: none;
}
+span.editor-equation {
+ display: inline-block;
+}
+
.editor-equation.focused {
outline: 2px solid rgb(60, 132, 244);
}
diff --git a/packages/lexical-playground/src/nodes/EquationNode.tsx b/packages/lexical-playground/src/nodes/EquationNode.tsx
index c32aa5bea3c..5db9e63482d 100644
--- a/packages/lexical-playground/src/nodes/EquationNode.tsx
+++ b/packages/lexical-playground/src/nodes/EquationNode.tsx
@@ -58,12 +58,18 @@ export class EquationNode extends DecoratorNode {
return new EquationNode(node.__equation, node.__inline, node.__key);
}
- constructor(equation: string, inline?: boolean, key?: NodeKey) {
+ constructor(equation: string = '', inline?: boolean, key?: NodeKey) {
super(key);
this.__equation = equation;
this.__inline = inline ?? false;
}
+ afterCloneFrom(prevNode: this): void {
+ super.afterCloneFrom(prevNode);
+ this.__equation = prevNode.__equation;
+ this.__inline = prevNode.__inline;
+ }
+
static importJSON(serializedNode: SerializedEquationNode): EquationNode {
return $createEquationNode(
serializedNode.equation,
@@ -75,7 +81,7 @@ export class EquationNode extends DecoratorNode {
return {
...super.exportJSON(),
equation: this.getEquation(),
- inline: this.__inline,
+ inline: this.isInline(),
};
}
@@ -132,16 +138,21 @@ export class EquationNode extends DecoratorNode {
}
getTextContent(): string {
- return this.__equation;
+ return this.getEquation();
+ }
+
+ isInline(): boolean {
+ return this.getLatest().__inline;
}
getEquation(): string {
- return this.__equation;
+ return this.getLatest().__equation;
}
- setEquation(equation: string): void {
+ setEquation(equation: string): this {
const writable = this.getWritable();
writable.__equation = equation;
+ return this;
}
decorate(): JSX.Element {
diff --git a/packages/lexical-playground/src/plugins/EquationsPlugin/index.tsx b/packages/lexical-playground/src/plugins/EquationsPlugin/index.tsx
index 46f1bf7ae1e..16b4ebaa3b7 100644
--- a/packages/lexical-playground/src/plugins/EquationsPlugin/index.tsx
+++ b/packages/lexical-playground/src/plugins/EquationsPlugin/index.tsx
@@ -11,7 +11,7 @@ import type {JSX} from 'react';
import 'katex/dist/katex.css';
import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
-import {$wrapNodeInElement} from '@lexical/utils';
+import {$insertNodeToNearestRoot, $wrapNodeInElement} from '@lexical/utils';
import {
$createParagraphNode,
$insertNodes,
@@ -69,9 +69,13 @@ export default function EquationsPlugin(): JSX.Element | null {
const {equation, inline} = payload;
const equationNode = $createEquationNode(equation, inline);
- $insertNodes([equationNode]);
- if ($isRootOrShadowRoot(equationNode.getParentOrThrow())) {
- $wrapNodeInElement(equationNode, $createParagraphNode).selectEnd();
+ if (inline) {
+ $insertNodes([equationNode]);
+ if ($isRootOrShadowRoot(equationNode.getParentOrThrow())) {
+ $wrapNodeInElement(equationNode, $createParagraphNode).selectEnd();
+ }
+ } else {
+ $insertNodeToNearestRoot(equationNode);
}
return true;
diff --git a/packages/lexical-playground/src/ui/KatexEquationAlterer.tsx b/packages/lexical-playground/src/ui/KatexEquationAlterer.tsx
index ab3dd38abbc..abe9ead8b92 100644
--- a/packages/lexical-playground/src/ui/KatexEquationAlterer.tsx
+++ b/packages/lexical-playground/src/ui/KatexEquationAlterer.tsx
@@ -43,7 +43,12 @@ export default function KatexEquationAlterer({
<>
Inline
-
+
Equation
@@ -54,6 +59,7 @@ export default function KatexEquationAlterer({
}}
value={equation}
className="KatexEquationAlterer_textArea"
+ data-test-id="equation-input"
/>
) : (
)}
@@ -76,7 +83,9 @@ export default function KatexEquationAlterer({
-
+
>
);
diff --git a/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx b/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx
index 6d8b5cf97c9..79859b3e4bd 100644
--- a/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx
+++ b/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx
@@ -24,7 +24,7 @@ import {
import {initializeUnitTest} from 'lexical/src/__tests__/utils';
import {describe, expect, test} from 'vitest';
-// Polyfill PointerEvent for Jest environment
+// Polyfill PointerEvent for test environment
interface PointerEventInit extends EventInit {
button?: number;
buttons?: number;
diff --git a/packages/lexical-website/docs/testing.md b/packages/lexical-website/docs/testing.md
index 7c7e0ed769d..4e17928e740 100644
--- a/packages/lexical-website/docs/testing.md
+++ b/packages/lexical-website/docs/testing.md
@@ -4,7 +4,7 @@ Lexical relies on tests to ensure that changes don't break anything, using a mix
## Unit tests
-We use Jest to run unit tests in core (`lexical` package). The goal is to have a well tested API, enabling us to add or modify features without breaking it.
+We use vitest to run unit tests in core (`lexical` package). The goal is to have a well tested API, enabling us to add or modify features without breaking it.
To run the tests use:
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c34d546a085..f13ea162dbd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -84,9 +84,6 @@ importers:
'@types/fs-extra':
specifier: ^8.1.5
version: 8.1.5
- '@types/jest':
- specifier: ^29.5.12
- version: 29.5.12
'@types/jsdom':
specifier: ^21.1.6
version: 21.1.6
@@ -159,9 +156,6 @@ importers:
eslint-plugin-import:
specifier: ^2.29.1
version: 2.29.1(@typescript-eslint/parser@8.42.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)
- eslint-plugin-jest:
- specifier: ^28.5.0
- version: 28.5.0(@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)))(typescript@5.9.2)
eslint-plugin-jsx-a11y:
specifier: ^6.8.0
version: 6.8.0(eslint@8.57.0)
@@ -213,12 +207,6 @@ importers:
husky:
specifier: ^7.0.1
version: 7.0.4
- jest:
- specifier: ^29.7.0
- version: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- jest-environment-jsdom:
- specifier: ^29.7.0
- version: 29.7.0
jsdom:
specifier: ^24.0.0
version: 24.0.0
@@ -261,9 +249,6 @@ importers:
tmp:
specifier: ^0.2.1
version: 0.2.5
- ts-jest:
- specifier: ^29.1.2
- version: 29.1.2(@babel/core@7.28.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)))(typescript@5.9.2)
ts-morph:
specifier: ^25.0.1
version: 25.0.1
@@ -477,7 +462,7 @@ importers:
packages/lexical-eslint-plugin:
dependencies:
eslint:
- specifier: '>=7.31.0 || ^8.0.0'
+ specifier: '>=7.31.0'
version: 8.57.0
devDependencies:
'@types/eslint':
@@ -490,7 +475,7 @@ importers:
packages/lexical-eslint-plugin-internal:
dependencies:
eslint:
- specifier: ^7.31.0 || ^8.0.0
+ specifier: '>=7.31.0'
version: 8.57.0
packages/lexical-extension:
@@ -1421,21 +1406,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-async-generators@7.8.4':
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-bigint@7.8.3':
- resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-properties@7.12.13':
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-dynamic-import@7.8.3':
resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
peerDependencies:
@@ -1471,58 +1441,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-meta@7.10.4':
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-json-strings@7.8.3':
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-jsx@7.25.9':
resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-numeric-separator@7.10.4':
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3':
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3':
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-chaining@7.8.3':
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-top-level-await@7.14.5':
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-typescript@7.25.9':
resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
@@ -2132,9 +2056,6 @@ packages:
resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==}
engines: {node: '>=6.9.0'}
- '@bcoe/v8-coverage@0.2.3':
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
-
'@braintree/sanitize-url@6.0.2':
resolution: {integrity: sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==}
@@ -3216,76 +3137,14 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
- '@istanbuljs/load-nyc-config@1.1.0':
- resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
- engines: {node: '>=8'}
-
- '@istanbuljs/schema@0.1.3':
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
-
- '@jest/console@29.7.0':
- resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/core@29.7.0':
- resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- '@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@29.7.0':
resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- '@jest/expect@29.7.0':
- resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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/globals@29.7.0':
- resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/reporters@29.7.0':
- resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
'@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/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@29.7.0':
- resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.7.0':
- resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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}
@@ -4447,12 +4306,6 @@ packages:
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
engines: {node: '>=14.16'}
- '@sinonjs/commons@3.0.1':
- resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
-
- '@sinonjs/fake-timers@10.3.0':
- resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
-
'@slorber/react-helmet-async@1.3.0':
resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==}
peerDependencies:
@@ -4791,10 +4644,6 @@ packages:
resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
engines: {node: '>= 10'}
- '@tootallnate/once@2.0.0':
- resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
- engines: {node: '>= 10'}
-
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@@ -4985,9 +4834,6 @@ packages:
'@types/glob@7.2.0':
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
- '@types/graceful-fs@4.1.9':
- resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
-
'@types/gtag.js@0.0.12':
resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==}
@@ -5030,9 +4876,6 @@ packages:
'@types/jest@29.5.12':
resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==}
- '@types/jsdom@20.0.1':
- resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
-
'@types/jsdom@21.1.6':
resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==}
@@ -5144,9 +4987,6 @@ packages:
'@types/sax@1.2.7':
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
- '@types/semver@7.5.8':
- resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
-
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
@@ -5216,10 +5056,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@7.8.0':
- resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==}
- engines: {node: ^18.18.0 || >=20.0.0}
-
'@typescript-eslint/scope-manager@8.42.0':
resolution: {integrity: sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -5237,35 +5073,16 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@7.8.0':
- resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==}
- engines: {node: ^18.18.0 || >=20.0.0}
-
'@typescript-eslint/types@8.42.0':
resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@7.8.0':
- resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
'@typescript-eslint/typescript-estree@8.42.0':
resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@7.8.0':
- resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
-
'@typescript-eslint/utils@8.42.0':
resolution: {integrity: sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -5273,10 +5090,6 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@7.8.0':
- resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==}
- engines: {node: ^18.18.0 || >=20.0.0}
-
'@typescript-eslint/visitor-keys@8.42.0':
resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -5438,10 +5251,6 @@ packages:
'@zag-js/focus-visible@0.31.1':
resolution: {integrity: sha512-dbLksz7FEwyFoANbpIlNnd3bVm0clQSUsnP8yUVQucStZPsuWjCrhL2jlAbGNrTrahX96ntUMXHb/sM68TibFg==}
- abab@2.0.6:
- resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
- deprecated: Use your platform's native atob() and btoa() methods instead
-
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
@@ -5459,9 +5268,6 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
- acorn-globals@7.0.1:
- resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
-
acorn-import-phases@1.0.4:
resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
engines: {node: '>=10.13.0'}
@@ -5495,10 +5301,6 @@ packages:
resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
engines: {node: '>=12.0'}
- agent-base@6.0.2:
- resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
- engines: {node: '>= 6.0.0'}
-
agent-base@7.1.0:
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
engines: {node: '>= 14'}
@@ -5734,12 +5536,6 @@ packages:
axobject-query@3.2.1:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
- babel-jest@29.7.0:
- resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@babel/core': ^7.8.0
-
babel-loader@9.2.1:
resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==}
engines: {node: '>= 14.15.0'}
@@ -5750,14 +5546,6 @@ packages:
babel-plugin-dynamic-import-node@2.3.3:
resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
- babel-plugin-istanbul@6.1.1:
- resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
- engines: {node: '>=8'}
-
- 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}
-
babel-plugin-macros@3.1.0:
resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
engines: {node: '>=10', npm: '>=6'}
@@ -5777,17 +5565,6 @@ packages:
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- babel-preset-current-node-syntax@1.0.1:
- resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
- 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}
- peerDependencies:
- '@babel/core': ^7.0.0
-
bail@1.0.5:
resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==}
@@ -5874,13 +5651,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==}
-
buble@0.19.6:
resolution: {integrity: sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==}
hasBin: true
@@ -6082,9 +5852,6 @@ packages:
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
- cjs-module-lexer@1.3.1:
- resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==}
-
clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
@@ -6161,19 +5928,12 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- co@4.6.0:
- resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
- engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-
code-block-writer@13.0.3:
resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==}
collapse-white-space@2.1.0:
resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
- collect-v8-coverage@1.0.2:
- resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
-
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -6391,11 +6151,6 @@ packages:
resolution: {integrity: sha512-kucVIjOmMc1f0tv53BJ/5WIX+MGLcKuoBhnGqQrgKJNqLByb/sVMWfW/Aw6hw0jgcqjJ2pi9E5y32zOIpaUlsA==}
engines: {node: '>=0.8'}
- create-jest@29.7.0:
- resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
-
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
@@ -6537,16 +6292,9 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- cssom@0.3.8:
- resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
-
cssom@0.5.0:
resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
- cssstyle@2.3.0:
- resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
- engines: {node: '>=8'}
-
cssstyle@4.0.1:
resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
engines: {node: '>=18'}
@@ -6716,10 +6464,6 @@ packages:
damerau-levenshtein@1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
- data-urls@3.0.2:
- resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
- engines: {node: '>=12'}
-
data-urls@5.0.0:
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
engines: {node: '>=18'}
@@ -6800,14 +6544,6 @@ packages:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
- dedent@1.5.3:
- resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'}
@@ -6897,10 +6633,6 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- detect-newline@3.1.0:
- resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
- engines: {node: '>=8'}
-
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
@@ -6990,11 +6722,6 @@ packages:
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
- domexception@4.0.0:
- resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
- engines: {node: '>=12'}
- deprecated: Use your platform's native DOMException instead
-
domhandler@4.3.1:
resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
engines: {node: '>= 4'}
@@ -7060,10 +6787,6 @@ packages:
elkjs@0.9.3:
resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
- emittery@0.13.1:
- resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
- engines: {node: '>=12'}
-
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -7227,11 +6950,6 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
- escodegen@2.1.0:
- resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
- engines: {node: '>=6.0'}
- hasBin: true
-
eslint-config-fbjs@4.0.0:
resolution: {integrity: sha512-GKXvVfpgVgXdxzmYeaqiBJFL58o+T9d5J8EMXYy3AsyD3AtEdsHzwd+4bEqSI2A0RbeF27CAj9+o2v9VhWSLIg==}
peerDependencies:
@@ -7300,19 +7018,6 @@ packages:
'@typescript-eslint/parser':
optional: true
- eslint-plugin-jest@28.5.0:
- resolution: {integrity: sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==}
- engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0
- eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
- jest: '*'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
- jest:
- optional: true
-
eslint-plugin-jsx-a11y@6.8.0:
resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==}
engines: {node: '>=4.0'}
@@ -7491,10 +7196,6 @@ packages:
exenv@1.2.2:
resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==}
- exit@0.1.2:
- resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
- engines: {node: '>= 0.8.0'}
-
expect-type@1.2.2:
resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
engines: {node: '>=12.0.0'}
@@ -7547,9 +7248,6 @@ packages:
resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
engines: {node: '>=0.8.0'}
- fb-watchman@2.0.2:
- resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
-
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -7788,10 +7486,6 @@ packages:
get-own-enumerable-property-symbols@3.0.2:
resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
- get-package-type@0.1.0:
- resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
- engines: {node: '>=8.0.0'}
-
get-port-please@3.2.0:
resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==}
@@ -8094,10 +7788,6 @@ packages:
hpack.js@2.1.6:
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
- html-encoding-sniffer@3.0.0:
- resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
- engines: {node: '>=12'}
-
html-encoding-sniffer@4.0.0:
resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
engines: {node: '>=18'}
@@ -8163,10 +7853,6 @@ packages:
http-parser-js@0.5.10:
resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
- http-proxy-agent@5.0.0:
- resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
- engines: {node: '>= 6'}
-
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
@@ -8192,10 +7878,6 @@ packages:
resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
engines: {node: '>=10.19.0'}
- https-proxy-agent@5.0.1:
- resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
- engines: {node: '>= 6'}
-
https-proxy-agent@7.0.2:
resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
engines: {node: '>= 14'}
@@ -8263,11 +7945,6 @@ packages:
resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
engines: {node: '>=8'}
- import-local@3.1.0:
- resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
- engines: {node: '>=8'}
- hasBin: true
-
import-meta-resolve@4.2.0:
resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
@@ -8443,10 +8120,6 @@ packages:
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
engines: {node: '>=18'}
- is-generator-fn@2.1.0:
- resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
- engines: {node: '>=6'}
-
is-generator-function@1.0.10:
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
engines: {node: '>= 0.4'}
@@ -8660,30 +8333,6 @@ packages:
isomorphic.js@0.2.5:
resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==}
- istanbul-lib-coverage@3.2.2:
- resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@5.2.1:
- resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@6.0.2:
- resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==}
- engines: {node: '>=10'}
-
- istanbul-lib-report@3.0.1:
- resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
- engines: {node: '>=10'}
-
- istanbul-lib-source-maps@4.0.1:
- resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
- engines: {node: '>=10'}
-
- istanbul-reports@3.1.7:
- resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
- engines: {node: '>=8'}
-
iterator.prototype@1.1.2:
resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
@@ -8695,73 +8344,14 @@ packages:
resolution: {integrity: sha512-9QR0M7//o5UVRnEUUm68IsGapHrcKGakYy9dKWWMX79LmeUKguDI6DREyljC5I13j78OUmtKLF5My6ccffLFBg==}
engines: {node: '>= 16.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@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@29.7.0:
- resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- jest-config@29.7.0:
- resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@types/node': 20.19.17
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- '@types/node':
- optional: true
- ts-node:
- optional: true
-
jest-diff@29.7.0:
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.7.0:
- resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-environment-jsdom@29.7.0:
- resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- canvas: ^2.5.0
- peerDependenciesMeta:
- canvas:
- optional: true
-
- jest-environment-node@29.7.0:
- resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.7.0:
- resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.2.2:
resolution: {integrity: sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -8774,55 +8364,10 @@ packages:
resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.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-pnp-resolver@1.2.3:
- resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
- engines: {node: '>=6'}
- peerDependencies:
- jest-resolve: '*'
- peerDependenciesMeta:
- jest-resolve:
- optional: true
-
- jest-regex-util@29.6.3:
- resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.7.0:
- resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-runner@29.7.0:
- resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.7.0:
- resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.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-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@29.7.0:
- resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
jest-worker@27.5.1:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
@@ -8831,16 +8376,6 @@ packages:
resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- jest@29.7.0:
- resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
jiti@1.21.7:
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
hasBin: true
@@ -8884,15 +8419,6 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsdom@20.0.3:
- resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
- engines: {node: '>=14'}
- peerDependencies:
- canvas: ^2.5.0
- peerDependenciesMeta:
- canvas:
- optional: true
-
jsdom@24.0.0:
resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==}
engines: {node: '>=18'}
@@ -9316,19 +8842,12 @@ packages:
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
- make-dir@4.0.0:
- resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
- engines: {node: '>=10'}
-
make-error@1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
make-synchronized@0.8.0:
resolution: {integrity: sha512-DZu4lwc0ffoFz581BSQa/BJl+1ZqIkoRQ+VejMlH0VrP4E86StAODnZujZ4sepumQj8rcP7wUnUBGM8Gu+zKUA==}
- makeerror@1.0.12:
- resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
-
many-keys-map@2.0.1:
resolution: {integrity: sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw==}
@@ -9941,9 +9460,6 @@ packages:
resolution: {integrity: sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==}
hasBin: true
- node-int64@0.4.0:
- resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
-
node-notifier@10.0.1:
resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==}
@@ -10366,10 +9882,6 @@ packages:
resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
engines: {node: '>= 6'}
- pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
-
pkg-dir@7.0.0:
resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
engines: {node: '>=14.16'}
@@ -11013,9 +10525,6 @@ packages:
resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==}
engines: {node: '>=12.20'}
- pure-rand@6.1.0:
- resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
-
pwacompat@2.0.17:
resolution: {integrity: sha512-6Du7IZdIy7cHiv7AhtDy4X2QRM8IAD5DII69mt5qWibC2d15ZU8DmBG1WdZKekG11cChSu4zkSUGPF9sweOl6w==}
@@ -11408,18 +10917,10 @@ packages:
resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
- resolve-cwd@3.0.0:
- resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
- engines: {node: '>=8'}
-
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
- resolve-from@5.0.0:
- resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
- engines: {node: '>=8'}
-
resolve-package-path@4.0.3:
resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==}
engines: {node: '>= 12'}
@@ -11427,10 +10928,6 @@ packages:
resolve-pathname@3.0.0:
resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==}
- resolve.exports@2.0.2:
- resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
- engines: {node: '>=10'}
-
resolve@1.22.10:
resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
engines: {node: '>= 0.4'}
@@ -11785,9 +11282,6 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
- source-map-support@0.5.13:
- resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
-
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
@@ -11878,10 +11372,6 @@ packages:
resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
engines: {node: '>=0.6.19'}
- string-length@4.0.2:
- resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
- engines: {node: '>=10'}
-
string-natural-compare@3.0.1:
resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==}
@@ -11942,10 +11432,6 @@ packages:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
- strip-bom@4.0.0:
- resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
- engines: {node: '>=8'}
-
strip-bom@5.0.0:
resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==}
engines: {node: '>=12'}
@@ -12085,10 +11571,6 @@ packages:
engines: {node: '>=10'}
hasBin: true
- test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
-
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@@ -12157,9 +11639,6 @@ packages:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
- tmpl@1.0.5:
- resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
-
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -12185,10 +11664,6 @@ packages:
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- tr46@3.0.0:
- resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
- engines: {node: '>=12'}
-
tr46@5.0.0:
resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
engines: {node: '>=18'}
@@ -12212,12 +11687,6 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- ts-api-utils@1.3.0:
- resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
ts-api-utils@2.1.0:
resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
engines: {node: '>=18.12'}
@@ -12231,27 +11700,6 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-jest@29.1.2:
- resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==}
- engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@babel/core': '>=7.0.0-beta.0 <8'
- '@jest/types': ^29.0.0
- babel-jest: ^29.0.0
- esbuild: '*'
- jest: ^29.0.0
- typescript: '>=4.3 <6'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- '@jest/types':
- optional: true
- babel-jest:
- optional: true
- esbuild:
- optional: true
-
ts-morph@25.0.1:
resolution: {integrity: sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==}
@@ -12295,10 +11743,6 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
- type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
-
type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
@@ -12635,10 +12079,6 @@ packages:
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
- v8-to-istanbul@9.2.0:
- resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
- engines: {node: '>=10.12.0'}
-
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
@@ -12794,17 +12234,10 @@ packages:
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
- w3c-xmlserializer@4.0.0:
- resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==}
- engines: {node: '>=14'}
-
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
- walker@1.0.8:
- resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
-
warning@4.0.3:
resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
@@ -12907,11 +12340,6 @@ packages:
webworkify@1.5.0:
resolution: {integrity: sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==}
- whatwg-encoding@2.0.0:
- resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
- engines: {node: '>=12'}
- deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
-
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
@@ -12925,10 +12353,6 @@ packages:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
- whatwg-url@11.0.0:
- resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
- engines: {node: '>=12'}
-
whatwg-url@14.0.0:
resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
engines: {node: '>=18'}
@@ -13026,10 +12450,6 @@ packages:
write-file-atomic@3.0.3:
resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
- write-file-atomic@4.0.2:
- resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
- engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-
ws@6.2.3:
resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==}
peerDependencies:
@@ -13081,10 +12501,6 @@ packages:
resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
hasBin: true
- xml-name-validator@4.0.0:
- resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
- engines: {node: '>=12'}
-
xml-name-validator@5.0.0:
resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
engines: {node: '>=18'}
@@ -13755,21 +13171,6 @@ snapshots:
dependencies:
'@babel/core': 7.28.4
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
'@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.4)':
dependencies:
'@babel/core': 7.28.4
@@ -13805,16 +13206,6 @@ snapshots:
'@babel/core': 7.28.4
'@babel/helper-plugin-utils': 7.28.6
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
'@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.28.4)':
dependencies:
'@babel/core': 7.28.4
@@ -13825,41 +13216,6 @@ snapshots:
'@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)':
- dependencies:
- '@babel/core': 7.28.4
- '@babel/helper-plugin-utils': 7.27.1
-
'@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.28.4)':
dependencies:
'@babel/core': 7.28.4
@@ -14764,8 +14120,6 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@bcoe/v8-coverage@0.2.3': {}
-
'@braintree/sanitize-url@6.0.2': {}
'@braintree/sanitize-url@7.1.1': {}
@@ -16481,173 +15835,14 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
- '@istanbuljs/load-nyc-config@1.1.0':
- dependencies:
- camelcase: 5.3.1
- find-up: 4.1.0
- get-package-type: 0.1.0
- js-yaml: 3.14.1
- resolve-from: 5.0.0
-
- '@istanbuljs/schema@0.1.3': {}
-
- '@jest/console@29.7.0':
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- chalk: 4.1.2
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
-
- '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))':
- dependencies:
- '@jest/console': 29.7.0
- '@jest/reporters': 29.7.0(node-notifier@10.0.1)
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- ci-info: 3.8.0
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-resolve-dependencies: 29.7.0
- jest-runner: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- jest-watcher: 29.7.0
- micromatch: 4.0.8
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-ansi: 6.0.1
- optionalDependencies:
- node-notifier: 10.0.1
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- '@jest/environment@29.7.0':
- dependencies:
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- jest-mock: 29.7.0
-
'@jest/expect-utils@29.7.0':
dependencies:
jest-get-type: 29.6.3
- '@jest/expect@29.7.0':
- dependencies:
- expect: 29.7.0
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/fake-timers@29.7.0':
- dependencies:
- '@jest/types': 29.6.3
- '@sinonjs/fake-timers': 10.3.0
- '@types/node': 20.19.17
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
- '@jest/globals@29.7.0':
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/types': 29.6.3
- jest-mock: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/reporters@29.7.0(node-notifier@10.0.1)':
- dependencies:
- '@bcoe/v8-coverage': 0.2.3
- '@jest/console': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.30
- '@types/node': 20.19.17
- chalk: 4.1.2
- collect-v8-coverage: 1.0.2
- exit: 0.1.2
- glob: 7.2.3
- graceful-fs: 4.2.11
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-instrument: 6.0.2
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 4.0.1
- istanbul-reports: 3.1.7
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- jest-worker: 29.7.0
- slash: 3.0.0
- string-length: 4.0.2
- strip-ansi: 6.0.1
- v8-to-istanbul: 9.2.0
- optionalDependencies:
- node-notifier: 10.0.1
- transitivePeerDependencies:
- - supports-color
-
'@jest/schemas@29.6.3':
dependencies:
'@sinclair/typebox': 0.27.8
- '@jest/source-map@29.6.3':
- dependencies:
- '@jridgewell/trace-mapping': 0.3.30
- callsites: 3.1.0
- graceful-fs: 4.2.11
-
- '@jest/test-result@29.7.0':
- dependencies:
- '@jest/console': 29.7.0
- '@jest/types': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.4
- collect-v8-coverage: 1.0.2
-
- '@jest/test-sequencer@29.7.0':
- dependencies:
- '@jest/test-result': 29.7.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- slash: 3.0.0
-
- '@jest/transform@29.7.0':
- dependencies:
- '@babel/core': 7.28.4
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.30
- babel-plugin-istanbul: 6.1.1
- chalk: 4.1.2
- convert-source-map: 2.0.0
- fast-json-stable-stringify: 2.1.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- micromatch: 4.0.8
- pirates: 4.0.5
- slash: 3.0.0
- write-file-atomic: 4.0.2
- transitivePeerDependencies:
- - supports-color
-
'@jest/types@29.6.3':
dependencies:
'@jest/schemas': 29.6.3
@@ -17763,14 +16958,6 @@ snapshots:
'@sindresorhus/is@5.6.0': {}
- '@sinonjs/commons@3.0.1':
- dependencies:
- type-detect: 4.0.8
-
- '@sinonjs/fake-timers@10.3.0':
- dependencies:
- '@sinonjs/commons': 3.0.1
-
'@slorber/react-helmet-async@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
dependencies:
'@babel/runtime': 7.28.2
@@ -18058,8 +17245,6 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
'@tailwindcss/oxide-win32-x64-msvc': 4.1.18
- '@tootallnate/once@2.0.0': {}
-
'@trysound/sax@0.2.0': {}
'@ts-morph/common@0.26.1':
@@ -18309,10 +17494,6 @@ snapshots:
'@types/minimatch': 6.0.0
'@types/node': 20.19.17
- '@types/graceful-fs@4.1.9':
- dependencies:
- '@types/node': 20.19.17
-
'@types/gtag.js@0.0.12': {}
'@types/har-format@1.2.16': {}
@@ -18357,12 +17538,6 @@ snapshots:
expect: 29.7.0
pretty-format: 29.7.0
- '@types/jsdom@20.0.1':
- dependencies:
- '@types/node': 20.19.17
- '@types/tough-cookie': 4.0.2
- parse5: 7.3.0
-
'@types/jsdom@21.1.6':
dependencies:
'@types/node': 20.19.17
@@ -18482,8 +17657,6 @@ snapshots:
dependencies:
'@types/node': 20.19.17
- '@types/semver@7.5.8': {}
-
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
@@ -18571,11 +17744,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@7.8.0':
- dependencies:
- '@typescript-eslint/types': 7.8.0
- '@typescript-eslint/visitor-keys': 7.8.0
-
'@typescript-eslint/scope-manager@8.42.0':
dependencies:
'@typescript-eslint/types': 8.42.0
@@ -18597,25 +17765,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@7.8.0': {}
-
'@typescript-eslint/types@8.42.0': {}
- '@typescript-eslint/typescript-estree@7.8.0(typescript@5.9.2)':
- dependencies:
- '@typescript-eslint/types': 7.8.0
- '@typescript-eslint/visitor-keys': 7.8.0
- debug: 4.4.3(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.7.2
- ts-api-utils: 1.3.0(typescript@5.9.2)
- optionalDependencies:
- typescript: 5.9.2
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/typescript-estree@8.42.0(typescript@5.9.2)':
dependencies:
'@typescript-eslint/project-service': 8.42.0(typescript@5.9.2)
@@ -18632,20 +17783,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.9.2)':
- dependencies:
- '@eslint-community/eslint-utils': 4.8.0(eslint@8.57.0)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.5.8
- '@typescript-eslint/scope-manager': 7.8.0
- '@typescript-eslint/types': 7.8.0
- '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.9.2)
- eslint: 8.57.0
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
-
'@typescript-eslint/utils@8.42.0(eslint@8.57.0)(typescript@5.9.2)':
dependencies:
'@eslint-community/eslint-utils': 4.8.0(eslint@8.57.0)
@@ -18657,11 +17794,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@7.8.0':
- dependencies:
- '@typescript-eslint/types': 7.8.0
- eslint-visitor-keys: 3.4.3
-
'@typescript-eslint/visitor-keys@8.42.0':
dependencies:
'@typescript-eslint/types': 8.42.0
@@ -18864,8 +17996,6 @@ snapshots:
dependencies:
'@zag-js/dom-query': 0.31.1
- abab@2.0.6: {}
-
abbrev@1.1.1: {}
abstract-leveldown@6.2.3:
@@ -18891,11 +18021,6 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
- acorn-globals@7.0.1:
- dependencies:
- acorn: 8.15.0
- acorn-walk: 8.3.4
-
acorn-import-phases@1.0.4(acorn@8.15.0):
dependencies:
acorn: 8.15.0
@@ -18920,12 +18045,6 @@ snapshots:
adm-zip@0.5.16: {}
- agent-base@6.0.2:
- dependencies:
- debug: 4.4.3(supports-color@8.1.1)
- transitivePeerDependencies:
- - supports-color
-
agent-base@7.1.0:
dependencies:
debug: 4.4.3(supports-color@8.1.1)
@@ -19194,19 +18313,6 @@ snapshots:
dependencies:
dequal: 2.0.3
- babel-jest@29.7.0(@babel/core@7.28.4):
- dependencies:
- '@babel/core': 7.28.4
- '@jest/transform': 29.7.0
- '@types/babel__core': 7.20.5
- babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.28.4)
- chalk: 4.1.2
- graceful-fs: 4.2.11
- slash: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
babel-loader@9.2.1(@babel/core@7.28.4)(webpack@5.104.0(@swc/core@1.15.5)):
dependencies:
'@babel/core': 7.28.4
@@ -19218,23 +18324,6 @@ snapshots:
dependencies:
object.assign: 4.1.5
- babel-plugin-istanbul@6.1.1:
- dependencies:
- '@babel/helper-plugin-utils': 7.27.1
- '@istanbuljs/load-nyc-config': 1.1.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 5.2.1
- test-exclude: 6.0.0
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-jest-hoist@29.6.3:
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
- '@types/babel__core': 7.20.5
- '@types/babel__traverse': 7.18.3
-
babel-plugin-macros@3.1.0:
dependencies:
'@babel/runtime': 7.28.2
@@ -19265,28 +18354,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- babel-preset-current-node-syntax@1.0.1(@babel/core@7.28.4):
- dependencies:
- '@babel/core': 7.28.4
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4)
-
- babel-preset-jest@29.6.3(@babel/core@7.28.4):
- dependencies:
- '@babel/core': 7.28.4
- babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.4)
-
bail@1.0.5: {}
bail@2.0.2: {}
@@ -19401,15 +18468,7 @@ 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
-
- buble@0.19.6:
+ buble@0.19.6:
dependencies:
chalk: 2.4.2
magic-string: 0.25.9
@@ -19655,8 +18714,6 @@ snapshots:
dependencies:
consola: 3.4.2
- cjs-module-lexer@1.3.1: {}
-
clean-css@5.3.3:
dependencies:
source-map: 0.6.1
@@ -19731,14 +18788,10 @@ snapshots:
clsx@2.1.1: {}
- co@4.6.0: {}
-
code-block-writer@13.0.3: {}
collapse-white-space@2.1.0: {}
- collect-v8-coverage@1.0.2: {}
-
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@@ -19939,21 +18992,6 @@ snapshots:
crc-32@0.3.0: {}
- create-jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)):
- 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@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- jest-util: 29.7.0
- prompts: 2.4.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
create-require@1.1.1: {}
cross-env@7.0.3:
@@ -20120,14 +19158,8 @@ snapshots:
dependencies:
css-tree: 2.2.1
- cssom@0.3.8: {}
-
cssom@0.5.0: {}
- cssstyle@2.3.0:
- dependencies:
- cssom: 0.3.8
-
cssstyle@4.0.1:
dependencies:
rrweb-cssom: 0.6.0
@@ -20325,12 +19357,6 @@ snapshots:
damerau-levenshtein@1.0.8: {}
- data-urls@3.0.2:
- dependencies:
- abab: 2.0.6
- whatwg-mimetype: 3.0.0
- whatwg-url: 11.0.0
-
data-urls@5.0.0:
dependencies:
whatwg-mimetype: 4.0.0
@@ -20396,10 +19422,6 @@ snapshots:
dependencies:
mimic-response: 3.1.0
- dedent@1.5.3(babel-plugin-macros@3.1.0):
- optionalDependencies:
- babel-plugin-macros: 3.1.0
-
deep-eql@5.0.2: {}
deep-extend@0.6.0: {}
@@ -20463,8 +19485,6 @@ snapshots:
detect-libc@2.1.2: {}
- detect-newline@3.1.0: {}
-
detect-node-es@1.1.0: {}
detect-node@2.1.0: {}
@@ -20592,10 +19612,6 @@ snapshots:
domelementtype@2.3.0: {}
- domexception@4.0.0:
- dependencies:
- webidl-conversions: 7.0.0
-
domhandler@4.3.1:
dependencies:
domelementtype: 2.3.0
@@ -20661,8 +19677,6 @@ snapshots:
elkjs@0.9.3: {}
- emittery@0.13.1: {}
-
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
@@ -20919,14 +19933,6 @@ snapshots:
escape-string-regexp@5.0.0: {}
- escodegen@2.1.0:
- dependencies:
- esprima: 4.0.1
- estraverse: 5.3.0
- esutils: 2.0.3
- optionalDependencies:
- source-map: 0.6.1
-
eslint-config-fbjs@4.0.0(eslint-plugin-babel@5.3.1(eslint@8.57.0))(eslint-plugin-ft-flow@3.0.7(eslint@8.57.0)(hermes-eslint@0.26.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react@7.34.1(eslint@8.57.0))(eslint@8.57.0)(hermes-eslint@0.26.0):
dependencies:
eslint: 8.57.0
@@ -21001,17 +20007,6 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)))(typescript@5.9.2):
- dependencies:
- '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.9.2)
- eslint: 8.57.0
- optionalDependencies:
- '@typescript-eslint/eslint-plugin': 8.42.0(@typescript-eslint/parser@8.42.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2)
- jest: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- transitivePeerDependencies:
- - supports-color
- - typescript
-
eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0):
dependencies:
'@babel/runtime': 7.28.2
@@ -21259,8 +20254,6 @@ snapshots:
exenv@1.2.2: {}
- exit@0.1.2: {}
-
expect-type@1.2.2: {}
expect@29.7.0:
@@ -21345,10 +20338,6 @@ snapshots:
dependencies:
websocket-driver: 0.7.4
- fb-watchman@2.0.2:
- dependencies:
- bser: 2.1.1
-
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -21612,8 +20601,6 @@ snapshots:
get-own-enumerable-property-symbols@3.0.2: {}
- get-package-type@0.1.0: {}
-
get-port-please@3.2.0: {}
get-proto@1.0.1:
@@ -22083,10 +21070,6 @@ snapshots:
readable-stream: 2.3.7
wbuf: 1.7.3
- html-encoding-sniffer@3.0.0:
- dependencies:
- whatwg-encoding: 2.0.0
-
html-encoding-sniffer@4.0.0:
dependencies:
whatwg-encoding: 3.1.1
@@ -22172,14 +21155,6 @@ snapshots:
http-parser-js@0.5.10: {}
- http-proxy-agent@5.0.0:
- dependencies:
- '@tootallnate/once': 2.0.0
- agent-base: 6.0.2
- debug: 4.4.3(supports-color@8.1.1)
- transitivePeerDependencies:
- - supports-color
-
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.0
@@ -22217,13 +21192,6 @@ snapshots:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
- https-proxy-agent@5.0.1:
- dependencies:
- agent-base: 6.0.2
- debug: 4.4.3(supports-color@8.1.1)
- transitivePeerDependencies:
- - supports-color
-
https-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.0
@@ -22274,11 +21242,6 @@ snapshots:
import-lazy@4.0.0: {}
- import-local@3.1.0:
- dependencies:
- pkg-dir: 4.2.0
- resolve-cwd: 3.0.0
-
import-meta-resolve@4.2.0: {}
imurmurhash@0.1.4: {}
@@ -22416,8 +21379,6 @@ snapshots:
dependencies:
get-east-asian-width: 1.4.0
- is-generator-fn@2.1.0: {}
-
is-generator-function@1.0.10:
dependencies:
has-tostringtag: 1.0.2
@@ -22573,47 +21534,6 @@ snapshots:
isomorphic.js@0.2.5: {}
- istanbul-lib-coverage@3.2.2: {}
-
- istanbul-lib-instrument@5.2.1:
- dependencies:
- '@babel/core': 7.28.4
- '@babel/parser': 7.28.5
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- istanbul-lib-instrument@6.0.2:
- dependencies:
- '@babel/core': 7.28.4
- '@babel/parser': 7.28.5
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
-
- istanbul-lib-report@3.0.1:
- dependencies:
- istanbul-lib-coverage: 3.2.2
- make-dir: 4.0.0
- supports-color: 7.2.0
-
- istanbul-lib-source-maps@4.0.1:
- dependencies:
- debug: 4.4.3(supports-color@8.1.1)
- istanbul-lib-coverage: 3.2.2
- source-map: 0.6.1
- transitivePeerDependencies:
- - supports-color
-
- istanbul-reports@3.1.7:
- dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.1
-
iterator.prototype@1.1.2:
dependencies:
define-properties: 1.2.1
@@ -22635,90 +21555,6 @@ snapshots:
jest-matcher-utils: 29.2.2
lodash.merge: 4.6.2
- jest-changed-files@29.7.0:
- dependencies:
- execa: 5.1.1
- jest-util: 29.7.0
- p-limit: 3.1.0
-
- jest-circus@29.7.0(babel-plugin-macros@3.1.0):
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- chalk: 4.1.2
- co: 4.6.0
- dedent: 1.5.3(babel-plugin-macros@3.1.0)
- is-generator-fn: 2.1.0
- jest-each: 29.7.0
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- p-limit: 3.1.0
- pretty-format: 29.7.0
- pure-rand: 6.1.0
- slash: 3.0.0
- stack-utils: 2.0.6
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
-
- jest-cli@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)):
- dependencies:
- '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- chalk: 4.1.2
- create-jest: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- exit: 0.1.2
- import-local: 3.1.0
- jest-config: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- jest-util: 29.7.0
- jest-validate: 29.7.0
- yargs: 17.7.2
- optionalDependencies:
- node-notifier: 10.0.1
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- jest-config@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)):
- dependencies:
- '@babel/core': 7.28.4
- '@jest/test-sequencer': 29.7.0
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.4)
- chalk: 4.1.2
- ci-info: 3.8.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': 20.19.17
- ts-node: 10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
-
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
@@ -22726,65 +21562,8 @@ snapshots:
jest-get-type: 29.6.3
pretty-format: 29.7.0
- jest-docblock@29.7.0:
- dependencies:
- detect-newline: 3.1.0
-
- jest-each@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- jest-get-type: 29.6.3
- jest-util: 29.7.0
- pretty-format: 29.7.0
-
- jest-environment-jsdom@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/jsdom': 20.0.1
- '@types/node': 20.19.17
- jest-mock: 29.7.0
- jest-util: 29.7.0
- jsdom: 20.0.3
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
- jest-environment-node@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
jest-get-type@29.6.3: {}
- jest-haste-map@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/graceful-fs': 4.1.9
- '@types/node': 20.19.17
- anymatch: 3.1.2
- fb-watchman: 2.0.2
- graceful-fs: 4.2.11
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- jest-worker: 29.7.0
- micromatch: 4.0.8
- walker: 1.0.8
- optionalDependencies:
- fsevents: 2.3.3
-
- jest-leak-detector@29.7.0:
- dependencies:
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
-
jest-matcher-utils@29.2.2:
dependencies:
chalk: 4.1.2
@@ -22811,115 +21590,6 @@ snapshots:
slash: 3.0.0
stack-utils: 2.0.6
- jest-mock@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- jest-util: 29.7.0
-
- jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
- optionalDependencies:
- jest-resolve: 29.7.0
-
- jest-regex-util@29.6.3: {}
-
- jest-resolve-dependencies@29.7.0:
- dependencies:
- jest-regex-util: 29.6.3
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- jest-resolve@29.7.0:
- dependencies:
- chalk: 4.1.2
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- resolve: 1.22.10
- resolve.exports: 2.0.2
- slash: 3.0.0
-
- jest-runner@29.7.0:
- dependencies:
- '@jest/console': 29.7.0
- '@jest/environment': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- chalk: 4.1.2
- emittery: 0.13.1
- graceful-fs: 4.2.11
- jest-docblock: 29.7.0
- jest-environment-node: 29.7.0
- jest-haste-map: 29.7.0
- jest-leak-detector: 29.7.0
- jest-message-util: 29.7.0
- jest-resolve: 29.7.0
- jest-runtime: 29.7.0
- jest-util: 29.7.0
- jest-watcher: 29.7.0
- jest-worker: 29.7.0
- p-limit: 3.1.0
- source-map-support: 0.5.13
- transitivePeerDependencies:
- - supports-color
-
- jest-runtime@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/globals': 29.7.0
- '@jest/source-map': 29.6.3
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- chalk: 4.1.2
- cjs-module-lexer: 1.3.1
- collect-v8-coverage: 1.0.2
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
- strip-bom: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
- jest-snapshot@29.7.0:
- dependencies:
- '@babel/core': 7.28.4
- '@babel/generator': 7.28.5
- '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.28.4)
- '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.28.4)
- '@babel/types': 7.28.5
- '@jest/expect-utils': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.28.4)
- chalk: 4.1.2
- expect: 29.7.0
- graceful-fs: 4.2.11
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- natural-compare: 1.4.0
- pretty-format: 29.7.0
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
-
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
@@ -22929,26 +21599,6 @@ snapshots:
graceful-fs: 4.2.11
picomatch: 2.3.1
- jest-validate@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- camelcase: 6.3.0
- chalk: 4.1.2
- jest-get-type: 29.6.3
- leven: 3.1.0
- pretty-format: 29.7.0
-
- jest-watcher@29.7.0:
- dependencies:
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.19.17
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- emittery: 0.13.1
- jest-util: 29.7.0
- string-length: 4.0.2
-
jest-worker@27.5.1:
dependencies:
'@types/node': 20.19.17
@@ -22962,20 +21612,6 @@ snapshots:
merge-stream: 2.0.0
supports-color: 8.1.1
- jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)):
- dependencies:
- '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- '@jest/types': 29.6.3
- import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- optionalDependencies:
- node-notifier: 10.0.1
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
jiti@1.21.7: {}
jiti@2.6.1: {}
@@ -23011,39 +21647,6 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdom@20.0.3:
- dependencies:
- abab: 2.0.6
- acorn: 8.15.0
- acorn-globals: 7.0.1
- cssom: 0.5.0
- cssstyle: 2.3.0
- data-urls: 3.0.2
- decimal.js: 10.4.3
- domexception: 4.0.0
- escodegen: 2.1.0
- form-data: 4.0.5
- html-encoding-sniffer: 3.0.0
- http-proxy-agent: 5.0.0
- https-proxy-agent: 5.0.1
- is-potential-custom-element-name: 1.0.1
- nwsapi: 2.2.7
- parse5: 7.3.0
- saxes: 6.0.0
- symbol-tree: 3.2.4
- tough-cookie: 4.1.3
- w3c-xmlserializer: 4.0.0
- webidl-conversions: 7.0.0
- whatwg-encoding: 2.0.0
- whatwg-mimetype: 3.0.0
- whatwg-url: 11.0.0
- ws: 8.18.3
- xml-name-validator: 4.0.0
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
jsdom@24.0.0:
dependencies:
cssstyle: 4.0.1
@@ -23487,18 +22090,10 @@ snapshots:
'@babel/types': 7.28.5
source-map-js: 1.2.1
- make-dir@4.0.0:
- dependencies:
- semver: 7.7.2
-
make-error@1.3.6: {}
make-synchronized@0.8.0: {}
- makeerror@1.0.12:
- dependencies:
- tmpl: 1.0.5
-
many-keys-map@2.0.1: {}
mark.js@8.11.1: {}
@@ -24657,8 +23252,6 @@ snapshots:
node-gyp-build@4.1.1:
optional: true
- node-int64@0.4.0: {}
-
node-notifier@10.0.1:
dependencies:
growly: 1.3.0
@@ -25101,10 +23694,6 @@ snapshots:
pirates@4.0.5: {}
- pkg-dir@4.2.0:
- dependencies:
- find-up: 4.1.0
-
pkg-dir@7.0.0:
dependencies:
find-up: 6.3.0
@@ -25737,8 +24326,6 @@ snapshots:
dependencies:
escape-goat: 4.0.0
- pure-rand@6.1.0: {}
-
pwacompat@2.0.17: {}
qs@6.15.0:
@@ -26236,22 +24823,14 @@ snapshots:
resolve-alpn@1.2.1: {}
- resolve-cwd@3.0.0:
- dependencies:
- resolve-from: 5.0.0
-
resolve-from@4.0.0: {}
- resolve-from@5.0.0: {}
-
resolve-package-path@4.0.3:
dependencies:
path-root: 0.1.1
resolve-pathname@3.0.0: {}
- resolve.exports@2.0.2: {}
-
resolve@1.22.10:
dependencies:
is-core-module: 2.16.1
@@ -26696,11 +25275,6 @@ snapshots:
source-map-js@1.2.1: {}
- source-map-support@0.5.13:
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
-
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
@@ -26786,11 +25360,6 @@ snapshots:
string-argv@0.3.1: {}
- string-length@4.0.2:
- dependencies:
- char-regex: 1.0.2
- strip-ansi: 6.0.1
-
string-natural-compare@3.0.1: {}
string-width@4.2.3:
@@ -26878,8 +25447,6 @@ snapshots:
strip-bom@3.0.0: {}
- strip-bom@4.0.0: {}
-
strip-bom@5.0.0: {}
strip-final-newline@2.0.0: {}
@@ -27038,12 +25605,6 @@ snapshots:
commander: 2.20.3
source-map-support: 0.5.21
- test-exclude@6.0.0:
- dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
-
text-table@0.2.0: {}
thenify-all@1.6.0:
@@ -27093,8 +25654,6 @@ snapshots:
tmp@0.2.5: {}
- tmpl@1.0.5: {}
-
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -27119,10 +25678,6 @@ snapshots:
tr46@0.0.3: {}
- tr46@3.0.0:
- dependencies:
- punycode: 2.3.1
-
tr46@5.0.0:
dependencies:
punycode: 2.3.1
@@ -27139,10 +25694,6 @@ snapshots:
trough@2.2.0: {}
- ts-api-utils@1.3.0(typescript@5.9.2):
- dependencies:
- typescript: 5.9.2
-
ts-api-utils@2.1.0(typescript@5.9.2):
dependencies:
typescript: 5.9.2
@@ -27151,23 +25702,6 @@ snapshots:
ts-interface-checker@0.1.13: {}
- ts-jest@29.1.2(@babel/core@7.28.4)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2)))(typescript@5.9.2):
- dependencies:
- bs-logger: 0.2.6
- fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.1(@swc/core@1.15.5)(@types/node@20.19.17)(typescript@5.9.2))
- jest-util: 29.7.0
- json5: 2.2.3
- lodash.memoize: 4.1.2
- make-error: 1.3.6
- semver: 7.7.2
- typescript: 5.9.2
- yargs-parser: 21.1.1
- optionalDependencies:
- '@babel/core': 7.28.4
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.4)
-
ts-morph@25.0.1:
dependencies:
'@ts-morph/common': 0.26.1
@@ -27220,8 +25754,6 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
- type-detect@4.0.8: {}
-
type-fest@0.20.2: {}
type-fest@0.21.3: {}
@@ -27614,12 +26146,6 @@ snapshots:
v8-compile-cache-lib@3.0.1: {}
- v8-to-istanbul@9.2.0:
- dependencies:
- '@jridgewell/trace-mapping': 0.3.30
- '@types/istanbul-lib-coverage': 2.0.4
- convert-source-map: 2.0.0
-
validate-npm-package-license@3.0.4:
dependencies:
spdx-correct: 3.1.1
@@ -27808,18 +26334,10 @@ snapshots:
vscode-uri@3.0.8: {}
- w3c-xmlserializer@4.0.0:
- dependencies:
- xml-name-validator: 4.0.0
-
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
- walker@1.0.8:
- dependencies:
- makeerror: 1.0.12
-
warning@4.0.3:
dependencies:
loose-envify: 1.4.0
@@ -28007,10 +26525,6 @@ snapshots:
webworkify@1.5.0: {}
- whatwg-encoding@2.0.0:
- dependencies:
- iconv-lite: 0.6.3
-
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3
@@ -28019,11 +26533,6 @@ snapshots:
whatwg-mimetype@4.0.0: {}
- whatwg-url@11.0.0:
- dependencies:
- tr46: 3.0.0
- webidl-conversions: 7.0.0
-
whatwg-url@14.0.0:
dependencies:
tr46: 5.0.0
@@ -28151,11 +26660,6 @@ snapshots:
signal-exit: 3.0.7
typedarray-to-buffer: 3.1.5
- write-file-atomic@4.0.2:
- dependencies:
- imurmurhash: 0.1.4
- signal-exit: 3.0.7
-
ws@6.2.3:
dependencies:
async-limiter: 1.0.1
@@ -28238,8 +26742,6 @@ snapshots:
dependencies:
sax: 1.4.3
- xml-name-validator@4.0.0: {}
-
xml-name-validator@5.0.0: {}
xml2js@0.6.2:
diff --git a/scripts/__tests__/integration/prepare-release.test.js b/scripts/__tests__/integration/prepare-release.test.mjs
similarity index 77%
rename from scripts/__tests__/integration/prepare-release.test.js
rename to scripts/__tests__/integration/prepare-release.test.mjs
index 0752d340639..6e474353f54 100644
--- a/scripts/__tests__/integration/prepare-release.test.js
+++ b/scripts/__tests__/integration/prepare-release.test.mjs
@@ -6,13 +6,13 @@
*
*/
// @ts-check
-'use strict';
+import fs from 'fs-extra';
+import {glob} from 'glob';
+import path from 'node:path';
+import {describe, expect, test} from 'vitest';
-const fs = require('fs-extra');
-const glob = require('glob');
-const {packagesManager} = require('../../shared/packagesManager');
-const path = require('node:path');
-const {describeExample} = require('./utils');
+import {packagesManager} from '../../shared/packagesManager.js';
+import {describeExample} from './utils.mjs';
describe('prepare-release tests', () => {
for (const pkg of packagesManager.getPublicPackages()) {
diff --git a/scripts/__tests__/integration/setup.js b/scripts/__tests__/integration/setup.mjs
similarity index 67%
rename from scripts/__tests__/integration/setup.js
rename to scripts/__tests__/integration/setup.mjs
index 71c128c93db..36c7fa83fd1 100644
--- a/scripts/__tests__/integration/setup.js
+++ b/scripts/__tests__/integration/setup.mjs
@@ -6,19 +6,19 @@
*
*/
// @ts-check
-'use strict';
+import fs from 'fs-extra';
+import path from 'node:path';
-const path = require('node:path');
-const fs = require('fs-extra');
-const {exec} = require('../../shared/childProcess');
-const {packagesManager} = require('../../shared/packagesManager');
-const {version} = require('../../shared/readMonorepoPackageJson')();
+import {exec} from '../../shared/childProcess.js';
+import {packagesManager} from '../../shared/packagesManager.js';
+import readMonorepoPackageJson from '../../shared/readMonorepoPackageJson.js';
+
+const {version} = readMonorepoPackageJson();
/**
- * @param {import('@jest/types').Config.GlobalConfig} globalConfig
- * @param {import('@jest/types').Config.ProjectConfig} projectConfig
+ * Vitest global setup function
*/
-module.exports = async function (globalConfig, projectConfig) {
+export default async function () {
const needsBuild = packagesManager
.getPublicPackages()
.some(
@@ -28,6 +28,7 @@ module.exports = async function (globalConfig, projectConfig) {
),
);
if (!needsBuild) {
+ // eslint-disable-next-line no-console
console.log(
'\nWARNING: Running integration tests with cached build artifacts from a previous `pnpm run prepare-release`.',
);
@@ -45,4 +46,4 @@ module.exports = async function (globalConfig, projectConfig) {
process.chdir(cwd);
}
}
-};
+}
diff --git a/scripts/__tests__/integration/utils.js b/scripts/__tests__/integration/utils.mjs
similarity index 87%
rename from scripts/__tests__/integration/utils.js
rename to scripts/__tests__/integration/utils.mjs
index b423e0b2ac8..71223c3561f 100644
--- a/scripts/__tests__/integration/utils.js
+++ b/scripts/__tests__/integration/utils.mjs
@@ -6,15 +6,15 @@
*
*/
// @ts-check
-'use strict';
+import fs from 'fs-extra';
+import path from 'node:path';
+import {beforeAll, describe, expect, test} from 'vitest';
-const {exec} = require('../../shared/childProcess');
-const {packagesManager} = require('../../shared/packagesManager');
-const fs = require('fs-extra');
-const path = require('node:path');
+import {exec} from '../../shared/childProcess.js';
+import {packagesManager} from '../../shared/packagesManager.js';
+import readMonorepoPackageJson from '../../shared/readMonorepoPackageJson.js';
-const monorepoVersion = require('../../shared/readMonorepoPackageJson')()
- .version;
+const monorepoVersion = readMonorepoPackageJson().version;
const LONG_TIMEOUT = 240 * 1000;
@@ -34,16 +34,15 @@ async function withCwd(dir, cb) {
process.chdir(cwd);
}
}
-exports.withCwd = withCwd;
/**
* @param {string} cmd
* @returns {Promise}
*/
function expectSuccessfulExec(cmd) {
- // Filter out JEST_WORKER_ID to prevent Playwright from detecting Jest environment
+ // Filter out VITEST_WORKER_ID to prevent Playwright from detecting Vitest environment
const env = Object.fromEntries(
- Object.entries(process.env).filter(([k]) => k !== 'JEST_WORKER_ID'),
+ Object.entries(process.env).filter(([k]) => k !== 'VITEST_WORKER_ID'),
);
return exec(cmd, {env}).catch((err) => {
expect(
@@ -54,7 +53,6 @@ function expectSuccessfulExec(cmd) {
throw err;
});
}
-exports.expectSuccessfulExec = expectSuccessfulExec;
/**
* @typedef {Object} ExampleContext
@@ -160,4 +158,4 @@ function describeExample(packageJsonPath, bodyFun = undefined) {
});
}
-exports.describeExample = describeExample;
+export {describeExample, expectSuccessfulExec, withCwd};
diff --git a/vitest.config.mts b/vitest.config.mts
index 63ce2d36737..41e096938ce 100644
--- a/vitest.config.mts
+++ b/vitest.config.mts
@@ -70,6 +70,15 @@ export default defineConfig({
name: 'scripts-unit',
},
},
+ {
+ extends: true,
+ test: {
+ environment: 'node',
+ globalSetup: './scripts/__tests__/integration/setup.mjs',
+ include: ['scripts/__tests__/integration/**/*.test.mjs'],
+ name: 'integration',
+ },
+ },
],
},
});