diff --git a/.gitignore b/.gitignore index b339d7ff6..66885ffda 100644 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,4 @@ node_modules/ test_batch.json *.backup.*.json frontend/public/locales/*/translation.backup*.json +/frontend diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index c0f9fd678..5277359ed 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -1,19 +1,39 @@ // @ts-check +import { fileURLToPath } from 'node:url'; import eslint from '@eslint/js'; +import globals from 'globals'; import { defineConfig } from 'eslint/config'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import reactPlugin from 'eslint-plugin-react'; import tseslint from 'typescript-eslint'; +const tsconfigRootDir = fileURLToPath(new URL('./', import.meta.url)); + +const srcGlobs = ['{src,frontend/src}/**/*.{ts,tsx,js,jsx}']; +const srcTsGlobs = ['{src,frontend/src}/**/*.{ts,tsx}']; +const nodeGlobs = [ + 'scripts/**/*.{js,ts}', + 'vite.config.ts', + 'vitest.config.ts', + 'vitest.minimal.config.ts', + 'playwright.config.ts', + 'tailwind.config.js', + 'postcss.config.js', + 'eslint.config.mjs', +]; + export default defineConfig( - eslint.configs.recommended, - tseslint.configs.recommended, { ignores: [ "dist", // Contains 3rd party code "public", // Contains 3rd party code ], }, + eslint.configs.recommended, { + files: ['**/*.{ts,tsx}'], + extends: [...tseslint.configs.recommended], rules: { "no-undef": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-empty-object-type": [ @@ -26,17 +46,112 @@ export default defineConfig( "@typescript-eslint/no-explicit-any": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-require-imports": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-unused-vars": [ - "error", + "warn", { - "args": "all", // All function args must be used (or explicitly ignored) - "argsIgnorePattern": "^_", // Allow unused variables beginning with an underscore - "caughtErrors": "all", // Caught errors must be used (or explicitly ignored) - "caughtErrorsIgnorePattern": "^_", // Allow unused variables beginning with an underscore - "destructuredArrayIgnorePattern": "^_", // Allow unused variables beginning with an underscore - "varsIgnorePattern": "^_", // Allow unused variables beginning with an underscore - "ignoreRestSiblings": true, // Allow unused variables when removing attributes from objects (otherwise this requires explicit renaming like `({ x: _x, ...y }) => y`, which is clunky) + args: 'all', // All function args must be used (or explicitly ignored) + argsIgnorePattern: '^_', // Allow unused variables beginning with an underscore + caughtErrors: 'all', // Caught errors must be used (or explicitly ignored) + caughtErrorsIgnorePattern: '^_', // Allow unused variables beginning with an underscore + destructuredArrayIgnorePattern: '^_', // Allow unused variables beginning with an underscore + varsIgnorePattern: '^_', // Allow unused variables beginning with an underscore + ignoreRestSiblings: true, // Allow unused variables when removing attributes from objects (otherwise this requires explicit renaming like `({ x: _x, ...y }) => y`, which is clunky) }, ], }, + }, + { + files: srcTsGlobs, + extends: [ + ...tseslint.configs.recommendedTypeChecked, + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir, + }, + }, + }, + { + files: srcGlobs, + extends: [reactPlugin.configs.flat.recommended], + languageOptions: { + globals: { + ...globals.browser, + }, + }, + plugins: { + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + 'react/react-in-jsx-scope': 'off', // Not needed with React 17+ + + 'react-hooks/exhaustive-deps': 'off', // Temporarily disabled until codebase conformant + 'react-hooks/rules-of-hooks': 'warn', + '@typescript-eslint/no-empty-function': 'off', + + '@typescript-eslint/no-unsafe-member-access': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-explicit-any': 'off', // Temporarily disabled until codebase conformant + "@typescript-eslint/no-inferrable-types": "off", // Temporarily disabled until codebase conformant + '@typescript-eslint/prefer-nullish-coalescing': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unsafe-assignment': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unsafe-return': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unsafe-call': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unsafe-arguments': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unsafe-argument': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/require-await': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/only-throw-error': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-floating-promises': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/prefer-promise-reject-errors': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/prefer-optional-chain': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unnecessary-type-assertions': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/unbound-method': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-base-to-string': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-misused-promises': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-unnecessary-type-assertion': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/restrict-template-expressions': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/dot-notation': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/prefer-regexp-exec': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/prefer-includes': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/consistent-indexed-object-style': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/non-nullable-type-assertion-style': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/consistent-generic-constructors': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/class-literal-property-style': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/consistent-type-definitions': 'off', // Temporarily disabled until codebase conformant + '@typescript-eslint/no-redundant-type-constituents': 'off', // Temporarily disabled until codebase conformant + + 'react/no-children-prop': 'warn', // Children should be passed as actual children, not via the children prop + 'react/prop-types': 'off', // We use TypeScript's types for props instead + 'react/display-name': 'off', // Temporarily disabled until codebase conformant + 'react/no-unescaped-entities': 'off', // Temporarily disabled until codebase conformant + }, + }, + { + files: [ + 'src/**/*.{test,spec}.{ts,tsx}', + 'src/tests/**/*.{ts,tsx}', + ], + extends: [tseslint.configs.disableTypeChecked], + languageOptions: { + globals: { + ...globals.browser, + ...globals.vitest, + }, + }, + }, + { + files: nodeGlobs, + extends: [tseslint.configs.disableTypeChecked], + languageOptions: { + globals: { + ...globals.node, + }, + }, } ); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ece2aba60..5d75e7c3e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,32 +10,36 @@ "license": "SEE LICENSE IN https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/refs/heads/main/proprietary/LICENSE", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.7.7", - "@embedpdf/core": "^1.2.1", - "@embedpdf/engines": "^1.2.1", - "@embedpdf/plugin-interaction-manager": "^1.2.1", - "@embedpdf/plugin-loader": "^1.2.1", - "@embedpdf/plugin-pan": "^1.2.1", - "@embedpdf/plugin-render": "^1.2.1", - "@embedpdf/plugin-rotate": "^1.2.1", - "@embedpdf/plugin-scroll": "^1.2.1", - "@embedpdf/plugin-search": "^1.2.1", - "@embedpdf/plugin-selection": "^1.2.1", - "@embedpdf/plugin-spread": "^1.2.1", - "@embedpdf/plugin-thumbnail": "^1.2.1", - "@embedpdf/plugin-tiling": "^1.2.1", - "@embedpdf/plugin-viewport": "^1.2.1", - "@embedpdf/plugin-zoom": "^1.2.1", + "@embedpdf/core": "^1.3.1", + "@embedpdf/engines": "^1.3.1", + "@embedpdf/plugin-interaction-manager": "^1.3.1", + "@embedpdf/plugin-loader": "^1.3.1", + "@embedpdf/plugin-pan": "^1.3.1", + "@embedpdf/plugin-render": "^1.3.1", + "@embedpdf/plugin-rotate": "^1.3.1", + "@embedpdf/plugin-scroll": "^1.3.1", + "@embedpdf/plugin-search": "^1.3.1", + "@embedpdf/plugin-selection": "^1.3.1", + "@embedpdf/plugin-spread": "^1.3.1", + "@embedpdf/plugin-thumbnail": "^1.3.1", + "@embedpdf/plugin-tiling": "^1.3.1", + "@embedpdf/plugin-viewport": "^1.3.1", + "@embedpdf/plugin-zoom": "^1.3.1", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@iconify/react": "^6.0.2", - "@mantine/core": "^8.3.1", - "@mantine/dates": "^8.3.1", - "@mantine/dropzone": "^8.3.1", - "@mantine/hooks": "^8.3.1", + "@mantine/core": "^8.3.2", + "@mantine/dates": "^8.3.2", + "@mantine/dropzone": "^8.3.2", + "@mantine/hooks": "^8.3.2", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", "@tailwindcss/postcss": "^4.1.13", "@tanstack/react-virtual": "^3.13.12", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "autoprefixer": "^10.4.21", "axios": "^1.12.2", "i18next": "^25.5.2", @@ -45,19 +49,19 @@ "license-report": "^6.8.0", "pdf-lib": "^1.17.1", "pdfjs-dist": "^5.4.149", - "posthog-js": "^1.268.0", + "posthog-js": "^1.268.5", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.7.3", - "react-router-dom": "^7.9.1", + "react-i18next": "^16.0.0", + "react-router-dom": "^7.9.2", "tailwindcss": "^4.1.13", "web-vitals": "^5.1.0" }, "devDependencies": { "@eslint/js": "^9.36.0", - "@iconify-json/material-symbols": "^1.2.37", + "@iconify-json/material-symbols": "^1.2.39", "@iconify/utils": "^3.0.2", - "@playwright/test": "^1.55.0", + "@playwright/test": "^1.55.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", @@ -70,7 +74,9 @@ "@vitejs/plugin-react-swc": "^4.1.0", "@vitest/coverage-v8": "^3.2.4", "eslint": "^9.36.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "globals": "^16.4.0", "jsdom": "^27.0.0", "license-checker": "^25.0.1", "madge": "^8.0.0", @@ -488,12 +494,13 @@ } }, "node_modules/@embedpdf/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/core/-/core-1.2.1.tgz", - "integrity": "sha512-2VwRPsN3+LmaBrD8TCN1t1ni/Vc9CxAfl/SApDjZYwE7zOieQT4ZHt+nkgF0F4I3xSgvvyHDjmOonhjBIrT6xA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/core/-/core-1.3.1.tgz", + "integrity": "sha512-2Az6trhiMMBIv+GFvV8H8UOS1gwQn7NK0KaJMcdsZbUHYLO0P95aVd6Pi/GRzEH4XyF51TDIoTOAUtf07TQ5dQ==", + "license": "MIT", "dependencies": { - "@embedpdf/engines": "1.2.1", - "@embedpdf/models": "1.2.1" + "@embedpdf/engines": "1.3.1", + "@embedpdf/models": "1.3.1" }, "peerDependencies": { "preact": "^10.26.4", @@ -503,13 +510,13 @@ } }, "node_modules/@embedpdf/engines": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/engines/-/engines-1.2.1.tgz", - "integrity": "sha512-nhycZ7Buq2B34dcpo6n7RdFwdhwTvKzvnRy7QX+uU00Dz5vftkCG4OK+pBVzxE4y7vAu+Yb4wNpdc7HmIj3B6w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/engines/-/engines-1.3.1.tgz", + "integrity": "sha512-G3pI+18la7spviUMuA5s9/hV95jlfkA2+CNxqlHBO5ocw3641E3d36Lv+mx+6yU7k0B5vEOQPZDGRMg7KFziBQ==", "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1", - "@embedpdf/pdfium": "1.2.1" + "@embedpdf/models": "1.3.1", + "@embedpdf/pdfium": "1.3.1" }, "peerDependencies": { "preact": "^10.26.4", @@ -519,26 +526,27 @@ } }, "node_modules/@embedpdf/models": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/models/-/models-1.2.1.tgz", - "integrity": "sha512-FzJU51jsqihfgt50B00FEpgyym87/Dn2iGmMq4++Vu/oO6qBx/y69m4/cCAh4p4KkTJsvKNWC7T7dwSKa0FjHA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/models/-/models-1.3.1.tgz", + "integrity": "sha512-OzmO1rQAuOP/Y3aYXmW21dPNAx49olhr9ZO2hDdI0fbNBHTVGxnaKqOISxVmUz7TmhTwVBljERACnaA8Ib4b4Q==", "license": "MIT" }, "node_modules/@embedpdf/pdfium": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/pdfium/-/pdfium-1.2.1.tgz", - "integrity": "sha512-QWf1jg7EqUlku2q6KYhlXCNfk5IAykFerPuzKJepHTeAEaRcAfu84fJgEsoUTCK4D6dfzVNp2Iuxw6Kv7MpSeg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/pdfium/-/pdfium-1.3.1.tgz", + "integrity": "sha512-qYGSS5ntz6DSY9Cxw/aigvHqGB+AKJLEcymNTZOL0GdlBzZpL++dOIYNEYHO2Tm/lOQVpE7I0e+Xh2TvD8O1zQ==", "license": "MIT" }, "node_modules/@embedpdf/plugin-interaction-manager": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-interaction-manager/-/plugin-interaction-manager-1.2.1.tgz", - "integrity": "sha512-HhEBuDjDNMH6wu76Eo3yHwjG01U1lNZShkOsFoib/rtx8HByTgZS8iVpovaOprr6gfS04ZLqWcsN1nt5qAH90w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-interaction-manager/-/plugin-interaction-manager-1.3.1.tgz", + "integrity": "sha512-8h3y5a9tQ1fZlc4mP1/+XKyuHWwcQEm9AujKxy+6f6omtCBzpnKrH95bURgYOzQEBGY7d5C3HvG6JOlh0o1x3A==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", + "@embedpdf/core": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -546,14 +554,15 @@ } }, "node_modules/@embedpdf/plugin-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-loader/-/plugin-loader-1.2.1.tgz", - "integrity": "sha512-VblKErfEiHcVao18TfCmc0UJlKAkqxE29DaLJrXQHGUw/qc+pC9HlvMVpDz3+Eb13UafYS6ZUZuEng2/fQ+JJw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-loader/-/plugin-loader-1.3.1.tgz", + "integrity": "sha512-NjNmA7TOs3E/zwb9I+YohzyGkxq8y5NUGu0MKgh2g41lZoFvyqTAjFPar+RjEiLX8iiJiwNZswyJsNrytmS3Xg==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", + "@embedpdf/core": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -561,16 +570,17 @@ } }, "node_modules/@embedpdf/plugin-pan": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-pan/-/plugin-pan-1.2.1.tgz", - "integrity": "sha512-/BTOyRl31tvnCmoLs4qNPROMRLaG34jGYNyMQquB0uPUXZjwdMloikriwos91qCOLUrhvs4SaDpC3Ghv2BO5kA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-pan/-/plugin-pan-1.3.1.tgz", + "integrity": "sha512-lF1gkz/a77G3+Rr8MOefkGnPJ1i5xWnClXm2ZzYAl7PbOScp59/PaP7qeU7eMPC4FHQM81ZhCgVYGXogbaB8ww==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-interaction-manager": "1.2.1", - "@embedpdf/plugin-viewport": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-interaction-manager": "1.3.1", + "@embedpdf/plugin-viewport": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -578,14 +588,15 @@ } }, "node_modules/@embedpdf/plugin-render": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-render/-/plugin-render-1.2.1.tgz", - "integrity": "sha512-iMfuVJqttJmm7Zb8oOaqNVNrC3NS57bDNNAc4MIc2f2TxIFSznvBPlwWN+PN45qNcTQiGzFc1ZMqIQDOG4qFnQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-render/-/plugin-render-1.3.1.tgz", + "integrity": "sha512-c9oH097e1CVUpYF9RgZRfV/7XCJ0pf+svdT1wyM2MbWby06ti20oCwT9wf7BLY0hPQ7+eO3wunr1I1/y3MnVrw==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", + "@embedpdf/core": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -593,14 +604,15 @@ } }, "node_modules/@embedpdf/plugin-rotate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-rotate/-/plugin-rotate-1.2.1.tgz", - "integrity": "sha512-UhHds5donLDXm3i9nKrhSmo3yawVtjb6gID0MDrhj3+Lci/YQ3wDvGUhk7dNmgLcOt7G8pMa0wesnnpVWirUXA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-rotate/-/plugin-rotate-1.3.1.tgz", + "integrity": "sha512-mRAlIW7IZAnCyDuYqN13yDc6yoNIYLUB4uYTUAR7vTIt021C8H5jDHk9TmLwcH0tQ8/R3yHuDm/XPAe0zfs81g==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", + "@embedpdf/core": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -608,15 +620,16 @@ } }, "node_modules/@embedpdf/plugin-scroll": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-scroll/-/plugin-scroll-1.2.1.tgz", - "integrity": "sha512-I1haDXIOzs59uhOWEP6UvP5jzjcQHMLQuQbfRVJM0zdWU6t3jwSfcwPUI7iv4CAAepbuyJKL328yc8736r/FYw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-scroll/-/plugin-scroll-1.3.1.tgz", + "integrity": "sha512-mDvK3DyBZC8/8pOEdJsWtSjCmV2ZuZJJ6xfspJpsaDVywo1Vq6M55BtKThkhqED6mqbFWTN9rP9cbWG8KDBWVA==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-viewport": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-viewport": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -624,15 +637,16 @@ } }, "node_modules/@embedpdf/plugin-search": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-search/-/plugin-search-1.2.1.tgz", - "integrity": "sha512-sl9FBQzbOBtdmPpf6UI0bnWCTPWDkj47rTxyK07bpnGfGuFof4zhcxmMaFdyP7zqBh4Y9XqGu4A0uMTO2d/t7g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-search/-/plugin-search-1.3.1.tgz", + "integrity": "sha512-SLwYPQg1NJWytq2sd4MnWFmRVGgzwbohBedB2kH0ALsvdnoRYqgjR5HqAsKgoRJO/pphQhHlk3L1gLW62r6hqQ==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-loader": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-loader": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -640,16 +654,17 @@ } }, "node_modules/@embedpdf/plugin-selection": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-selection/-/plugin-selection-1.2.1.tgz", - "integrity": "sha512-wgG1X1sl6sed3pv7WLIO74SX0x3389/ax+/OLMty/LFbDNYMRO+n8ZQss8aUM700HARIqkPJy7UoSQt91o4nwA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-selection/-/plugin-selection-1.3.1.tgz", + "integrity": "sha512-yef2XB/zR7zjyeUB3Ul0SbTcXqu5isR0GtINkFwL7bJMok6HpYNDnMXSuo55BaxI0dOCnnCSZfoRkAgosnZ1uQ==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-interaction-manager": "1.2.1", - "@embedpdf/plugin-viewport": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-interaction-manager": "1.3.1", + "@embedpdf/plugin-viewport": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -657,15 +672,16 @@ } }, "node_modules/@embedpdf/plugin-spread": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-spread/-/plugin-spread-1.2.1.tgz", - "integrity": "sha512-rpadnutT1wSdBQV7RQz40zYdKgCRgmJde/tamgB8oHQypcnZGQcAG6/ZfX5j12s9pG18hKwwL+KmMoBnXD9IjQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-spread/-/plugin-spread-1.3.1.tgz", + "integrity": "sha512-RJ/kgJsFRdtWlPMXTW1feUSb6WHIvxtNRLgqzX8dlFIoyc4oZex2Vw+URo/VZuWSe/NvCIihQ20rkNAQJMnNMQ==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-loader": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-loader": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -673,32 +689,34 @@ } }, "node_modules/@embedpdf/plugin-thumbnail": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-thumbnail/-/plugin-thumbnail-1.2.1.tgz", - "integrity": "sha512-TjHPkK8p3+FDMLcUdb3/4VREjm+liVooufLPVZ3FCXHbiC0PeUkqnwAxpCS2Jw1n+EtkY8pefRdRJeZhO6plOQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-thumbnail/-/plugin-thumbnail-1.3.1.tgz", + "integrity": "sha512-xv96ESa7JgD5z+TzcOK18/u0gq3d9v7QPv2wpr0ZhcnwLwf4sH0eUJZIsv7z7DMOpBNz7o7jJbrtxDUdCEHGhg==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-render": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-render": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@embedpdf/plugin-tiling": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-tiling/-/plugin-tiling-1.2.1.tgz", - "integrity": "sha512-C9uOGVIsoxUw+uQMXfJFZ8ibRLQeNOnaKC2izjx967iGu0ZoecAv+mKtH/Ge0vMEKYM1109AlF5T2EGwKQW2YA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-tiling/-/plugin-tiling-1.3.1.tgz", + "integrity": "sha512-Q8RF80fb6y9GDAKwvgsu0BsWJlQuhNCtSKWwp3YcZJtIBFm94DVcg0zTgvDmE9/WNOmn4Z1Edt86usmYauHolw==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-render": "1.2.1", - "@embedpdf/plugin-scroll": "1.2.1", - "@embedpdf/plugin-viewport": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-render": "1.3.1", + "@embedpdf/plugin-scroll": "1.3.1", + "@embedpdf/plugin-viewport": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -706,14 +724,15 @@ } }, "node_modules/@embedpdf/plugin-viewport": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-viewport/-/plugin-viewport-1.2.1.tgz", - "integrity": "sha512-yvftOis7FLBjM3w2VYO5LXVKXoHkmFV/SPy7U6SbuLJTX126F4ohSij9euMHJjaqOgr5tBNvrf4xemVRglxM9w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-viewport/-/plugin-viewport-1.3.1.tgz", + "integrity": "sha512-gzosrWL18ZhN175Kxocf/p7uqYBhNHvEuV1CpJQmN7ys48aew6Qq8z7MjAsCnJBANXk/8syNdo3qWwBriyjQNg==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1" + "@embedpdf/models": "1.3.1" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", + "@embedpdf/core": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -721,18 +740,19 @@ } }, "node_modules/@embedpdf/plugin-zoom": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@embedpdf/plugin-zoom/-/plugin-zoom-1.2.1.tgz", - "integrity": "sha512-hsp/nM4C8q0FM9P6FkpQLbU8IYawUgmiYgD3HXqHWBVRk30OIaXs4N0KC9vsHwn8ZAiyLl7jhlAXpgoacH5xEQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@embedpdf/plugin-zoom/-/plugin-zoom-1.3.1.tgz", + "integrity": "sha512-3GXpgv6XmZiQnjaPbsxblTqUn84ALFiyONh2gwrEU9apB6STT3TQiY0QRindwrUXdQLpCSjRSB9PpDBCtTww7w==", + "license": "MIT", "dependencies": { - "@embedpdf/models": "1.2.1", + "@embedpdf/models": "1.3.1", "hammerjs": "^2.0.8" }, "peerDependencies": { - "@embedpdf/core": "1.2.1", - "@embedpdf/plugin-interaction-manager": "1.2.1", - "@embedpdf/plugin-scroll": "1.2.1", - "@embedpdf/plugin-viewport": "1.2.1", + "@embedpdf/core": "1.3.1", + "@embedpdf/plugin-interaction-manager": "1.3.1", + "@embedpdf/plugin-scroll": "1.3.1", + "@embedpdf/plugin-viewport": "1.3.1", "preact": "^10.26.4", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -1632,9 +1652,9 @@ } }, "node_modules/@iconify-json/material-symbols": { - "version": "1.2.37", - "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.37.tgz", - "integrity": "sha512-T9R1IUJ3CBWGTo/qJLpXTPwy9JOCJucSONXxJKIdUpOzINhFfHBg8TvUUVcFNv8qw6L4upQyptnI6iJqbxxUWw==", + "version": "1.2.39", + "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.39.tgz", + "integrity": "sha512-spjiB1I5jPi6hV5b/QyC4zO8GRYGCbb6/DaHm754NJFqNli6bsYDpN4HYVl67XhU49rYljvJyNc/6lYEf+jokA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1679,6 +1699,19 @@ "mlly": "^1.7.4" } }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1856,9 +1889,9 @@ "license": "MIT" }, "node_modules/@mantine/core": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.1.tgz", - "integrity": "sha512-OYfxn9cTv+K6RZ8+Ozn/HDQXkB8Fmn+KJJt5lxyFDP9F09EHnC59Ldadv1LyUZVBGtNqz4sn6b3vBShbxwAmYw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.2.tgz", + "integrity": "sha512-uIHC9ooEZ9E+/pw8ag4f8pi0GmwSQ1DYnETjr4a4ZNVKJHfVv5NSkjprBxPrKJq9oox/SdcrAWy5XlKTwBzRag==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.16", @@ -1869,46 +1902,46 @@ "type-fest": "^4.41.0" }, "peerDependencies": { - "@mantine/hooks": "8.3.1", + "@mantine/hooks": "8.3.2", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "node_modules/@mantine/dates": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-8.3.1.tgz", - "integrity": "sha512-qCGlLnrwu9eQsl+yQC/tEYgTEO8rE6hopagNpTV2/wzLBUywlL/AbtB1yHuOikQgZxXAOLfvIBWNTWUHRtTnfw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-8.3.2.tgz", + "integrity": "sha512-qO9Aft+icFGSeLFTbbHfef/UIKpmUzwujsYuRFw8o6cqOqhqjlC9ObE/3DATxvS+vK9BxODUZYGtE2sI4XUO3Q==", "license": "MIT", "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { - "@mantine/core": "8.3.1", - "@mantine/hooks": "8.3.1", + "@mantine/core": "8.3.2", + "@mantine/hooks": "8.3.2", "dayjs": ">=1.0.0", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "node_modules/@mantine/dropzone": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-8.3.1.tgz", - "integrity": "sha512-jsaZhX02Uu8FDWBYNk59wWEBNO0hrayuBfRGqSjY/FQwRHZXIBgfuBsE3AIBJte6ptX+gWSR0Bhwids0LicEtg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@mantine/dropzone/-/dropzone-8.3.2.tgz", + "integrity": "sha512-2NInRbW0M+mNfBLa90P4zN0UfXs8bUWiKRR7Fw9qYV+xWML1O4HMoNcFRB2kLPZbb3ld0d2bMXfW+0j/GOhLuw==", "license": "MIT", "dependencies": { "react-dropzone": "14.3.8" }, "peerDependencies": { - "@mantine/core": "8.3.1", - "@mantine/hooks": "8.3.1", + "@mantine/core": "8.3.2", + "@mantine/hooks": "8.3.2", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "node_modules/@mantine/hooks": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.1.tgz", - "integrity": "sha512-lQutBS+Q0iz/cNFvdrsYassPWo3RtWcmDGJeOtKfHigLzFOhxUuLOkQgepDbMf3WcVMB/tist6Px1PQOv57JTw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.2.tgz", + "integrity": "sha512-urDgQJNAs2t2mAyGaA+7uNsBMRn9U/ccvi+ZUl5ef3/Wzfv5KYHe9LA9DBNhn24BTSewxrI27W0EFpFxv/Jsbg==", "license": "MIT", "peerDependencies": { "react": "^18.x || ^19.x" @@ -2400,13 +2433,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", + "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0" + "playwright": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -2426,9 +2459,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.1.0.tgz", - "integrity": "sha512-igElrcnRPJh2nWYACschjH4OwGwzSa6xVFzRDVzpnjirUivdJ8nv4hE+H31nvwE56MFhvvglfHuotnWLMcRW7w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.2.1.tgz", + "integrity": "sha512-zNw96BipqM5/Tf161Q8/K5zpwGY3ezfb2wz+Yc3fIT5OQHW8eEzkQldPgtFKMUkqImc73ukEa2IdUpS6vEGH7w==", "license": "MIT" }, "node_modules/@rolldown/pluginutils": { @@ -4220,6 +4253,23 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -4230,6 +4280,127 @@ "node": ">=0.10.0" } }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4276,6 +4447,16 @@ "dev": true, "license": "MIT" }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4328,6 +4509,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", @@ -4565,6 +4762,25 @@ "node": ">=18" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -4578,6 +4794,23 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4981,6 +5214,60 @@ "node": ">=20" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { "version": "1.11.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", @@ -5098,6 +5385,42 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5323,6 +5646,19 @@ "wrappy": "1" } }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -5418,6 +5754,75 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -5436,6 +5841,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -5470,6 +5903,37 @@ "node": ">= 0.4" } }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", @@ -5627,6 +6091,39 @@ } } }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, "node_modules/eslint-plugin-react-hooks": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", @@ -5640,6 +6137,58 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -6058,6 +6607,22 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -6172,6 +6737,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-amd-module-type": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", @@ -6274,6 +6870,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6334,9 +6948,9 @@ } }, "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -6346,6 +6960,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gonzales-pe": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", @@ -6421,6 +7052,19 @@ "node": ">=0.8.0" } }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6431,6 +7075,35 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -6730,12 +7403,81 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -6749,6 +7491,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -6764,6 +7536,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6774,6 +7581,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6784,6 +7607,25 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6807,6 +7649,32 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6817,6 +7685,23 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -6834,6 +7719,25 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -6844,6 +7748,35 @@ "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", @@ -6856,6 +7789,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -6889,6 +7873,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6956,6 +7986,24 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -7104,6 +8152,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -8169,6 +9233,104 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8269,6 +9431,24 @@ "os-tmpdir": "^1.0.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", @@ -8535,13 +9715,13 @@ } }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", + "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -8554,9 +9734,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", + "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8576,6 +9756,16 @@ "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -8851,12 +10041,12 @@ } }, "node_modules/posthog-js": { - "version": "1.268.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.268.0.tgz", - "integrity": "sha512-rEtziXONYXi+KKXBTzkxCTsHHKohLQvyAF2uEdXMwmL1vLW+f9rbroa2XuA9QUrvfboJXb5Pvysa+HnFnWnUcw==", + "version": "1.268.5", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.268.5.tgz", + "integrity": "sha512-IRhFBeCKkl4bapbxmLvWedKUOG7Fh9jJab718qm7ce8j66LWaPiX7mEi/iuoYLYRU3wD6mWFFiWmeXh6prczRg==", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@posthog/core": "1.1.0", + "@posthog/core": "1.2.1", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", @@ -9173,16 +10363,16 @@ } }, "node_modules/react-i18next": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.3.tgz", - "integrity": "sha512-AANws4tOE+QSq/IeMF/ncoHlMNZaVLxpa5uUGW1wjike68elVYr0018L9xYoqBr1OFO7G7boDPrbn0HpMCJxTw==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.0.0.tgz", + "integrity": "sha512-JQ+dFfLnFSKJQt7W01lJHWRC0SX7eDPobI+MSTJ3/gP39xH2g33AuTE7iddAfXYHamJdAeMGM0VFboPaD3G68Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { - "i18next": ">= 25.4.1", + "i18next": ">= 25.5.2", "react": ">= 16.8.0", "typescript": "^5" }, @@ -9274,9 +10464,9 @@ "license": "0BSD" }, "node_modules/react-router": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.1.tgz", - "integrity": "sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.2.tgz", + "integrity": "sha512-i2TPp4dgaqrOqiRGLZmqh2WXmbdFknUyiCRmSKs0hf6fWXkTKg5h56b+9F22NbGRAMxjYfqQnpi63egzD2SuZA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -9296,12 +10486,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.1.tgz", - "integrity": "sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.2.tgz", + "integrity": "sha512-pagqpVJnjZOfb+vIM23eTp7Sp/AAJjOgaowhP1f1TWOdk5/W8Uk8d/M/0wfleqx7SgjitjNPPsKeCZE1hTSp3w==", "license": "MIT", "dependencies": { - "react-router": "7.9.1" + "react-router": "7.9.2" }, "engines": { "node": ">=20.0.0" @@ -9481,6 +10671,50 @@ "node": ">=8" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9687,12 +10921,81 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -9781,6 +11084,55 @@ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "license": "MIT" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -9810,6 +11162,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -9959,6 +11387,20 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -10009,6 +11451,104 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -10543,6 +12083,84 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", @@ -10588,6 +12206,25 @@ "dev": true, "license": "MIT" }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "7.12.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", @@ -11160,6 +12797,102 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 0cd9713d0..3d77385dc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,32 +6,36 @@ "proxy": "http://localhost:8080", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.7.7", - "@embedpdf/core": "^1.2.1", - "@embedpdf/engines": "^1.2.1", - "@embedpdf/plugin-interaction-manager": "^1.2.1", - "@embedpdf/plugin-loader": "^1.2.1", - "@embedpdf/plugin-pan": "^1.2.1", - "@embedpdf/plugin-render": "^1.2.1", - "@embedpdf/plugin-rotate": "^1.2.1", - "@embedpdf/plugin-scroll": "^1.2.1", - "@embedpdf/plugin-search": "^1.2.1", - "@embedpdf/plugin-selection": "^1.2.1", - "@embedpdf/plugin-spread": "^1.2.1", - "@embedpdf/plugin-thumbnail": "^1.2.1", - "@embedpdf/plugin-tiling": "^1.2.1", - "@embedpdf/plugin-viewport": "^1.2.1", - "@embedpdf/plugin-zoom": "^1.2.1", + "@embedpdf/core": "^1.3.1", + "@embedpdf/engines": "^1.3.1", + "@embedpdf/plugin-interaction-manager": "^1.3.1", + "@embedpdf/plugin-loader": "^1.3.1", + "@embedpdf/plugin-pan": "^1.3.1", + "@embedpdf/plugin-render": "^1.3.1", + "@embedpdf/plugin-rotate": "^1.3.1", + "@embedpdf/plugin-scroll": "^1.3.1", + "@embedpdf/plugin-search": "^1.3.1", + "@embedpdf/plugin-selection": "^1.3.1", + "@embedpdf/plugin-spread": "^1.3.1", + "@embedpdf/plugin-thumbnail": "^1.3.1", + "@embedpdf/plugin-tiling": "^1.3.1", + "@embedpdf/plugin-viewport": "^1.3.1", + "@embedpdf/plugin-zoom": "^1.3.1", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@iconify/react": "^6.0.2", - "@mantine/core": "^8.3.1", - "@mantine/dates": "^8.3.1", - "@mantine/dropzone": "^8.3.1", - "@mantine/hooks": "^8.3.1", + "@mantine/core": "^8.3.2", + "@mantine/dates": "^8.3.2", + "@mantine/dropzone": "^8.3.2", + "@mantine/hooks": "^8.3.2", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", "@tailwindcss/postcss": "^4.1.13", "@tanstack/react-virtual": "^3.13.12", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "autoprefixer": "^10.4.21", "axios": "^1.12.2", "i18next": "^25.5.2", @@ -41,11 +45,11 @@ "license-report": "^6.8.0", "pdf-lib": "^1.17.1", "pdfjs-dist": "^5.4.149", - "posthog-js": "^1.268.0", + "posthog-js": "^1.268.5", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.7.3", - "react-router-dom": "^7.9.1", + "react-i18next": "^16.0.0", + "react-router-dom": "^7.9.2", "tailwindcss": "^4.1.13", "web-vitals": "^5.1.0" }, @@ -54,6 +58,7 @@ "dev": "npm run typecheck && vite", "prebuild": "npm run generate-icons", "lint": "eslint", + "lint:fix": "eslint --fix", "build": "npm run typecheck && vite build", "preview": "vite preview", "typecheck": "tsc --noEmit", @@ -94,9 +99,9 @@ }, "devDependencies": { "@eslint/js": "^9.36.0", - "@iconify-json/material-symbols": "^1.2.37", + "@iconify-json/material-symbols": "^1.2.39", "@iconify/utils": "^3.0.2", - "@playwright/test": "^1.55.0", + "@playwright/test": "^1.55.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", @@ -109,7 +114,9 @@ "@vitejs/plugin-react-swc": "^4.1.0", "@vitest/coverage-v8": "^3.2.4", "eslint": "^9.36.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "globals": "^16.4.0", "jsdom": "^27.0.0", "license-checker": "^25.0.1", "madge": "^8.0.0", diff --git a/frontend/src/components/pageEditor/DragDropGrid.tsx b/frontend/src/components/pageEditor/DragDropGrid.tsx index 715929567..38702dfa6 100644 --- a/frontend/src/components/pageEditor/DragDropGrid.tsx +++ b/frontend/src/components/pageEditor/DragDropGrid.tsx @@ -14,7 +14,7 @@ interface DragDropGridProps { selectionMode: boolean; isAnimating: boolean; onReorderPages: (sourcePageNumber: number, targetIndex: number, selectedPageIds?: string[]) => void; - renderItem: (item: T, index: number, refs: React.MutableRefObject>) => React.ReactNode; + renderItem: (item: T, index: number, refs: React.RefObject>) => React.ReactNode; renderSplitMarker?: (item: T, index: number) => React.ReactNode; } diff --git a/frontend/src/components/pageEditor/PageThumbnail.tsx b/frontend/src/components/pageEditor/PageThumbnail.tsx index dfa098af1..b8cdb182c 100644 --- a/frontend/src/components/pageEditor/PageThumbnail.tsx +++ b/frontend/src/components/pageEditor/PageThumbnail.tsx @@ -23,7 +23,7 @@ interface PageThumbnailProps { selectionMode: boolean; movingPage: number | null; isAnimating: boolean; - pageRefs: React.MutableRefObject>; + pageRefs: React.RefObject>; onReorderPages: (sourcePageNumber: number, targetIndex: number, selectedPageIds?: string[]) => void; onTogglePage: (pageId: string) => void; onAnimateReorder: () => void; diff --git a/frontend/src/components/shared/FileGrid.tsx b/frontend/src/components/shared/FileGrid.tsx index 678bedca1..11a6be91f 100644 --- a/frontend/src/components/shared/FileGrid.tsx +++ b/frontend/src/components/shared/FileGrid.tsx @@ -8,7 +8,7 @@ import { StirlingFileStub } from "../../types/fileContext"; import { FileId } from "../../types/file"; interface FileGridProps { - files: Array<{ file: File; record?: StirlingFileStub }>; + files: { file: File; record?: StirlingFileStub }[]; onRemove?: (index: number) => void; onDoubleClick?: (item: { file: File; record?: StirlingFileStub }) => void; onView?: (item: { file: File; record?: StirlingFileStub }) => void; diff --git a/frontend/src/components/toast/index.ts b/frontend/src/components/toast/index.ts index d0b1045f2..1279ae46a 100644 --- a/frontend/src/components/toast/index.ts +++ b/frontend/src/components/toast/index.ts @@ -8,7 +8,7 @@ export { useToast, ToastProvider, ToastRenderer }; let _api: ReturnType | null = null; function createImperativeApi() { - const subscribers: Array<(fn: any) => void> = []; + const subscribers: ((fn: any) => void)[] = []; let api: any = null; return { provide(instance: any) { diff --git a/frontend/src/components/tools/SearchResults.tsx b/frontend/src/components/tools/SearchResults.tsx index 5bd6036cc..219df3ba8 100644 --- a/frontend/src/components/tools/SearchResults.tsx +++ b/frontend/src/components/tools/SearchResults.tsx @@ -9,7 +9,7 @@ import NoToolsFound from './shared/NoToolsFound'; import "./toolPicker/ToolPicker.css"; interface SearchResultsProps { - filteredTools: Array<{ item: [string, ToolRegistryEntry]; matchedText?: string }>; + filteredTools: { item: [string, ToolRegistryEntry]; matchedText?: string }[]; onSelect: (id: string) => void; searchQuery?: string; } @@ -40,13 +40,13 @@ const SearchResults: React.FC = ({ filteredTools, onSelect, {group.tools.map(({ id, tool }) => { const matchedText = matchedTextMap.get(id); // Check if the match was from synonyms and show the actual synonym that matched - const isSynonymMatch = matchedText && tool.synonyms?.some(synonym => + const isSynonymMatch = matchedText && tool.synonyms?.some(synonym => matchedText.toLowerCase().includes(synonym.toLowerCase()) ); - const matchedSynonym = isSynonymMatch ? tool.synonyms?.find(synonym => + const matchedSynonym = isSynonymMatch ? tool.synonyms?.find(synonym => matchedText.toLowerCase().includes(synonym.toLowerCase()) ) : undefined; - + return ( void; - filteredTools: Array<{ item: [string, ToolRegistryEntry]; matchedText?: string }>; + filteredTools: { item: [string, ToolRegistryEntry]; matchedText?: string }[]; isSearching?: boolean; } diff --git a/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.test.tsx b/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.test.tsx index d126c7d31..14d0cf1e4 100644 --- a/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.test.tsx +++ b/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.test.tsx @@ -34,7 +34,7 @@ describe('ChangePermissionsSettings', () => { ); // Should render checkboxes for all permission types - const permissionKeys = Object.keys(defaultParameters) as Array; + const permissionKeys = Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[]; const checkboxes = screen.getAllByRole('checkbox'); expect(checkboxes).toHaveLength(permissionKeys.length); @@ -55,7 +55,7 @@ describe('ChangePermissionsSettings', () => { ); - const permissionKeys = Object.keys(defaultParameters) as Array; + const permissionKeys = Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[]; permissionKeys.forEach(permission => { expect(screen.getByText(`mock-changePermissions.permissions.${permission}.label`)).toBeInTheDocument(); @@ -183,13 +183,13 @@ describe('ChangePermissionsSettings', () => { ); - const permissionKeys = Object.keys(defaultParameters) as Array; + const permissionKeys = Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[]; permissionKeys.forEach(permission => { expect(mockT).toHaveBeenCalledWith(`changePermissions.permissions.${permission}.label`, permission); }); }); - test.each(Object.keys(defaultParameters) as Array)('should handle %s permission type individually', (permission) => { + test.each(Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[])('should handle %s permission type individually', (permission) => { const testParameters: ChangePermissionsParameters = { ...defaultParameters, [permission]: true diff --git a/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.tsx b/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.tsx index 06ac6ac69..83e132ec6 100644 --- a/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.tsx +++ b/frontend/src/components/tools/changePermissions/ChangePermissionsSettings.tsx @@ -14,7 +14,7 @@ const ChangePermissionsSettings = ({ parameters, onParameterChange, disabled = f return ( - {(Object.keys(parameters) as Array).map((key) => ( + {(Object.keys(parameters) as (keyof ChangePermissionsParameters)[]).map((key) => ( (key: K, value: ConvertParameters[K]) => void; - getAvailableToExtensions: (fromExtension: string) => Array<{value: string, label: string, group: string}>; + getAvailableToExtensions: (fromExtension: string) => {value: string, label: string, group: string}[]; selectedFiles: StirlingFile[]; disabled?: boolean; } diff --git a/frontend/src/components/tools/sanitize/SanitizeSettings.tsx b/frontend/src/components/tools/sanitize/SanitizeSettings.tsx index 21ef7c0aa..b40f56399 100644 --- a/frontend/src/components/tools/sanitize/SanitizeSettings.tsx +++ b/frontend/src/components/tools/sanitize/SanitizeSettings.tsx @@ -11,7 +11,7 @@ interface SanitizeSettingsProps { const SanitizeSettings = ({ parameters, onParameterChange, disabled = false }: SanitizeSettingsProps) => { const { t } = useTranslation(); - const options = (Object.keys(defaultParameters) as Array).map((key) => ({ + const options = (Object.keys(defaultParameters) as (keyof SanitizeParameters)[]).map((key) => ({ key: key, label: t(`sanitize.options.${key}`, key), description: t(`sanitize.options.${key}.desc`, `${key} from the PDF`), diff --git a/frontend/src/components/tools/shared/renderToolButtons.tsx b/frontend/src/components/tools/shared/renderToolButtons.tsx index a4aadf20b..c4d0f5422 100644 --- a/frontend/src/components/tools/shared/renderToolButtons.tsx +++ b/frontend/src/components/tools/shared/renderToolButtons.tsx @@ -14,7 +14,7 @@ export const renderToolButtons = ( onSelect: (id: string) => void, showSubcategoryHeader: boolean = true, disableNavigation: boolean = false, - searchResults?: Array<{ item: [string, any]; matchedText?: string }> + searchResults?: { item: [string, any]; matchedText?: string }[] ) => { // Create a map of matched text for quick lookup const matchedTextMap = new Map(); @@ -32,7 +32,7 @@ export const renderToolButtons = (
{subcategory.tools.map(({ id, tool }) => { const matchedSynonym = matchedTextMap.get(id); - + return ( { - const { t } = useTranslation(); - - return { - header: { - title: t("pageSelection.tooltip.header.title", "Page Selection Guide") - }, - tips: [ - { - description: t("pageSelection.tooltip.description", "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.") - }, - { - title: t("pageSelection.tooltip.individual.title", "Individual Pages"), - description: t("pageSelection.tooltip.individual.description", "Enter numbers separated by commas."), - bullets: [ - t("pageSelection.tooltip.individual.bullet1", "1,3,5 → selects pages 1, 3, 5"), - t("pageSelection.tooltip.individual.bullet2", "2,7,12 → selects pages 2, 7, 12") - ] - }, - { - title: t("pageSelection.tooltip.ranges.title", "Page Ranges"), - description: t("pageSelection.tooltip.ranges.description", "Use - for consecutive pages."), - bullets: [ - t("pageSelection.tooltip.ranges.bullet1", "3-6 → selects pages 3–6"), - t("pageSelection.tooltip.ranges.bullet2", "10-15 → selects pages 10–15"), - t("pageSelection.tooltip.ranges.bullet3", "5- → selects pages 5 to end") - ] - }, - { - title: t("pageSelection.tooltip.mathematical.title", "Mathematical Functions"), - description: t("pageSelection.tooltip.mathematical.description", "Use n in formulas for patterns."), - bullets: [ - t("pageSelection.tooltip.mathematical.bullet2", "2n-1 → all odd pages (1, 3, 5…)"), - t("pageSelection.tooltip.mathematical.bullet1", "2n → all even pages (2, 4, 6…)"), - t("pageSelection.tooltip.mathematical.bullet3", "3n → every 3rd page (3, 6, 9…)"), - t("pageSelection.tooltip.mathematical.bullet4", "4n-1 → pages 3, 7, 11, 15…") - ] - }, - { - title: t("pageSelection.tooltip.special.title", "Special Keywords"), - bullets: [ - t("pageSelection.tooltip.special.bullet1", "all → selects all pages"), - ] - }, - { - title: t("pageSelection.tooltip.complex.title", "Complex Combinations"), - description: t("pageSelection.tooltip.complex.description", "Mix different types."), - bullets: [ - t("pageSelection.tooltip.complex.bullet1", "1,3-5,8,2n → pages 1, 3–5, 8, plus evens"), - t("pageSelection.tooltip.complex.bullet2", "10-,2n-1 → from page 10 to end + odd pages") - ] - } - ] - }; -}; \ No newline at end of file diff --git a/frontend/src/components/viewer/CustomSearchLayer.tsx b/frontend/src/components/viewer/CustomSearchLayer.tsx index 9df19a230..85d61c8b0 100644 --- a/frontend/src/components/viewer/CustomSearchLayer.tsx +++ b/frontend/src/components/viewer/CustomSearchLayer.tsx @@ -14,19 +14,19 @@ interface SearchLayerProps { } interface SearchResultState { - results: Array<{ + results: { pageIndex: number; - rects: Array<{ + rects: { origin: { x: number; y: number }; size: { width: number; height: number }; - }>; - }>; + }[]; + }[]; activeResultIndex?: number; } -export function CustomSearchLayer({ - pageIndex, - scale, +export function CustomSearchLayer({ + pageIndex, + scale, highlightColor = SEARCH_CONSTANTS.HIGHLIGHT_COLORS.BACKGROUND, activeHighlightColor = SEARCH_CONSTANTS.HIGHLIGHT_COLORS.ACTIVE_BACKGROUND, opacity = SEARCH_CONSTANTS.HIGHLIGHT_COLORS.OPACITY, @@ -42,17 +42,17 @@ export function CustomSearchLayer({ if (!searchProvides) { return; } - + const unsubscribe = searchProvides.onSearchResultStateChange?.((state: SearchResultState) => { // Auto-scroll to active search result if (state?.results && state.activeResultIndex !== undefined && state.activeResultIndex >= 0) { const activeResult = state.results[state.activeResultIndex]; - if (activeResult) { + if (activeResult) { const pageNumber = activeResult.pageIndex + 1; // Convert to 1-based page number scrollActions.scrollToPage(pageNumber); } } - + setSearchResultState(state); }); @@ -69,7 +69,7 @@ export function CustomSearchLayer({ const filtered = searchResultState.results .map((result, originalIndex) => ({ result, originalIndex })) .filter(({ result }) => result.pageIndex === pageIndex); - + return filtered; }, [searchResultState, pageIndex]); @@ -78,7 +78,7 @@ export function CustomSearchLayer({ } return ( -
); -} \ No newline at end of file +} diff --git a/frontend/src/components/viewer/SearchAPIBridge.tsx b/frontend/src/components/viewer/SearchAPIBridge.tsx index 67bb4c446..06f7955f8 100644 --- a/frontend/src/components/viewer/SearchAPIBridge.tsx +++ b/frontend/src/components/viewer/SearchAPIBridge.tsx @@ -4,10 +4,10 @@ import { useViewer } from '../../contexts/ViewerContext'; interface SearchResult { pageIndex: number; - rects: Array<{ + rects: { origin: { x: number; y: number }; size: { width: number; height: number }; - }>; + }[]; } /** @@ -17,7 +17,7 @@ interface SearchResult { export function SearchAPIBridge() { const { provides: search } = useSearch(); const { registerBridge } = useViewer(); - + const [localState, setLocalState] = useState({ results: null as SearchResult[] | null, activeIndex: 0 @@ -32,7 +32,7 @@ export function SearchAPIBridge() { results: state?.results || null, activeIndex: (state?.activeResultIndex || 0) + 1 // Convert to 1-based index }; - + setLocalState(prevState => { // Only update if state actually changed if (prevState.results !== newState.results || prevState.activeIndex !== newState.activeIndex) { diff --git a/frontend/src/contexts/ToolWorkflowContext.tsx b/frontend/src/contexts/ToolWorkflowContext.tsx index 106636692..ed60d3371 100644 --- a/frontend/src/contexts/ToolWorkflowContext.tsx +++ b/frontend/src/contexts/ToolWorkflowContext.tsx @@ -101,7 +101,7 @@ interface ToolWorkflowContextValue extends ToolWorkflowState { handleReaderToggle: () => void; // Computed values - filteredTools: Array<{ item: [string, ToolRegistryEntry]; matchedText?: string }>; // Filtered by search + filteredTools: { item: [string, ToolRegistryEntry]; matchedText?: string }[]; // Filtered by search isPanelVisible: boolean; } diff --git a/frontend/src/contexts/ViewerContext.tsx b/frontend/src/contexts/ViewerContext.tsx index 34a49de42..9c9ef147d 100644 --- a/frontend/src/contexts/ViewerContext.tsx +++ b/frontend/src/contexts/ViewerContext.tsx @@ -82,10 +82,10 @@ interface RotationState { interface SearchResult { pageIndex: number; - rects: Array<{ + rects: { origin: { x: number; y: number }; size: { width: number; height: number }; - }>; + }[]; } interface SearchState { @@ -179,7 +179,7 @@ interface ViewerContextType { clear: () => void; }; - // Bridge registration - internal use by bridges + // Bridge registration - internal use by bridges registerBridge: (type: string, ref: BridgeRef) => void; } diff --git a/frontend/src/contexts/file/fileActions.ts b/frontend/src/contexts/file/fileActions.ts index 6ae14724f..070ef5474 100644 --- a/frontend/src/contexts/file/fileActions.ts +++ b/frontend/src/contexts/file/fileActions.ts @@ -25,7 +25,7 @@ const DEBUG = process.env.NODE_ENV === 'development'; */ class SimpleMutex { private locked = false; - private queue: Array<() => void> = []; + private queue: (() => void)[] = []; async lock(): Promise { if (!this.locked) { @@ -151,7 +151,7 @@ interface AddFileOptions { files?: File[]; // For 'processed' files - filesWithThumbnails?: Array<{ file: File; thumbnail?: string; pageCount?: number }>; + filesWithThumbnails?: { file: File; thumbnail?: string; pageCount?: number }[]; // Insertion position insertAfterPageId?: string; @@ -165,8 +165,8 @@ interface AddFileOptions { */ export async function addFiles( options: AddFileOptions, - stateRef: React.MutableRefObject, - filesRef: React.MutableRefObject>, + stateRef: React.RefObject, + filesRef: React.RefObject>, dispatch: React.Dispatch, lifecycleManager: FileLifecycleManager, enablePersistence: boolean = false @@ -278,7 +278,7 @@ export async function consumeFiles( inputFileIds: FileId[], outputStirlingFiles: StirlingFile[], outputStirlingFileStubs: StirlingFileStub[], - filesRef: React.MutableRefObject>, + filesRef: React.RefObject>, dispatch: React.Dispatch ): Promise { if (DEBUG) console.log(`📄 consumeFiles: Processing ${inputFileIds.length} input files, ${outputStirlingFiles.length} output files with pre-created stubs`); @@ -355,9 +355,9 @@ export async function consumeFiles( * Helper function to restore files to filesRef and manage IndexedDB cleanup */ async function restoreFilesAndCleanup( - filesToRestore: Array<{ file: File; record: StirlingFileStub }>, + filesToRestore: { file: File; record: StirlingFileStub }[], fileIdsToRemove: FileId[], - filesRef: React.MutableRefObject>, + filesRef: React.RefObject>, indexedDB?: { deleteFile: (fileId: FileId) => Promise } | null ): Promise { // Remove files from filesRef @@ -406,7 +406,7 @@ export async function undoConsumeFiles( inputFiles: File[], inputStirlingFileStubs: StirlingFileStub[], outputFileIds: FileId[], - filesRef: React.MutableRefObject>, + filesRef: React.RefObject>, dispatch: React.Dispatch, indexedDB?: { saveFile: (file: File, fileId: FileId, existingThumbnail?: string) => Promise; deleteFile: (fileId: FileId) => Promise } | null ): Promise { @@ -468,8 +468,8 @@ export async function undoConsumeFiles( export async function addStirlingFileStubs( stirlingFileStubs: StirlingFileStub[], options: { insertAfterPageId?: string; selectFiles?: boolean } = {}, - stateRef: React.MutableRefObject, - filesRef: React.MutableRefObject>, + stateRef: React.RefObject, + filesRef: React.RefObject>, dispatch: React.Dispatch, _lifecycleManager: FileLifecycleManager ): Promise { diff --git a/frontend/src/contexts/file/fileSelectors.ts b/frontend/src/contexts/file/fileSelectors.ts index a004831cc..dd975601e 100644 --- a/frontend/src/contexts/file/fileSelectors.ts +++ b/frontend/src/contexts/file/fileSelectors.ts @@ -15,8 +15,8 @@ import { * Create stable selectors using stateRef and filesRef */ export function createFileSelectors( - stateRef: React.MutableRefObject, - filesRef: React.MutableRefObject> + stateRef: React.RefObject, + filesRef: React.RefObject> ): FileContextSelectors { return { getFile: (id: FileId) => { @@ -111,7 +111,7 @@ export function buildQuickKeySet(stirlingFileStubs: Record): Set { +export function buildQuickKeySetFromMetadata(metadata: { name: string; size: number; lastModified: number }[]): Set { const quickKeys = new Set(); metadata.forEach(meta => { // Format: name|size|lastModified (same as createQuickKey) @@ -125,8 +125,8 @@ export function buildQuickKeySetFromMetadata(metadata: Array<{ name: string; siz * Get primary file (first in list) - commonly used pattern */ export function getPrimaryFile( - stateRef: React.MutableRefObject, - filesRef: React.MutableRefObject> + stateRef: React.RefObject, + filesRef: React.RefObject> ): { file?: File; record?: StirlingFileStub } { const primaryFileId = stateRef.current.files.ids[0]; if (!primaryFileId) return {}; diff --git a/frontend/src/contexts/file/lifecycle.ts b/frontend/src/contexts/file/lifecycle.ts index c65fec127..3c95fe788 100644 --- a/frontend/src/contexts/file/lifecycle.ts +++ b/frontend/src/contexts/file/lifecycle.ts @@ -16,7 +16,7 @@ export class FileLifecycleManager { private fileGenerations = new Map(); // Generation tokens to prevent stale cleanup constructor( - private filesRef: React.MutableRefObject>, + private filesRef: React.RefObject>, private dispatch: React.Dispatch ) {} @@ -34,7 +34,7 @@ export class FileLifecycleManager { /** * Clean up resources for a specific file (with stateRef access for complete cleanup) */ - cleanupFile = (fileId: FileId, stateRef?: React.MutableRefObject): void => { + cleanupFile = (fileId: FileId, stateRef?: React.RefObject): void => { // Use comprehensive cleanup (same as removeFiles) this.cleanupAllResourcesForFile(fileId, stateRef); @@ -68,7 +68,7 @@ export class FileLifecycleManager { /** * Schedule delayed cleanup for a file with generation token to prevent stale cleanup */ - scheduleCleanup = (fileId: FileId, delay: number = 30000, stateRef?: React.MutableRefObject): void => { + scheduleCleanup = (fileId: FileId, delay: number = 30000, stateRef?: React.RefObject): void => { // Cancel existing timer const existingTimer = this.cleanupTimers.get(fileId); if (existingTimer) { @@ -101,7 +101,7 @@ export class FileLifecycleManager { /** * Remove a file immediately with complete resource cleanup */ - removeFiles = (fileIds: FileId[], stateRef?: React.MutableRefObject): void => { + removeFiles = (fileIds: FileId[], stateRef?: React.RefObject): void => { fileIds.forEach(fileId => { // Clean up all resources for this file this.cleanupAllResourcesForFile(fileId, stateRef); @@ -114,7 +114,7 @@ export class FileLifecycleManager { /** * Complete resource cleanup for a single file */ - private cleanupAllResourcesForFile = (fileId: FileId, stateRef?: React.MutableRefObject): void => { + private cleanupAllResourcesForFile = (fileId: FileId, stateRef?: React.RefObject): void => { // Remove from files ref this.filesRef.current.delete(fileId); @@ -166,7 +166,7 @@ export class FileLifecycleManager { /** * Update file record with race condition guards */ - updateStirlingFileStub = (fileId: FileId, updates: Partial, stateRef?: React.MutableRefObject): void => { + updateStirlingFileStub = (fileId: FileId, updates: Partial, stateRef?: React.RefObject): void => { // Guard against updating removed files (race condition protection) if (!this.filesRef.current.has(fileId)) { if (DEBUG) console.warn(`🗂️ Attempted to update removed file (filesRef): ${fileId}`); diff --git a/frontend/src/hooks/tools/addPassword/useAddPasswordParameters.test.ts b/frontend/src/hooks/tools/addPassword/useAddPasswordParameters.test.ts index 92a876087..bb0969c3c 100644 --- a/frontend/src/hooks/tools/addPassword/useAddPasswordParameters.test.ts +++ b/frontend/src/hooks/tools/addPassword/useAddPasswordParameters.test.ts @@ -125,7 +125,7 @@ describe('useAddPasswordParameters', () => { expect(result.current.validateParameters()).toBe(true); }); - test.each(Object.keys(defaultChangePermissionsParameters) as Array)('should handle boolean restriction parameter %s', (param) => { + test.each(Object.keys(defaultChangePermissionsParameters) as (keyof ChangePermissionsParameters)[])('should handle boolean restriction parameter %s', (param) => { const { result } = renderHook(() => useAddPasswordParameters()); act(() => { diff --git a/frontend/src/hooks/tools/changePermissions/useChangePermissionsOperation.test.ts b/frontend/src/hooks/tools/changePermissions/useChangePermissionsOperation.test.ts index b85f5533f..90b416a39 100644 --- a/frontend/src/hooks/tools/changePermissions/useChangePermissionsOperation.test.ts +++ b/frontend/src/hooks/tools/changePermissions/useChangePermissionsOperation.test.ts @@ -96,7 +96,7 @@ describe('useChangePermissionsOperation', () => { // Verify the form data contains the file expect(formData.get('fileInput')).toBe(testFile); - (Object.keys(testParameters) as Array).forEach(key => { + (Object.keys(testParameters) as (keyof ChangePermissionsParameters)[]).forEach(key => { expect(formData.get(key), `Parameter ${key} should be set correctly`).toBe(testParameters[key].toString()); }); }); diff --git a/frontend/src/hooks/tools/changePermissions/useChangePermissionsParameters.test.ts b/frontend/src/hooks/tools/changePermissions/useChangePermissionsParameters.test.ts index fe85434a5..68c279770 100644 --- a/frontend/src/hooks/tools/changePermissions/useChangePermissionsParameters.test.ts +++ b/frontend/src/hooks/tools/changePermissions/useChangePermissionsParameters.test.ts @@ -30,7 +30,7 @@ describe('useChangePermissionsParameters', () => { test('should update all permission parameters', () => { const { result } = renderHook(() => useChangePermissionsParameters()); - const permissionKeys = Object.keys(defaultParameters) as Array; + const permissionKeys = Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[]; // Set all to true act(() => { @@ -99,7 +99,7 @@ describe('useChangePermissionsParameters', () => { // Set all restrictions - should still be valid act(() => { - const permissionKeys = Object.keys(defaultParameters) as Array; + const permissionKeys = Object.keys(defaultParameters) as (keyof ChangePermissionsParameters)[]; permissionKeys.forEach(key => { result.current.updateParameter(key, true); }); diff --git a/frontend/src/hooks/tools/convert/useConvertParameters.ts b/frontend/src/hooks/tools/convert/useConvertParameters.ts index 74a1bd3a1..484e66361 100644 --- a/frontend/src/hooks/tools/convert/useConvertParameters.ts +++ b/frontend/src/hooks/tools/convert/useConvertParameters.ts @@ -42,8 +42,8 @@ export interface ConvertParameters extends BaseParameters { export interface ConvertParametersHook extends BaseParametersHook { getEndpoint: () => string; - getAvailableToExtensions: (fromExtension: string) => Array<{value: string, label: string, group: string}>; - analyzeFileTypes: (files: Array<{name: string}>) => void; + getAvailableToExtensions: (fromExtension: string) => {value: string, label: string, group: string}[]; + analyzeFileTypes: (files: {name: string}[]) => void; } export const defaultParameters: ConvertParameters = { @@ -157,7 +157,7 @@ export const useConvertParameters = (): ConvertParametersHook => { const getAvailableToExtensions = getAvailableToExtensionsUtil; - const analyzeFileTypes = useCallback((files: Array<{name: string}>) => { + const analyzeFileTypes = useCallback((files: {name: string}[]) => { if (files.length === 0) { // No files - only reset smart detection, keep user's format choices baseHook.setParameters(prev => { diff --git a/frontend/src/hooks/tools/convert/useConvertParametersAutoDetection.test.ts b/frontend/src/hooks/tools/convert/useConvertParametersAutoDetection.test.ts index e208d4479..11778ada4 100644 --- a/frontend/src/hooks/tools/convert/useConvertParametersAutoDetection.test.ts +++ b/frontend/src/hooks/tools/convert/useConvertParametersAutoDetection.test.ts @@ -345,7 +345,7 @@ describe('useConvertParameters - Auto Detection & Smart Conversion', () => { test('should handle malformed file objects', () => { const { result } = renderHook(() => useConvertParameters()); - const malformedFiles: Array<{name: string}> = [ + const malformedFiles: {name: string}[] = [ { name: 'valid.pdf' }, // @ts-expect-error - Testing runtime resilience { name: null }, diff --git a/frontend/src/hooks/useToolSections.ts b/frontend/src/hooks/useToolSections.ts index 088a1ba52..2b5b7c91e 100644 --- a/frontend/src/hooks/useToolSections.ts +++ b/frontend/src/hooks/useToolSections.ts @@ -4,7 +4,7 @@ import { SUBCATEGORY_ORDER, SubcategoryId, ToolCategoryId, ToolRegistryEntry } f import { useTranslation } from 'react-i18next'; type SubcategoryIdMap = { - [subcategoryId in SubcategoryId]: Array<{ id: string /* FIX ME: Should be ToolId */; tool: ToolRegistryEntry }>; + [subcategoryId in SubcategoryId]: { id: string /* FIX ME: Should be ToolId */; tool: ToolRegistryEntry }[]; } type GroupedTools = { @@ -28,7 +28,7 @@ export interface ToolSection { }; export function useToolSections( - filteredTools: Array<{ item: [string /* FIX ME: Should be ToolId */, ToolRegistryEntry]; matchedText?: string }>, + filteredTools: { item: [string /* FIX ME: Should be ToolId */, ToolRegistryEntry]; matchedText?: string }[], searchQuery?: string ) { const { t } = useTranslation(); @@ -37,7 +37,7 @@ export function useToolSections( if (!filteredTools || !Array.isArray(filteredTools)) { return {} as GroupedTools; } - + const grouped = {} as GroupedTools; filteredTools.forEach(({ item: [id, tool] }) => { const categoryId = tool.categoryId; @@ -102,7 +102,7 @@ export function useToolSections( if (!filteredTools || !Array.isArray(filteredTools)) { return []; } - + const subMap = {} as SubcategoryIdMap; const seen = new Set(); filteredTools.forEach(({ item: [id, tool] }) => { diff --git a/frontend/src/services/automationStorage.ts b/frontend/src/services/automationStorage.ts index 990e95a7f..de3791180 100644 --- a/frontend/src/services/automationStorage.ts +++ b/frontend/src/services/automationStorage.ts @@ -6,10 +6,10 @@ export interface AutomationConfig { id: string; name: string; description?: string; - operations: Array<{ + operations: { operation: string; parameters: any; - }>; + }[]; createdAt: string; updatedAt: string; } @@ -35,7 +35,7 @@ class AutomationStorage { request.onupgradeneeded = (event) => { const db = (event.target as IDBOpenDBRequest).result; - + if (!db.objectStoreNames.contains(this.storeName)) { const store = db.createObjectStore(this.storeName, { keyPath: 'id' }); store.createIndex('name', 'name', { unique: false }); @@ -49,18 +49,18 @@ class AutomationStorage { if (!this.db) { await this.init(); } - + if (!this.db) { throw new Error('Database not initialized'); } - + return this.db; } async saveAutomation(automation: Omit): Promise { const db = await this.ensureDB(); const timestamp = new Date().toISOString(); - + const automationWithMeta: AutomationConfig = { id: `automation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, ...automation, @@ -85,7 +85,7 @@ class AutomationStorage { async updateAutomation(automation: AutomationConfig): Promise { const db = await this.ensureDB(); - + const updatedAutomation: AutomationConfig = { ...automation, updatedAt: new Date().toISOString() @@ -165,13 +165,13 @@ class AutomationStorage { async searchAutomations(query: string): Promise { const automations = await this.getAllAutomations(); - + if (!query.trim()) { return automations; } const lowerQuery = query.toLowerCase(); - return automations.filter(automation => + return automations.filter(automation => automation.name.toLowerCase().includes(lowerQuery) || (automation.description && automation.description.toLowerCase().includes(lowerQuery)) || automation.operations.some(op => op.operation.toLowerCase().includes(lowerQuery)) @@ -180,4 +180,4 @@ class AutomationStorage { } // Export singleton instance -export const automationStorage = new AutomationStorage(); \ No newline at end of file +export const automationStorage = new AutomationStorage(); diff --git a/frontend/src/services/fileProcessingService.ts b/frontend/src/services/fileProcessingService.ts index be822b846..6bd3011e9 100644 --- a/frontend/src/services/fileProcessingService.ts +++ b/frontend/src/services/fileProcessingService.ts @@ -10,12 +10,12 @@ import { FileId } from '../types/file'; export interface ProcessedFileMetadata { totalPages: number; - pages: Array<{ + pages: { pageNumber: number; thumbnail?: string; rotation: number; splitBefore: boolean; - }>; + }[]; thumbnailUrl?: string; // Page 1 thumbnail for FileEditor lastProcessed: number; } diff --git a/frontend/src/services/processingErrorHandler.ts b/frontend/src/services/processingErrorHandler.ts index f6871008d..c443eedb2 100644 --- a/frontend/src/services/processingErrorHandler.ts +++ b/frontend/src/services/processingErrorHandler.ts @@ -8,8 +8,8 @@ export class ProcessingErrorHandler { * Create a ProcessingError from an unknown error */ static createProcessingError( - error: unknown, - retryCount: number = 0, + error: unknown, + retryCount: number = 0, maxRetries: number = this.DEFAULT_MAX_RETRIES ): ProcessingError { const originalError = error instanceof Error ? error : new Error(String(error)); @@ -17,7 +17,7 @@ export class ProcessingErrorHandler { // Determine error type based on error message and properties const errorType = this.determineErrorType(originalError, message); - + // Determine if error is recoverable const recoverable = this.isRecoverable(errorType, retryCount, maxRetries); @@ -38,7 +38,7 @@ export class ProcessingErrorHandler { const lowerMessage = message.toLowerCase(); // Network-related errors - if (lowerMessage.includes('network') || + if (lowerMessage.includes('network') || lowerMessage.includes('fetch') || lowerMessage.includes('connection')) { return 'network'; @@ -83,8 +83,8 @@ export class ProcessingErrorHandler { * Determine if an error is recoverable based on type and retry count */ private static isRecoverable( - errorType: ProcessingError['type'], - retryCount: number, + errorType: ProcessingError['type'], + retryCount: number, maxRetries: number ): boolean { // Never recoverable @@ -113,22 +113,22 @@ export class ProcessingErrorHandler { switch (errorType) { case 'network': return 'Network connection failed. Please check your internet connection and try again.'; - + case 'memory': return 'Insufficient memory to process this file. Try closing other applications or processing a smaller file.'; - + case 'timeout': return 'Processing timed out. This file may be too large or complex to process.'; - + case 'cancelled': return 'Processing was cancelled by user.'; - + case 'corruption': return 'This PDF file appears to be corrupted or encrypted. Please try a different file.'; - + case 'parsing': return `Failed to process PDF: ${originalMessage}`; - + default: return `Processing failed: ${originalMessage}`; } @@ -149,7 +149,7 @@ export class ProcessingErrorHandler { return await operation(); } catch (error) { lastError = this.createProcessingError(error, attempt, maxRetries); - + // Notify error handler if (onError) { onError(lastError); @@ -168,7 +168,7 @@ export class ProcessingErrorHandler { // Wait before retry with progressive backoff const delay = this.RETRY_DELAYS[Math.min(attempt, this.RETRY_DELAYS.length - 1)]; await this.delay(delay); - + console.log(`Retrying operation (attempt ${attempt + 2}/${maxRetries + 1}) after ${delay}ms delay`); } } @@ -207,7 +207,7 @@ export class ProcessingErrorHandler { */ static createTimeoutController(timeoutMs: number): AbortController { const controller = new AbortController(); - + setTimeout(() => { controller.abort(); }, timeoutMs); @@ -233,7 +233,7 @@ export class ProcessingErrorHandler { 'Try refreshing the page', 'Try again in a few moments' ]; - + case 'memory': return [ 'Close other browser tabs or applications', @@ -241,14 +241,14 @@ export class ProcessingErrorHandler { 'Restart your browser', 'Use a device with more memory' ]; - + case 'timeout': return [ 'Try processing a smaller file', 'Break large files into smaller sections', 'Check your internet connection speed' ]; - + case 'corruption': return [ 'Verify the PDF file opens in other applications', @@ -256,14 +256,14 @@ export class ProcessingErrorHandler { 'Try a different PDF file', 'Contact the file creator if it appears corrupted' ]; - + case 'parsing': return [ 'Verify this is a valid PDF file', 'Try a different PDF file', 'Contact support if the problem persists' ]; - + default: return [ 'Try refreshing the page', @@ -279,4 +279,4 @@ export class ProcessingErrorHandler { private static delay(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } -} \ No newline at end of file +} diff --git a/frontend/src/tests/convert/ConvertE2E.spec.ts b/frontend/src/tests/convert/ConvertE2E.spec.ts index 5e250030e..33746ff7b 100644 --- a/frontend/src/tests/convert/ConvertE2E.spec.ts +++ b/frontend/src/tests/convert/ConvertE2E.spec.ts @@ -13,7 +13,7 @@ import { type ConversionEndpoint } from '../helpers/conversionEndpointDiscovery'; import * as path from 'path'; -import * as fs from 'fs'; +import fs from 'fs'; // Test configuration const BASE_URL = process.env.BASE_URL || 'http://localhost:5173'; @@ -238,7 +238,7 @@ async function testConversion(page: Page, conversion: ConversionEndpoint) { // Save and verify file is not empty const path = await download.path(); if (path) { - const fs = require('fs'); + // fs is already imported at the top of the file const stats = fs.statSync(path); expect(stats.size).toBeGreaterThan(0); diff --git a/frontend/src/tests/utils/testFileHelpers.ts b/frontend/src/tests/utils/testFileHelpers.ts index 80b3c74cf..674fe1246 100644 --- a/frontend/src/tests/utils/testFileHelpers.ts +++ b/frontend/src/tests/utils/testFileHelpers.ts @@ -20,9 +20,9 @@ export function createTestStirlingFile( * Create multiple StirlingFile objects for testing */ export function createTestFilesWithId( - files: Array<{ name: string; content?: string; type?: string }> + files: { name: string; content?: string; type?: string }[] ): StirlingFile[] { return files.map(({ name, content = 'test content', type = 'application/pdf' }) => createTestStirlingFile(name, content, type) ); -} \ No newline at end of file +} diff --git a/frontend/src/utils/convertUtils.ts b/frontend/src/utils/convertUtils.ts index 63e00da46..7f340ebfb 100644 --- a/frontend/src/utils/convertUtils.ts +++ b/frontend/src/utils/convertUtils.ts @@ -1,4 +1,4 @@ -import { +import { CONVERSION_ENDPOINTS, ENDPOINT_NAMES, EXTENSION_TO_ENDPOINT, @@ -11,15 +11,15 @@ import { */ export const getEndpointName = (fromExtension: string, toExtension: string): string => { if (!fromExtension || !toExtension) return ''; - + let endpointKey = EXTENSION_TO_ENDPOINT[fromExtension]?.[toExtension]; - - // If no explicit mapping exists and we're converting to PDF, + + // If no explicit mapping exists and we're converting to PDF, // fall back to 'any' which uses file-to-pdf endpoint if (!endpointKey && toExtension === 'pdf' && fromExtension !== 'any') { endpointKey = EXTENSION_TO_ENDPOINT['any']?.[toExtension]; } - + return endpointKey || ''; }; @@ -29,7 +29,7 @@ export const getEndpointName = (fromExtension: string, toExtension: string): str export const getEndpointUrl = (fromExtension: string, toExtension: string): string => { const endpointName = getEndpointName(fromExtension, toExtension); if (!endpointName) return ''; - + // Find the endpoint URL from CONVERSION_ENDPOINTS using the endpoint name for (const [key, endpoint] of Object.entries(CONVERSION_ENDPOINTS)) { if (ENDPOINT_NAMES[key as keyof typeof ENDPOINT_NAMES] === endpointName) { @@ -64,7 +64,7 @@ export const isWebFormat = (extension: string): boolean => { * Gets available target extensions for a given source extension * Extracted from useConvertParameters to be reusable in automation settings */ -export const getAvailableToExtensions = (fromExtension: string): Array<{value: string, label: string, group: string}> => { +export const getAvailableToExtensions = (fromExtension: string): {value: string, label: string, group: string}[] => { if (!fromExtension) return []; // Handle dynamic format identifiers (file-) @@ -87,4 +87,4 @@ export const getAvailableToExtensions = (fromExtension: string): Array<{value: s return TO_FORMAT_OPTIONS.filter(option => supportedExtensions.includes(option.value) ); -}; \ No newline at end of file +}; diff --git a/frontend/src/utils/fuzzySearch.ts b/frontend/src/utils/fuzzySearch.ts index e8e8bdf01..55a2e7001 100644 --- a/frontend/src/utils/fuzzySearch.ts +++ b/frontend/src/utils/fuzzySearch.ts @@ -70,9 +70,9 @@ export function scoreMatch(queryRaw: string, targetRaw: string): number { export function minScoreForQuery(query: string): number { const len = normalizeText(query).length; - if (len <= 3) return 40; - if (len <= 6) return 30; - return 25; + if (len <= 3) return 40; + if (len <= 6) return 30; + return 25; } // Decide if a target matches a query based on a threshold @@ -82,8 +82,8 @@ export function isFuzzyMatch(query: string, target: string, minScore?: number): } // Convenience: rank a list of items by best score across provided getters -export function rankByFuzzy(items: T[], query: string, getters: Array<(item: T) => string>, minScore?: number): Array<{ item: T; score: number; matchedText?: string }>{ - const results: Array<{ item: T; score: number; matchedText?: string }> = []; +export function rankByFuzzy(items: T[], query: string, getters: ((item: T) => string)[], minScore?: number): { item: T; score: number; matchedText?: string }[]{ + const results: { item: T; score: number; matchedText?: string }[] = []; const threshold = typeof minScore === 'number' ? minScore : minScoreForQuery(query); for (const item of items) { let best = 0; diff --git a/frontend/src/utils/toolSearch.ts b/frontend/src/utils/toolSearch.ts index dda5749a8..670dba491 100644 --- a/frontend/src/utils/toolSearch.ts +++ b/frontend/src/utils/toolSearch.ts @@ -18,10 +18,10 @@ export function filterToolRegistryByQuery( const nq = normalizeForSearch(query); const threshold = minScoreForQuery(query); - const exactName: Array<{ id: string; tool: ToolRegistryEntry; pos: number }> = []; - const exactSyn: Array<{ id: string; tool: ToolRegistryEntry; text: string; pos: number }> = []; - const fuzzyName: Array<{ id: string; tool: ToolRegistryEntry; score: number; text: string }> = []; - const fuzzySyn: Array<{ id: string; tool: ToolRegistryEntry; score: number; text: string }> = []; + const exactName: { id: string; tool: ToolRegistryEntry; pos: number }[] = []; + const exactSyn: { id: string; tool: ToolRegistryEntry; text: string; pos: number }[] = []; + const fuzzyName: { id: string; tool: ToolRegistryEntry; score: number; text: string }[] = []; + const fuzzySyn: { id: string; tool: ToolRegistryEntry; score: number; text: string }[] = []; for (const [id, tool] of entries) { const nameNorm = normalizeForSearch(tool.name || ''); diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 3e4c6105d..dcc2e9b2a 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -13,7 +13,7 @@ /* Language and Environment */ "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - "jsx": "react-jsx", /* Specify what JSX code is generated. */ + "jsx": "react-jsx", /* Specify what JSX code is generated. */ // "libReplacement": true, /* Enable lib replacement. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ @@ -24,13 +24,12 @@ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - /* Modules */ - "module": "esnext", /* Specify what module code is generated. */ + "module": "esnext", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "bundler", /* Specify how TypeScript looks up a file from a given module specifier. */ - "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - "paths": { /* Specify a set of entries that re-map imports to additional lookup locations. */ + "moduleResolution": "bundler", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + "paths": { /* Specify a set of entries that re-map imports to additional lookup locations. */ }, // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ @@ -43,7 +42,7 @@ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ - "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ @@ -113,6 +112,7 @@ }, "include": [ "src", - "src/global.d.ts" -, "vite.config.ts" ] + "src/global.d.ts", + "vite.config.ts" + ] }