From 0d6ebf9f945518a69d9c988bede56f17223fd1b3 Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Mon, 23 Sep 2024 21:26:41 -0700 Subject: [PATCH 1/7] remove biome, update eslint + ts configs --- .eslintrc.js | 11 +- .github/workflows/build.yml | 4 +- .prettier.config.js | 3 + apps/mocksi-lite-next/.eslintrc | 41 - apps/mocksi-lite-next/.eslintrc.js | 3 + apps/mocksi-lite-next/package.json | 21 +- apps/mocksi-lite-next/tsconfig.json | 42 +- apps/mocksi-lite-next/vite.config.ts | 21 +- package.json | 26 +- .../README.md | 2 +- .../next.js => config-eslint/base.js} | 30 +- packages/config-eslint/package.json | 17 + packages/config-eslint/web.js | 42 + packages/config-prettier/index.js | 10 + packages/config-prettier/package.json | 17 + packages/config-typescript/base.json | 24 + packages/config-typescript/package.json | 23 + packages/config-typescript/web-app.json | 9 + packages/config-typescript/web-library.json | 10 + packages/eslint-config/library.js | 34 - packages/eslint-config/package.json | 19 - packages/eslint-config/react-internal.js | 43 - packages/reactor/.eslintrc.js | 5 + packages/reactor/biome.json | 19 - packages/reactor/index.ts | 2 +- packages/reactor/interfaces.ts | 222 +- packages/reactor/main.ts | 192 +- packages/reactor/modifications.ts | 374 +-- .../reactor/modifications/adjacentHTML.ts | 62 +- packages/reactor/modifications/highlight.ts | 48 +- packages/reactor/modifications/noop.ts | 18 +- packages/reactor/modifications/remove.ts | 76 +- packages/reactor/modifications/replace.ts | 44 +- packages/reactor/modifications/replaceAll.ts | 507 +-- packages/reactor/modifications/swapImage.ts | 52 +- packages/reactor/modifications/toast.ts | 46 +- packages/reactor/mutationObserver.ts | 226 +- packages/reactor/package.json | 62 +- packages/reactor/reactor.ts | 4 +- packages/reactor/tests/index.test.ts | 80 +- packages/reactor/tests/main.test.ts | 584 ++-- packages/reactor/tests/modifications.test.ts | 970 +++--- packages/reactor/tests/mutation.test.ts | 116 +- packages/reactor/tests/test.utils.ts | 27 +- packages/reactor/tsconfig.json | 23 +- packages/reactor/utils.ts | 34 +- packages/reactor/vitest.config.ts | 8 +- packages/typescript-config/base.json | 20 - packages/typescript-config/nextjs.json | 13 - packages/typescript-config/package.json | 9 - packages/typescript-config/react-library.json | 8 - pnpm-lock.yaml | 2909 +++-------------- tsconfig.json | 4 +- turbo.json | 12 +- 54 files changed, 2598 insertions(+), 4630 deletions(-) create mode 100644 .prettier.config.js delete mode 100644 apps/mocksi-lite-next/.eslintrc create mode 100644 apps/mocksi-lite-next/.eslintrc.js rename packages/{eslint-config => config-eslint}/README.md (65%) rename packages/{eslint-config/next.js => config-eslint/base.js} (63%) create mode 100644 packages/config-eslint/package.json create mode 100644 packages/config-eslint/web.js create mode 100644 packages/config-prettier/index.js create mode 100644 packages/config-prettier/package.json create mode 100644 packages/config-typescript/base.json create mode 100644 packages/config-typescript/package.json create mode 100644 packages/config-typescript/web-app.json create mode 100644 packages/config-typescript/web-library.json delete mode 100644 packages/eslint-config/library.js delete mode 100644 packages/eslint-config/package.json delete mode 100644 packages/eslint-config/react-internal.js create mode 100644 packages/reactor/.eslintrc.js delete mode 100644 packages/reactor/biome.json delete mode 100644 packages/typescript-config/base.json delete mode 100644 packages/typescript-config/nextjs.json delete mode 100644 packages/typescript-config/package.json delete mode 100644 packages/typescript-config/react-library.json diff --git a/.eslintrc.js b/.eslintrc.js index 1ebc781e..d7323d1a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,16 +1,7 @@ // This configuration only applies to the package manager root. /** @type {import("eslint").Linter.Config} */ module.exports = { - extends: ["@repo/eslint-config/library.js"], + extends: ["@repo/config-eslint/base.js"], ignorePatterns: ["apps/**", "packages/**"], - parser: "@typescript-eslint/parser", - parserOptions: { - project: true, - }, - plugins: ["@typescript-eslint"], root: true, - rules: { - "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], - "no-unused-vars": "off", - }, }; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ab390ec5..b8153bdf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,5 +38,7 @@ jobs: ${{ runner.os }}-pnpm-store- - name: Install dependencies run: pnpm install --no-frozen-lockfile + - name: Lint + run: pnpm lint - name: Build artifacts - run: pnpm build \ No newline at end of file + run: pnpm build diff --git a/.prettier.config.js b/.prettier.config.js new file mode 100644 index 00000000..41a9f1eb --- /dev/null +++ b/.prettier.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: "@repo/config-prettier/index.js", +}; diff --git a/apps/mocksi-lite-next/.eslintrc b/apps/mocksi-lite-next/.eslintrc deleted file mode 100644 index baab62fe..00000000 --- a/apps/mocksi-lite-next/.eslintrc +++ /dev/null @@ -1,41 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "react", - "@typescript-eslint" - ], - "rules": { - "react/react-in-jsx-scope": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ] - }, - "globals": { - "chrome": "readonly" - }, - "ignorePatterns": [ - "watch.js", - "dist/**" - ] -} \ No newline at end of file diff --git a/apps/mocksi-lite-next/.eslintrc.js b/apps/mocksi-lite-next/.eslintrc.js new file mode 100644 index 00000000..c016910c --- /dev/null +++ b/apps/mocksi-lite-next/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: "@repo/config-eslint/web.js", +}; diff --git a/apps/mocksi-lite-next/package.json b/apps/mocksi-lite-next/package.json index 955a80ce..d09169c0 100755 --- a/apps/mocksi-lite-next/package.json +++ b/apps/mocksi-lite-next/package.json @@ -15,32 +15,21 @@ "description": "A simple chrome extension template with Vite, React, TypeScript and Tailwind CSS.", "devDependencies": { "@crxjs/vite-plugin": "^2.0.0-beta.23", - "@types/chrome": "^0.0.268", - "@types/node": "^20.12.11", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@types/webextension-polyfill": "^0.10.7", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@repo/config-eslint": "workspace:*", + "@repo/config-prettier": "workspace:*", + "@repo/config-typescript": "workspace:*", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.19", "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.2", - "fs-extra": "^11.2.0", "nodemon": "^3.1.0", "postcss": "^8.4.38", "prettier": "^3.2.5", "tailwindcss": "^3.4.3", - "ts-node": "^10.9.2", "typescript": "^5.4.5", "vite": "^5.2.11" }, "license": "MIT", - "name": "vite-web-extension", + "name": "web-extension", "repository": { "type": "git", "url": "https://github.com/JohnBra/web-extension.git" @@ -49,7 +38,7 @@ "build": "vite build --mode '${npm_config_mode}'", "dev": "nodemon", "format": "prettier --write \"src/**/*.{tsx,ts}\"", - "lint": "eslint --fix --ext .ts,.tsx" + "lint": "eslint --fix" }, "type": "module", "version": "1.2.0" diff --git a/apps/mocksi-lite-next/tsconfig.json b/apps/mocksi-lite-next/tsconfig.json index 7b42e5d4..ececa9b7 100644 --- a/apps/mocksi-lite-next/tsconfig.json +++ b/apps/mocksi-lite-next/tsconfig.json @@ -1,44 +1,10 @@ { - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "baseUrl": ".", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "jsx": "react-jsx", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "module": "esnext", - "moduleResolution": "node", - "noEmit": true, - "noFallthroughCasesInSwitch": true, - "paths": { - "@assets/*": [ - "src/assets/*" - ], - "@pages/*": [ - "src/pages/*" - ], - "@src/*": [ - "src/*" - ] - }, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "esnext", - "types": [ - "vite/client", - "node", - "chrome" - ] - }, + "extends": "@repo/config-typescript/web-app.json", + "ignore": [ + "public" + ], "include": [ "src", - "utils", "vite.config.ts" ], } \ No newline at end of file diff --git a/apps/mocksi-lite-next/vite.config.ts b/apps/mocksi-lite-next/vite.config.ts index ab936b4b..b1be58b6 100644 --- a/apps/mocksi-lite-next/vite.config.ts +++ b/apps/mocksi-lite-next/vite.config.ts @@ -1,14 +1,27 @@ -import { ManifestV3Export, crx } from "@crxjs/vite-plugin"; +import { type ManifestV3Export, crx } from "@crxjs/vite-plugin"; import react from "@vitejs/plugin-react"; import { resolve } from "path"; import { defineConfig, loadEnv } from "vite"; -import manifest from "./manifest.json"; +import baseManifest from "./manifest.json"; import pkg from "./package.json"; +interface ManifestConfig { + content_security_policy: { + extension_pages: string; + }; + externally_connectable: { + matches: string[]; + }; + key?: string; + name: string; + web_accessible_resources: { matches: string[]; resources: string[] }[]; +} + const root = resolve(__dirname, "src"); -const pagesDir = resolve(root, "pages"); + const assetsDir = resolve(root, "assets"); const outDir = resolve(__dirname, "dist"); +const pagesDir = resolve(root, "pages"); const publicDir = resolve(__dirname, "public"); export default defineConfig(({ mode }) => { @@ -35,6 +48,8 @@ export default defineConfig(({ mode }) => { ); } + const manifest: ManifestConfig = baseManifest; + // Dev note: make sure these urls are what you expect them to be for current mode! manifest.externally_connectable.matches = [`${env.VITE_NEST_APP}/*`]; manifest.content_security_policy.extension_pages = `object-src 'none'; child-src ${env.VITE_NEST_APP}; frame-src ${env.VITE_NEST_APP}; script-src 'self'`; diff --git a/package.json b/package.json index 81024fe1..9f701832 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,23 @@ { - "name": "harlighter", - "private": true, - "scripts": { - "build": "turbo build", - "dev": "turbo dev" + "dependencies": { + "@repo/reactor": "workspace:*" }, "devDependencies": { - "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*", - "prettier": "^3.2.5", - "turbo": "1.13.3" + "@repo/config-eslint": "workspace:*", + "@repo/config-prettier": "workspace:*", + "@repo/config-typescript": "workspace:*", + "turbo": "latest" }, - "packageManager": "pnpm@9.0.2", "engines": { "node": ">=18" }, - "dependencies": { - "@repo/reactor": "workspace:*" + "name": "harlighter", + "packageManager": "pnpm@9.0.2", + "private": true, + "scripts": { + "build": "turbo build", + "dev": "turbo dev", + "format": "turbo format", + "lint": "turbo lint" } } diff --git a/packages/eslint-config/README.md b/packages/config-eslint/README.md similarity index 65% rename from packages/eslint-config/README.md rename to packages/config-eslint/README.md index 8b42d901..cdecd6b9 100644 --- a/packages/eslint-config/README.md +++ b/packages/config-eslint/README.md @@ -1,3 +1,3 @@ -# `@turbo/eslint-config` +# `@turbo/config-eslint` Collection of internal eslint configurations. diff --git a/packages/eslint-config/next.js b/packages/config-eslint/base.js similarity index 63% rename from packages/eslint-config/next.js rename to packages/config-eslint/base.js index 6000e546..b05b7a4b 100644 --- a/packages/eslint-config/next.js +++ b/packages/config-eslint/base.js @@ -6,19 +6,25 @@ const project = resolve(process.cwd(), "tsconfig.json"); module.exports = { extends: [ "eslint:recommended", - "prettier", - require.resolve("@vercel/style-guide/eslint/next"), "eslint-config-turbo", + "eslint-config-prettier", + "prettier", + ], + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", ], - globals: { - React: true, - JSX: true, + overrides: [{ files: ["*.js?(x)", "*.ts?(x)"] }], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, }, - env: { - node: true, - browser: true, + plugins: ["only-warn", "@typescript-eslint/eslint-plugin"], + rules: { + "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], + "no-unused-vars": "off", }, - plugins: ["only-warn"], settings: { "import/resolver": { typescript: { @@ -26,10 +32,4 @@ module.exports = { }, }, }, - ignorePatterns: [ - // Ignore dotfiles - ".*.js", - "node_modules/", - ], - overrides: [{ files: ["*.js?(x)", "*.ts?(x)"] }], }; diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json new file mode 100644 index 00000000..724fb2fc --- /dev/null +++ b/packages/config-eslint/package.json @@ -0,0 +1,17 @@ +{ + "devDependencies": { + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/parser": "latest", + "eslint": "latest", + "eslint-config-turbo": "^1.13.4", + "eslint-plugin-only-warn": "^1.1.0", + "typescript": "^5.3.3" + }, + "files": [ + "web.js", + "base.js" + ], + "name": "@repo/config-eslint", + "private": true, + "version": "1.0.0" +} diff --git a/packages/config-eslint/web.js b/packages/config-eslint/web.js new file mode 100644 index 00000000..b052ff5f --- /dev/null +++ b/packages/config-eslint/web.js @@ -0,0 +1,42 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + env: { + browser: true, + es6: true, + }, + + extends: ["./base.js"], + extends: [ + "@repo/config-eslint/base.js", + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + ], + globals: { + JSX: true, + React: true, + }, + globals: { + chrome: "readonly", + }, + ignorePatterns: ["nodemon.js", "dist/**"], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["react"], + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + }, + ], + "no-unused-vars": "off", + "react/react-in-jsx-scope": "off", + }, +}; diff --git a/packages/config-prettier/index.js b/packages/config-prettier/index.js new file mode 100644 index 00000000..591f534c --- /dev/null +++ b/packages/config-prettier/index.js @@ -0,0 +1,10 @@ +/** @type {import("prettier").Config} */ +const config = { + plugins: [ + "prettier-plugin-organize-attributes", + "prettier-plugin-tailwindcss", + ], + semi: true, +}; + +module.exports = config; diff --git a/packages/config-prettier/package.json b/packages/config-prettier/package.json new file mode 100644 index 00000000..80d215eb --- /dev/null +++ b/packages/config-prettier/package.json @@ -0,0 +1,17 @@ +{ + "devDependencies": { + "prettier": "^3.2.5", + "prettier-plugin-organize-attributes": "latest", + "prettier-plugin-tailwindcss": "^0.5.11" + }, + "files": [ + "index.js" + ], + "license": "MIT", + "name": "@repo/config-prettier", + "private": true, + "publishConfig": { + "access": "public" + }, + "version": "1.0.0" +} diff --git a/packages/config-typescript/base.json b/packages/config-typescript/base.json new file mode 100644 index 00000000..849cd8ac --- /dev/null +++ b/packages/config-typescript/base.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "downlevelIteration": true, + "esModuleInterop": true, + "isolatedModules": true, + "module": "ES6", + "moduleDetection": "force", + "moduleResolution": "Node", + "noImplicitOverride": true, + "noUncheckedIndexedAccess": true, + "outDir": "dist", + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "target": "es2022", + "types": ["eslint"], + "verbatimModuleSyntax": true + }, + "exclude": ["node_modules", "dist", "test"] +} diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json new file mode 100644 index 00000000..e4c25f52 --- /dev/null +++ b/packages/config-typescript/package.json @@ -0,0 +1,23 @@ +{ + "devDependencies": { + "@types/chrome": "^0.0.270", + "@types/eslint": "^8.56.1", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.11.24", + "@types/react": "^18.2.61", + "@types/react-dom": "^18.2.19", + "@types/uuid": "^9.0.8" + }, + "files": [ + "web-library.json", + "web-app.json", + "base.json" + ], + "license": "MIT", + "name": "@repo/config-typescript", + "private": true, + "publishConfig": { + "access": "public" + }, + "version": "1.0.0" +} diff --git a/packages/config-typescript/web-app.json b/packages/config-typescript/web-app.json new file mode 100644 index 00000000..8c4ed9c5 --- /dev/null +++ b/packages/config-typescript/web-app.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "types": ["chrome", "node", "react-dom", "react", "uuid", "vitest", "vite"] + }, + "display": "Web App", + "extends": "./base.json", + "lib": ["es2022", "dom", "dom.iterable"] +} diff --git a/packages/config-typescript/web-library.json b/packages/config-typescript/web-library.json new file mode 100644 index 00000000..97948d68 --- /dev/null +++ b/packages/config-typescript/web-library.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["jsdom", "chrome", "uuid", "vitest"] + }, + "composite": true, + "declarationMap": true, + "display": "Web Library", + "extends": "./base.json", + "lib": ["es2022", "dom", "dom.iterable"] +} diff --git a/packages/eslint-config/library.js b/packages/eslint-config/library.js deleted file mode 100644 index c667cd10..00000000 --- a/packages/eslint-config/library.js +++ /dev/null @@ -1,34 +0,0 @@ -const { resolve } = require("node:path"); - -const project = resolve(process.cwd(), "tsconfig.json"); - -/** @type {import("eslint").Linter.Config} */ -module.exports = { - extends: ["eslint:recommended", "prettier", "eslint-config-turbo"], - plugins: ["only-warn"], - globals: { - React: true, - JSX: true, - }, - env: { - node: true, - }, - settings: { - "import/resolver": { - typescript: { - project, - }, - }, - }, - ignorePatterns: [ - // Ignore dotfiles - ".*.js", - "node_modules/", - "dist/", - ], - overrides: [ - { - files: ["*.js?(x)", "*.ts?(x)"], - }, - ], -}; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json deleted file mode 100644 index 575d83a1..00000000 --- a/packages/eslint-config/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@repo/eslint-config", - "version": "0.0.0", - "private": true, - "files": [ - "library.js", - "next.js", - "react-internal.js" - ], - "devDependencies": { - "@vercel/style-guide": "^5.1.0", - "eslint-config-turbo": "^1.11.3", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-only-warn": "^1.1.0", - "@typescript-eslint/parser": "^6.17.0", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "typescript": "^5.3.3" - } -} diff --git a/packages/eslint-config/react-internal.js b/packages/eslint-config/react-internal.js deleted file mode 100644 index f56c9249..00000000 --- a/packages/eslint-config/react-internal.js +++ /dev/null @@ -1,43 +0,0 @@ -const { resolve } = require("node:path"); - -const project = resolve(process.cwd(), "tsconfig.json"); - -/* - * This is a custom ESLint configuration for use with - * internal (bundled by their consumer) libraries - * that utilize React. - * - * This config extends the Vercel Engineering Style Guide. - * For more information, see https://github.com/vercel/style-guide - * - */ - -/** @type {import("eslint").Linter.Config} */ -module.exports = { - extends: ["eslint:recommended", "prettier", "eslint-config-turbo"], - plugins: ["only-warn"], - globals: { - React: true, - JSX: true, - }, - env: { - browser: true, - }, - settings: { - "import/resolver": { - typescript: { - project, - }, - }, - }, - ignorePatterns: [ - // Ignore dotfiles - ".*.js", - "node_modules/", - "dist/", - ], - overrides: [ - // Force ESLint to detect .tsx files - { files: ["*.js?(x)", "*.ts?(x)"] }, - ], -}; diff --git a/packages/reactor/.eslintrc.js b/packages/reactor/.eslintrc.js new file mode 100644 index 00000000..937db920 --- /dev/null +++ b/packages/reactor/.eslintrc.js @@ -0,0 +1,5 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/config-eslint/web-library.js"], + types: ["vitest/globals"], +}; diff --git a/packages/reactor/biome.json b/packages/reactor/biome.json deleted file mode 100644 index 183cb06e..00000000 --- a/packages/reactor/biome.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.7.2/schema.json", - "organizeImports": { - "enabled": true - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "style": { - "noUselessElse": "error", - "useBlockStatements": "error" - } - } - }, - "files": { - "ignore": ["dist/*"] - } -} diff --git a/packages/reactor/index.ts b/packages/reactor/index.ts index 2b4417ed..d753d06a 100644 --- a/packages/reactor/index.ts +++ b/packages/reactor/index.ts @@ -8,4 +8,4 @@ export type { import Reactor from "./reactor"; -export { Reactor }; \ No newline at end of file +export { Reactor }; diff --git a/packages/reactor/interfaces.ts b/packages/reactor/interfaces.ts index 730b1a5b..51eaab12 100644 --- a/packages/reactor/interfaces.ts +++ b/packages/reactor/interfaces.ts @@ -1,129 +1,129 @@ import { generateRandomString } from "./utils"; export type Modification = { - selector?: string; - xpath?: string; - action: - | "replace" - | "replaceAll" - | "append" - | "prepend" - | "remove" - | "swapImage" - | "highlight" - | "toast" - | "addComponent" - | "unknown"; - content?: string; - imageUrl?: string; - toastMessage?: string; - componentHtml?: string; - highlightStyle?: string; - duration?: number; -} + selector?: string; + xpath?: string; + action: + | "replace" + | "replaceAll" + | "append" + | "prepend" + | "remove" + | "swapImage" + | "highlight" + | "toast" + | "addComponent" + | "unknown"; + content?: string; + imageUrl?: string; + toastMessage?: string; + componentHtml?: string; + highlightStyle?: string; + duration?: number; +}; export interface ModificationRequest { - description: string; - modifications: Modification[]; + description: string; + modifications: Modification[]; } export interface AppliedModifications { - modificationRequest: ModificationRequest; + modificationRequest: ModificationRequest; - /** - * Turn highlighting on or off for the changes made - * by this request - */ - setHighlight(highlight: boolean): void; + /** + * Turn highlighting on or off for the changes made + * by this request + */ + setHighlight(highlight: boolean): void; } export interface DomJsonExportNode { - tag: string; - visible: boolean; - text?: string; - attributes?: Record; - children?: DomJsonExportNode[]; + tag: string; + visible: boolean; + text?: string; + attributes?: Record; + children?: DomJsonExportNode[]; } export interface Highlighter { - highlightNode(elementToHighlight: Node): void; - removeHighlightNode(elementToUnhighlight: Node): void; + highlightNode(elementToHighlight: Node): void; + removeHighlightNode(elementToUnhighlight: Node): void; } export abstract class AppliableModification { - doc: Document; - uuid: string; - highlightNodes: Node[] = []; - elementState: { [key: string]: any } = {}; - - constructor(doc: Document) { - this.doc = doc; - this.uuid = generateRandomString(8); - } - - abstract apply(): void; - abstract unapply(): void; - - addModifiedElement(element: Element): string { - let mocksiId = element.getAttribute("mocksi-id"); - if (!mocksiId) { - mocksiId = generateRandomString(8); - element.setAttribute("mocksi-id", mocksiId); - } - - element.setAttribute(`mocksi-modified-${this.uuid}`, "true"); - - return mocksiId; - } - - removeModifiedElement(element: Element): void { - let mocksiId = element.getAttribute("mocksi-id"); - if (mocksiId) { - this.removeElementState(mocksiId); - } - - element.removeAttribute(`mocksi-modified-${this.uuid}`); - } - - getModifiedElement(mocksiId: string): Element | null { - return this.doc.querySelector(`[mocksi-id="${mocksiId}"]`); - } - - getModifiedElements(): Element[] { - return Array.from( - this.doc.querySelectorAll(`[mocksi-modified-${this.uuid}]`), - ) as Element[]; - } - - // returns true if the modification is no longer needed because it no - // longer applied to any nodes. In that case it will be removed from - // the list of modifications - modifiedElementRemoved(element: Element, mocksiId: string): boolean { - this.removeElementState(mocksiId); - return this.elementState.length === 0; - } - - getMocksiId(element: Element): string { - return element.getAttribute("mocksi-id") || ""; - } - - setElementState(mocksiId: string, state: any): void { - this.elementState[mocksiId] = state; - } - - getElementState(mocksiId: string): any { - return this.elementState[mocksiId]; - } - - removeElementState(mocksiId: string): void { - delete this.elementState[mocksiId]; - } - - getHighlightNodes(): Node[] { - return this.highlightNodes; - } - - addHighlightNode(node: Node): void { - this.highlightNodes.push(node); - } -} \ No newline at end of file + doc: Document; + uuid: string; + highlightNodes: Node[] = []; + elementState: { [key: string]: any } = {}; + + constructor(doc: Document) { + this.doc = doc; + this.uuid = generateRandomString(8); + } + + abstract apply(): void; + abstract unapply(): void; + + addModifiedElement(element: Element): string { + let mocksiId = element.getAttribute("mocksi-id"); + if (!mocksiId) { + mocksiId = generateRandomString(8); + element.setAttribute("mocksi-id", mocksiId); + } + + element.setAttribute(`mocksi-modified-${this.uuid}`, "true"); + + return mocksiId; + } + + removeModifiedElement(element: Element): void { + let mocksiId = element.getAttribute("mocksi-id"); + if (mocksiId) { + this.removeElementState(mocksiId); + } + + element.removeAttribute(`mocksi-modified-${this.uuid}`); + } + + getModifiedElement(mocksiId: string): Element | null { + return this.doc.querySelector(`[mocksi-id="${mocksiId}"]`); + } + + getModifiedElements(): Element[] { + return Array.from( + this.doc.querySelectorAll(`[mocksi-modified-${this.uuid}]`), + ) as Element[]; + } + + // returns true if the modification is no longer needed because it no + // longer applied to any nodes. In that case it will be removed from + // the list of modifications + modifiedElementRemoved(element: Element, mocksiId: string): boolean { + this.removeElementState(mocksiId); + return this.elementState.length === 0; + } + + getMocksiId(element: Element): string { + return element.getAttribute("mocksi-id") || ""; + } + + setElementState(mocksiId: string, state: any): void { + this.elementState[mocksiId] = state; + } + + getElementState(mocksiId: string): any { + return this.elementState[mocksiId]; + } + + removeElementState(mocksiId: string): void { + delete this.elementState[mocksiId]; + } + + getHighlightNodes(): Node[] { + return this.highlightNodes; + } + + addHighlightNode(node: Node): void { + this.highlightNodes.push(node); + } +} diff --git a/packages/reactor/main.ts b/packages/reactor/main.ts index 2d7a05e6..297d8b62 100644 --- a/packages/reactor/main.ts +++ b/packages/reactor/main.ts @@ -1,120 +1,120 @@ import type { - AppliedModifications, - DomJsonExportNode, - ModificationRequest, + AppliedModifications, + DomJsonExportNode, + ModificationRequest, } from "./interfaces"; import { generateModifications } from "./modifications"; import { parseRequest } from "./utils"; export async function modifyHtml( - htmlString: string, - userRequest: string, + htmlString: string, + userRequest: string, ): Promise { - try { - const parser = new DOMParser(); - const doc = parser.parseFromString(htmlString, "text/html"); + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, "text/html"); - const modificationRequest: ModificationRequest = parseRequest(userRequest); + const modificationRequest: ModificationRequest = parseRequest(userRequest); - await generateModifications(modificationRequest, doc); + await generateModifications(modificationRequest, doc); - const serializer = new XMLSerializer(); - return serializer.serializeToString(doc); - // biome-ignore lint/suspicious/noExplicitAny: Exception handling - } catch (e: any) { - console.error("Error modifying HTML:", e); - throw new Error(`Error modifying HTML: ${e}`); - } + const serializer = new XMLSerializer(); + return serializer.serializeToString(doc); + // biome-ignore lint/suspicious/noExplicitAny: Exception handling + } catch (e: any) { + console.error("Error modifying HTML:", e); + throw new Error(`Error modifying HTML: ${e}`); + } } export async function modifyDom( - root: Document, - modificationRequest: ModificationRequest, + root: Document, + modificationRequest: ModificationRequest, ): Promise { - try { - return generateModifications(modificationRequest, root); - } catch (e) { - console.error("Error modifying DOM:", e); - throw new Error(`Error modifying DOM: ${e}`); - } + try { + return generateModifications(modificationRequest, root); + } catch (e) { + console.error("Error modifying DOM:", e); + throw new Error(`Error modifying DOM: ${e}`); + } } export const htmlElementToJson = (root: HTMLElement): DomJsonExportNode[] => { - function nodeToJson(node: Node): DomJsonExportNode { - if (node instanceof Text) { - return { - tag: "text", - visible: node.parentElement - ? node.parentElement.offsetWidth > 0 || - node.parentElement.offsetHeight > 0 - : false, - text: node.data, - }; - } - - if (node instanceof Element) { - const element = node; - const obj: DomJsonExportNode = { - tag: element.tagName.toLowerCase(), - visible: - element instanceof HTMLElement - ? element.offsetWidth > 0 || element.offsetHeight > 0 - : false, - }; - - if (element.attributes.length > 0) { - obj.attributes = {}; - for (const attr of Array.from(element.attributes)) { - obj.attributes[attr.name] = attr.value; - } - } - - const children = Array.from(element.childNodes).filter(textElementFilter); - - // special case: if the element has only one child, and that child is a text node, then - // include the text directly - if (children.length === 1 && children[0] instanceof Text) { - obj.text = children[0].data; - } else { - obj.children = children.map((child) => nodeToJson(child)); - } - - // remove text and children from script and style elements - if (obj.tag === "script" || obj.tag === "style") { - obj.text = undefined; - obj.children = undefined; - } - - // remove empty children - if (obj.children?.length === 0) { - obj.children = undefined; - } - - return obj; - } - - throw new Error("Unknown node type"); - } - - // Convert the body of the parsed document to JSON - const json = Array.from(root.childNodes) - .filter(textElementFilter) - .map((child) => nodeToJson(child)); - - return json; + function nodeToJson(node: Node): DomJsonExportNode { + if (node instanceof Text) { + return { + tag: "text", + visible: node.parentElement + ? node.parentElement.offsetWidth > 0 || + node.parentElement.offsetHeight > 0 + : false, + text: node.data, + }; + } + + if (node instanceof Element) { + const element = node; + const obj: DomJsonExportNode = { + tag: element.tagName.toLowerCase(), + visible: + element instanceof HTMLElement + ? element.offsetWidth > 0 || element.offsetHeight > 0 + : false, + }; + + if (element.attributes.length > 0) { + obj.attributes = {}; + for (const attr of Array.from(element.attributes)) { + obj.attributes[attr.name] = attr.value; + } + } + + const children = Array.from(element.childNodes).filter(textElementFilter); + + // special case: if the element has only one child, and that child is a text node, then + // include the text directly + if (children.length === 1 && children[0] instanceof Text) { + obj.text = children[0].data; + } else { + obj.children = children.map((child) => nodeToJson(child)); + } + + // remove text and children from script and style elements + if (obj.tag === "script" || obj.tag === "style") { + obj.text = undefined; + obj.children = undefined; + } + + // remove empty children + if (obj.children?.length === 0) { + obj.children = undefined; + } + + return obj; + } + + throw new Error("Unknown node type"); + } + + // Convert the body of the parsed document to JSON + const json = Array.from(root.childNodes) + .filter(textElementFilter) + .map((child) => nodeToJson(child)); + + return json; }; // TODO: may need to handle DOCUMENT_NODE also for iframes const textElementFilter = (node: Node) => { - if (node instanceof Element) { - return true; - } + if (node instanceof Element) { + return true; + } - // filter out "empty" text nodes that only include whitespace - if (node instanceof Text) { - return node.data.trim().length > 0; - } + // filter out "empty" text nodes that only include whitespace + if (node instanceof Text) { + return node.data.trim().length > 0; + } - // ignore other nodes - return false; + // ignore other nodes + return false; }; diff --git a/packages/reactor/modifications.ts b/packages/reactor/modifications.ts index dcaaf5db..d0011607 100644 --- a/packages/reactor/modifications.ts +++ b/packages/reactor/modifications.ts @@ -8,202 +8,208 @@ import { SwapImageModification } from "./modifications/swapImage"; import { ToastModification } from "./modifications/toast"; import type { - AppliableModification, - AppliedModifications, - Highlighter, - Modification, - ModificationRequest, + AppliableModification, + AppliedModifications, + Highlighter, + Modification, + ModificationRequest, } from "./interfaces"; export class AppliedModificationsImpl implements AppliedModifications { - modificationRequest: ModificationRequest; - modifications: Array = []; - highlighter?: Highlighter; - - constructor( - modificationRequest: ModificationRequest, - highlighter?: Highlighter, - ) { - this.modificationRequest = modificationRequest; - this.highlighter = highlighter; - } - - unapply(): void { - const reversedModifications = [...this.modifications].reverse(); - for (const mod of reversedModifications) { - mod.unapply(); - } - } - - setHighlight(highlight: boolean): void { - if (this.highlighter) { - for (const mod of this.modifications) { - for (const node of mod.highlightNodes) { - if (highlight) { - this.highlighter.highlightNode(node); - } else { - this.highlighter.removeHighlightNode(node); - } - } - } - } - } + modificationRequest: ModificationRequest; + modifications: Array = []; + highlighter?: Highlighter; + + constructor( + modificationRequest: ModificationRequest, + highlighter?: Highlighter, + ) { + this.modificationRequest = modificationRequest; + this.highlighter = highlighter; + } + + unapply(): void { + const reversedModifications = [...this.modifications].reverse(); + for (const mod of reversedModifications) { + mod.unapply(); + } + } + + setHighlight(highlight: boolean): void { + if (this.highlighter) { + for (const mod of this.modifications) { + for (const node of mod.highlightNodes) { + if (highlight) { + this.highlighter.highlightNode(node); + } else { + this.highlighter.removeHighlightNode(node); + } + } + } + } + } } export async function generateModifications( - request: ModificationRequest, - doc: Document, - highlighter?: Highlighter, + request: ModificationRequest, + doc: Document, + highlighter?: Highlighter, ): Promise { - const appliedModifications = new AppliedModificationsImpl( - request, - highlighter, - ); - - try { - for (const mod of request.modifications) { - let elements: Array; - try { - if (mod.selector) { - elements = Array.from(doc.querySelectorAll(mod.selector)); - } else if (mod.xpath) { - // construct a new NodeListOf from items found by the xpath - elements = []; - if (!mod.xpath.startsWith("//html")) { - mod.xpath = `//html/${mod.xpath}`; - } - const xpath = document.evaluate( - mod.xpath, - doc, - null, - XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - for (let i = 0; i < xpath.snapshotLength; i++) { - const item = xpath.snapshotItem(i); - if (item !== null && item instanceof Element) { - elements.push(item); - } - } - } else { - console.warn("No selector provided for modification."); - continue; - } - } catch (e) { - console.warn( - `Invalid selector: ${mod.selector ? mod.selector : mod.xpath}`, - ); - continue; - } - - if (elements.length === 0) { - console.warn( - `Element not found for selector: ${ - mod.selector ? mod.selector : mod.xpath - }`, - ); - continue; - } - - for (const element of elements) { - const appliedModification = await applyModification(element, mod, doc); - appliedModifications.modifications.push(appliedModification); - } - - // Add a small delay between modifications - await new Promise((resolve) => setTimeout(resolve, 100)); - } - // biome-ignore lint/suspicious/noExplicitAny: exception handling - } catch (error: any) { - console.error("Error generating modifications:", error); - throw new Error(`Error generating modifications: ${error}`); - } - - return appliedModifications; + const appliedModifications = new AppliedModificationsImpl( + request, + highlighter, + ); + + try { + for (const mod of request.modifications) { + let elements: Array; + try { + if (mod.selector) { + elements = Array.from(doc.querySelectorAll(mod.selector)); + } else if (mod.xpath) { + // construct a new NodeListOf from items found by the xpath + elements = []; + if (!mod.xpath.startsWith("//html")) { + mod.xpath = `//html/${mod.xpath}`; + } + const xpath = document.evaluate( + mod.xpath, + doc, + null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + for (let i = 0; i < xpath.snapshotLength; i++) { + const item = xpath.snapshotItem(i); + if (item !== null && item instanceof Element) { + elements.push(item); + } + } + } else { + console.warn("No selector provided for modification."); + continue; + } + } catch (e) { + console.warn( + `Invalid selector: ${mod.selector ? mod.selector : mod.xpath}`, + ); + continue; + } + + if (elements.length === 0) { + console.warn( + `Element not found for selector: ${ + mod.selector ? mod.selector : mod.xpath + }`, + ); + continue; + } + + for (const element of elements) { + const appliedModification = await applyModification(element, mod, doc); + appliedModifications.modifications.push(appliedModification); + } + + // Add a small delay between modifications + await new Promise((resolve) => setTimeout(resolve, 100)); + } + // biome-ignore lint/suspicious/noExplicitAny: exception handling + } catch (error: any) { + console.error("Error generating modifications:", error); + throw new Error(`Error generating modifications: ${error}`); + } + + return appliedModifications; } export async function applyModification( - element: Element, - mod: Modification, - doc: Document, + element: Element, + mod: Modification, + doc: Document, ): Promise { - let modification: AppliableModification; - - switch (mod.action) { - case "replace": - modification = new ReplaceModification(doc, element, mod.content || ""); - break; - case "replaceAll": - modification = new ReplaceAllModification( - doc, - element, - mod.content || "", - ); - break; - case "append": - modification = new AdjacentHTMLModification( - doc, - element, - "beforeend", - mod.content || "", - ); - break; - case "prepend": - modification = new AdjacentHTMLModification( - doc, - element, - "afterbegin", - mod.content || "", - ); - break; - case "remove": - modification = new RemoveModification(doc, element); - break; - case "swapImage": - modification = new SwapImageModification( - doc, - element, - mod.imageUrl || "", - ); - break; - case "highlight": - modification = new HighlightModification( - doc, - element, - mod.highlightStyle || "2px solid red", - ); - break; - case "toast": - modification = new ToastModification( - doc, - mod.toastMessage || "Notification", - mod.duration || 3000, - ); - break; - case "addComponent": - modification = new AdjacentHTMLModification( - doc, - element, - "beforeend", - mod.componentHtml || "", - ); - break; - default: - modification = new NoopModification(doc, mod.action); - break; - } - - modification.apply(); - return modification; + let modification: AppliableModification; + + switch (mod.action) { + case "replace": + modification = new ReplaceModification(doc, element, mod.content || ""); + break; + case "replaceAll": + modification = new ReplaceAllModification( + doc, + element, + mod.content || "", + ); + break; + case "append": + modification = new AdjacentHTMLModification( + doc, + element, + "beforeend", + mod.content || "", + ); + break; + case "prepend": + modification = new AdjacentHTMLModification( + doc, + element, + "afterbegin", + mod.content || "", + ); + break; + case "remove": + modification = new RemoveModification(doc, element); + break; + case "swapImage": + modification = new SwapImageModification( + doc, + element, + mod.imageUrl || "", + ); + break; + case "highlight": + modification = new HighlightModification( + doc, + element, + mod.highlightStyle || "2px solid red", + ); + break; + case "toast": + modification = new ToastModification( + doc, + mod.toastMessage || "Notification", + mod.duration || 3000, + ); + break; + case "addComponent": + modification = new AdjacentHTMLModification( + doc, + element, + "beforeend", + mod.componentHtml || "", + ); + break; + default: + modification = new NoopModification(doc, mod.action); + break; + } + + modification.apply(); + return modification; } export function matchesSelector(element: Element, mod: Modification): boolean { - if (mod.selector) { - return element.matches(mod.selector); - } else if (mod.xpath) { - const xpathResult = document.evaluate(mod.xpath, document, null, XPathResult.BOOLEAN_TYPE, null); - return xpathResult.booleanValue; - } - - return false; + if (mod.selector) { + return element.matches(mod.selector); + } else if (mod.xpath) { + const xpathResult = document.evaluate( + mod.xpath, + document, + null, + XPathResult.BOOLEAN_TYPE, + null, + ); + return xpathResult.booleanValue; + } + + return false; } diff --git a/packages/reactor/modifications/adjacentHTML.ts b/packages/reactor/modifications/adjacentHTML.ts index 15f2d591..465951e0 100644 --- a/packages/reactor/modifications/adjacentHTML.ts +++ b/packages/reactor/modifications/adjacentHTML.ts @@ -1,38 +1,38 @@ import { AppliableModification } from "../interfaces"; export class AdjacentHTMLModification extends AppliableModification { - elementId: string; - position: InsertPosition; - newValue: string; + elementId: string; + position: InsertPosition; + newValue: string; - constructor( - doc: Document, - element: Element, - position: InsertPosition, - newValue: string, - ) { - super(doc); - - this.position = position; - this.newValue = newValue; - - this.elementId = this.addModifiedElement(element); - } + constructor( + doc: Document, + element: Element, + position: InsertPosition, + newValue: string, + ) { + super(doc); - apply(): void { - for (const element of this.getModifiedElements()) { - const oldValue = element.outerHTML; - this.setElementState(this.getMocksiId(element), oldValue); - element.insertAdjacentHTML(this.position, this.newValue); - } - } + this.position = position; + this.newValue = newValue; - unapply(): void { - for (const element of this.getModifiedElements()) { - const oldValue = this.getElementState(this.getMocksiId(element)); - if (oldValue) { - element.outerHTML = oldValue; - } - } - } + this.elementId = this.addModifiedElement(element); + } + + apply(): void { + for (const element of this.getModifiedElements()) { + const oldValue = element.outerHTML; + this.setElementState(this.getMocksiId(element), oldValue); + element.insertAdjacentHTML(this.position, this.newValue); + } + } + + unapply(): void { + for (const element of this.getModifiedElements()) { + const oldValue = this.getElementState(this.getMocksiId(element)); + if (oldValue) { + element.outerHTML = oldValue; + } + } + } } diff --git a/packages/reactor/modifications/highlight.ts b/packages/reactor/modifications/highlight.ts index 7c0708b4..88324c81 100644 --- a/packages/reactor/modifications/highlight.ts +++ b/packages/reactor/modifications/highlight.ts @@ -2,32 +2,32 @@ import { AppliableModification } from "../interfaces"; import * as cssSelector from "css-selector-generator"; export class HighlightModification extends AppliableModification { - elementSelector: string; - highlightStyle: string; - prevBorder: string; + elementSelector: string; + highlightStyle: string; + prevBorder: string; - constructor(doc: Document, element: Element, highlightStyle: string) { - super(doc); - this.elementSelector = cssSelector.getCssSelector(element); - this.highlightStyle = highlightStyle; - this.prevBorder = ""; + constructor(doc: Document, element: Element, highlightStyle: string) { + super(doc); + this.elementSelector = cssSelector.getCssSelector(element); + this.highlightStyle = highlightStyle; + this.prevBorder = ""; - if (element instanceof HTMLElement) { - this.prevBorder = element.style.border; - } - } + if (element instanceof HTMLElement) { + this.prevBorder = element.style.border; + } + } - apply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (element && element instanceof HTMLElement) { - element.style.border = this.highlightStyle; - } - } + apply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (element && element instanceof HTMLElement) { + element.style.border = this.highlightStyle; + } + } - unapply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (element && element instanceof HTMLElement) { - element.style.border = this.prevBorder; - } - } + unapply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (element && element instanceof HTMLElement) { + element.style.border = this.prevBorder; + } + } } diff --git a/packages/reactor/modifications/noop.ts b/packages/reactor/modifications/noop.ts index 6c142fec..da7ee7e3 100644 --- a/packages/reactor/modifications/noop.ts +++ b/packages/reactor/modifications/noop.ts @@ -1,16 +1,16 @@ import { AppliableModification } from "../interfaces"; export class NoopModification extends AppliableModification { - action: string; + action: string; - constructor(doc: Document, action: string) { - super(doc); - this.action = action; - } + constructor(doc: Document, action: string) { + super(doc); + this.action = action; + } - apply(): void { - console.warn(`Unknown action: ${this.action}`); - } + apply(): void { + console.warn(`Unknown action: ${this.action}`); + } - unapply(): void {} + unapply(): void {} } diff --git a/packages/reactor/modifications/remove.ts b/packages/reactor/modifications/remove.ts index a6682368..48214158 100644 --- a/packages/reactor/modifications/remove.ts +++ b/packages/reactor/modifications/remove.ts @@ -2,47 +2,47 @@ import { AppliableModification } from "../interfaces"; import * as cssSelector from "css-selector-generator"; export class RemoveModification extends AppliableModification { - element: Element; - parentSelector: string | null; - nextSiblingSelector: string | null = null; + element: Element; + parentSelector: string | null; + nextSiblingSelector: string | null = null; - constructor(doc: Document, element: Element) { - super(doc); - this.element = element; - this.parentSelector = element.parentElement - ? cssSelector.getCssSelector(element.parentElement) - : null; - } + constructor(doc: Document, element: Element) { + super(doc); + this.element = element; + this.parentSelector = element.parentElement + ? cssSelector.getCssSelector(element.parentElement) + : null; + } - apply(): void { - // get the element's next sibling - const nextSibling = this.element.nextElementSibling; - this.element.remove(); - // now get the selector for the sibling after the element was - // removed - this.nextSiblingSelector = nextSibling - ? cssSelector.getCssSelector(nextSibling) - : null; - } + apply(): void { + // get the element's next sibling + const nextSibling = this.element.nextElementSibling; + this.element.remove(); + // now get the selector for the sibling after the element was + // removed + this.nextSiblingSelector = nextSibling + ? cssSelector.getCssSelector(nextSibling) + : null; + } - unapply(): void { - let parent: Element | null = null; - if (this.parentSelector) { - parent = this.doc.querySelector(this.parentSelector); - } - if (!parent) { - return; - } + unapply(): void { + let parent: Element | null = null; + if (this.parentSelector) { + parent = this.doc.querySelector(this.parentSelector); + } + if (!parent) { + return; + } - let nextSibling: Element | null = null; - if (this.nextSiblingSelector) { - nextSibling = this.doc.querySelector(this.nextSiblingSelector); - } + let nextSibling: Element | null = null; + if (this.nextSiblingSelector) { + nextSibling = this.doc.querySelector(this.nextSiblingSelector); + } - if (nextSibling) { - parent.insertBefore(this.element, nextSibling); - } else { - parent.appendChild(this.element); - } - } + if (nextSibling) { + parent.insertBefore(this.element, nextSibling); + } else { + parent.appendChild(this.element); + } + } } diff --git a/packages/reactor/modifications/replace.ts b/packages/reactor/modifications/replace.ts index ff7f6f36..4e8202d8 100644 --- a/packages/reactor/modifications/replace.ts +++ b/packages/reactor/modifications/replace.ts @@ -2,29 +2,29 @@ import { AppliableModification } from "../interfaces"; import * as cssSelector from "css-selector-generator"; export class ReplaceModification extends AppliableModification { - elementSelector: string; - oldValue: string; - newValue: string; + elementSelector: string; + oldValue: string; + newValue: string; - constructor(doc: Document, element: Element, newValue: string) { - super(doc); - this.elementSelector = cssSelector.getCssSelector(element); - this.newValue = newValue; - this.oldValue = element.innerHTML; - } + constructor(doc: Document, element: Element, newValue: string) { + super(doc); + this.elementSelector = cssSelector.getCssSelector(element); + this.newValue = newValue; + this.oldValue = element.innerHTML; + } - apply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (element) { - element.innerHTML = this.newValue; - this.addHighlightNode(element); - } - } + apply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (element) { + element.innerHTML = this.newValue; + this.addHighlightNode(element); + } + } - unapply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (element) { - element.innerHTML = this.oldValue; - } - } + unapply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (element) { + element.innerHTML = this.oldValue; + } + } } diff --git a/packages/reactor/modifications/replaceAll.ts b/packages/reactor/modifications/replaceAll.ts index f3c4aa59..57c19ce2 100644 --- a/packages/reactor/modifications/replaceAll.ts +++ b/packages/reactor/modifications/replaceAll.ts @@ -1,279 +1,286 @@ import { AppliableModification } from "../interfaces"; export class ReplaceAllModification extends AppliableModification { - element: Element; - content: string; - changes: TreeChange[] = []; - observer: MutationObserver; - - constructor(doc: Document, element: Element, content: string) { - super(doc); - this.element = element; - this.content = content; - - this.observer = new MutationObserver(this.handleMutation.bind(this)); - } - - apply(): void { - // mark the element as modified - this.addModifiedElement(this.element); - - this.changes = walkTree( - this.element, - checkText(this.content), - replaceText(this.content, - this.addModifiedElement.bind(this), - this.addHighlightNode.bind(this)), - ); - - this.observer.observe(this.element, { childList: true, subtree: true }); - } - - unapply(): void { - this.observer.disconnect(); - - const reverseChanges = [...this.changes].reverse(); - for (const change of reverseChanges) { - const parentElement = this.getModifiedElement(change.parentMocksiId); - if (!parentElement) { - continue; - } - - const nextSibling = - parentElement.childNodes[change.replaceStart + change.replaceCount] || - null; - for (let i = change.replaceCount; i > 0; i--) { - const removeNode = - parentElement.childNodes[change.replaceStart + i - 1]; - if (removeNode) { - removeNode.remove(); - } - } - - const newTextNode = this.doc.createTextNode(change.origText); - parentElement.insertBefore(newTextNode, nextSibling); - } - } - - handleMutation(mutations: MutationRecord[]) { - this.observer.disconnect(); - - for (const mutation of mutations) { - if (mutation.type === "childList") { - for (const added of mutation.addedNodes) { - const changes = walkTree( - added, - checkText(this.content), - replaceText(this.content, - this.addModifiedElement.bind(this), - this.addHighlightNode.bind(this)), - ); - - console.debug(`Added: ${added.nodeName} changes: ${changes.length}`); - - this.changes = this.changes.concat(changes); - } - } - } - - this.observer.observe(this.element, { childList: true, subtree: true }); - } - - modifiedElementRemoved(element: Element, mocksiId: string): boolean { - const noState = super.modifiedElementRemoved(element, mocksiId); - - // remove any changes that were made to this element - this.changes = this.changes.filter((c) => c.parentMocksiId !== mocksiId); - - // if all changed nodes have been removed (including the element itself), - // it is safe to remove this modification - return noState && this.changes.length === 0; - } + element: Element; + content: string; + changes: TreeChange[] = []; + observer: MutationObserver; + + constructor(doc: Document, element: Element, content: string) { + super(doc); + this.element = element; + this.content = content; + + this.observer = new MutationObserver(this.handleMutation.bind(this)); + } + + apply(): void { + // mark the element as modified + this.addModifiedElement(this.element); + + this.changes = walkTree( + this.element, + checkText(this.content), + replaceText( + this.content, + this.addModifiedElement.bind(this), + this.addHighlightNode.bind(this), + ), + ); + + this.observer.observe(this.element, { childList: true, subtree: true }); + } + + unapply(): void { + this.observer.disconnect(); + + const reverseChanges = [...this.changes].reverse(); + for (const change of reverseChanges) { + const parentElement = this.getModifiedElement(change.parentMocksiId); + if (!parentElement) { + continue; + } + + const nextSibling = + parentElement.childNodes[change.replaceStart + change.replaceCount] || + null; + for (let i = change.replaceCount; i > 0; i--) { + const removeNode = + parentElement.childNodes[change.replaceStart + i - 1]; + if (removeNode) { + removeNode.remove(); + } + } + + const newTextNode = this.doc.createTextNode(change.origText); + parentElement.insertBefore(newTextNode, nextSibling); + } + } + + handleMutation(mutations: MutationRecord[]) { + this.observer.disconnect(); + + for (const mutation of mutations) { + if (mutation.type === "childList") { + for (const added of mutation.addedNodes) { + const changes = walkTree( + added, + checkText(this.content), + replaceText( + this.content, + this.addModifiedElement.bind(this), + this.addHighlightNode.bind(this), + ), + ); + + console.debug(`Added: ${added.nodeName} changes: ${changes.length}`); + + this.changes = this.changes.concat(changes); + } + } + } + + this.observer.observe(this.element, { childList: true, subtree: true }); + } + + override modifiedElementRemoved(element: Element, mocksiId: string): boolean { + const noState = super.modifiedElementRemoved(element, mocksiId); + + // remove any changes that were made to this element + this.changes = this.changes.filter((c) => c.parentMocksiId !== mocksiId); + + // if all changed nodes have been removed (including the element itself), + // it is safe to remove this modification + return noState && this.changes.length === 0; + } } type TreeChange = { - parentMocksiId: string; - origText: string; - replaceStart: number; - replaceCount: number; + origText: string; + parentMocksiId: string; + replaceCount: number; + replaceStart: number; }; function walkTree( - rootElement: Node, - checker: (textNode: Node) => boolean, - changer: (textNode: Node) => TreeChange | null, + rootElement: Node, + checker: (textNode: Node) => boolean, + changer: (textNode: Node) => null | TreeChange, ): TreeChange[] { - const changeNodes: Node[] = []; - const changes: TreeChange[] = []; - - const treeWalker = document.createTreeWalker( - rootElement, - NodeFilter.SHOW_TEXT, - (node) => { - if ( - node.parentElement instanceof HTMLScriptElement || - node.parentElement instanceof HTMLStyleElement - ) { - return NodeFilter.FILTER_REJECT; - } - return NodeFilter.FILTER_ACCEPT; - }, - ); - let textNode: Node; - do { - textNode = treeWalker.currentNode; - if (textNode.nodeValue === null || !textNode?.nodeValue?.trim()) { - continue; - } - - if (checker(textNode)) { - changeNodes.push(textNode); - } - } while (treeWalker.nextNode()); - - for (const node of changeNodes) { - const change = changer(node); - if (change) { - changes.push(change); - } - } - - return changes; + const changeNodes: Node[] = []; + const changes: TreeChange[] = []; + + const treeWalker = document.createTreeWalker( + rootElement, + NodeFilter.SHOW_TEXT, + (node) => { + if ( + node.parentElement instanceof HTMLScriptElement || + node.parentElement instanceof HTMLStyleElement + ) { + return NodeFilter.FILTER_REJECT; + } + return NodeFilter.FILTER_ACCEPT; + }, + ); + let textNode: Node; + do { + textNode = treeWalker.currentNode; + if (textNode.nodeValue === null || !textNode?.nodeValue?.trim()) { + continue; + } + + if (checker(textNode)) { + changeNodes.push(textNode); + } + } while (treeWalker.nextNode()); + + for (const node of changeNodes) { + const change = changer(node); + if (change) { + changes.push(change); + } + } + + return changes; } function checkText(pattern: string): (node: Node) => boolean { - const { patternRegexp } = toRegExpPattern(pattern); + const { patternRegexp } = toRegExpPattern(pattern); - return (node: Node) => { - if (!node.textContent || !node.nodeValue) { - return false; - } + return (node: Node) => { + if (!node.textContent || !node.nodeValue) { + return false; + } - patternRegexp.lastIndex = 0; - return patternRegexp.test(node.nodeValue || ""); - }; + patternRegexp.lastIndex = 0; + return patternRegexp.test(node.nodeValue || ""); + }; } function replaceText( - pattern: string, - addModifiedElement: (element: Element) => string, - addHighlightNode: (node: Node) => void, -): (node: Node) => TreeChange | null { - const { patternRegexp, replacement, flags } = toRegExpPattern(pattern); - - return (node: Node) => { - let split = node.nodeValue?.split(patternRegexp) || []; - split = split.map((part, index) => { - if (index % 2 === 0) { - return part; - } - return replaceFirstLetterCaseAndPlural(replacement, flags)(part); - }); - - const parentElement = node.parentElement; - if (!parentElement) { - return null; - } - const parentMocksiId = addModifiedElement(parentElement); - - let replaceStart = 0; - const nextSibling = node.nextSibling; - const prevSibling = node.previousSibling; - if (prevSibling || nextSibling) { - for (let i = 0; i < parentElement.childNodes.length; i++) { - if (parentElement.childNodes[i] === prevSibling) { - replaceStart = i + 1; - break; - } else if (parentElement.childNodes[i] === nextSibling) { - replaceStart = i - 1; - break; - } - } - } - - parentElement.removeChild(node); - - for (let i = 0; i < split.length; i++) { - if (typeof split[i] !== "undefined") { - const textNode = document.createTextNode(split[i] || ""); - parentElement.insertBefore(textNode, nextSibling); - - if (i % 2 !== 0) { - addHighlightNode(textNode); - } - } - } - - return { - parentMocksiId: parentMocksiId, - origText: node.nodeValue || "", - replaceStart: replaceStart, - replaceCount: split.length, - }; - }; + pattern: string, + addModifiedElement: (element: Element) => string, + addHighlightNode: (node: Node) => void, +): (node: Node) => null | TreeChange { + const { flags, patternRegexp, replacement } = toRegExpPattern(pattern); + + return (node: Node) => { + let split = node.nodeValue?.split(patternRegexp) || []; + split = split.map((part, index) => { + if (index % 2 === 0) { + return part; + } + return replaceFirstLetterCaseAndPlural(replacement, flags)(part); + }); + + const parentElement = node.parentElement; + if (!parentElement) { + return null; + } + const parentMocksiId = addModifiedElement(parentElement); + + let replaceStart = 0; + const nextSibling = node.nextSibling; + const prevSibling = node.previousSibling; + if (prevSibling || nextSibling) { + for (let i = 0; i < parentElement.childNodes.length; i++) { + if (parentElement.childNodes[i] === prevSibling) { + replaceStart = i + 1; + break; + } else if (parentElement.childNodes[i] === nextSibling) { + replaceStart = i - 1; + break; + } + } + } + + parentElement.removeChild(node); + + for (let i = 0; i < split.length; i++) { + if (typeof split[i] !== "undefined") { + const textNode = document.createTextNode(split[i] || ""); + parentElement.insertBefore(textNode, nextSibling); + + if (i % 2 !== 0) { + addHighlightNode(textNode); + } + } + } + + return { + origText: node.nodeValue || "", + parentMocksiId: parentMocksiId, + replaceCount: split.length, + replaceStart: replaceStart, + }; + }; } -function replaceFirstLetterCaseAndPlural(value: string, flags: Partial> = {}) { - return (match: string) => { - let out = value; - - // change the case if the first letter of the match is uppercase - if (match[0]?.toLowerCase() !== match[0]?.toUpperCase()) { - if (match[0] === match[0]?.toUpperCase()) { - out = out.charAt(0).toUpperCase() + out.slice(1); - } - } - - // if the match is plural, add an s - if ((flags[PatternFlag.Plurals] ?? false) && match.endsWith("s")) { - out = `${out}s`; - } - - return out; - }; +function replaceFirstLetterCaseAndPlural( + value: string, + flags: Partial> = {}, +) { + return (match: string) => { + let out = value; + + // change the case if the first letter of the match is uppercase + if (match[0]?.toLowerCase() !== match[0]?.toUpperCase()) { + if (match[0] === match[0]?.toUpperCase()) { + out = out.charAt(0).toUpperCase() + out.slice(1); + } + } + + // if the match is plural, add an s + if ((flags[PatternFlag.Plurals] ?? false) && match.endsWith("s")) { + out = `${out}s`; + } + + return out; + }; } enum PatternFlag { - CaseInsensitive = "i", - WordBoundary = "w", - Plurals = "p", + CaseInsensitive = "i", + WordBoundary = "w", + Plurals = "p", } // Take pattern in the form of /pattern/replacement/ and return {patternRegexp, replacement} function toRegExpPattern(pattern: string): { - patternRegexp: RegExp; - replacement: string; - flags: Partial>; + flags: Partial>; + patternRegexp: RegExp; + replacement: string; } { - const match = /\/(.+)\/(.+)\/(.*)/.exec(pattern); - if (!match || match.length < 3 || !match[1] || !match[2]) { - throw new Error(`Invalid pattern: ${pattern}`); - } - - let reFlags = "g"; - let rePattern = match[1]; - const flags = match[3]; - - const patternFlags: Partial> = {}; - - if (flags?.includes('p')) { - rePattern += "s?"; - patternFlags[PatternFlag.Plurals] = true; - } - - if (flags?.includes('w')) { - rePattern = `\\b${rePattern}\\b`; - patternFlags[PatternFlag.WordBoundary] = true; - } - - if (flags?.includes('i')) { - reFlags += "i"; - patternFlags[PatternFlag.CaseInsensitive] = true; - } - - return { - patternRegexp: new RegExp(`(${rePattern})`, reFlags), - replacement: match[2], - flags: patternFlags, - }; + const match = /\/(.+)\/(.+)\/(.*)/.exec(pattern); + if (!match || match.length < 3 || !match[1] || !match[2]) { + throw new Error(`Invalid pattern: ${pattern}`); + } + + let reFlags = "g"; + let rePattern = match[1]; + const flags = match[3]; + + const patternFlags: Partial> = {}; + + if (flags?.includes("p")) { + rePattern += "s?"; + patternFlags[PatternFlag.Plurals] = true; + } + + if (flags?.includes("w")) { + rePattern = `\\b${rePattern}\\b`; + patternFlags[PatternFlag.WordBoundary] = true; + } + + if (flags?.includes("i")) { + reFlags += "i"; + patternFlags[PatternFlag.CaseInsensitive] = true; + } + + return { + flags: patternFlags, + patternRegexp: new RegExp(`(${rePattern})`, reFlags), + replacement: match[2], + }; } diff --git a/packages/reactor/modifications/swapImage.ts b/packages/reactor/modifications/swapImage.ts index 713a3742..f6518c0e 100644 --- a/packages/reactor/modifications/swapImage.ts +++ b/packages/reactor/modifications/swapImage.ts @@ -2,34 +2,34 @@ import { AppliableModification } from "../interfaces"; import * as cssSelector from "css-selector-generator"; export class SwapImageModification extends AppliableModification { - elementSelector: string; - imageUrl: string; - previousUrl: string | null; + elementSelector: string; + imageUrl: string; + previousUrl: string | null; - constructor(doc: Document, element: Element, imageUrl: string) { - super(doc); - this.elementSelector = cssSelector.getCssSelector(element); - this.imageUrl = imageUrl; + constructor(doc: Document, element: Element, imageUrl: string) { + super(doc); + this.elementSelector = cssSelector.getCssSelector(element); + this.imageUrl = imageUrl; - if (element instanceof HTMLImageElement) { - this.previousUrl = element.getAttribute("src"); - } else { - this.previousUrl = null; - } - } + if (element instanceof HTMLImageElement) { + this.previousUrl = element.getAttribute("src"); + } else { + this.previousUrl = null; + } + } - apply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (element && element instanceof HTMLImageElement) { - element.src = this.imageUrl; - this.addHighlightNode(element); - } - } + apply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (element && element instanceof HTMLImageElement) { + element.src = this.imageUrl; + this.addHighlightNode(element); + } + } - unapply(): void { - const element = this.doc.querySelector(this.elementSelector); - if (this.previousUrl && element && element instanceof HTMLImageElement) { - element.setAttribute("src", this.previousUrl); - } - } + unapply(): void { + const element = this.doc.querySelector(this.elementSelector); + if (this.previousUrl && element && element instanceof HTMLImageElement) { + element.setAttribute("src", this.previousUrl); + } + } } diff --git a/packages/reactor/modifications/toast.ts b/packages/reactor/modifications/toast.ts index 58702b80..1c9a7eea 100644 --- a/packages/reactor/modifications/toast.ts +++ b/packages/reactor/modifications/toast.ts @@ -1,35 +1,35 @@ import { AppliableModification } from "../interfaces"; export class ToastModification extends AppliableModification { - message: string; - duration: number; + message: string; + duration: number; - constructor(doc: Document, message: string, duration: number) { - super(doc); - this.message = message; - this.duration = duration; - } + constructor(doc: Document, message: string, duration: number) { + super(doc); + this.message = message; + this.duration = duration; + } - apply(): void { - createToast(this.message, this.doc, this.duration); - } + apply(): void { + createToast(this.message, this.doc, this.duration); + } - unapply(): void { - // can't undo - } + unapply(): void { + // can't undo + } } export function createToast( - message: string, - doc: Document, - duration = 3000, + message: string, + doc: Document, + duration = 3000, ): void { - const toast = doc.createElement("div"); - toast.className = "fixed bottom-4 right-4 bg-blue-500 text-white p-4 rounded"; - toast.textContent = message; - doc.body.appendChild(toast); + const toast = doc.createElement("div"); + toast.className = "fixed bottom-4 right-4 bg-blue-500 text-white p-4 rounded"; + toast.textContent = message; + doc.body.appendChild(toast); - setTimeout(() => { - toast.remove(); - }, duration); + setTimeout(() => { + toast.remove(); + }, duration); } diff --git a/packages/reactor/mutationObserver.ts b/packages/reactor/mutationObserver.ts index e3373cf5..a6124446 100644 --- a/packages/reactor/mutationObserver.ts +++ b/packages/reactor/mutationObserver.ts @@ -3,123 +3,137 @@ import { AppliedModificationsImpl } from "./modifications"; import { applyModification, matchesSelector } from "./modifications"; export class ReactorMutationObserver { - private reactor: Reactor; - private observer: MutationObserver | undefined; + private reactor: Reactor; + private observer: MutationObserver | undefined; - constructor(reactor: Reactor) { - this.reactor = reactor; - } + constructor(reactor: Reactor) { + this.reactor = reactor; + } - attach(root: Document) { - this.observer = new MutationObserver(this.handleMutations.bind(this)); - this.observer.observe(root, { childList: true, subtree: true }); - } + attach(root: Document) { + this.observer = new MutationObserver(this.handleMutations.bind(this)); + this.observer.observe(root, { childList: true, subtree: true }); + } - detach() { - this.observer?.disconnect(); - } + detach() { + this.observer?.disconnect(); + } - handleMutations(mutations: MutationRecord[]) { - for (const mutation of mutations) { - this.handleMutation(mutation); - } - } + handleMutations(mutations: MutationRecord[]) { + for (const mutation of mutations) { + this.handleMutation(mutation); + } + } - handleMutation(mutation: MutationRecord) { - console.debug(`Mutation: ${mutation.type} added: ${mutation.addedNodes.length} removed: ${mutation.removedNodes.length}`); - for (const node of mutation.addedNodes) { - console.debug(` Added: ${printNode(node)}`); - if (node instanceof Element) { - this.walkAddedElements(node); - } - } - for (const node of mutation.removedNodes) { - console.debug(` Removed: ${printNode(node)}`); - if (node instanceof Element) { - this.walkRemovedElements(node); - } - } - } + handleMutation(mutation: MutationRecord) { + console.debug( + `Mutation: ${mutation.type} added: ${mutation.addedNodes.length} removed: ${mutation.removedNodes.length}`, + ); + for (const node of mutation.addedNodes) { + console.debug(` Added: ${printNode(node)}`); + if (node instanceof Element) { + this.walkAddedElements(node); + } + } + for (const node of mutation.removedNodes) { + console.debug(` Removed: ${printNode(node)}`); + if (node instanceof Element) { + this.walkRemovedElements(node); + } + } + } - walkAddedElements(element: Element) { - const treeWalker = document.createTreeWalker( - element, - NodeFilter.SHOW_ELEMENT, - null - ); - - do { - const node = treeWalker.currentNode; - if (node instanceof Element) { - const applied = Array.from(this.reactor.getAppliedModifications()) as AppliedModificationsImpl[]; - for (const modification of applied) { - const reqs = modification.modificationRequest; - for (const req of reqs.modifications) { - if (this.reactor.doc && matchesSelector(node, req)) { - // apply modificaiton, but don't wait for result in mutation observer - applyModification(node, req, this.reactor.doc).then((appliedModification) => { - modification.modifications.push(appliedModification); - }); - } - } - } - } - } while (treeWalker.nextNode()); - } + walkAddedElements(element: Element) { + const treeWalker = document.createTreeWalker( + element, + NodeFilter.SHOW_ELEMENT, + null, + ); - walkRemovedElements(element: Element) { - const treeWalker = document.createTreeWalker( - element, - NodeFilter.SHOW_ELEMENT, - null - ); - - do { - const node = treeWalker.currentNode; - if (node instanceof Element) { - const mocksiId = node.getAttribute("mocksi-id"); - if (mocksiId) { - for (const attributes of node.attributes) { - if (attributes.name.startsWith("mocksi-modified-")) { - const modificationId = attributes.name.substring("mocksi-modified-".length); - console.debug(` Modified by: ${modificationId}`); - this.removeModifiedElement(node, mocksiId, modificationId); - } - } - } - } - } while (treeWalker.nextNode()); - } + do { + const node = treeWalker.currentNode; + if (node instanceof Element) { + const applied = Array.from( + this.reactor.getAppliedModifications(), + ) as AppliedModificationsImpl[]; + for (const modification of applied) { + const reqs = modification.modificationRequest; + for (const req of reqs.modifications) { + if (this.reactor.doc && matchesSelector(node, req)) { + // apply modificaiton, but don't wait for result in mutation observer + applyModification(node, req, this.reactor.doc).then( + (appliedModification) => { + modification.modifications.push(appliedModification); + }, + ); + } + } + } + } + } while (treeWalker.nextNode()); + } - removeModifiedElement(element: Element, elementId: string, modificationId: string) { - const applied = Array.from(this.reactor.getAppliedModifications()) as AppliedModificationsImpl[]; - for (const modification of applied) { - for (const [index, mod] of modification.modifications.entries()) { - if (mod.uuid === modificationId) { - const remove = mod.modifiedElementRemoved(element, elementId); - if (remove) { - modification.modifications.splice(index, 1); - } - return; - } - } - } - } + walkRemovedElements(element: Element) { + const treeWalker = document.createTreeWalker( + element, + NodeFilter.SHOW_ELEMENT, + null, + ); + + do { + const node = treeWalker.currentNode; + if (node instanceof Element) { + const mocksiId = node.getAttribute("mocksi-id"); + if (mocksiId) { + for (const attributes of node.attributes) { + if (attributes.name.startsWith("mocksi-modified-")) { + const modificationId = attributes.name.substring( + "mocksi-modified-".length, + ); + console.debug(` Modified by: ${modificationId}`); + this.removeModifiedElement(node, mocksiId, modificationId); + } + } + } + } + } while (treeWalker.nextNode()); + } + + removeModifiedElement( + element: Element, + elementId: string, + modificationId: string, + ) { + const applied = Array.from( + this.reactor.getAppliedModifications(), + ) as AppliedModificationsImpl[]; + for (const modification of applied) { + for (const [index, mod] of modification.modifications.entries()) { + if (mod.uuid === modificationId) { + const remove = mod.modifiedElementRemoved(element, elementId); + if (remove) { + modification.modifications.splice(index, 1); + } + return; + } + } + } + } } const printNode = (node: Node) => { - let out = node.nodeName; + let out = node.nodeName; - if (node instanceof Text) { - out += `: ${node.nodeValue}`; - } + if (node instanceof Text) { + out += `: ${node.nodeValue}`; + } - if (node instanceof Element) { - const mocksiId = node.getAttribute("mocksi-id"); - if (mocksiId) { - out += ` (mocksi-id: ${mocksiId})`; - } - } + if (node instanceof Element) { + const mocksiId = node.getAttribute("mocksi-id"); + if (mocksiId) { + out += ` (mocksi-id: ${mocksiId})`; + } + } - return out; -} + return out; +}; diff --git a/packages/reactor/package.json b/packages/reactor/package.json index 7b8d0bc7..72480605 100644 --- a/packages/reactor/package.json +++ b/packages/reactor/package.json @@ -1,35 +1,31 @@ { - "name": "@repo/reactor", - "version": "1.0.0", - "description": "Library for modifying HTML content based on specific user commands", - "private": true, - "main": "dist/index.js", - "type": "module", - "types": "dist/index.d.ts", - "scripts": { - "prepare": "tsc", - "build": "tsc", - "test": "pnpm exec vitest", - "coverage": "pnpm exec vitest run --coverage", - "lint": "biome ci .", - "format": "biome check --apply . && biome lint --apply ." - }, - "devDependencies": { - "@biomejs/biome": "1.7.2", - "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@types/eslint": "^8.56.1", - "@types/jsdom": "^21.1.7", - "@types/node": "^20.10.6", - "@types/uuid": "^9.0.8", - "@vitest/coverage-v8": "^2.0.1", - "eslint": "^8.56.0", - "jsdom": "^24.1.0", - "typescript": "^5.3.3", - "vitest": "^2.0.1" - }, - "dependencies": { - "css-selector-generator": "^3.6.8", - "uuid": "^9.0.1" - } + "dependencies": { + "css-selector-generator": "^3.6.8", + "uuid": "^9.0.1" + }, + "description": "Library for modifying HTML content based on specific user commands", + "devDependencies": { + "@repo/config-eslint": "workspace:*", + "@repo/config-prettier": "workspace:*", + "@repo/config-typescript": "workspace:*", + "@vitest/coverage-v8": "^2.0.1", + "eslint": "^8.56.0", + "jsdom": "^24.1.0", + "typescript": "^5.3.3", + "vitest": "^2.0.1" + }, + "main": "dist/index.js", + "name": "@repo/reactor", + "private": true, + "scripts": { + "build": "tsc", + "coverage": "pnpm exec vitest run --coverage", + "format": "prettier --write \"**/*.{tsx,ts}\"", + "lint": "eslint --fix", + "prepare": "tsc", + "test": "pnpm exec vitest" + }, + "type": "module", + "types": "dist/index.d.ts", + "version": "1.0.0" } diff --git a/packages/reactor/reactor.ts b/packages/reactor/reactor.ts index b26661ff..9d0ecc5c 100644 --- a/packages/reactor/reactor.ts +++ b/packages/reactor/reactor.ts @@ -164,7 +164,7 @@ class Reactor { ); out.push(applied); this.appliedModifications.push(applied); - + // re-enable the mutation listener this.mutationObserver.attach(this.doc); } @@ -211,4 +211,4 @@ class Reactor { } } -export default Reactor; \ No newline at end of file +export default Reactor; diff --git a/packages/reactor/tests/index.test.ts b/packages/reactor/tests/index.test.ts index 030a9955..81d107d2 100644 --- a/packages/reactor/tests/index.test.ts +++ b/packages/reactor/tests/index.test.ts @@ -4,48 +4,48 @@ import type { ModificationRequest } from "../interfaces"; import { modifyDom, modifyHtml } from "../main"; describe("modifyHtml should perform basic HTML modification", {}, () => { - it("changes text content, swaps image sources, highlights elements, creates toast notifications, adds DaisyUI components, handles multiple modifications, and gracefully handles missing elements", async () => { - const html = ``; - const userRequest = JSON.stringify({ - description: "Swap the profile picture.", - modifications: [ - { - selector: "#profile-pic", - action: "swapImage", - imageUrl: "santiago.jpg", - }, - ], - }); + it("changes text content, swaps image sources, highlights elements, creates toast notifications, adds DaisyUI components, handles multiple modifications, and gracefully handles missing elements", async () => { + const html = ``; + const userRequest = JSON.stringify({ + description: "Swap the profile picture.", + modifications: [ + { + selector: "#profile-pic", + action: "swapImage", + imageUrl: "santiago.jpg", + }, + ], + }); - const result = await modifyHtml(html, userRequest); - expect(result).toContain('src="santiago.jpg"'); - }); + const result = await modifyHtml(html, userRequest); + expect(result).toContain('src="santiago.jpg"'); + }); - it("modifies the DOM directly", async () => { - const htmlString = `

Mocksi test

Some text content here
`; - const parser = new DOMParser(); - const doc = parser.parseFromString(htmlString, "text/html"); + it("modifies the DOM directly", async () => { + const htmlString = `

Mocksi test

Some text content here
`; + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, "text/html"); - const modificationRequest: ModificationRequest = { - description: "Change Mocksi to Rocksi.", - modifications: [ - { - xpath: "//html/body/h1", - action: "replace", - content: "Rocksi", - }, - ], - }; + const modificationRequest: ModificationRequest = { + description: "Change Mocksi to Rocksi.", + modifications: [ + { + xpath: "//html/body/h1", + action: "replace", + content: "Rocksi", + }, + ], + }; - await modifyDom(doc, modificationRequest); - const result = document.evaluate( - "//html/body/h1", - doc, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ).singleNodeValue; - expect(result).not.toBeNull(); - expect(result?.textContent).toBe("Rocksi"); - }); + await modifyDom(doc, modificationRequest); + const result = document.evaluate( + "//html/body/h1", + doc, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null, + ).singleNodeValue; + expect(result).not.toBeNull(); + expect(result?.textContent).toBe("Rocksi"); + }); }); diff --git a/packages/reactor/tests/main.test.ts b/packages/reactor/tests/main.test.ts index 33e93205..c8bf5aff 100644 --- a/packages/reactor/tests/main.test.ts +++ b/packages/reactor/tests/main.test.ts @@ -11,139 +11,139 @@ global.document = dom.window.document; global.window = dom.window as any; describe("modifyHtml", () => { - it("should replace text content", async () => { - const html = `
Eliza Hart
`; - const userRequest = JSON.stringify({ - description: "Change the name 'Eliza' to 'Santiago'.", - modifications: [ - { - selector: "#user-info", - action: "replace", - content: "Santiago Hart", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).toContain("Santiago Hart"); - }); - - it("Should replace all with a regular expression", async () => { - const htmlString = `

Train test

Some text content here about a train

About the train

Trains are really cool. I use my train every day.
`; - const userRequest = JSON.stringify({ - description: "Change train to brain", - modifications: [ - { - xpath: "//html/body/div", - action: "replaceAll", - content: "/train/brain/i", - }, - ], - }); - const result = await modifyHtml(htmlString, userRequest); - - const parser = new DOMParser(); - const doc = parser.parseFromString(result, "text/html"); - - const unmodified = document.evaluate( - "//html/body/h1/text()[1]", - doc, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ).singleNodeValue; - expect(unmodified?.textContent).toBe("Train test"); - - const modified = document.evaluate( - "//html/body/div/div/text()[1]", - doc, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ).singleNodeValue; - expect(modified?.textContent).toBe("Some text content here about a brain"); - - const modified2 = document.evaluate( - "//html/body/div/h2/text()[1]", - doc, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ).singleNodeValue; - expect(modified2?.textContent).toBe("About the brain"); - - const modified3 = document.evaluate( - "//html/body/div/div[2]/text()[1]", - doc, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null, - ).singleNodeValue; - expect(modified3?.textContent).toBe( - "Brains are really cool. I use my brain every day.", - ); - }); - - it("should swap image source", async () => { - const html = ``; - const userRequest = JSON.stringify({ - description: "Swap the profile picture.", - modifications: [ - { - selector: "#profile-pic", - action: "swapImage", - imageUrl: "santiago.jpg", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).toContain('src="santiago.jpg"'); - }); - - it("should highlight an element", async () => { - const html = `
Highlight me!
`; - const userRequest = JSON.stringify({ - description: "Highlight the element.", - modifications: [ - { - selector: "#highlight-me", - action: "highlight", - highlightStyle: "2px dashed blue", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).toContain('style="border: 2px dashed blue;"'); - }); - - it("should create a toast notification", async () => { - const html = ""; - const userRequest = JSON.stringify({ - description: "Create a toast notification.", - modifications: [ - { - selector: "body", - action: "toast", - toastMessage: "This is a toast message", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).toContain("This is a toast message"); - }); - - it("should add a DaisyUI component", async () => { - const html = `
Eliza Hart
`; - const userRequest = JSON.stringify({ - description: "Add a DaisyUI card component.", - modifications: [ - { - selector: "#user-info", - action: "addComponent", - componentHtml: ` + it("should replace text content", async () => { + const html = `
Eliza Hart
`; + const userRequest = JSON.stringify({ + description: "Change the name 'Eliza' to 'Santiago'.", + modifications: [ + { + selector: "#user-info", + action: "replace", + content: "Santiago Hart", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).toContain("Santiago Hart"); + }); + + it("Should replace all with a regular expression", async () => { + const htmlString = `

Train test

Some text content here about a train

About the train

Trains are really cool. I use my train every day.
`; + const userRequest = JSON.stringify({ + description: "Change train to brain", + modifications: [ + { + xpath: "//html/body/div", + action: "replaceAll", + content: "/train/brain/i", + }, + ], + }); + const result = await modifyHtml(htmlString, userRequest); + + const parser = new DOMParser(); + const doc = parser.parseFromString(result, "text/html"); + + const unmodified = document.evaluate( + "//html/body/h1/text()[1]", + doc, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null, + ).singleNodeValue; + expect(unmodified?.textContent).toBe("Train test"); + + const modified = document.evaluate( + "//html/body/div/div/text()[1]", + doc, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null, + ).singleNodeValue; + expect(modified?.textContent).toBe("Some text content here about a brain"); + + const modified2 = document.evaluate( + "//html/body/div/h2/text()[1]", + doc, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null, + ).singleNodeValue; + expect(modified2?.textContent).toBe("About the brain"); + + const modified3 = document.evaluate( + "//html/body/div/div[2]/text()[1]", + doc, + null, + XPathResult.FIRST_ORDERED_NODE_TYPE, + null, + ).singleNodeValue; + expect(modified3?.textContent).toBe( + "Brains are really cool. I use my brain every day.", + ); + }); + + it("should swap image source", async () => { + const html = ``; + const userRequest = JSON.stringify({ + description: "Swap the profile picture.", + modifications: [ + { + selector: "#profile-pic", + action: "swapImage", + imageUrl: "santiago.jpg", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).toContain('src="santiago.jpg"'); + }); + + it("should highlight an element", async () => { + const html = `
Highlight me!
`; + const userRequest = JSON.stringify({ + description: "Highlight the element.", + modifications: [ + { + selector: "#highlight-me", + action: "highlight", + highlightStyle: "2px dashed blue", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).toContain('style="border: 2px dashed blue;"'); + }); + + it("should create a toast notification", async () => { + const html = ""; + const userRequest = JSON.stringify({ + description: "Create a toast notification.", + modifications: [ + { + selector: "body", + action: "toast", + toastMessage: "This is a toast message", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).toContain("This is a toast message"); + }); + + it("should add a DaisyUI component", async () => { + const html = `
Eliza Hart
`; + const userRequest = JSON.stringify({ + description: "Add a DaisyUI card component.", + modifications: [ + { + selector: "#user-info", + action: "addComponent", + componentHtml: `

New Card

@@ -154,180 +154,180 @@ describe("modifyHtml", () => {
`, - }, - ], - }); + }, + ], + }); - const result = await modifyHtml(html, userRequest); - expect(result).toContain('class="card w-96 bg-base-100 shadow-xl"'); - }); + const result = await modifyHtml(html, userRequest); + expect(result).toContain('class="card w-96 bg-base-100 shadow-xl"'); + }); - it("should handle multiple modifications using modifyDom", async () => { - const htmlString = ` + it("should handle multiple modifications using modifyDom", async () => { + const htmlString = `
Eliza Hart
Welcome, Eliza!
`; - const parser = new DOMParser(); - const doc = parser.parseFromString(htmlString, "text/html"); - - const userRequest: ModificationRequest = { - description: - "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", - modifications: [ - { - selector: "#user-info", - action: "replace", - content: "Santiago Hart", - }, - { - selector: "#welcome-message", - action: "replace", - content: "Welcome, Santiago!", - }, - { - selector: "#profile-pic", - action: "swapImage", - imageUrl: "santiago.jpg", - }, - { - selector: "body", - action: "toast", - toastMessage: "Welcome to the new site, Santiago!", - }, - ], - }; - - await modifyDom(doc, userRequest); - - expect(doc.body.innerHTML).toContain("Santiago Hart"); - expect(doc.body.innerHTML).toContain("Welcome, Santiago!"); - expect(doc.body.innerHTML).toContain('src="santiago.jpg"'); - expect(doc.body.innerHTML).toContain("Welcome to the new site, Santiago!"); - }); - - it("should unapply multiple modifications using modifyDom", async () => { - const htmlString = ` + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, "text/html"); + + const userRequest: ModificationRequest = { + description: + "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", + modifications: [ + { + selector: "#user-info", + action: "replace", + content: "Santiago Hart", + }, + { + selector: "#welcome-message", + action: "replace", + content: "Welcome, Santiago!", + }, + { + selector: "#profile-pic", + action: "swapImage", + imageUrl: "santiago.jpg", + }, + { + selector: "body", + action: "toast", + toastMessage: "Welcome to the new site, Santiago!", + }, + ], + }; + + await modifyDom(doc, userRequest); + + expect(doc.body.innerHTML).toContain("Santiago Hart"); + expect(doc.body.innerHTML).toContain("Welcome, Santiago!"); + expect(doc.body.innerHTML).toContain('src="santiago.jpg"'); + expect(doc.body.innerHTML).toContain("Welcome to the new site, Santiago!"); + }); + + it("should unapply multiple modifications using modifyDom", async () => { + const htmlString = `
Eliza Hart
Welcome, Eliza!
`; - const parser = new DOMParser(); - const doc = parser.parseFromString(htmlString, "text/html"); - - const userRequest: ModificationRequest = { - description: - "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", - modifications: [ - { - selector: "#user-info", - action: "replace", - content: "Santiago Hart", - }, - { - selector: "#welcome-message", - action: "replace", - content: "Welcome, Santiago!", - }, - { - selector: "#profile-pic", - action: "swapImage", - imageUrl: "santiago.jpg", - }, - { - selector: "body", - action: "toast", - toastMessage: "Welcome to the new site, Santiago!", - }, - ], - }; - - const modifications = (await modifyDom( - doc, - userRequest, - )) as AppliedModificationsImpl; - modifications.unapply(); - - expect(doc.body.innerHTML).toContain("Eliza Hart"); - expect(doc.body.innerHTML).toContain("Welcome, Eliza!"); - expect(doc.body.innerHTML).toContain('src="eliza.jpg"'); - }); - - it("should unapply a remove of multiple elements correctly", async () => { - const htmlString = ` + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, "text/html"); + + const userRequest: ModificationRequest = { + description: + "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", + modifications: [ + { + selector: "#user-info", + action: "replace", + content: "Santiago Hart", + }, + { + selector: "#welcome-message", + action: "replace", + content: "Welcome, Santiago!", + }, + { + selector: "#profile-pic", + action: "swapImage", + imageUrl: "santiago.jpg", + }, + { + selector: "body", + action: "toast", + toastMessage: "Welcome to the new site, Santiago!", + }, + ], + }; + + const modifications = (await modifyDom( + doc, + userRequest, + )) as AppliedModificationsImpl; + modifications.unapply(); + + expect(doc.body.innerHTML).toContain("Eliza Hart"); + expect(doc.body.innerHTML).toContain("Welcome, Eliza!"); + expect(doc.body.innerHTML).toContain('src="eliza.jpg"'); + }); + + it("should unapply a remove of multiple elements correctly", async () => { + const htmlString = `
Eliza Hart
Welcome, Eliza!
`; - const parser = new DOMParser(); - const doc = parser.parseFromString(htmlString, "text/html"); - - const userRequest: ModificationRequest = { - description: - "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", - modifications: [ - { - selector: "#user-info", - action: "remove", - }, - { - selector: "#welcome-message", - action: "remove", - }, - { - selector: "#profile-pic", - action: "remove", - }, - ], - }; - - const modifications = (await modifyDom( - doc, - userRequest, - )) as AppliedModificationsImpl; - modifications.unapply(); - - expect(doc.body.innerHTML).toContain("Eliza Hart"); - expect(doc.body.innerHTML).toContain("Welcome, Eliza!"); - expect(doc.body.innerHTML).toContain('src="eliza.jpg"'); - }); - - it("should handle missing elements gracefully", async () => { - const html = "
Some content
"; - const userRequest = JSON.stringify({ - description: "Try to modify a non-existent element", - modifications: [ - { - selector: "#non-existent", - action: "replace", - content: "This should not appear", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).not.toContain("This should not appear"); - expect(result).toContain("
Some content
"); - }); - - it("should ignore invalid selectors", async () => { - const html = "

Old content

"; - const userRequest = JSON.stringify({ - description: "Try to modify an element with a bad selector", - modifications: [ - { - action: "replace", - content: "

New Content

", - selector: "#;3s92hn", - }, - ], - }); - - const result = await modifyHtml(html, userRequest); - expect(result).not.toContain("

New content

"); - expect(result).toContain("

Old content

"); - }); + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, "text/html"); + + const userRequest: ModificationRequest = { + description: + "Change all occurrences of the name 'Eliza' to 'Santiago', swap profile picture, and add a toast notification.", + modifications: [ + { + selector: "#user-info", + action: "remove", + }, + { + selector: "#welcome-message", + action: "remove", + }, + { + selector: "#profile-pic", + action: "remove", + }, + ], + }; + + const modifications = (await modifyDom( + doc, + userRequest, + )) as AppliedModificationsImpl; + modifications.unapply(); + + expect(doc.body.innerHTML).toContain("Eliza Hart"); + expect(doc.body.innerHTML).toContain("Welcome, Eliza!"); + expect(doc.body.innerHTML).toContain('src="eliza.jpg"'); + }); + + it("should handle missing elements gracefully", async () => { + const html = "
Some content
"; + const userRequest = JSON.stringify({ + description: "Try to modify a non-existent element", + modifications: [ + { + selector: "#non-existent", + action: "replace", + content: "This should not appear", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).not.toContain("This should not appear"); + expect(result).toContain("
Some content
"); + }); + + it("should ignore invalid selectors", async () => { + const html = "

Old content

"; + const userRequest = JSON.stringify({ + description: "Try to modify an element with a bad selector", + modifications: [ + { + action: "replace", + content: "

New Content

", + selector: "#;3s92hn", + }, + ], + }); + + const result = await modifyHtml(html, userRequest); + expect(result).not.toContain("

New content

"); + expect(result).toContain("

Old content

"); + }); }); diff --git a/packages/reactor/tests/modifications.test.ts b/packages/reactor/tests/modifications.test.ts index 62cfc28e..48c75c46 100644 --- a/packages/reactor/tests/modifications.test.ts +++ b/packages/reactor/tests/modifications.test.ts @@ -7,480 +7,498 @@ import { createToast } from "../modifications/toast"; extendExpect(expect); describe("Utils", () => { - let doc: Document; - - // Vitest beforeEach function for setup - beforeEach(() => { - doc = document.implementation.createHTMLDocument("Test Document"); - }); - - describe("applyModification", () => { - it("should replace content correctly", async () => { - const modification: Modification = { - action: "replace", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Old Content

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toBe("

New Content

"); - }); - - it("should unapply replaced content correctly", async () => { - const modification: Modification = { - action: "replace", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Old Content

"; - const modifications = await applyModification(element, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toBe("

Old Content

"); - }); - - it("should replace all content correctly", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/old/new/i", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Old Content

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

New Content

"); - }); - - it("should unapply replace all correctly", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/old/new/", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Old Content

"; - const modifications = await applyModification(element, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

Old Content

"); - }); - - it("should preserve capitals in replacement", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/old/new/i", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Old Content is old

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

New Content is new

"); - }); - - it("should preserve plurals in replacement", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/train/brain/ip", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Trains are great! I love my train.

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - "

Brains are great! I love my brain.

", - ); - }); - - it("should only replace whole words", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/train/brain/wip", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = - "

I was in training about trains, but it was a strain to train.

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - "

I was in training about brains, but it was a strain to brain.

", - ); - }); - - it("should handle more complicated HTML", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/train/brain/wip", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = - '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

'; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - '

Brains

Brains are great! A picture of a brain

Brains are great! I love my brain.

', - ); - }); - - it("should unapply replaceall properly on more complicated HTML", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/train/brain/", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = - '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

'; - const modifications = await applyModification(element, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

', - ); - }); - - it("should work with multiple text nodes", async () => { - const modification: Modification = { - action: "replaceAll", - content: "/train/brain/wip", - }; - - const element = doc.createElement("div"); - doc.body.appendChild(element); - const t1 = doc.createTextNode("Trains node 1 "); - const t2 = doc.createTextNode("Trains node 2 "); - const t3 = doc.createTextNode("Trains node 3"); - element.appendChild(t1); - element.appendChild(t2); - element.appendChild(t3); - - await applyModification(element, modification, doc); - - expect(element.innerHTML).toBe( - "Brains node 1 Brains node 2 Brains node 3", - ); - }); - - it("should work with wikipedia", async() => { - const modification: Modification = { - action: "replaceAll", - content: "/Thailand/Russia/", - }; - - const element = doc.createElement("p"); - element.innerHTML = "

The office of the \"President of the People's Committee\" (ประธานคณะกรรมการราษฎร), later changed to \"Prime Minister of Siam\" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

" - doc.body.appendChild(element); - - await applyModification(doc.body, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

The office of the \"President of the People's Committee\" (ประธานคณะกรรมการราษฎร), later changed to \"Prime Minister of Siam\" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Russia is not new.

"); - }); - - it("should unapply from wikipedia", async() => { - const modification: Modification = { - action: "replaceAll", - content: "/Thailand/Russia/", - }; - - const element = doc.createElement("p"); - element.innerHTML = "

The office of the \"President of the People's Committee\" (ประธานคณะกรรมการราษฎร), later changed to \"Prime Minister of Siam\" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

" - doc.body.appendChild(element); - - const modifications = await applyModification(doc.body, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

The office of the \"President of the People's Committee\" (ประธานคณะกรรมการราษฎร), later changed to \"Prime Minister of Siam\" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

"); - }); - - it("should append content correctly", async () => { - const modification: Modification = { - action: "append", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("div"); - inner.innerHTML = "

Initial Content

"; - element.appendChild(inner); - await applyModification(inner, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - "

Initial Content

New Content

", - ); - }); - - it("should unapply appended content correctly", async () => { - const modification: Modification = { - action: "append", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("div"); - inner.innerHTML = "

Initial Content

"; - element.appendChild(inner); - const modifications = await applyModification(inner, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

Initial Content

"); - }); - - it("should prepend content correctly", async () => { - const modification: Modification = { - action: "prepend", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("div"); - inner.innerHTML = "

Initial Content

"; - element.appendChild(inner); - await applyModification(inner, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - "

New Content

Initial Content

", - ); - }); - - it("should unapply prepend content correctly", async () => { - const modification: Modification = { - action: "prepend", - content: "

New Content

", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("div"); - inner.innerHTML = "

Initial Content

"; - element.appendChild(inner); - const modifications = await applyModification(inner, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

Initial Content

"); - }); - - it("should remove the element correctly", async () => { - const modification: Modification = { - action: "remove", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("p"); - inner.innerHTML = "Initial Content"; - element.appendChild(inner); - await applyModification(inner, modification, doc); - - expect(element.outerHTML).toBe("
"); - }); - - it("should unapply the remove element correctly", async () => { - const modification: Modification = { - action: "remove", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("p"); - inner.innerHTML = "Initial Content"; - element.appendChild(inner); - const modifications = await applyModification(inner, modification, doc); - modifications.unapply(); - - expect(element.outerHTML).toBe("

Initial Content

"); - }); - - it("should remove the element correctly with siblings", async () => { - const modification: Modification = { - action: "remove", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner1 = doc.createElement("p"); - inner1.innerHTML = "Inner child 1"; - element.appendChild(inner1); - const inner2 = doc.createElement("p"); - inner2.innerHTML = "Inner child 2"; - element.appendChild(inner2); - const inner3 = doc.createElement("p"); - inner3.innerHTML = "Inner child 3"; - element.appendChild(inner3); - await applyModification(inner2, modification, doc); - - expect(element.outerHTML).toBe( - "

Inner child 1

Inner child 3

", - ); - }); - - it("should unapply the remove element correctly with siblings", async () => { - const modification: Modification = { - action: "remove", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner1 = doc.createElement("p"); - inner1.innerHTML = "Inner child 1"; - element.appendChild(inner1); - const inner2 = doc.createElement("p"); - inner2.innerHTML = "Inner child 2"; - element.appendChild(inner2); - const inner3 = doc.createElement("p"); - inner3.innerHTML = "Inner child 3"; - element.appendChild(inner3); - const modifications = await applyModification(inner2, modification, doc); - modifications.unapply(); - - expect(element.outerHTML).toBe( - "

Inner child 1

Inner child 2

Inner child 3

", - ); - }); - - it("should swap image source correctly", async () => { - const modification: Modification = { - action: "swapImage", - imageUrl: "new-image-url.jpg", - }; - const element = doc.createElement("img"); - doc.body.appendChild(element); - element.src = "old-image-url.jpg"; - await applyModification(element, modification, doc); - - expect(element.src).toBe("new-image-url.jpg"); - }); - - it("should unapply the swap image source correctly", async () => { - const modification: Modification = { - action: "swapImage", - imageUrl: "new-image-url.jpg", - }; - const element = doc.createElement("img"); - doc.body.appendChild(element); - element.src = "old-image-url.jpg"; - const modifications = await applyModification(element, modification, doc); - modifications.unapply(); - - expect(element.src).toBe("old-image-url.jpg"); - }); - - it("should highlight element correctly", async () => { - const modification: Modification = { - action: "highlight", - highlightStyle: "2px solid green", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Content

"; - await applyModification(element, modification, doc); - - expect(element.style.border).toBe("2px solid green"); - }); - - it("should create and display a toast correctly", async () => { - const modification: Modification = { - action: "toast", - toastMessage: "Test Notification", - duration: 100, - }; - createToast(modification.toastMessage ?? "", doc, modification.duration); - - // Simulate checking if the toast exists - const toastElement = doc.querySelector(".bg-blue-500"); // Assuming '.bg-blue-500' is the class for the toast - expect(toastElement?.textContent).toBe("Test Notification"); - - // Simulate waiting for the toast to be removed - await new Promise((resolve) => setTimeout(resolve, 200)); - - expect(doc.querySelector(".bg-blue-500")).toBeNull(); - }); - - it("should add a component correctly", async () => { - const modification: Modification = { - action: "addComponent", - componentHtml: "Component Content", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("p"); - inner.innerHTML = "Initial Content"; - element.appendChild(inner); - await applyModification(inner, modification, doc); - - expect(element.innerHTML).toMatchIgnoringMocksiTags( - "

Initial ContentComponent Content

", - ); - }); - - it("should unapply the add component correctly", async () => { - const modification: Modification = { - action: "addComponent", - componentHtml: "Component Content", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - const inner = doc.createElement("p"); - inner.innerHTML = "Initial Content"; - element.appendChild(inner); - const modifications = await applyModification(inner, modification, doc); - modifications.unapply(); - - expect(element.innerHTML).toMatchIgnoringMocksiTags("

Initial Content

"); - }); - - it("should handle unknowns correctly", async () => { - const modification: Modification = { - action: "unknown", - componentHtml: "Component Content", - }; - const element = doc.createElement("div"); - doc.body.appendChild(element); - element.innerHTML = "

Initial Content

"; - await applyModification(element, modification, doc); - - expect(element.innerHTML).toContain("

Initial Content

"); - }); - }); - - describe("createToast", () => { - it("should create and remove a toast correctly", async () => { - const message = "Test Message"; - createToast(message, doc); - - // Check if the toast exists - const toastElement = doc.querySelector(".bg-blue-500"); - expect(toastElement?.textContent).toBe(message); - - // Wait for the timeout before removing the toast - await new Promise((resolve) => setTimeout(resolve, 3100)); // Adjusted slightly above the 3000ms to account for any delays - - expect(doc.querySelector(".bg-blue-500")).toBeNull(); - }); - }); - - describe("generateModifications", () => { - it("should handle empty selectors gracefully", async () => { - const request: ModificationRequest = { - modifications: [ - { - selector: "", - action: "replace", - content: "

New Content

", - }, - ], - description: "", - }; - - await generateModifications(request, doc); - }); - }); + let doc: Document; + + // Vitest beforeEach function for setup + beforeEach(() => { + doc = document.implementation.createHTMLDocument("Test Document"); + }); + + describe("applyModification", () => { + it("should replace content correctly", async () => { + const modification: Modification = { + action: "replace", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Old Content

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toBe("

New Content

"); + }); + + it("should unapply replaced content correctly", async () => { + const modification: Modification = { + action: "replace", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Old Content

"; + const modifications = await applyModification(element, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toBe("

Old Content

"); + }); + + it("should replace all content correctly", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/old/new/i", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Old Content

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags("

New Content

"); + }); + + it("should unapply replace all correctly", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/old/new/", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Old Content

"; + const modifications = await applyModification(element, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags("

Old Content

"); + }); + + it("should preserve capitals in replacement", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/old/new/i", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Old Content is old

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

New Content is new

", + ); + }); + + it("should preserve plurals in replacement", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/train/brain/ip", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Trains are great! I love my train.

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Brains are great! I love my brain.

", + ); + }); + + it("should only replace whole words", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/train/brain/wip", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = + "

I was in training about trains, but it was a strain to train.

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

I was in training about brains, but it was a strain to brain.

", + ); + }); + + it("should handle more complicated HTML", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/train/brain/wip", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = + '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

'; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + '

Brains

Brains are great! A picture of a brain

Brains are great! I love my brain.

', + ); + }); + + it("should unapply replaceall properly on more complicated HTML", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/train/brain/", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = + '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

'; + const modifications = await applyModification(element, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + '

Trains

Trains are great! A picture of a train

Trains are great! I love my train.

', + ); + }); + + it("should work with multiple text nodes", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/train/brain/wip", + }; + + const element = doc.createElement("div"); + doc.body.appendChild(element); + const t1 = doc.createTextNode("Trains node 1 "); + const t2 = doc.createTextNode("Trains node 2 "); + const t3 = doc.createTextNode("Trains node 3"); + element.appendChild(t1); + element.appendChild(t2); + element.appendChild(t3); + + await applyModification(element, modification, doc); + + expect(element.innerHTML).toBe( + "Brains node 1 Brains node 2 Brains node 3", + ); + }); + + it("should work with wikipedia", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/Thailand/Russia/", + }; + + const element = doc.createElement("p"); + element.innerHTML = + '

The office of the "President of the People\'s Committee" (ประธานคณะกรรมการราษฎร), later changed to "Prime Minister of Siam" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

'; + doc.body.appendChild(element); + + await applyModification(doc.body, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + '

The office of the "President of the People\'s Committee" (ประธานคณะกรรมการราษฎร), later changed to "Prime Minister of Siam" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Russia is not new.

', + ); + }); + + it("should unapply from wikipedia", async () => { + const modification: Modification = { + action: "replaceAll", + content: "/Thailand/Russia/", + }; + + const element = doc.createElement("p"); + element.innerHTML = + '

The office of the "President of the People\'s Committee" (ประธานคณะกรรมการราษฎร), later changed to "Prime Minister of Siam" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

'; + doc.body.appendChild(element); + + const modifications = await applyModification( + doc.body, + modification, + doc, + ); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + '

The office of the "President of the People\'s Committee" (ประธานคณะกรรมการราษฎร), later changed to "Prime Minister of Siam" (นายกรัฐมนตรีสยาม), was first created in the Temporary Constitution of 1932. The office was modeled after the prime minister of the United Kingdom, as Siam became a parliamentary democracy in 1932 after a bloodless revolution. However, the idea of a separate head of government in Thailand is not new.

', + ); + }); + + it("should append content correctly", async () => { + const modification: Modification = { + action: "append", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("div"); + inner.innerHTML = "

Initial Content

"; + element.appendChild(inner); + await applyModification(inner, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Initial Content

New Content

", + ); + }); + + it("should unapply appended content correctly", async () => { + const modification: Modification = { + action: "append", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("div"); + inner.innerHTML = "

Initial Content

"; + element.appendChild(inner); + const modifications = await applyModification(inner, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Initial Content

", + ); + }); + + it("should prepend content correctly", async () => { + const modification: Modification = { + action: "prepend", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("div"); + inner.innerHTML = "

Initial Content

"; + element.appendChild(inner); + await applyModification(inner, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

New Content

Initial Content

", + ); + }); + + it("should unapply prepend content correctly", async () => { + const modification: Modification = { + action: "prepend", + content: "

New Content

", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("div"); + inner.innerHTML = "

Initial Content

"; + element.appendChild(inner); + const modifications = await applyModification(inner, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Initial Content

", + ); + }); + + it("should remove the element correctly", async () => { + const modification: Modification = { + action: "remove", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("p"); + inner.innerHTML = "Initial Content"; + element.appendChild(inner); + await applyModification(inner, modification, doc); + + expect(element.outerHTML).toBe("
"); + }); + + it("should unapply the remove element correctly", async () => { + const modification: Modification = { + action: "remove", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("p"); + inner.innerHTML = "Initial Content"; + element.appendChild(inner); + const modifications = await applyModification(inner, modification, doc); + modifications.unapply(); + + expect(element.outerHTML).toBe("

Initial Content

"); + }); + + it("should remove the element correctly with siblings", async () => { + const modification: Modification = { + action: "remove", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner1 = doc.createElement("p"); + inner1.innerHTML = "Inner child 1"; + element.appendChild(inner1); + const inner2 = doc.createElement("p"); + inner2.innerHTML = "Inner child 2"; + element.appendChild(inner2); + const inner3 = doc.createElement("p"); + inner3.innerHTML = "Inner child 3"; + element.appendChild(inner3); + await applyModification(inner2, modification, doc); + + expect(element.outerHTML).toBe( + "

Inner child 1

Inner child 3

", + ); + }); + + it("should unapply the remove element correctly with siblings", async () => { + const modification: Modification = { + action: "remove", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner1 = doc.createElement("p"); + inner1.innerHTML = "Inner child 1"; + element.appendChild(inner1); + const inner2 = doc.createElement("p"); + inner2.innerHTML = "Inner child 2"; + element.appendChild(inner2); + const inner3 = doc.createElement("p"); + inner3.innerHTML = "Inner child 3"; + element.appendChild(inner3); + const modifications = await applyModification(inner2, modification, doc); + modifications.unapply(); + + expect(element.outerHTML).toBe( + "

Inner child 1

Inner child 2

Inner child 3

", + ); + }); + + it("should swap image source correctly", async () => { + const modification: Modification = { + action: "swapImage", + imageUrl: "new-image-url.jpg", + }; + const element = doc.createElement("img"); + doc.body.appendChild(element); + element.src = "old-image-url.jpg"; + await applyModification(element, modification, doc); + + expect(element.src).toBe("new-image-url.jpg"); + }); + + it("should unapply the swap image source correctly", async () => { + const modification: Modification = { + action: "swapImage", + imageUrl: "new-image-url.jpg", + }; + const element = doc.createElement("img"); + doc.body.appendChild(element); + element.src = "old-image-url.jpg"; + const modifications = await applyModification(element, modification, doc); + modifications.unapply(); + + expect(element.src).toBe("old-image-url.jpg"); + }); + + it("should highlight element correctly", async () => { + const modification: Modification = { + action: "highlight", + highlightStyle: "2px solid green", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Content

"; + await applyModification(element, modification, doc); + + expect(element.style.border).toBe("2px solid green"); + }); + + it("should create and display a toast correctly", async () => { + const modification: Modification = { + action: "toast", + toastMessage: "Test Notification", + duration: 100, + }; + createToast(modification.toastMessage ?? "", doc, modification.duration); + + // Simulate checking if the toast exists + const toastElement = doc.querySelector(".bg-blue-500"); // Assuming '.bg-blue-500' is the class for the toast + expect(toastElement?.textContent).toBe("Test Notification"); + + // Simulate waiting for the toast to be removed + await new Promise((resolve) => setTimeout(resolve, 200)); + + expect(doc.querySelector(".bg-blue-500")).toBeNull(); + }); + + it("should add a component correctly", async () => { + const modification: Modification = { + action: "addComponent", + componentHtml: "Component Content", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("p"); + inner.innerHTML = "Initial Content"; + element.appendChild(inner); + await applyModification(inner, modification, doc); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Initial ContentComponent Content

", + ); + }); + + it("should unapply the add component correctly", async () => { + const modification: Modification = { + action: "addComponent", + componentHtml: "Component Content", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + const inner = doc.createElement("p"); + inner.innerHTML = "Initial Content"; + element.appendChild(inner); + const modifications = await applyModification(inner, modification, doc); + modifications.unapply(); + + expect(element.innerHTML).toMatchIgnoringMocksiTags( + "

Initial Content

", + ); + }); + + it("should handle unknowns correctly", async () => { + const modification: Modification = { + action: "unknown", + componentHtml: "Component Content", + }; + const element = doc.createElement("div"); + doc.body.appendChild(element); + element.innerHTML = "

Initial Content

"; + await applyModification(element, modification, doc); + + expect(element.innerHTML).toContain("

Initial Content

"); + }); + }); + + describe("createToast", () => { + it("should create and remove a toast correctly", async () => { + const message = "Test Message"; + createToast(message, doc); + + // Check if the toast exists + const toastElement = doc.querySelector(".bg-blue-500"); + expect(toastElement?.textContent).toBe(message); + + // Wait for the timeout before removing the toast + await new Promise((resolve) => setTimeout(resolve, 3100)); // Adjusted slightly above the 3000ms to account for any delays + + expect(doc.querySelector(".bg-blue-500")).toBeNull(); + }); + }); + + describe("generateModifications", () => { + it("should handle empty selectors gracefully", async () => { + const request: ModificationRequest = { + modifications: [ + { + selector: "", + action: "replace", + content: "

New Content

", + }, + ], + description: "", + }; + + await generateModifications(request, doc); + }); + }); }); diff --git a/packages/reactor/tests/mutation.test.ts b/packages/reactor/tests/mutation.test.ts index f6a66789..386aa07f 100644 --- a/packages/reactor/tests/mutation.test.ts +++ b/packages/reactor/tests/mutation.test.ts @@ -6,63 +6,73 @@ import Reactor from "../reactor"; extendExpect(expect); describe("test mutation listeners", {}, () => { - let doc: Document; - let reactor: Reactor; + let doc: Document; + let reactor: Reactor; - // Vitest beforeEach function for setup - beforeEach(() => { - doc = document.implementation.createHTMLDocument("Test Document"); - - reactor = new Reactor(); - reactor.attach(doc, { - highlightNode: (elementToHighlight: Node) => {}, - removeHighlightNode: (elementToUnhighlight: Node) => {} - }); - }); + // Vitest beforeEach function for setup + beforeEach(() => { + doc = document.implementation.createHTMLDocument("Test Document"); - it("should handle an added mutation", async () => { - doc.body.innerHTML = "

train

about

Trains are really cool. I use my train every day.
"; - - const request: ModificationRequest = { - description: "Change train to brain", - modifications: [ - { - selector: "body", - action: "replaceAll", - content: "/train/brain/wip", - } - ], - }; + reactor = new Reactor(); + reactor.attach(doc, { + highlightNode: (elementToHighlight: Node) => {}, + removeHighlightNode: (elementToUnhighlight: Node) => {}, + }); + }); - await reactor.pushModification(request); - expect(doc.body.innerHTML).toMatchIgnoringMocksiTags("

brain

about

Brains are really cool. I use my brain every day.
"); + it("should handle an added mutation", async () => { + doc.body.innerHTML = + "

train

about

Trains are really cool. I use my train every day.
"; - doc.body.innerHTML = "

trains are uncool

avoid

I hate trains. I never ride them.
"; - // wait for the changes to be applied - await new Promise(resolve => setTimeout(resolve, 1000)); - expect(doc.body.innerHTML).toMatchIgnoringMocksiTags("

brains are uncool

avoid

I hate brains. I never ride them.
"); - }); + const request: ModificationRequest = { + description: "Change train to brain", + modifications: [ + { + selector: "body", + action: "replaceAll", + content: "/train/brain/wip", + }, + ], + }; - it("should handle undoing after an added mutation", async () => { - doc.body.innerHTML = "

train

about

Trains are really cool. I use my train every day.
"; - - const request: ModificationRequest = { - description: "Change train to brain", - modifications: [ - { - selector: "body", - action: "replaceAll", - content: "/train/brain/", - } - ], - }; + await reactor.pushModification(request); + expect(doc.body.innerHTML).toMatchIgnoringMocksiTags( + "

brain

about

Brains are really cool. I use my brain every day.
", + ); - await reactor.pushModification(request); - doc.body.innerHTML = "

trains are uncool

avoid

I hate trains. I never ride them.
"; - // wait for the changes to be applied - await new Promise(resolve => setTimeout(resolve, 1000)); - reactor.detach(); + doc.body.innerHTML = + "

trains are uncool

avoid

I hate trains. I never ride them.
"; + // wait for the changes to be applied + await new Promise((resolve) => setTimeout(resolve, 1000)); + expect(doc.body.innerHTML).toMatchIgnoringMocksiTags( + "

brains are uncool

avoid

I hate brains. I never ride them.
", + ); + }); - expect(doc.body.innerHTML).toMatchIgnoringMocksiTags("

trains are uncool

avoid

I hate trains. I never ride them.
"); - }); -}); \ No newline at end of file + it("should handle undoing after an added mutation", async () => { + doc.body.innerHTML = + "

train

about

Trains are really cool. I use my train every day.
"; + + const request: ModificationRequest = { + description: "Change train to brain", + modifications: [ + { + selector: "body", + action: "replaceAll", + content: "/train/brain/", + }, + ], + }; + + await reactor.pushModification(request); + doc.body.innerHTML = + "

trains are uncool

avoid

I hate trains. I never ride them.
"; + // wait for the changes to be applied + await new Promise((resolve) => setTimeout(resolve, 1000)); + reactor.detach(); + + expect(doc.body.innerHTML).toMatchIgnoringMocksiTags( + "

trains are uncool

avoid

I hate trains. I never ride them.
", + ); + }); +}); diff --git a/packages/reactor/tests/test.utils.ts b/packages/reactor/tests/test.utils.ts index 804c1287..ab7ddddd 100644 --- a/packages/reactor/tests/test.utils.ts +++ b/packages/reactor/tests/test.utils.ts @@ -1,17 +1,18 @@ import { ExpectStatic } from "vitest"; export function extendExpect(expect: ExpectStatic) { - expect.extend({ - toMatchIgnoringMocksiTags(received: string, expected: string) { - // Remove mocksi attributes - - received = received.replace(/ mocksi-id="[^"]*"/g, ''); - received = received.replace(/ mocksi-modified-[^=]+="[^"]*"/g, ''); - - return { - message: () => `\n\x1B[32mexpected\x1B[0m\n\x1B[31mreceived\x1B[0m\n\n\x1B[32m${expected}\x1B[0m\n\x1B[31m${received}\x1B[0m`, - pass: received === expected, - } - } - }); + expect.extend({ + toMatchIgnoringMocksiTags(received: string, expected: string) { + // Remove mocksi attributes + + received = received.replace(/ mocksi-id="[^"]*"/g, ""); + received = received.replace(/ mocksi-modified-[^=]+="[^"]*"/g, ""); + + return { + message: () => + `\n\x1B[32mexpected\x1B[0m\n\x1B[31mreceived\x1B[0m\n\n\x1B[32m${expected}\x1B[0m\n\x1B[31m${received}\x1B[0m`, + pass: received === expected, + }; + }, + }); } diff --git a/packages/reactor/tsconfig.json b/packages/reactor/tsconfig.json index 001bfa82..5092d697 100644 --- a/packages/reactor/tsconfig.json +++ b/packages/reactor/tsconfig.json @@ -1,14 +1,15 @@ { - "extends": "@repo/typescript-config/base.json", "compilerOptions": { - "outDir": "dist", - "types": ["vitest/globals"], - "moduleResolution": "Node", - "module": "ESNext", - "target": "ESNext", - "esModuleInterop": true, - "allowSyntheticDefaultImports": true + "types": [ + "vitest/globals", + ] }, - "include": ["index.ts", "receivers", "utils", "commands"], - "exclude": ["node_modules", "dist", "test"] - } \ No newline at end of file + "extends": "@repo/config-typescript/web-library.json", + "include": [ + "commands", + "modifications", + "receivers", + "utils", + "*.ts" + ] +} \ No newline at end of file diff --git a/packages/reactor/utils.ts b/packages/reactor/utils.ts index 4eba2125..bc51ee70 100644 --- a/packages/reactor/utils.ts +++ b/packages/reactor/utils.ts @@ -1,23 +1,21 @@ -import type { - ModificationRequest, -} from "./interfaces"; +import type { ModificationRequest } from "./interfaces"; export function parseRequest(userRequest: string): ModificationRequest { - try { - return JSON.parse(userRequest); - // biome-ignore lint/suspicious/noExplicitAny: - } catch (error: any) { - console.error("Error parsing user request:", error); - throw new Error("Invalid user request format"); - } + try { + return JSON.parse(userRequest); + // biome-ignore lint/suspicious/noExplicitAny: + } catch (error: any) { + console.error("Error parsing user request:", error); + throw new Error("Invalid user request format"); + } } export function generateRandomString(length: number) { - const characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; - let result = ''; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} \ No newline at end of file + const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} diff --git a/packages/reactor/vitest.config.ts b/packages/reactor/vitest.config.ts index 41268e9c..09b620e1 100644 --- a/packages/reactor/vitest.config.ts +++ b/packages/reactor/vitest.config.ts @@ -1,8 +1,8 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - environment: "jsdom", - globals: true, - }, + test: { + environment: "jsdom", + globals: true, + }, }); diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json deleted file mode 100644 index aa444a46..00000000 --- a/packages/typescript-config/base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Default", - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "incremental": false, - "isolatedModules": true, - "lib": ["es2022", "DOM", "DOM.Iterable", "esnext"], - "module": "NodeNext", - "moduleDetection": "force", - "moduleResolution": "NodeNext", - "noUncheckedIndexedAccess": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ES2022" - } -} diff --git a/packages/typescript-config/nextjs.json b/packages/typescript-config/nextjs.json deleted file mode 100644 index 44f42899..00000000 --- a/packages/typescript-config/nextjs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Next.js", - "extends": "./base.json", - "compilerOptions": { - "plugins": [{ "name": "next" }], - "module": "ESNext", - "moduleResolution": "Bundler", - "allowJs": true, - "jsx": "preserve", - "noEmit": true - } -} diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json deleted file mode 100644 index 27c0e604..00000000 --- a/packages/typescript-config/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@repo/typescript-config", - "version": "0.0.0", - "private": true, - "license": "MIT", - "publishConfig": { - "access": "public" - } -} diff --git a/packages/typescript-config/react-library.json b/packages/typescript-config/react-library.json deleted file mode 100644 index 44924d9e..00000000 --- a/packages/typescript-config/react-library.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "React Library", - "extends": "./base.json", - "compilerOptions": { - "jsx": "react-jsx" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 300a92cf..c0749d38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,18 +12,18 @@ importers: specifier: workspace:* version: link:packages/reactor devDependencies: - '@repo/eslint-config': + '@repo/config-eslint': specifier: workspace:* - version: link:packages/eslint-config - '@repo/typescript-config': + version: link:packages/config-eslint + '@repo/config-prettier': specifier: workspace:* - version: link:packages/typescript-config - prettier: - specifier: ^3.2.5 - version: 3.3.2 + version: link:packages/config-prettier + '@repo/config-typescript': + specifier: workspace:* + version: link:packages/config-typescript turbo: - specifier: 1.13.3 - version: 1.13.3 + specifier: latest + version: 2.1.2 apps/mocksi-lite-next: dependencies: @@ -49,27 +49,18 @@ importers: '@crxjs/vite-plugin': specifier: ^2.0.0-beta.23 version: 2.0.0-beta.25 + '@repo/config-eslint': + specifier: workspace:* + version: link:../../packages/config-eslint + '@repo/config-prettier': + specifier: workspace:* + version: link:../../packages/config-prettier + '@repo/config-typescript': + specifier: workspace:* + version: link:../../packages/config-typescript '@types/chrome': - specifier: ^0.0.268 - version: 0.0.268 - '@types/node': - specifier: ^20.12.11 - version: 20.14.10 - '@types/react': - specifier: ^18.3.1 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@types/webextension-polyfill': - specifier: ^0.10.7 - version: 0.10.7 - '@typescript-eslint/eslint-plugin': - specifier: ^7.8.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^7.8.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + specifier: latest + version: 0.0.271 '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.8)(terser@5.31.2)) @@ -79,24 +70,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) - eslint-plugin-jsx-a11y: - specifier: ^6.8.0 - version: 6.9.0(eslint@8.57.0) - eslint-plugin-react: - specifier: ^7.34.1 - version: 7.34.3(eslint@8.57.0) - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.0) - fs-extra: - specifier: ^11.2.0 - version: 11.2.0 nodemon: specifier: ^3.1.0 version: 3.1.4 @@ -109,9 +82,6 @@ importers: tailwindcss: specifier: ^3.4.3 version: 3.4.4(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.4)) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.10)(typescript@5.5.4) typescript: specifier: ^5.4.5 version: 5.5.4 @@ -122,48 +92,44 @@ importers: '@repo/reactor': injected: true - packages/eslint-config: + packages/config-eslint: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.17.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) + specifier: latest + version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) '@typescript-eslint/parser': - specifier: ^6.17.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.3.3) - '@vercel/style-guide': - specifier: ^5.1.0 - version: 5.2.0(@next/eslint-plugin-next@14.2.5)(eslint@8.57.0)(prettier@3.3.2)(typescript@5.3.3) - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + specifier: latest + version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) + eslint: + specifier: latest + version: 9.11.1(jiti@1.21.6) eslint-config-turbo: - specifier: ^1.11.3 - version: 1.13.4(eslint@8.57.0) + specifier: ^1.13.4 + version: 1.13.4(eslint@9.11.1(jiti@1.21.6)) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.5.4 - packages/reactor: - dependencies: - css-selector-generator: - specifier: ^3.6.8 - version: 3.6.8 - uuid: - specifier: ^9.0.1 - version: 9.0.1 + packages/config-prettier: devDependencies: - '@biomejs/biome': - specifier: 1.7.2 - version: 1.7.2 - '@repo/eslint-config': - specifier: workspace:* - version: link:../eslint-config - '@repo/typescript-config': - specifier: workspace:* - version: link:../typescript-config + prettier: + specifier: ^3.2.5 + version: 3.3.2 + prettier-plugin-organize-attributes: + specifier: latest + version: 1.0.0(prettier@3.3.2) + prettier-plugin-tailwindcss: + specifier: ^0.5.11 + version: 0.5.14(prettier-plugin-organize-attributes@1.0.0(prettier@3.3.2))(prettier@3.3.2) + + packages/config-typescript: + devDependencies: + '@types/chrome': + specifier: ^0.0.270 + version: 0.0.270 '@types/eslint': specifier: ^8.56.1 version: 8.56.10 @@ -171,11 +137,36 @@ importers: specifier: ^21.1.7 version: 21.1.7 '@types/node': - specifier: ^20.10.6 + specifier: ^20.11.24 version: 20.14.10 + '@types/react': + specifier: ^18.2.61 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.2.19 + version: 18.3.0 '@types/uuid': specifier: ^9.0.8 version: 9.0.8 + + packages/reactor: + dependencies: + css-selector-generator: + specifier: ^3.6.8 + version: 3.6.8 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@repo/config-eslint': + specifier: workspace:* + version: link:../config-eslint + '@repo/config-prettier': + specifier: workspace:* + version: link:../config-prettier + '@repo/config-typescript': + specifier: workspace:* + version: link:../config-typescript '@vitest/coverage-v8': specifier: ^2.0.1 version: 2.0.2(vitest@2.0.2(@types/node@20.14.10)(jsdom@24.1.0)(less@4.2.0)(sass@1.77.8)(terser@5.31.2)) @@ -187,13 +178,11 @@ importers: version: 24.1.0 typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.6.2 vitest: specifier: ^2.0.1 version: 2.0.2(@types/node@20.14.10)(jsdom@24.1.0)(less@4.2.0)(sass@1.77.8)(terser@5.31.2) - packages/typescript-config: {} - packages: '@alloc/quick-lru@5.2.0': @@ -216,13 +205,6 @@ packages: resolution: {integrity: sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.24.8': - resolution: {integrity: sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.24.8': resolution: {integrity: sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==} engines: {node: '>=6.9.0'} @@ -317,59 +299,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@1.7.2': - resolution: {integrity: sha512-6Skx9N47inLQzYi9RKgJ7PBnUnaHnMe/imqX43cOcJjZtfMnQLxEvfM2Eyo7gChkwrZlwc+VbA4huFRjw2fsYA==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.7.2': - resolution: {integrity: sha512-CrldIueHivWEWmeTkK8bTXajeX53F8i2Rrkkt8cPZyMtzkrwxf8Riq4a/jz3SQBHkxHFT4TqGbSTNMXe3X1ogA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.7.2': - resolution: {integrity: sha512-UELnLJuJOsTL9meArvn8BtiXDURyPil2Ej9me2uVpEvee8UQdqd/bssP5we400OWShlL1AAML4fn6d2WX5332g==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@1.7.2': - resolution: {integrity: sha512-kKYZiem7Sj7wI0dpVxJlK7C+TFQwzO/ctufIGXGJAyEmUe9vEKSzV8CXpv+JIRiTWyqaZJ4K+eHz4SPdPCv05w==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@1.7.2': - resolution: {integrity: sha512-Z1CSGQE6fHz55gkiFHv9E8wEAaSUd7dHSRaxSCBa7utonHqpIeMbvj3Evm1w0WfGLFDtRXLV1fTfEdM0FMTOhA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.7.2': - resolution: {integrity: sha512-x10LpGMepDrLS+h2TZ6/T7egpHjGKtiI4GuShNylmBQJWfTotbFf9eseHggrqJ4WZf9yrGoVYrtbxXftuB95sQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@1.7.2': - resolution: {integrity: sha512-vXXyox8/CQijBxAu0+r8FfSO7JlC4tob3PbaFda8gPJFRz2uFJw39HtxVUwbTV1EcU6wSPh4SiRu5sZfP1VHrQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.7.2': - resolution: {integrity: sha512-kRXdlKzcU7INf6/ldu0nVmkOgt7bKqmyXRRCUqqaJfA32+9InTbkD8tGrHZEVYIWr+eTuKcg16qZVDsPSDFZ8g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@1.7.2': - resolution: {integrity: sha512-qHTtpAs+CNglAAuaTy09htoqUhrQyd3nd0aGTuLNqD10h1llMVi8WFZfoa+e5MuDSfYtMK6nW2Tbf6WgzzR1Qw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@crxjs/vite-plugin@2.0.0-beta.25': resolution: {integrity: sha512-g5ytTNiFpFCi+T0trSDJLohVz5PufLBLh6OGljyGTHkQCKiApuEgZ1bAjgPXluMDhMUvbPfZT10LYl5ROefXog==} @@ -529,14 +458,38 @@ packages: resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.11.1': + resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -550,6 +503,10 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -582,18 +539,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - - '@next/eslint-plugin-next@14.2.5': - resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -610,10 +555,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -698,9 +639,6 @@ packages: cpu: [x64] os: [win32] - '@rushstack/eslint-patch@1.10.3': - resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} - '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -725,8 +663,11 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/chrome@0.0.268': - resolution: {integrity: sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA==} + '@types/chrome@0.0.270': + resolution: {integrity: sha512-ADvkowV7YnJfycZZxL2brluZ6STGW+9oKG37B422UePf2PCXuFA/XdERI0T18wtuWPx0tmFeZqq6MOXVk1IC+Q==} + + '@types/chrome@0.0.271': + resolution: {integrity: sha512-K0qgXvkwA5ic+/eygF1xiypHEvCoBgH5lwrhg3yva2mqJuCWyYm0vpZQ22GksAxgGfo0PWev9Zx3plp2clMlwg==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -737,6 +678,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/filesystem@0.0.36': resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} @@ -752,15 +696,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@20.14.10': resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -770,182 +708,72 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/webextension-polyfill@0.10.7': - resolution: {integrity: sha512-10ql7A0qzBmFB+F+qAke/nP1PIonS0TXZAOMVOxEUsm+lGSW6uwVcISFNa0I4Oyj0884TZVWGGMIWeXOVSNFHw==} - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.7.0': + resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.7.0': + resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.7.0': + resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/type-utils@8.7.0': + resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@8.7.0': + resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.7.0': + resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/utils@8.7.0': + resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.7.0': + resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vercel/style-guide@5.2.0': - resolution: {integrity: sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==} - engines: {node: '>=16'} - peerDependencies: - '@next/eslint-plugin-next': '>=12.3.0 <15' - eslint: '>=8.48.0 <9' - prettier: '>=3.0.0 <4' - typescript: '>=4.8.0 <6' - peerDependenciesMeta: - '@next/eslint-plugin-next': - optional: true - eslint: - optional: true - prettier: - optional: true - typescript: - optional: true - '@vitejs/plugin-react@4.3.1': resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1121,55 +949,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1180,17 +963,6 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.9.1: - resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} - engines: {node: '>=4'} - - axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1219,18 +991,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1273,14 +1037,6 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -1361,25 +1117,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1388,14 +1129,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} @@ -1412,33 +1145,13 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} - engines: {node: '>=12.20'} - - detect-newline@4.0.1: - resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1446,17 +1159,9 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -1510,49 +1215,12 @@ packages: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} - es-module-lexer@0.10.5: resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1570,133 +1238,19 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-config-turbo@1.13.4: resolution: {integrity: sha512-+we4eWdZlmlEn7LnhXHCIPX/wtujbHCS7XjQM/TN09BHNEl2fZ8id4rHfdfUKIYTSKyy8U/nNyJ0DNoZj5Q8bw==} peerDependencies: eslint: '>6.6.0' - eslint-import-resolver-alias@1.1.2: - resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} - engines: {node: '>= 4'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-plugin-turbo@1.13.4: + resolution: {integrity: sha512-82GfMzrewI/DJB92Bbch239GWbGx4j1zvjk1lqb06lxIlMPnVwUHVwPbAnLfyLG3JuhLv9whxGkO/q1CL18JTg==} peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jest@27.9.0: - resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jsx-a11y@6.9.0: - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-only-warn@1.1.0: - resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} - engines: {node: '>=6'} - - eslint-plugin-playwright@0.16.0: - resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} - peerDependencies: - eslint: '>=7' - eslint-plugin-jest: '>=25' - peerDependenciesMeta: - eslint-plugin-jest: - optional: true - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.34.3: - resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-testing-library@6.2.2: - resolution: {integrity: sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - - eslint-plugin-tsdoc@0.2.17: - resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} - - eslint-plugin-turbo@1.13.4: - resolution: {integrity: sha512-82GfMzrewI/DJB92Bbch239GWbGx4j1zvjk1lqb06lxIlMPnVwUHVwPbAnLfyLG3JuhLv9whxGkO/q1CL18JTg==} - peerDependencies: - eslint: '>6.6.0' - - eslint-plugin-unicorn@48.0.1: - resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' + eslint: '>6.6.0' eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -1706,19 +1260,37 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + eslint@9.11.1: + resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1781,6 +1353,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1797,6 +1373,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -1804,9 +1384,6 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.2.1: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} @@ -1822,10 +1399,6 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1837,13 +1410,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1851,28 +1417,10 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - - git-hooks-list@3.1.0: - resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1884,11 +1432,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -1905,20 +1448,9 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1926,9 +1458,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1937,28 +1466,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -2013,10 +1524,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -2024,91 +1531,30 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - interpret@3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.14.0: resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2117,10 +1563,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -2128,51 +1570,13 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2196,13 +1600,6 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2214,9 +1611,6 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2236,10 +1630,6 @@ packages: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -2262,10 +1652,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2274,10 +1660,6 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} @@ -2289,13 +1671,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - less@4.2.0: resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} engines: {node: '>=6'} @@ -2331,9 +1706,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2396,24 +1768,13 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -2424,9 +1785,6 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -2454,9 +1812,6 @@ packages: engines: {node: '>=10'} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2483,42 +1838,6 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2557,10 +1876,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -2597,10 +1912,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -2631,14 +1942,6 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -2684,12 +1987,62 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.0: - resolution: {integrity: sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==} + prettier-plugin-organize-attributes@1.0.0: + resolution: {integrity: sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==} + engines: {node: '>=14.0.0'} + peerDependencies: + prettier: ^3.0.0 + + prettier-plugin-tailwindcss@0.5.14: + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + engines: {node: '>=14.21.3'} peerDependencies: - prettier: '>= 1.16.0' + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' peerDependenciesMeta: - prettier: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: optional: true prettier@3.3.2: @@ -2697,9 +2050,6 @@ packages: engines: {node: '>=14'} hasBin: true - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -2735,9 +2085,6 @@ packages: peerDependencies: react: ^18.3.1 - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-refresh@0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} @@ -2753,14 +2100,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2769,22 +2108,6 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -2800,20 +2123,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2845,17 +2158,9 @@ packages: rxjs@7.5.7: resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2894,14 +2199,6 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -2914,10 +2211,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2929,21 +2222,6 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - - sort-package-json@2.10.0: - resolution: {integrity: sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==} - hasBin: true - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -2959,28 +2237,12 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-buffers@0.2.6: resolution: {integrity: sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==} engines: {node: '>= 0.3.0'} @@ -2993,44 +2255,18 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.0: - resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} - - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3062,10 +2298,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} - tailwindcss@3.4.4: resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} engines: {node: '>=14.0.0'} @@ -3168,53 +2400,41 @@ packages: '@swc/wasm': optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - turbo-darwin-64@1.13.3: - resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==} + turbo-darwin-64@2.1.2: + resolution: {integrity: sha512-3TEBxHWh99h2yIzkuIigMEOXt/ItYQp0aPiJjPd1xN4oDcsKK5AxiFKPH9pdtfIBzYsY59kQhZiFj0ELnSP7Bw==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@1.13.3: - resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==} + turbo-darwin-arm64@2.1.2: + resolution: {integrity: sha512-he0miWNq2WxJzsH82jS2Z4MXpnkzn9SH8a79iPXiJkq25QREImucscM4RPasXm8wARp91pyysJMq6aasD45CeA==} cpu: [arm64] os: [darwin] - turbo-linux-64@1.13.3: - resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==} + turbo-linux-64@2.1.2: + resolution: {integrity: sha512-fKUBcc0rK8Vdqv5a/E3CSpMBLG1bzwv+Q0Q83F8fG2ZfNCNKGbcEYABdonNZkkx141Rj03cZQFCgxu3MVEGU+A==} cpu: [x64] os: [linux] - turbo-linux-arm64@1.13.3: - resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==} + turbo-linux-arm64@2.1.2: + resolution: {integrity: sha512-sV8Bpmm0WiuxgbhxymcC7wSsuxfBBieI98GegSwbr/bs1ANAgzCg93urIrdKdQ3/b31zZxQwcaP4FBF1wx1Qdg==} cpu: [arm64] os: [linux] - turbo-windows-64@1.13.3: - resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==} + turbo-windows-64@2.1.2: + resolution: {integrity: sha512-wcmIJZI9ORT9ykHGliFE6kWRQrlH930QGSjSgWC8uFChFFuOyUlvC7ttcxuSvU9VqC7NF4C+GVAcFJQ8lTjN7g==} cpu: [x64] os: [win32] - turbo-windows-arm64@1.13.3: - resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==} + turbo-windows-arm64@2.1.2: + resolution: {integrity: sha512-zdnXjrhk7YO6CP+Q5wPueEvOCLH4lDa6C4rrwiakcWcPgcQGbVozJlo4uaQ6awo8HLWQEvOwu84RkWTdLAc/Hw==} cpu: [arm64] os: [win32] - turbo@1.13.3: - resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} + turbo@2.1.2: + resolution: {integrity: sha512-Jb0rbU4iHEVQ18An/YfakdIv9rKnd3zUfSE117EngrfWXFHo3RndVH96US3GsT8VHpwTncPePDBT2t06PaFLrw==} hasBin: true type-check@0.4.0: @@ -3225,46 +2445,19 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true uberproto@1.2.0: resolution: {integrity: sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -3305,9 +2498,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@2.0.2: resolution: {integrity: sha512-w4vkSz1Wo+NIQg8pjlEn0jQbcM/0D+xVaYjhw3cvarTanLLBh54oNiRbsT8PNK5GfuST0IlVXjsNRoNlqvY/fw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3428,21 +2618,6 @@ packages: resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} engines: {node: '>=18'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3542,14 +2717,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.24.8(@babel/core@7.24.8)(eslint@8.57.0)': - dependencies: - '@babel/core': 7.24.8 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - '@babel/generator@7.24.8': dependencies: '@babel/types': 7.24.8 @@ -3670,41 +2837,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@1.7.2': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.7.2 - '@biomejs/cli-darwin-x64': 1.7.2 - '@biomejs/cli-linux-arm64': 1.7.2 - '@biomejs/cli-linux-arm64-musl': 1.7.2 - '@biomejs/cli-linux-x64': 1.7.2 - '@biomejs/cli-linux-x64-musl': 1.7.2 - '@biomejs/cli-win32-arm64': 1.7.2 - '@biomejs/cli-win32-x64': 1.7.2 - - '@biomejs/cli-darwin-arm64@1.7.2': - optional: true - - '@biomejs/cli-darwin-x64@1.7.2': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.7.2': - optional: true - - '@biomejs/cli-linux-arm64@1.7.2': - optional: true - - '@biomejs/cli-linux-x64-musl@1.7.2': - optional: true - - '@biomejs/cli-linux-x64@1.7.2': - optional: true - - '@biomejs/cli-win32-arm64@1.7.2': - optional: true - - '@biomejs/cli-win32-x64@1.7.2': - optional: true - '@crxjs/vite-plugin@2.0.0-beta.25': dependencies: '@rollup/pluginutils': 4.2.1 @@ -3729,6 +2861,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@discoveryjs/json-ext@0.5.7': {} @@ -3806,8 +2939,23 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@1.21.6))': + dependencies: + eslint: 9.11.1(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.11.0': {} + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.5(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.6.0': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -3822,8 +2970,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.5(supports-color@5.5.0) + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.0': {} + '@eslint/js@9.11.1': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -3836,6 +3006,8 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3873,25 +3045,8 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - - '@microsoft/tsdoc@0.14.2': {} - - '@next/eslint-plugin-next@14.2.5': - dependencies: - glob: 10.3.10 optional: true - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3907,8 +3062,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} - '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 @@ -3962,15 +3115,17 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.1': optional: true - '@rushstack/eslint-patch@1.10.3': {} - - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node14@1.0.3': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node16@1.0.4': + optional: true '@types/babel__core@7.20.5': dependencies: @@ -3993,7 +3148,12 @@ snapshots: dependencies: '@babel/types': 7.24.8 - '@types/chrome@0.0.268': + '@types/chrome@0.0.270': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.15 + + '@types/chrome@0.0.271': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.15 @@ -4010,6 +3170,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/filesystem@0.0.36': dependencies: '@types/filewriter': 0.0.33 @@ -4026,14 +3188,10 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/node@20.14.10': dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': @@ -4045,43 +3203,19 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 - '@types/semver@7.5.8': {} - '@types/tough-cookie@4.0.5': {} '@types/uuid@9.0.8': {} - '@types/webextension-polyfill@0.10.7': {} - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.0 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.7.0 + eslint: 9.11.1(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -4091,112 +3225,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.7.0 debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 + eslint: 9.11.1(jiti@1.21.6) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/scope-manager@6.21.0': + '@typescript-eslint/scope-manager@8.7.0': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@7.18.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.7.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 debug: 4.3.5(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.5(supports-color@5.5.0) - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 @@ -4206,95 +3272,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3)': + '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.57.0 - semver: 7.6.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.4) + eslint: 9.11.1(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/visitor-keys@8.7.0': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/types': 8.7.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vercel/style-guide@5.2.0(@next/eslint-plugin-next@14.2.5)(eslint@8.57.0)(prettier@3.3.2)(typescript@5.3.3)': - dependencies: - '@babel/core': 7.24.8 - '@babel/eslint-parser': 7.24.8(@babel/core@7.24.8)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0) - eslint-plugin-react: 7.34.3(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - eslint-plugin-testing-library: 6.2.2(eslint@8.57.0)(typescript@5.3.3) - eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) - prettier-plugin-packagejson: 2.5.0(prettier@3.3.2) - optionalDependencies: - '@next/eslint-plugin-next': 14.2.5 - eslint: 8.57.0 - prettier: 3.3.2 - typescript: 5.3.3 - transitivePeerDependencies: - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - jest - - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.8)(terser@5.31.2))': dependencies: '@babel/core': 7.24.8 @@ -4507,94 +3502,15 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} argparse@2.0.1: {} - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.toreversed@1.1.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - asynckit@0.4.0: {} autoprefixer@10.4.19(postcss@8.4.39): @@ -4607,16 +3523,6 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axe-core@4.9.1: {} - - axobject-query@3.1.1: - dependencies: - deep-equal: 2.2.3 - balanced-match@1.0.2: {} binary-extensions@2.3.0: {} @@ -4645,18 +3551,8 @@ snapshots: buffer-from@1.1.2: {} - builtin-modules@3.3.0: {} - cac@6.7.14: {} - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -4721,12 +3617,6 @@ snapshots: chrome-trace-event@1.0.4: {} - ci-info@3.9.0: {} - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 @@ -4777,7 +3667,8 @@ snapshots: is-what: 3.14.1 optional: true - create-require@1.1.1: {} + create-require@1.1.1: + optional: true cross-spawn@7.0.3: dependencies: @@ -4805,39 +3696,15 @@ snapshots: csstype@3.1.3: {} - damerau-levenshtein@1.0.8: {} - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - debug@2.6.9: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.3.5(supports-color@5.5.0): dependencies: ms: 2.1.2 @@ -4848,61 +3715,17 @@ snapshots: deep-eql@5.0.2: {} - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - deep-is@0.1.4: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delayed-stream@1.0.0: {} - detect-indent@7.0.1: {} - - detect-newline@4.0.1: {} - didyoumean@1.2.2: {} - diff@4.0.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + diff@4.0.2: + optional: true dlv@1.1.3: {} - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -4954,118 +3777,10 @@ snapshots: prr: 1.0.1 optional: true - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-iterator-helpers@1.0.19: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - es-module-lexer@0.10.5: {} es-module-lexer@1.5.4: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -5098,225 +3813,17 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-config-turbo@1.13.4(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-plugin-turbo: 1.13.4(eslint@8.57.0) - - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)): - dependencies: - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - - eslint-import-resolver-node@0.3.9: + eslint-config-turbo@1.13.4(eslint@9.11.1(jiti@1.21.6)): dependencies: - debug: 3.2.7 - is-core-module: 2.14.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.5(supports-color@5.5.0) - enhanced-resolve: 5.17.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.5 - is-core-module: 2.14.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): - dependencies: - escape-string-regexp: 1.0.5 - eslint: 8.57.0 - ignore: 5.3.1 - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): - dependencies: - aria-query: 5.1.3 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.9.1 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.19 - eslint: 8.57.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.0 + eslint: 9.11.1(jiti@1.21.6) + eslint-plugin-turbo: 1.13.4(eslint@9.11.1(jiti@1.21.6)) eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - optionalDependencies: - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-react@7.34.3(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.57.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.hasown: 1.1.4 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - - eslint-plugin-testing-library@6.2.2(eslint@8.57.0)(typescript@5.3.3): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-tsdoc@0.2.17: - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - - eslint-plugin-turbo@1.13.4(eslint@8.57.0): + eslint-plugin-turbo@1.13.4(eslint@9.11.1(jiti@1.21.6)): dependencies: dotenv: 16.0.3 - eslint: 8.57.0 - - eslint-plugin-unicorn@48.0.1(eslint@8.57.0): - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.57.0 - esquery: 1.6.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.6.2 - strip-indent: 3.0.0 + eslint: 9.11.1(jiti@1.21.6) eslint-scope@5.1.1: dependencies: @@ -5328,10 +3835,15 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@2.1.0: {} + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.0.0: {} + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -5375,6 +3887,56 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.11.1(jiti@1.21.6): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.11.1 + '@eslint/plugin-kit': 0.2.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + espree@9.6.1: dependencies: acorn: 8.12.1 @@ -5439,6 +4001,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5459,14 +4025,15 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + flat@5.0.2: {} flatted@3.3.1: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 @@ -5478,15 +4045,9 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - fraction.js@4.3.7: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 + fraction.js@4.3.7: {} - fs-extra@11.2.0: + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -5499,43 +4060,12 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-func-name@2.0.2: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-stdin@9.0.0: {} - get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - get-tsconfig@4.7.5: - dependencies: - resolve-pkg-maps: 1.0.0 - - git-hooks-list@3.1.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5546,15 +4076,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: - dependencies: - foreground-child: 3.2.1 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - optional: true - glob@10.4.5: dependencies: foreground-child: 3.2.1 @@ -5579,60 +4100,20 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 4.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + globals@14.0.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - has-bigints@1.0.2: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - hasown@2.0.2: dependencies: function-bind: 1.1.2 - hosted-git-info@2.8.9: {} - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -5688,8 +4169,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -5697,138 +4176,39 @@ snapshots: inherits@2.0.4: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - interpret@3.1.1: {} - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-callable@1.2.7: {} - is-core-module@2.14.0: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 is-potential-custom-element-name@1.0.1: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-weakmap@2.0.2: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-what@3.14.1: optional: true - isarray@2.0.5: {} - isexe@2.0.0: {} isobject@3.0.1: {} @@ -5854,21 +4234,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - optional: true - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -5883,8 +4248,6 @@ snapshots: jiti@1.21.6: {} - jju@1.4.0: {} - js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -5921,8 +4284,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@0.5.0: {} - jsesc@2.5.2: {} jsesc@3.0.2: {} @@ -5935,10 +4296,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonfile@6.1.0: @@ -5947,13 +4304,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - jwt-decode@4.0.0: {} keyv@4.5.4: @@ -5962,12 +4312,6 @@ snapshots: kind-of@6.0.3: {} - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - less@4.2.0: dependencies: copy-anything: 2.0.6 @@ -6006,8 +4350,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.17.21: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6046,7 +4388,8 @@ snapshots: dependencies: semver: 7.6.2 - make-error@1.3.6: {} + make-error@1.3.6: + optional: true merge-stream@2.0.0: {} @@ -6068,30 +4411,20 @@ snapshots: mimic-fn@4.0.0: {} - min-indent@1.0.1: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - minimist@1.2.8: {} - minipass@7.1.2: {} ms@2.0.0: {} ms@2.1.2: {} - ms@2.1.3: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -6125,13 +4458,6 @@ snapshots: touch: 3.1.1 undefsafe: 2.0.5 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -6150,53 +4476,6 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.2: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.entries@1.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6238,13 +4517,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse-node-version@1.0.1: optional: true @@ -6276,8 +4548,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-type@4.0.0: {} - pathe@1.1.2: {} pathval@2.0.0: {} @@ -6297,10 +4567,6 @@ snapshots: dependencies: find-up: 4.1.0 - pluralize@8.0.0: {} - - possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.39): dependencies: postcss: 8.4.39 @@ -6341,20 +4607,17 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.0(prettier@3.3.2): + prettier-plugin-organize-attributes@1.0.0(prettier@3.3.2): dependencies: - sort-package-json: 2.10.0 - synckit: 0.9.0 - optionalDependencies: prettier: 3.3.2 - prettier@3.3.2: {} - - prop-types@15.8.1: + prettier-plugin-tailwindcss@0.5.14(prettier-plugin-organize-attributes@1.0.0(prettier@3.3.2))(prettier@3.3.2): dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 + prettier: 3.3.2 + optionalDependencies: + prettier-plugin-organize-attributes: 1.0.0(prettier@3.3.2) + + prettier@3.3.2: {} prr@1.0.1: optional: true @@ -6381,8 +4644,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-is@16.13.1: {} - react-refresh@0.13.0: {} react-refresh@0.14.2: {} @@ -6395,19 +4656,6 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -6416,29 +4664,6 @@ snapshots: dependencies: resolve: 1.22.8 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - - regexp-tree@0.1.27: {} - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - requires-port@1.0.0: {} resolve-cwd@3.0.0: @@ -6449,25 +4674,12 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - - resolve@1.19.0: - dependencies: - is-core-module: 2.14.0 - path-parse: 1.0.7 - resolve@1.22.8: dependencies: is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.14.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} rimraf@3.0.2: @@ -6512,21 +4724,8 @@ snapshots: dependencies: tslib: 2.6.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safer-buffer@2.1.2: {} sass@1.77.8: @@ -6553,7 +4752,8 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - semver@5.7.2: {} + semver@5.7.2: + optional: true semver@6.3.1: {} @@ -6563,22 +4763,6 @@ snapshots: dependencies: randombytes: 2.1.0 - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -6589,13 +4773,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -6604,23 +4781,6 @@ snapshots: dependencies: semver: 7.6.2 - slash@3.0.0: {} - - slash@4.0.0: {} - - sort-object-keys@1.1.3: {} - - sort-package-json@2.10.0: - dependencies: - detect-indent: 7.0.1 - detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.1.0 - globby: 13.2.2 - is-plain-obj: 4.1.0 - semver: 7.6.2 - sort-object-keys: 1.1.3 - source-map-js@1.2.0: {} source-map-support@0.5.21: @@ -6632,28 +4792,10 @@ snapshots: sourcemap-codec@1.4.8: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - - spdx-license-ids@3.0.18: {} - stackback@0.0.2: {} std-env@3.7.0: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stream-buffers@0.2.6: {} string-width@4.2.3: @@ -6668,45 +4810,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.includes@2.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - - string.prototype.matchall@4.0.11: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -6715,14 +4818,8 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} strip-literal@2.1.0: @@ -6755,11 +4852,6 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.9.0: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.3 - tailwindcss@3.4.4(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -6848,10 +4940,6 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@1.3.0(typescript@5.3.3): - dependencies: - typescript: 5.3.3 - ts-api-utils@1.3.0(typescript@5.5.4): dependencies: typescript: 5.5.4 @@ -6875,49 +4963,36 @@ snapshots: typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} + optional: true tslib@2.6.3: {} - tsutils@3.21.0(typescript@5.3.3): - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - - turbo-darwin-64@1.13.3: + turbo-darwin-64@2.1.2: optional: true - turbo-darwin-arm64@1.13.3: + turbo-darwin-arm64@2.1.2: optional: true - turbo-linux-64@1.13.3: + turbo-linux-64@2.1.2: optional: true - turbo-linux-arm64@1.13.3: + turbo-linux-arm64@2.1.2: optional: true - turbo-windows-64@1.13.3: + turbo-windows-64@2.1.2: optional: true - turbo-windows-arm64@1.13.3: + turbo-windows-arm64@2.1.2: optional: true - turbo@1.13.3: + turbo@2.1.2: optionalDependencies: - turbo-darwin-64: 1.13.3 - turbo-darwin-arm64: 1.13.3 - turbo-linux-64: 1.13.3 - turbo-linux-arm64: 1.13.3 - turbo-windows-64: 1.13.3 - turbo-windows-arm64: 1.13.3 + turbo-darwin-64: 2.1.2 + turbo-darwin-arm64: 2.1.2 + turbo-linux-64: 2.1.2 + turbo-linux-arm64: 2.1.2 + turbo-windows-64: 2.1.2 + turbo-windows-arm64: 2.1.2 type-check@0.4.0: dependencies: @@ -6925,54 +5000,11 @@ snapshots: type-fest@0.20.2: {} - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typescript@5.3.3: {} - typescript@5.5.4: {} - uberproto@1.2.0: {} + typescript@5.6.2: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + uberproto@1.2.0: {} undefsafe@2.0.5: {} @@ -7003,12 +5035,8 @@ snapshots: uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + v8-compile-cache-lib@3.0.1: + optional: true vite-node@2.0.2(@types/node@20.14.10)(less@4.2.0)(sass@1.77.8)(terser@5.31.2): dependencies: @@ -7164,44 +5192,6 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -7239,6 +5229,7 @@ snapshots: yaml@2.4.5: {} - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} diff --git a/tsconfig.json b/tsconfig.json index c8a018d0..7d888cd1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@repo/typescript-config/base.json" -} + "extends": "@repo/config-typescript/base.json" +} \ No newline at end of file diff --git a/turbo.json b/turbo.json index 781f2748..ef719dd8 100644 --- a/turbo.json +++ b/turbo.json @@ -1,17 +1,21 @@ { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local"], - "pipeline": { + "tasks": { "build": { "dependsOn": ["^build"], "outputs": [".next/**", "!.next/cache/**"] }, - "lint": { - "dependsOn": ["^lint"] - }, + "dev": { "cache": false, "persistent": true + }, + "format": { + "dependsOn": ["^format"] + }, + "lint": { + "dependsOn": ["^lint"] } } } From 0ca656fd28d791ad877d41aff2d7b590454d86cb Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Mon, 23 Sep 2024 21:33:06 -0700 Subject: [PATCH 2/7] update lockfile --- pnpm-lock.yaml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0749d38..ee3a5806 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,9 +58,6 @@ importers: '@repo/config-typescript': specifier: workspace:* version: link:../../packages/config-typescript - '@types/chrome': - specifier: latest - version: 0.0.271 '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.8)(terser@5.31.2)) @@ -666,9 +663,6 @@ packages: '@types/chrome@0.0.270': resolution: {integrity: sha512-ADvkowV7YnJfycZZxL2brluZ6STGW+9oKG37B422UePf2PCXuFA/XdERI0T18wtuWPx0tmFeZqq6MOXVk1IC+Q==} - '@types/chrome@0.0.271': - resolution: {integrity: sha512-K0qgXvkwA5ic+/eygF1xiypHEvCoBgH5lwrhg3yva2mqJuCWyYm0vpZQ22GksAxgGfo0PWev9Zx3plp2clMlwg==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3153,11 +3147,6 @@ snapshots: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.15 - '@types/chrome@0.0.271': - dependencies: - '@types/filesystem': 0.0.36 - '@types/har-format': 1.2.15 - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 From 95100fbf779910f69c19e62526640c3c804c56f9 Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Mon, 23 Sep 2024 21:37:53 -0700 Subject: [PATCH 3/7] try alt module/moduleResolution --- packages/config-typescript/base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config-typescript/base.json b/packages/config-typescript/base.json index 849cd8ac..f097d1f8 100644 --- a/packages/config-typescript/base.json +++ b/packages/config-typescript/base.json @@ -6,7 +6,7 @@ "downlevelIteration": true, "esModuleInterop": true, "isolatedModules": true, - "module": "ES6", + "module": "ES2022", "moduleDetection": "force", "moduleResolution": "Node", "noImplicitOverride": true, From 7957b667a8f290d2cb8d89f5ea479530808d5f03 Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Mon, 23 Sep 2024 21:39:21 -0700 Subject: [PATCH 4/7] try different main" ; --- packages/reactor/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactor/package.json b/packages/reactor/package.json index 72480605..737036ef 100644 --- a/packages/reactor/package.json +++ b/packages/reactor/package.json @@ -14,7 +14,7 @@ "typescript": "^5.3.3", "vitest": "^2.0.1" }, - "main": "dist/index.js", + "main": "index.ts", "name": "@repo/reactor", "private": true, "scripts": { From af081182651cfae844c84816518cebfd975ba08b Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Tue, 24 Sep 2024 09:12:36 -0700 Subject: [PATCH 5/7] format --- .eslintrc.js | 2 - .github/workflows/ci.yml | 65 --------------------------- .prettier.config.js | 3 -- apps/mocksi-lite-next/.eslintrc.js | 4 +- apps/mocksi-lite-next/package.json | 3 +- packages/config-eslint/base.js | 2 +- packages/config-eslint/package.json | 1 + packages/config-eslint/web.js | 12 +---- packages/config-prettier/package.json | 3 ++ packages/reactor/.eslintrc.js | 3 +- packages/reactor/package.json | 5 ++- pnpm-lock.yaml | 5 ++- 12 files changed, 20 insertions(+), 88 deletions(-) delete mode 100644 .github/workflows/ci.yml delete mode 100644 .prettier.config.js diff --git a/.eslintrc.js b/.eslintrc.js index d7323d1a..aa86a74c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,3 @@ -// This configuration only applies to the package manager root. -/** @type {import("eslint").Linter.Config} */ module.exports = { extends: ["@repo/config-eslint/base.js"], ignorePatterns: ["apps/**", "packages/**"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 066acb35..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Build and Zip Extension - -on: - workflow_dispatch: - inputs: - environment: - description: "Extension build target" - required: true - default: "QA" - type: choice - options: - - QA - - production - - staging - - development - -defaults: - run: - working-directory: ./apps/mocksi-lite-next - -jobs: - build_extension: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v3 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - uses: pnpm/action-setup@v4 - name: Install pnpm - with: - run_install: false - - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Build artifacts - run: pnpm build --mode=${{ inputs.environment }} - - - name: Store commit short sha - shell: bash - run: echo "SHORT_SHA=`git rev-parse --short HEAD`" >> $GITHUB_ENV - - - name: Upload extension artifacts - uses: actions/upload-artifact@v4 - with: - name: mocksi-lite-${{ inputs.environment }}-${{ env.SHORT_SHA }} - path: ./apps/mocksi-lite-next/dist diff --git a/.prettier.config.js b/.prettier.config.js deleted file mode 100644 index 41a9f1eb..00000000 --- a/.prettier.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: "@repo/config-prettier/index.js", -}; diff --git a/apps/mocksi-lite-next/.eslintrc.js b/apps/mocksi-lite-next/.eslintrc.js index c016910c..21447009 100644 --- a/apps/mocksi-lite-next/.eslintrc.js +++ b/apps/mocksi-lite-next/.eslintrc.js @@ -1,3 +1,5 @@ +/** @type {import("eslint").Linter.Config} */ module.exports = { - extends: "@repo/config-eslint/web.js", + extends: ["@repo/config-eslint/web.js"], + root: true, }; diff --git a/apps/mocksi-lite-next/package.json b/apps/mocksi-lite-next/package.json index d09169c0..b8a3b98f 100755 --- a/apps/mocksi-lite-next/package.json +++ b/apps/mocksi-lite-next/package.json @@ -30,6 +30,7 @@ }, "license": "MIT", "name": "web-extension", + "prettier": "@repo/config-prettier", "repository": { "type": "git", "url": "https://github.com/JohnBra/web-extension.git" @@ -38,7 +39,7 @@ "build": "vite build --mode '${npm_config_mode}'", "dev": "nodemon", "format": "prettier --write \"src/**/*.{tsx,ts}\"", - "lint": "eslint --fix" + "lint": "eslint --fix ." }, "type": "module", "version": "1.2.0" diff --git a/packages/config-eslint/base.js b/packages/config-eslint/base.js index b05b7a4b..9444e26b 100644 --- a/packages/config-eslint/base.js +++ b/packages/config-eslint/base.js @@ -1,5 +1,4 @@ const { resolve } = require("node:path"); - const project = resolve(process.cwd(), "tsconfig.json"); /** @type {import("eslint").Linter.Config} */ @@ -14,6 +13,7 @@ module.exports = { // Ignore dotfiles ".*.js", "node_modules/", + "dist/", ], overrides: [{ files: ["*.js?(x)", "*.ts?(x)"] }], parser: "@typescript-eslint/parser", diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json index 724fb2fc..1376f616 100644 --- a/packages/config-eslint/package.json +++ b/packages/config-eslint/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "@eslint/js": "latest", "@typescript-eslint/eslint-plugin": "latest", "@typescript-eslint/parser": "latest", "eslint": "latest", diff --git a/packages/config-eslint/web.js b/packages/config-eslint/web.js index b052ff5f..5a5513ec 100644 --- a/packages/config-eslint/web.js +++ b/packages/config-eslint/web.js @@ -1,13 +1,10 @@ -/** @type {import("eslint").Linter.Config} */ module.exports = { env: { browser: true, es6: true, }, - - extends: ["./base.js"], extends: [ - "@repo/config-eslint/base.js", + "./base.js", "eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended", @@ -30,13 +27,6 @@ module.exports = { }, plugins: ["react"], rules: { - "@typescript-eslint/no-unused-vars": [ - "error", - { - argsIgnorePattern: "^_", - }, - ], - "no-unused-vars": "off", "react/react-in-jsx-scope": "off", }, }; diff --git a/packages/config-prettier/package.json b/packages/config-prettier/package.json index 80d215eb..5a56e904 100644 --- a/packages/config-prettier/package.json +++ b/packages/config-prettier/package.json @@ -4,6 +4,9 @@ "prettier-plugin-organize-attributes": "latest", "prettier-plugin-tailwindcss": "^0.5.11" }, + "exports": { + ".": "./index.js" + }, "files": [ "index.js" ], diff --git a/packages/reactor/.eslintrc.js b/packages/reactor/.eslintrc.js index 937db920..0a9ae898 100644 --- a/packages/reactor/.eslintrc.js +++ b/packages/reactor/.eslintrc.js @@ -1,5 +1,6 @@ /** @type {import("eslint").Linter.Config} */ module.exports = { - extends: ["@repo/config-eslint/web-library.js"], + extends: ["@repo/config-eslint/web.js"], + root: true, types: ["vitest/globals"], }; diff --git a/packages/reactor/package.json b/packages/reactor/package.json index 737036ef..6629e5b0 100644 --- a/packages/reactor/package.json +++ b/packages/reactor/package.json @@ -9,19 +9,20 @@ "@repo/config-prettier": "workspace:*", "@repo/config-typescript": "workspace:*", "@vitest/coverage-v8": "^2.0.1", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "jsdom": "^24.1.0", "typescript": "^5.3.3", "vitest": "^2.0.1" }, "main": "index.ts", "name": "@repo/reactor", + "prettier": "@repo/config-prettier", "private": true, "scripts": { "build": "tsc", "coverage": "pnpm exec vitest run --coverage", "format": "prettier --write \"**/*.{tsx,ts}\"", - "lint": "eslint --fix", + "lint": "eslint --fix . --ext .ts,.tsx", "prepare": "tsc", "test": "pnpm exec vitest" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee3a5806..69d142bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,6 +91,9 @@ importers: packages/config-eslint: devDependencies: + '@eslint/js': + specifier: latest + version: 9.11.1 '@typescript-eslint/eslint-plugin': specifier: latest version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.11.1(jiti@1.21.6))(typescript@5.5.4) @@ -168,7 +171,7 @@ importers: specifier: ^2.0.1 version: 2.0.2(vitest@2.0.2(@types/node@20.14.10)(jsdom@24.1.0)(less@4.2.0)(sass@1.77.8)(terser@5.31.2)) eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 jsdom: specifier: ^24.1.0 From abdab93f9f41adea9e0bcbc9a1cbe99e5ec9f0b7 Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Tue, 24 Sep 2024 09:17:48 -0700 Subject: [PATCH 6/7] ts --- packages/reactor/package.json | 1 - pnpm-lock.yaml | 3 --- 2 files changed, 4 deletions(-) diff --git a/packages/reactor/package.json b/packages/reactor/package.json index 6629e5b0..ae9f7fc3 100644 --- a/packages/reactor/package.json +++ b/packages/reactor/package.json @@ -9,7 +9,6 @@ "@repo/config-prettier": "workspace:*", "@repo/config-typescript": "workspace:*", "@vitest/coverage-v8": "^2.0.1", - "eslint": "^8.57.0", "jsdom": "^24.1.0", "typescript": "^5.3.3", "vitest": "^2.0.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69d142bb..b2f36f93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,9 +170,6 @@ importers: '@vitest/coverage-v8': specifier: ^2.0.1 version: 2.0.2(vitest@2.0.2(@types/node@20.14.10)(jsdom@24.1.0)(less@4.2.0)(sass@1.77.8)(terser@5.31.2)) - eslint: - specifier: ^8.57.0 - version: 8.57.0 jsdom: specifier: ^24.1.0 version: 24.1.0 From 7071bd4561e9a5b5b1b7cf0a9f465a7e07cb38bd Mon Sep 17 00:00:00 2001 From: Kayla Fitzsimmons Date: Tue, 24 Sep 2024 09:40:34 -0700 Subject: [PATCH 7/7] use same eslint command --- apps/mocksi-lite-next/package.json | 2 +- packages/config-eslint/base.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/mocksi-lite-next/package.json b/apps/mocksi-lite-next/package.json index b8a3b98f..4f2d979f 100755 --- a/apps/mocksi-lite-next/package.json +++ b/apps/mocksi-lite-next/package.json @@ -39,7 +39,7 @@ "build": "vite build --mode '${npm_config_mode}'", "dev": "nodemon", "format": "prettier --write \"src/**/*.{tsx,ts}\"", - "lint": "eslint --fix ." + "lint": "eslint --fix . --ext .ts,.tsx" }, "type": "module", "version": "1.2.0" diff --git a/packages/config-eslint/base.js b/packages/config-eslint/base.js index 9444e26b..919f1177 100644 --- a/packages/config-eslint/base.js +++ b/packages/config-eslint/base.js @@ -27,6 +27,9 @@ module.exports = { }, settings: { "import/resolver": { + node: { + extensions: ["•js", ".jsx,", ".ts", ".tsx"], + }, typescript: { project, },