diff --git a/.babelrc b/.babelrc deleted file mode 100644 index a3f0def0d..000000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-flow"] -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a253783fa..000000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -**/dist/**/* -**/node_modules/**/* diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 673ed1232..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - extends: ['algolia', 'algolia/jest', 'algolia/react'], - - env: { - es6: true, - }, - - settings: { - react: { - version: 'detect', - }, - }, - - rules: { - 'max-params': ['error', 10], - 'no-warning-comments': 'error', - - 'import/no-commonjs': 'off', - }, - - overrides: [ - { - files: ['*.spec.js'], - env: { - jest: true, - }, - }, - ], -}; diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 55a8088cb..000000000 --- a/.flowconfig +++ /dev/null @@ -1,18 +0,0 @@ -[ignore] -/node_modules/.*/test/.* -/node_modules/.*.spec\.js -/node_modules/editions/es2015/index.js -/dist/.* -# FIXME: do not ignore local tests -/.*\.spec\.js - -[include] - -[libs] - -[options] -emoji=true -#experimental.const_params=true -munge_underscores=true - -[lints] diff --git a/.github/workflows/continuous-integration.yaml b/.github/workflows/continuous-integration.yaml index c042d6d59..7d2c3bc5c 100644 --- a/.github/workflows/continuous-integration.yaml +++ b/.github/workflows/continuous-integration.yaml @@ -6,18 +6,20 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: '20' - cache: 'yarn' - - run: yarn install --frozen-lockfile - - run: yarn run test - - run: yarn run lint - - run: yarn run flow - - run: yarn run smoke cjs 19.0.0 - - run: yarn run smoke esm 19.0.0 - - run: yarn run smoke cjs latest - - run: yarn run smoke esm latest - - run: yarn run smoke cjs next - - run: yarn run smoke esm next - + node-version: 20 + cache: "pnpm" + - run: pnpm install + - run: pnpm run test + - run: pnpm run typecheck + - run: pnpm run lint + - run: pnpm run build + # FIXME: To be reactivated + # - run: pnpm run smoke cjs 19.0.0 + # - run: pnpm run smoke esm 19.0.0 + # - run: pnpm run smoke cjs latest + # - run: pnpm run smoke esm latest + # - run: pnpm run smoke cjs next + # - run: pnpm run smoke esm next diff --git a/.npmignore b/.npmignore index 63b665bfc..ec0d11b86 100644 --- a/.npmignore +++ b/.npmignore @@ -1,19 +1,11 @@ -**/*.spec.js -**/*.spec.js.flow - .github/ !dist/ src/ tests/ -.babelrc -.eslintignore -.eslintrc.js -.flowconfig -.travis.yml -.prettier -.prettierignore +**/*.spec.js + +biome.json commitlint.config.js release.sh renovate.json -rollup.config.js diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index a253783fa..000000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -**/dist/**/* -**/node_modules/**/* diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index e17e00276..000000000 --- a/.prettierrc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "parser": "flow", - "singleQuote": true, - "trailingComma": "es5", - "overrides": [ - { - "files": ".prettierrc", - "options": { "parser": "json" } - }, - { - "files": ".babelrc", - "options": { "parser": "json" } - }, - { - "files": "*.json", - "options": { "parser": "json" } - }, - { - "files": "package.json", - "options": { "printWidth": 999 } - } - ] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 75a45e170..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Jest Current File", - "program": "${workspaceFolder}/node_modules/.bin/jest", - "args": ["${fileBasenameNoExtension}"], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - } - } - ] -} diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..3370cffe0 --- /dev/null +++ b/biome.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "ignore": ["./tests/smoke/**"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2 + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "recommended": true, + "noUnusedImports": "error" + }, + "a11y": { + "recommended": false + }, + "complexity": { + "noForEach": "off", + "noBannedTypes": "warn" + } + } + } +} diff --git a/commitlint.config.js b/commitlint.config.js index e1b648eb7..bdf555409 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,3 +1,3 @@ module.exports = { - extends: ['@commitlint/config-angular'], + extends: ["@commitlint/config-angular"], }; diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index d6c28cd7c..000000000 --- a/index.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -declare module 'react-element-to-jsx-string' { - import { ReactNode } from 'react'; - - type FilterPropsFunction = (value: any, key: string) => boolean - - interface ReactElementToJSXStringOptions { - displayName?: (element: ReactNode) => string; - filterProps?: string[] | FilterPropsFunction; - showDefaultProps?: boolean; - showFunctions?: boolean; - functionValue?: (fn: any) => any; - tabStop?: number; - useBooleanShorthandSyntax?: boolean; - maxInlineAttributesLineLength?: number; - sortProps?: boolean; - useFragmentShortSyntax?: boolean; - } - - const reactElementToJSXString: (element: ReactNode, options?: ReactElementToJSXStringOptions) => string; - - export { ReactElementToJSXStringOptions as Options }; - - export default reactElementToJSXString; -} diff --git a/package.json b/package.json index 45bd99328..30ad4a57c 100644 --- a/package.json +++ b/package.json @@ -2,33 +2,23 @@ "name": "react-element-to-jsx-string", "version": "17.0.0", "description": "Turn a ReactElement into the corresponding JSX string.", - "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "browser": "dist/cjs/index.js", - "types": "index.d.ts", + "packageManager": "pnpm@9.15.2", + "type": "module", + "main": "dist/index.mjs", + "module": "dist/index.mjs", + "browser": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { - "build": "rollup -c", - "build:flow": "flow-copy-source -v --ignore=*.spec.js src/ dist/cjs", + "build": "tsup", "prebuild": "rm -rf dist/", - "postbuild": "npm run build:flow", - "prepare": "npm run build", - "lint": "eslint .", - "lint:fix": "npm run lint -- --fix", - "flow": "flow", - "precommit": "lint-staged", - "prepublishOnly": "npm run build", - "prettier:fix": "prettier --write \"**/*.{js,json}\"", - "test": "jest", - "test:watch": "jest --watch", + "build:esm": "tsc --module esnext --outDir lib/esm", + "build:cjs": "tsc --module commonjs --outDir lib/cjs", + "lint": "biome check", + "lint:fix": "pnpm run check --fix", + "test": "vitest", "release": "./release.sh", - "smoke": "node tests/smoke/run" - }, - "lint-staged": { - "*.js": [ - "prettier --write \"**/*.{js,json}\"", - "git add" - ] + "smoke": "node tests/smoke/run", + "typecheck": "tsc --noEmit" }, "author": { "name": "Algolia, Inc.", @@ -36,61 +26,35 @@ }, "license": "MIT", "repository": "algolia/react-element-to-jsx-string", + "dependencies": { + "@base2/pretty-print-object": "1.0.2" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-is": "^19.0.0" + }, "devDependencies": { - "@babel/cli": "7.26.4", - "@babel/core": "7.26.9", - "@babel/preset-env": "7.26.9", - "@babel/preset-flow": "7.25.9", - "@babel/preset-react": "7.26.3", - "@commitlint/cli": "8.3.6", - "@commitlint/config-angular": "8.3.6", - "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "5.17.0", - "@testing-library/react": "16.2.0", - "babel-eslint": "10.1.0", - "babel-jest": "24.9.0", - "babel-register": "6.26.0", - "conventional-changelog-cli": "2.2.2", + "@biomejs/biome": "1.9.4", + "@commitlint/cli": "^19.6.1", + "@commitlint/config-angular": "^19.7.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@types/react-is": "^19.0.0", + "@vitejs/plugin-react": "^4.3.4", + "conventional-changelog-cli": "2.1.1", "doctoc": "1.4.0", - "eslint": "6.8.0", - "eslint-config-algolia": "14.0.1", - "eslint-config-prettier": "6.15.0", - "eslint-plugin-import": "2.29.1", - "eslint-plugin-jest": "22.21.0", - "eslint-plugin-prettier": "3.4.1", - "eslint-plugin-react": "7.31.1", "esm": "3.2.25", - "expect": "27.5.1", - "flow-bin": "0.119.1", - "flow-copy-source": "2.0.9", - "husky": "3.1.0", - "jest": "27.5.1", - "json": "10.0.0", - "lint-staged": "10.5.4", + "happy-dom": "^17.1.0", "mversion": "2.0.1", - "prettier": "1.19.1", "react": "19.0.0", "react-dom": "19.0.0", "react-is": "19.0.0", - "rollup": "2.79.1", - "rollup-plugin-babel": "4.4.0", - "rollup-plugin-node-builtins": "2.1.2", - "rollup-plugin-node-globals": "1.4.0", - "rollup-plugin-node-resolve": "5.2.0", - "rollup-plugin-sourcemaps": "0.6.3" - }, - "peerDependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-is": "^19.0.0" - }, - "dependencies": { - "@base2/pretty-print-object": "1.0.2", - "is-plain-object": "5.0.0" - }, - "jest": { - "setupFilesAfterEnv": [ - "tests/setupTests.js" - ] + "tsup": "^8.3.6", + "typescript": "^5.7.3", + "vitest": "^3.0.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..652fbb425 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6355 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@base2/pretty-print-object': + specifier: 1.0.2 + version: 1.0.2 + devDependencies: + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 + '@commitlint/cli': + specifier: ^19.6.1 + version: 19.6.1(@types/node@22.10.6)(typescript@5.7.3) + '@commitlint/config-angular': + specifier: ^19.7.0 + version: 19.7.0 + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 + '@testing-library/jest-dom': + specifier: ^6.6.3 + version: 6.6.3 + '@testing-library/react': + specifier: ^16.2.0 + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@types/react': + specifier: ^19.0.8 + version: 19.0.8 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.8) + '@types/react-is': + specifier: ^19.0.0 + version: 19.0.0 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.1.0(@types/node@22.10.6)(jiti@2.4.2)) + conventional-changelog-cli: + specifier: 2.1.1 + version: 2.1.1 + doctoc: + specifier: 1.4.0 + version: 1.4.0 + esm: + specifier: 3.2.25 + version: 3.2.25 + happy-dom: + specifier: ^17.1.0 + version: 17.1.0 + mversion: + specifier: 2.0.1 + version: 2.0.1 + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) + react-is: + specifier: 19.0.0 + version: 19.0.0 + tsup: + specifier: ^8.3.6 + version: 8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + vitest: + specifier: ^3.0.5 + version: 3.0.5(@types/node@22.10.6)(happy-dom@17.1.0)(jiti@2.4.2) + +packages: + + '@adobe/css-tools@4.4.1': + resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.7': + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.7': + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + engines: {node: '>=6.9.0'} + + '@base2/pretty-print-object@1.0.2': + resolution: {integrity: sha512-rBha0UDfV7EmBRjWrGG7Cpwxg8WomPlo0q+R2so47ZFf9wy4YKJzLuHcVa0UGFjdcLZj/4F/1FNC46GIQhe7sA==} + + '@biomejs/biome@1.9.4': + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.4': + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.4': + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.4': + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.4': + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.4': + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@commitlint/cli@19.6.1': + resolution: {integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-angular-type-enum@19.5.0': + resolution: {integrity: sha512-4/6xrkElCSBb7+6oZXlBJ/zytkxXgmTg5gk1Voj3GAWShTivtWrPtDYvHmF858WhA695YKgxMHEPNN74UFkK8w==} + engines: {node: '>=v18'} + + '@commitlint/config-angular@19.7.0': + resolution: {integrity: sha512-xXBplZDC3yjnE1knGvO9ETqpxRhW0xZ/ud7KHPXGtvbcpmLX/tUIsbCmZcNvM9cZYMnYqAvhrQMEqCsjlkOA7A==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} + + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.6.0': + resolution: {integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.6.0': + resolution: {integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==} + engines: {node: '>=v18'} + + '@commitlint/load@19.6.1': + resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==} + engines: {node: '>=v18'} + + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} + + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.6.0': + resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.32.1': + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.34.4': + resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.32.1': + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.34.4': + resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.32.1': + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.34.4': + resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.32.1': + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.4': + resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.32.1': + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.34.4': + resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.32.1': + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.4': + resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.32.1': + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.32.1': + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.4': + resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.32.1': + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.32.1': + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.4': + resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.32.1': + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.4': + resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.32.1': + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.32.1': + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.32.1': + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.4': + resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@0.14.0': + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + + '@szmarczak/http-timer@1.1.2': + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.2.0': + resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@textlint/ast-node-types@4.4.3': + resolution: {integrity: sha512-qi2jjgO6Tn3KNPGnm6B7p6QTEPvY95NFsIAaJuwbulur8iJUEenp1OnoUfiDaC/g2WPPEFkcfXpmnu8XEMFo2A==} + + '@textlint/markdown-to-ast@6.0.9': + resolution: {integrity: sha512-hfAWBvTeUGh5t5kTn2U3uP3qOSM1BSrxzl1jF3nn0ywfZXpRBZr5yRjXnl4DzIYawCtZOshmRi/tI3/x4TE1jQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@22.10.6': + resolution: {integrity: sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/react-dom@19.0.3': + resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-is@19.0.0': + resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==} + + '@types/react@19.0.8': + resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@vitest/expect@3.0.5': + resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + + '@vitest/mocker@3.0.5': + resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.5': + resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + + '@vitest/runner@3.0.5': + resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} + + '@vitest/snapshot@3.0.5': + resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} + + '@vitest/spy@3.0.5': + resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} + + '@vitest/utils@3.0.5': + resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + anchor-markdown-header@0.5.7: + resolution: {integrity: sha512-AmikqcK15r3q99hPvTa1na9n3eLkW0uE+RL9BZMSgwYalQeDnNXbYrN06BIcBPfGlmsGIE2jvkuvl/x0hyPF5Q==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + atoa@1.0.0: + resolution: {integrity: sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + boundary@1.0.1: + resolution: {integrity: sha512-AaLhxHwYVh55iOTJncV3DE5o7RakEUSSj64XXEWRTiIhlp7aDI8qR0vY/k8Uw0Z234VjZi/iG/WxfrvqYPUCww==} + + boxen@4.2.0: + resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} + engines: {node: '>=8'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + + cli-usage@0.1.10: + resolution: {integrity: sha512-Q/s1S4Jz5LYI0LQ+XiFQCXkhMzn244ddyIffni8JIq/kL95DvQomVQ0cJC41c76hH9/FmZGY7rZB53y/bXHtRA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + + collapse-white-space@1.0.6: + resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + + contra@1.9.4: + resolution: {integrity: sha512-N9ArHAqwR/lhPq4OdIAwH4e1btn6EIZMAz4TazjnzCiVECcWUPTma+dRAM38ERImEJBh8NiCCpjoQruSZ+agYg==} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + conventional-changelog-cli@2.1.1: + resolution: {integrity: sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + doctoc@1.4.0: + resolution: {integrity: sha512-8IAq3KdMkxhXCUF+xdZxdJxwuz8N2j25sMgqiu4U4JWluN9tRKMlAalxGASszQjlZaBprdD2YfXpL3VPWUD4eg==} + engines: {node: '>=0.4'} + hasBin: true + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.91: + resolution: {integrity: sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==} + + emoji-regex@6.1.3: + resolution: {integrity: sha512-73/zxHTjP2N2FQf0J5ngNjxP9LqG2krUshxYaowI8HxZQsiL2pYJc3k9/O93fc5/lCSkZv+bQ5Esk6k6msiSvg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.0.5: + resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-dirs@2.1.0: + resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} + engines: {node: '>=8'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + happy-dom@17.1.0: + resolution: {integrity: sha512-9tUhXyePCjzUMycaHS/IzrIpF69xiq/laAT7golk4MtZ6t8ft5+Rv7U3lfrs2b4NMH0JTL3EhZzjfahrPmOnaQ==} + engines: {node: '>=18.0.0'} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + htmlparser2@3.9.2: + resolution: {integrity: sha512-RSOwLNCnCLDRB9XpSfCzsLzzX8COezhJ3D4kRBNWh0NC/facp1hAMmM8zD7kC01My8vD6lGEbPMlbRW/EwGK5w==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.7: + resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-installed-globally@0.3.2: + resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + + is-npm@4.0.0: + resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} + engines: {node: '>=8'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-whitespace-character@1.0.4: + resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-word-character@1.0.4: + resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} + + is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-escapes@1.0.4: + resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + + marked-terminal@3.3.0: + resolution: {integrity: sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==} + peerDependencies: + marked: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + + marked@0.7.0: + resolution: {integrity: sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==} + engines: {node: '>=0.10.0'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mversion@2.0.1: + resolution: {integrity: sha512-lw3QxTeZw4rIAR2tqHtqT4neN4kW4hESoOxE+/gCdcmvgMobVXrsNKhkcYtVraikcNEu1YP+k+G1sz77vd82vA==} + hasBin: true + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + + now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@1.2.2: + resolution: {integrity: sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + + registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + + remark-frontmatter@1.3.3: + resolution: {integrity: sha512-fM5eZPBvu2pVNoq3ZPW22q+5Ativ1oLozq2qYt9I2oNyxiUd/tDl0iLLntEVAegpZIslPWg1brhcP1VsaSVUag==} + + remark-parse@5.0.0: + resolution: {integrity: sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==} + + remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + + remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + replace-ext@1.0.0: + resolution: {integrity: sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==} + engines: {node: '>= 0.10'} + + replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + + rollup@4.32.1: + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.34.4: + resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + state-toggle@1.0.3: + resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + structured-source@3.0.2: + resolution: {integrity: sha512-Ap7JHfKgmH40SUjumqyKTHYHNZ8GvGQskP34ks0ElHCDEig+bYGpmXVksxPSrgcY9rkJqhVMzfeg5GIpZelfpQ==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@1.0.1: + resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempfile@3.0.0: + resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} + engines: {node: '>=8'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + ticky@1.0.1: + resolution: {integrity: sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + + to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + + to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + traverse@0.6.10: + resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==} + engines: {node: '>= 0.4'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trim-trailing-lines@1.1.4: + resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + + trim@0.0.1: + resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + deprecated: Use String.prototype.trim() instead + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.3.6: + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + underscore@1.8.3: + resolution: {integrity: sha512-5WsVTFcH1ut/kkhAaHf4PVgI8c7++GiVcpCGxPouI6ZVjsqPnSDf8h/8HtVqc0t4fzRXwnMK70EcZeAs3PIddg==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unherit@1.1.3: + resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unified@6.2.0: + resolution: {integrity: sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==} + + unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + + unist-util-remove-position@1.1.4: + resolution: {integrity: sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==} + + unist-util-stringify-position@1.1.2: + resolution: {integrity: sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==} + + unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + + unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@4.1.3: + resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} + engines: {node: '>=8'} + + update-section@0.3.3: + resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} + + url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + + vfile-location@2.0.6: + resolution: {integrity: sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==} + + vfile-message@1.1.1: + resolution: {integrity: sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==} + + vfile@2.3.0: + resolution: {integrity: sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==} + + vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + + vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + + vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + + vite-node@3.0.5: + resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.0.5: + resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.5 + '@vitest/ui': 3.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + x-is-string@0.1.0: + resolution: {integrity: sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==} + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + +snapshots: + + '@adobe/css-tools@4.4.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.5': {} + + '@babel/core@7.26.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + + '@babel/parser@7.26.7': + dependencies: + '@babel/types': 7.26.7 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.26.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + + '@babel/traverse@7.26.7': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.7': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@base2/pretty-print-object@1.0.2': {} + + '@biomejs/biome@1.9.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@biomejs/cli-darwin-x64@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64@1.9.4': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-x64@1.9.4': + optional: true + + '@biomejs/cli-win32-arm64@1.9.4': + optional: true + + '@biomejs/cli-win32-x64@1.9.4': + optional: true + + '@commitlint/cli@19.6.1(@types/node@22.10.6)(typescript@5.7.3)': + dependencies: + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.6.0 + '@commitlint/load': 19.6.1(@types/node@22.10.6)(typescript@5.7.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-angular-type-enum@19.5.0': {} + + '@commitlint/config-angular@19.7.0': + dependencies: + '@commitlint/config-angular-type-enum': 19.5.0 + + '@commitlint/config-validator@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + ajv: 8.17.1 + + '@commitlint/ensure@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.5.0': {} + + '@commitlint/format@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.6.0': + dependencies: + '@commitlint/types': 19.5.0 + semver: 7.6.3 + + '@commitlint/lint@19.6.0': + dependencies: + '@commitlint/is-ignored': 19.6.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.6.0 + '@commitlint/types': 19.5.0 + + '@commitlint/load@19.6.1(@types/node@22.10.6)(typescript@5.7.3)': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.6)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.5.0': {} + + '@commitlint/parse@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.5.0': + dependencies: + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.2 + + '@commitlint/resolve-extends@19.5.0': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.6.0': + dependencies: + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 + + '@commitlint/to-lines@19.5.0': {} + + '@commitlint/top-level@19.5.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.5.0': + dependencies: + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.1 + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@hutson/parse-repository-url@3.0.2': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.32.1': + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.4': + optional: true + + '@rollup/rollup-android-arm64@4.32.1': + optional: true + + '@rollup/rollup-android-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.32.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-x64@4.32.1': + optional: true + + '@rollup/rollup-darwin-x64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.32.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.32.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.32.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.4': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.32.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.32.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.32.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.32.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.4': + optional: true + + '@sindresorhus/is@0.14.0': {} + + '@szmarczak/http-timer@1.1.2': + dependencies: + defer-to-connect: 1.1.3 + + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.6.3': + dependencies: + '@adobe/css-tools': 4.4.1 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@babel/runtime': 7.26.7 + '@testing-library/dom': 10.4.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) + + '@textlint/ast-node-types@4.4.3': {} + + '@textlint/markdown-to-ast@6.0.9': + dependencies: + '@textlint/ast-node-types': 4.4.3 + debug: 2.6.9 + remark-frontmatter: 1.3.3 + remark-parse: 5.0.0 + structured-source: 3.0.2 + traverse: 0.6.10 + unified: 6.2.0 + transitivePeerDependencies: + - supports-color + + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.7 + + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 22.10.6 + + '@types/estree@1.0.6': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.10.6 + + '@types/minimist@1.2.5': {} + + '@types/node@22.10.6': + dependencies: + undici-types: 6.20.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/react-dom@19.0.3(@types/react@19.0.8)': + dependencies: + '@types/react': 19.0.8 + + '@types/react-is@19.0.0': + dependencies: + '@types/react': 19.0.8 + + '@types/react@19.0.8': + dependencies: + csstype: 3.1.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.10.6 + + '@types/unist@2.0.11': {} + + '@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@22.10.6)(jiti@2.4.2))': + dependencies: + '@babel/core': 7.26.7 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.1.0(@types/node@22.10.6)(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.0.5': + dependencies: + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@22.10.6)(jiti@2.4.2))': + dependencies: + '@vitest/spy': 3.0.5 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.1.0(@types/node@22.10.6)(jiti@2.4.2) + + '@vitest/pretty-format@3.0.5': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.0.5': + dependencies: + '@vitest/utils': 3.0.5 + pathe: 2.0.2 + + '@vitest/snapshot@3.0.5': + dependencies: + '@vitest/pretty-format': 3.0.5 + magic-string: 0.30.17 + pathe: 2.0.2 + + '@vitest/spy@3.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.0.5': + dependencies: + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + add-stream@1.0.0: {} + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + anchor-markdown-header@0.5.7: + dependencies: + emoji-regex: 6.1.3 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@3.2.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + ansicolors@0.3.2: {} + + any-promise@1.3.0: {} + + append-buffer@1.0.2: + dependencies: + buffer-equal: 1.0.1 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + array-ify@1.0.0: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + assertion-error@2.0.1: {} + + atoa@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + bail@1.0.5: {} + + balanced-match@1.0.2: {} + + boundary@1.0.1: {} + + boxen@4.2.0: + dependencies: + ansi-align: 3.0.1 + camelcase: 5.3.1 + chalk: 3.0.0 + cli-boxes: 2.2.1 + string-width: 4.2.3 + term-size: 2.2.1 + type-fest: 0.8.1 + widest-line: 3.1.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.91 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-equal@1.0.1: {} + + bundle-require@5.1.0(esbuild@0.24.2): + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + cacheable-request@6.1.0: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001697: {} + + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-legacy@1.1.4: {} + + character-entities@1.2.4: {} + + character-reference-invalid@1.1.4: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + ci-info@2.0.0: {} + + cli-boxes@2.2.1: {} + + cli-table@0.3.11: + dependencies: + colors: 1.0.3 + + cli-usage@0.1.10: + dependencies: + marked: 0.7.0 + marked-terminal: 3.3.0(marked@0.7.0) + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-buffer@1.0.0: {} + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone-stats@1.0.0: {} + + clone@2.1.2: {} + + cloneable-readable@1.1.3: + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + + collapse-white-space@1.0.6: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.0.3: {} + + commander@4.1.1: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + consola@3.4.0: {} + + contra@1.9.4: + dependencies: + atoa: 1.0.0 + ticky: 1.0.1 + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-atom@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-cli@2.1.1: + dependencies: + add-stream: 1.0.0 + conventional-changelog: 3.1.25 + lodash: 4.17.21 + meow: 8.1.2 + tempfile: 3.0.0 + + conventional-changelog-codemirror@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + + conventional-changelog-core@4.2.4: + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + + conventional-changelog-ember@2.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-eslint@3.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-express@2.0.6: + dependencies: + q: 1.5.1 + + conventional-changelog-jquery@3.0.11: + dependencies: + q: 1.5.1 + + conventional-changelog-jshint@2.0.9: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-preset-loader@2.3.4: {} + + conventional-changelog-writer@5.0.1: + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + + conventional-changelog@3.1.25: + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + + conventional-commits-filter@2.0.7: + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + core-util-is@1.0.3: {} + + cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.6)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3): + dependencies: + '@types/node': 22.10.6 + cosmiconfig: 9.0.0(typescript@5.7.3) + jiti: 2.4.2 + typescript: 5.7.3 + + cosmiconfig@9.0.0(typescript@5.7.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.7.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + css.escape@1.5.1: {} + + csstype@3.1.3: {} + + dargs@7.0.0: {} + + dargs@8.1.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dateformat@3.0.3: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + defer-to-connect@1.1.3: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + doctoc@1.4.0: + dependencies: + '@textlint/markdown-to-ast': 6.0.9 + anchor-markdown-header: 0.5.7 + htmlparser2: 3.9.2 + minimist: 1.2.8 + underscore: 1.8.3 + update-section: 0.3.3 + transitivePeerDependencies: + - supports-color + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer3@0.1.5: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.91: {} + + emoji-regex@6.1.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@1.1.2: {} + + entities@2.2.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + 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.3 + 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.0.0 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + 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-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + 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 + 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.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-goat@2.1.1: {} + + escape-string-regexp@1.0.5: {} + + esm@3.2.25: {} + + esprima@4.0.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + expect-type@1.1.0: {} + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.0.5: {} + + fault@1.0.4: + dependencies: + format: 0.2.2 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flush-write-stream@1.1.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + format@0.2.2: {} + + fs-mkdirp-stream@1.0.0: + dependencies: + graceful-fs: 4.2.11 + through2: 2.0.5 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + 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 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-pkg-repo@4.2.1: + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + + get-stream@4.1.0: + dependencies: + pump: 3.0.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + + git-remote-origin-url@2.0.0: + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + + git-semver-tags@4.1.1: + dependencies: + meow: 8.1.2 + semver: 6.3.1 + + gitconfiglocal@1.0.0: + dependencies: + ini: 1.3.8 + + glob-parent@3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + + glob-stream@6.1.0: + dependencies: + extend: 3.0.2 + glob: 7.2.3 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + global-dirs@2.1.0: + dependencies: + ini: 1.3.7 + + globals@11.12.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + got@9.6.0: + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + happy-dom@17.1.0: + dependencies: + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + hard-rejection@2.1.0: {} + + has-bigints@1.1.0: {} + + has-flag@2.0.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-yarn@2.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + htmlparser2@3.9.2: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + + http-cache-semantics@4.1.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@2.1.0: {} + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.7: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-ci@2.0.0: + dependencies: + ci-info: 2.0.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@3.1.0: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-installed-globally@0.3.2: + dependencies: + global-dirs: 2.1.0 + is-path-inside: 3.0.3 + + is-map@2.0.3: {} + + is-negated-glob@1.0.0: {} + + is-npm@4.0.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-typedarray@1.0.0: {} + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-utf8@0.2.1: {} + + is-valid-glob@1.0.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-whitespace-character@1.0.4: {} + + is-windows@1.0.2: {} + + is-word-character@1.0.4: {} + + is-yarn-global@0.3.0: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.4.2: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.0: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonparse@1.3.1: {} + + keyv@3.1.0: + dependencies: + json-buffer: 3.0.0 + + kind-of@6.0.3: {} + + latest-version@5.1.0: + dependencies: + package-json: 6.5.0 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lead@1.0.0: + dependencies: + flush-write-stream: 1.1.1 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + load-tsconfig@0.2.5: {} + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.ismatch@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + loupe@3.1.3: {} + + lowercase-keys@1.0.1: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lz-string@1.5.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-escapes@1.0.4: {} + + marked-terminal@3.3.0(marked@0.7.0): + dependencies: + ansi-escapes: 3.2.0 + cardinal: 2.1.1 + chalk: 2.4.2 + cli-table: 0.3.11 + marked: 0.7.0 + node-emoji: 1.11.0 + supports-hyperlinks: 1.0.1 + + marked@0.7.0: {} + + math-intrinsics@1.1.0: {} + + meow@12.1.1: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + mimic-response@1.0.1: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + modify-values@1.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mversion@2.0.1: + dependencies: + chalk: 4.1.2 + cli-usage: 0.1.10 + contra: 1.9.4 + minimatch: 3.1.2 + minimist: 1.2.8 + rc: 1.2.8 + semver: 7.6.3 + through2: 3.0.2 + update-notifier: 4.1.3 + vinyl-fs: 3.0.3 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.8: {} + + neo-async@2.6.2: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-releases@2.0.19: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + + normalize-url@4.5.1: {} + + now-and-later@2.0.1: + dependencies: + once: 1.4.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + 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 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + ordered-read-streams@1.0.1: + dependencies: + readable-stream: 2.3.8 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-cancelable@1.1.0: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-try@1.0.0: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@6.5.0: + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.2 + registry-url: 5.1.0 + semver: 6.3.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@1.2.2: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-dirname@1.0.2: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + pathe@2.0.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pirates@4.0.6: {} + + possible-typed-array-names@1.0.0: {} + + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.1 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prepend-http@2.0.0: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + process-nextick-args@2.0.1: {} + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + pupa@2.1.1: + dependencies: + escape-goat: 2.1.1 + + q@1.5.1: {} + + quick-lru@4.0.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-is@17.0.2: {} + + react-is@19.0.0: {} + + react-refresh@0.14.2: {} + + react@19.0.0: {} + + read-pkg-up@3.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.1: {} + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redeyed@2.1.1: + dependencies: + esprima: 4.0.1 + + reflect.getprototypeof@1.0.10: + 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 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.4: + 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 + + registry-auth-token@4.2.2: + dependencies: + rc: 1.2.8 + + registry-url@5.1.0: + dependencies: + rc: 1.2.8 + + remark-frontmatter@1.3.3: + dependencies: + fault: 1.0.4 + xtend: 4.0.2 + + remark-parse@5.0.0: + dependencies: + collapse-white-space: 1.0.6 + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + is-whitespace-character: 1.0.4 + is-word-character: 1.0.4 + markdown-escapes: 1.0.4 + parse-entities: 1.2.2 + repeat-string: 1.6.1 + state-toggle: 1.0.3 + trim: 0.0.1 + trim-trailing-lines: 1.1.4 + unherit: 1.1.3 + unist-util-remove-position: 1.1.4 + vfile-location: 2.0.6 + xtend: 4.0.2 + + remove-bom-buffer@3.0.0: + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + + remove-bom-stream@1.2.0: + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + + remove-trailing-separator@1.1.0: {} + + repeat-string@1.6.1: {} + + replace-ext@1.0.0: {} + + replace-ext@1.0.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-options@1.1.0: + dependencies: + value-or-function: 3.0.0 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@1.0.2: + dependencies: + lowercase-keys: 1.0.1 + + rollup@4.32.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.32.1 + '@rollup/rollup-android-arm64': 4.32.1 + '@rollup/rollup-darwin-arm64': 4.32.1 + '@rollup/rollup-darwin-x64': 4.32.1 + '@rollup/rollup-freebsd-arm64': 4.32.1 + '@rollup/rollup-freebsd-x64': 4.32.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 + '@rollup/rollup-linux-arm64-musl': 4.32.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 + '@rollup/rollup-linux-x64-gnu': 4.32.1 + '@rollup/rollup-linux-x64-musl': 4.32.1 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 + '@rollup/rollup-win32-x64-msvc': 4.32.1 + fsevents: 2.3.3 + + rollup@4.34.4: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.4 + '@rollup/rollup-android-arm64': 4.34.4 + '@rollup/rollup-darwin-arm64': 4.34.4 + '@rollup/rollup-darwin-x64': 4.34.4 + '@rollup/rollup-freebsd-arm64': 4.34.4 + '@rollup/rollup-freebsd-x64': 4.34.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 + '@rollup/rollup-linux-arm-musleabihf': 4.34.4 + '@rollup/rollup-linux-arm64-gnu': 4.34.4 + '@rollup/rollup-linux-arm64-musl': 4.34.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 + '@rollup/rollup-linux-riscv64-gnu': 4.34.4 + '@rollup/rollup-linux-s390x-gnu': 4.34.4 + '@rollup/rollup-linux-x64-gnu': 4.34.4 + '@rollup/rollup-linux-x64-musl': 4.34.4 + '@rollup/rollup-win32-arm64-msvc': 4.34.4 + '@rollup/rollup-win32-ia32-msvc': 4.34.4 + '@rollup/rollup-win32-x64-msvc': 4.34.4 + fsevents: 2.3.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.25.0: {} + + semver-diff@3.1.1: + dependencies: + semver: 6.3.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + 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 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + + stackback@0.0.2: {} + + state-toggle@1.0.3: {} + + std-env@3.8.0: {} + + stream-shift@1.0.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + structured-source@3.0.2: + dependencies: + boundary: 1.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@1.0.1: + dependencies: + has-flag: 2.0.0 + supports-color: 5.5.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + temp-dir@2.0.0: {} + + tempfile@3.0.0: + dependencies: + temp-dir: 2.0.0 + uuid: 3.4.0 + + term-size@2.2.1: {} + + text-extensions@1.9.0: {} + + text-extensions@2.4.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + through2-filter@3.0.0: + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + ticky@1.0.1: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + + to-absolute-glob@2.0.2: + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + + to-readable-stream@1.0.0: {} + + to-through@2.0.0: + dependencies: + through2: 2.0.5 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + traverse@0.6.10: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.18 + + tree-kill@1.2.2: {} + + trim-newlines@3.0.1: {} + + trim-trailing-lines@1.1.4: {} + + trim@0.0.1: {} + + trough@1.0.5: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.3.6(jiti@2.4.2)(postcss@8.5.1)(typescript@5.7.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.1) + resolve-from: 5.0.0 + rollup: 4.32.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.10 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.1 + typescript: 5.7.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + type-fest@0.18.1: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + 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.15 + + typed-array-byte-offset@1.0.4: + 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.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@5.7.3: {} + + uglify-js@3.19.3: + optional: true + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unc-path-regex@0.1.2: {} + + underscore@1.8.3: {} + + undici-types@6.20.0: {} + + unherit@1.1.3: + dependencies: + inherits: 2.0.4 + xtend: 4.0.2 + + unicorn-magic@0.1.0: {} + + unified@6.2.0: + dependencies: + '@types/unist': 2.0.11 + bail: 1.0.5 + extend: 3.0.2 + is-plain-obj: 1.1.0 + trough: 1.0.5 + vfile: 2.3.0 + x-is-string: 0.1.0 + + unique-stream@2.3.1: + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + unist-util-is@3.0.0: {} + + unist-util-remove-position@1.1.4: + dependencies: + unist-util-visit: 1.4.1 + + unist-util-stringify-position@1.1.2: {} + + unist-util-visit-parents@2.1.2: + dependencies: + unist-util-is: 3.0.0 + + unist-util-visit@1.4.1: + dependencies: + unist-util-visit-parents: 2.1.2 + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-notifier@4.1.3: + dependencies: + boxen: 4.2.0 + chalk: 3.0.0 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.3.2 + is-npm: 4.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + + update-section@0.3.3: {} + + url-parse-lax@3.0.0: + dependencies: + prepend-http: 2.0.0 + + util-deprecate@1.0.2: {} + + uuid@3.4.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + value-or-function@3.0.0: {} + + vfile-location@2.0.6: {} + + vfile-message@1.1.1: + dependencies: + unist-util-stringify-position: 1.1.2 + + vfile@2.3.0: + dependencies: + is-buffer: 1.1.6 + replace-ext: 1.0.0 + unist-util-stringify-position: 1.1.2 + vfile-message: 1.1.1 + + vinyl-fs@3.0.3: + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.11 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.7 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + + vinyl-sourcemap@1.1.0: + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.11 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + + vinyl@2.2.1: + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + + vite-node@3.0.5(@types/node@22.10.6)(jiti@2.4.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.2 + vite: 6.1.0(@types/node@22.10.6)(jiti@2.4.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@6.1.0(@types/node@22.10.6)(jiti@2.4.2): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.4 + optionalDependencies: + '@types/node': 22.10.6 + fsevents: 2.3.3 + jiti: 2.4.2 + + vitest@3.0.5(@types/node@22.10.6)(happy-dom@17.1.0)(jiti@2.4.2): + dependencies: + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.10.6)(jiti@2.4.2)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.1.0(@types/node@22.10.6)(jiti@2.4.2) + vite-node: 3.0.5(@types/node@22.10.6)(jiti@2.4.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.6 + happy-dom: 17.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + webidl-conversions@4.0.2: {} + + webidl-conversions@7.0.0: {} + + whatwg-mimetype@3.0.0: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.1.1: + 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 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + x-is-string@0.1.0: {} + + xdg-basedir@4.0.0: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@1.1.1: {} diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index aa07cb4a6..000000000 --- a/rollup.config.js +++ /dev/null @@ -1,43 +0,0 @@ -import babel from 'rollup-plugin-babel'; -import resolve from 'rollup-plugin-node-resolve'; -import builtins from 'rollup-plugin-node-builtins'; -import globals from 'rollup-plugin-node-globals'; -import pkg from './package.json'; - -const extractExternals = () => [ - ...Object.keys(pkg.dependencies || {}), - ...Object.keys(pkg.peerDependencies || {}), -]; - -export default { - input: 'src/index.js', - output: [ - { - file: pkg.main, - format: 'cjs', - sourcemap: true, - }, - { - file: pkg.module, - format: 'es', - sourcemap: true, - }, - ], - external: extractExternals(), - plugins: [ - babel({ - babelrc: false, - exclude: 'node_modules/**', - presets: [ - '@babel/preset-env', - '@babel/preset-react', - '@babel/preset-flow', - ], - }), - resolve({ - mainFields: ['module', 'main', 'jsnext', 'browser'], - }), - globals(), - builtins(), - ], -}; diff --git a/src/AnonymousStatelessComponent.js b/src/AnonymousStatelessComponent.js deleted file mode 100644 index 29b165cf0..000000000 --- a/src/AnonymousStatelessComponent.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -// eslint-disable-next-line react/display-name -export default function(props) { - const { children } = props; // eslint-disable-line react/prop-types - return
{children}
; -} diff --git a/src/__tests__/generateOptionsFixture.ts b/src/__tests__/generateOptionsFixture.ts new file mode 100644 index 000000000..550fe81ce --- /dev/null +++ b/src/__tests__/generateOptionsFixture.ts @@ -0,0 +1,10 @@ +import { type Options, defaultOptions } from "../options"; + +export function generateOptionsFixture( + fixtureOptions: Partial, +): Options { + return { + ...defaultOptions, + ...fixtureOptions, + }; +} diff --git a/src/formatter/createPropFilter.js b/src/formatter/createPropFilter.js deleted file mode 100644 index a9a9dd26f..000000000 --- a/src/formatter/createPropFilter.js +++ /dev/null @@ -1,12 +0,0 @@ -/* @flow */ - -export default function createPropFilter( - props: {}, - filter: string[] | ((any, string) => boolean) -) { - if (Array.isArray(filter)) { - return (key: string) => filter.indexOf(key) === -1; - } else { - return (key: string) => filter(props[key], key); - } -} diff --git a/src/formatter/createPropFilter.spec.js b/src/formatter/createPropFilter.spec.js deleted file mode 100644 index caf6790b7..000000000 --- a/src/formatter/createPropFilter.spec.js +++ /dev/null @@ -1,26 +0,0 @@ -/* @flow */ - -import createPropFilter from './createPropFilter'; - -describe('createPropFilter', () => { - it('should filter based on an array of keys', () => { - const props = { a: 1, b: 2, c: 3 }; - const filter = createPropFilter(props, ['b']); - - const filteredPropKeys = Object.keys(props).filter(filter); - - expect(filteredPropKeys).toEqual(['a', 'c']); - }); - - it('should filter based on a callback', () => { - const props = { a: 1, b: 2, c: 3 }; - const filter = createPropFilter( - props, - (val, key) => key !== 'b' && val < 3 - ); - - const filteredPropKeys = Object.keys(props).filter(filter); - - expect(filteredPropKeys).toEqual(['a']); - }); -}); diff --git a/src/formatter/createPropFilter.spec.ts b/src/formatter/createPropFilter.spec.ts new file mode 100644 index 000000000..a691adfa1 --- /dev/null +++ b/src/formatter/createPropFilter.spec.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from "vitest"; +import createPropFilter from "./createPropFilter"; + +describe("createPropFilter", () => { + it("should filter based on an array of keys", () => { + const props = { + a: 1, + b: 2, + c: 3, + }; + + const filter = createPropFilter(props, ["b"]); + + const filteredPropKeys = Object.keys(props).filter(filter); + + expect(filteredPropKeys).toEqual(["a", "c"]); + }); + + it("should filter based on a callback", () => { + const props = { + a: 1, + b: 2, + c: 3, + }; + + const filter = createPropFilter( + props, + (val, key) => key !== "b" && val < 3, + ); + + const filteredPropKeys = Object.keys(props).filter(filter); + + expect(filteredPropKeys).toEqual(["a"]); + }); +}); diff --git a/src/formatter/createPropFilter.ts b/src/formatter/createPropFilter.ts new file mode 100644 index 000000000..9fc97679e --- /dev/null +++ b/src/formatter/createPropFilter.ts @@ -0,0 +1,11 @@ +// TODO: To be renamed `createPropsFilter` +export default function createPropFilter( + props: Record, + filter: string[] | ((propValue: Value, key: string) => boolean), +) { + if (Array.isArray(filter)) { + return (key: string) => filter.indexOf(key) === -1; + } + + return (key: string) => filter(props[key], key); +} diff --git a/src/formatter/formatComplexDataStructure.js b/src/formatter/formatComplexDataStructure.js deleted file mode 100644 index 57abb6136..000000000 --- a/src/formatter/formatComplexDataStructure.js +++ /dev/null @@ -1,54 +0,0 @@ -/* @flow */ - -import { isValidElement } from 'react'; -import { prettyPrint } from '@base2/pretty-print-object'; -import sortObject from './sortObject'; -import parseReactElement from './../parser/parseReactElement'; -import formatTreeNode from './formatTreeNode'; -import formatFunction from './formatFunction'; -import spacer from './spacer'; -import type { Options } from './../options'; - -export default ( - value: Object | Array, - inline: boolean, - lvl: number, - options: Options -): string => { - const normalizedValue = sortObject(value); - - const stringifiedValue = prettyPrint(normalizedValue, { - transform: (currentObj, prop, originalResult) => { - const currentValue = currentObj[prop]; - - if (currentValue && isValidElement(currentValue)) { - return formatTreeNode( - parseReactElement(currentValue, options), - true, - lvl, - options - ); - } - - if (typeof currentValue === 'function') { - return formatFunction(currentValue, options); - } - - return originalResult; - }, - }); - - if (inline) { - return stringifiedValue - .replace(/\s+/g, ' ') - .replace(/{ /g, '{') - .replace(/ }/g, '}') - .replace(/\[ /g, '[') - .replace(/ ]/g, ']'); - } - - // Replace tabs with spaces, and add necessary indentation in front of each new line - return stringifiedValue - .replace(/\t/g, spacer(1, options.tabStop)) - .replace(/\n([^$])/g, `\n${spacer(lvl + 1, options.tabStop)}$1`); -}; diff --git a/src/formatter/formatComplexDataStructure.spec.js b/src/formatter/formatComplexDataStructure.spec.js deleted file mode 100644 index 81ff66f6f..000000000 --- a/src/formatter/formatComplexDataStructure.spec.js +++ /dev/null @@ -1,147 +0,0 @@ -/* @flow */ - -import React from 'react'; -import formatComplexDataStructure from './formatComplexDataStructure'; - -jest.mock('./formatReactElementNode.js', () => node => - `<${node.displayName} />` -); - -const createFakeReactElement = (tagName = 'Foo') => - React.createElement(tagName, {}, null); -const options = { tabStop: 2 }; - -describe('formatComplexDataStructure', () => { - it('should format an object', () => { - const fixture = { a: 1, b: { c: 'ccc' } }; - - expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual( - `{ - a: 1, - b: { - c: 'ccc' - } - }` - ); - }); - - it('should format inline an object', () => { - const fixture = { a: 1, b: { c: 'ccc' } }; - - expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( - "{a: 1, b: {c: 'ccc'}}" - ); - }); - - it('should format an empty object', () => { - expect(formatComplexDataStructure({}, false, 0, options)).toEqual('{}'); - }); - - it('should order the object keys', () => { - const fixture = { b: { d: 'ddd', c: 'ccc' }, a: 1 }; - - expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual( - `{ - a: 1, - b: { - c: 'ccc', - d: 'ddd' - } - }` - ); - }); - - it('should format an array', () => { - const fixture = [1, '2', true, false, null]; - - expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual( - `[ - 1, - '2', - true, - false, - null - ]` - ); - }); - - it('should format inline an array ', () => { - const fixture = [1, '2', true, false, null]; - - expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( - "[1, '2', true, false, null]" - ); - }); - - it('should format an object that contains a react element', () => { - const fixture = { a: createFakeReactElement('BarBar') }; - - expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual( - `{ - a: - }` - ); - }); - - it('should format an empty array', () => { - expect(formatComplexDataStructure([], false, 0, options)).toEqual('[]'); - }); - - it('should format an object that contains a date', () => { - const fixture = { a: new Date('2017-11-13T00:00:00.000Z') }; - - expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( - `{a: new Date('2017-11-13T00:00:00.000Z')}` - ); - }); - - it('should format an object that contains a regexp', () => { - const fixture = { a: /test/g }; - - expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( - `{a: /test/g}` - ); - }); - - it('should replace a function with noRefCheck', () => { - const fixture = { - a: function hello() { - return 1; - }, - }; - - expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( - '{a: function noRefCheck() {}}' - ); - }); - - it('should format a function', () => { - const fixture = { - a: function hello() { - return 1; - }, - }; - - expect( - formatComplexDataStructure(fixture, true, 0, { - ...options, - showFunctions: true, - }) - ).toEqual('{a: function hello() {return 1;}}'); - }); - - it('should use the functionValue option', () => { - const fixture = { - a: function hello() { - return 1; - }, - }; - - expect( - formatComplexDataStructure(fixture, true, 0, { - ...options, - functionValue: () => '', - }) - ).toEqual('{a: }'); - }); -}); diff --git a/src/formatter/formatComplexDataStructure.spec.ts b/src/formatter/formatComplexDataStructure.spec.ts new file mode 100644 index 000000000..9a2ea6b83 --- /dev/null +++ b/src/formatter/formatComplexDataStructure.spec.ts @@ -0,0 +1,160 @@ +import { type NamedExoticComponent, createElement } from "react"; +import { describe, expect, it, vitest } from "vitest"; +import type { Options } from "../options"; +import formatComplexDataStructure from "./formatComplexDataStructure"; + +vitest.mock("./formatReactElementNode", () => ({ + default: (node: NamedExoticComponent) => `<${node.displayName} />`, +})); + +const options = { + tabStop: 2, +} as unknown as Options; + +describe("formatComplexDataStructure", () => { + it("should format an object", () => { + const fixture = { + a: 1, + b: { + c: "ccc", + }, + }; + expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual(`{ + a: 1, + b: { + c: 'ccc' + } + }`); + }); + + it("should format inline an object", () => { + const fixture = { + a: 1, + b: { + c: "ccc", + }, + }; + + expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( + "{a: 1, b: {c: 'ccc'}}", + ); + }); + + it("should format an empty object", () => { + expect(formatComplexDataStructure({}, false, 0, options)).toEqual("{}"); + }); + + it("should order the object keys", () => { + const fixture = { + b: { + d: "ddd", + c: "ccc", + }, + a: 1, + }; + + expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual(`{ + a: 1, + b: { + c: 'ccc', + d: 'ddd' + } + }`); + }); + + it("should format an array", () => { + const fixture = [1, "2", true, false, null]; + + expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual(`[ + 1, + '2', + true, + false, + null + ]`); + }); + + it("should format inline an array ", () => { + const fixture = [1, "2", true, false, null]; + + expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( + "[1, '2', true, false, null]", + ); + }); + + it("should format an object that contains a react element", () => { + const fixture = { + a: createElement("BarBar", {}, null), + }; + + expect(formatComplexDataStructure(fixture, false, 0, options)).toEqual(`{ + a: + }`); + }); + + it("should format an empty array", () => { + expect(formatComplexDataStructure([], false, 0, options)).toEqual("[]"); + }); + + it("should format an object that contains a date", () => { + const fixture = { + a: new Date("2017-11-13T00:00:00.000Z"), + }; + + expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( + `{a: new Date('2017-11-13T00:00:00.000Z')}`, + ); + }); + + it("should format an object that contains a regexp", () => { + const fixture = { + a: /test/g, + }; + + expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( + "{a: /test/g}", + ); + }); + + it("should replace a function with noRefCheck", () => { + const fixture = { + a: function hello() { + return 1; + }, + }; + + expect(formatComplexDataStructure(fixture, true, 0, options)).toEqual( + "{a: function noRefCheck() {}}", + ); + }); + + it("should format a function", () => { + const fixture = { + a: function hello() { + return 1; + }, + }; + + expect( + formatComplexDataStructure(fixture, true, 0, { + ...options, + showFunctions: true, + }), + ).toEqual("{a: function hello() {return 1;}}"); + }); + + it("should use the functionValue option", () => { + const fixture = { + a: function hello() { + return 1; + }, + }; + + expect( + formatComplexDataStructure(fixture, true, 0, { + ...options, + functionValue: () => "", + }), + ).toEqual("{a: }"); + }); +}); diff --git a/src/formatter/formatComplexDataStructure.ts b/src/formatter/formatComplexDataStructure.ts new file mode 100644 index 000000000..5fb8bdda7 --- /dev/null +++ b/src/formatter/formatComplexDataStructure.ts @@ -0,0 +1,54 @@ +import { prettyPrint } from "@base2/pretty-print-object"; +import { isValidElement } from "react"; +import { type Options, defaultOptions } from "../options"; +import parseReactElement from "../parser/parseReactElement"; +import formatFunction from "./formatFunction"; +import formatTreeNode from "./formatTreeNode"; +import sortObject from "./sortObject"; +import spacer from "./spacer"; + +export default ( + value: Record | Array, + inline: boolean, + lvl: number, + options: Options, +): string => { + const normalizedValue = sortObject(value); + + const stringifiedValue = prettyPrint(normalizedValue, { + transform: (currentObj, prop, originalResult) => { + const currentValue = currentObj[prop]; + + if (currentValue && isValidElement(currentValue)) { + return formatTreeNode( + parseReactElement(currentValue, options), + true, + lvl, + options, + ); + } + + if (typeof currentValue === "function") { + return formatFunction(currentValue, options); + } + + return originalResult; + }, + }); + + if (inline) { + return stringifiedValue + .replace(/\s+/g, " ") + .replace(/{ /g, "{") + .replace(/ }/g, "}") + .replace(/\[ /g, "[") + .replace(/ ]/g, "]"); + } + + const tabStop = options.tabStop ?? defaultOptions.tabStop; + + // Replace tabs with spaces, and add necessary indentation in front of each new line + return stringifiedValue + .replace(/\t/g, spacer(1, tabStop)) + .replace(/\n([^$])/g, `\n${spacer(lvl + 1, tabStop)}$1`); +}; diff --git a/src/formatter/formatFunction.spec.js b/src/formatter/formatFunction.spec.js deleted file mode 100644 index 8a199696b..000000000 --- a/src/formatter/formatFunction.spec.js +++ /dev/null @@ -1,59 +0,0 @@ -/* @flow */ - -import formatFunction from './formatFunction'; - -jest.mock('./formatReactElementNode.js', () => node => - `<${node.displayName} />` -); - -function hello() { - return 1; -} - -describe('formatFunction', () => { - it('should replace a function with noRefCheck without showFunctions option', () => { - expect(formatFunction(hello, {})).toEqual('function noRefCheck() {}'); - }); - - it('should replace a function with noRefCheck if showFunctions is false', () => { - expect(formatFunction(hello, { showFunctions: false })).toEqual( - 'function noRefCheck() {}' - ); - }); - - it('should format a function if showFunctions is true', () => { - expect(formatFunction(hello, { showFunctions: true })).toEqual( - 'function hello() {return 1;}' - ); - }); - - it('should format a function without name if showFunctions is true', () => { - expect(formatFunction(() => 1, { showFunctions: true })).toEqual( - 'function () {return 1;}' - ); - }); - - it('should use the functionValue option', () => { - expect(formatFunction(hello, { functionValue: () => '' })).toEqual( - '' - ); - }); - - it('should use the functionValue option even if showFunctions is true', () => { - expect( - formatFunction(hello, { - showFunctions: true, - functionValue: () => '', - }) - ).toEqual(''); - }); - - it('should use the functionValue option even if showFunctions is false', () => { - expect( - formatFunction(hello, { - showFunctions: false, - functionValue: () => '', - }) - ).toEqual(''); - }); -}); diff --git a/src/formatter/formatFunction.spec.ts b/src/formatter/formatFunction.spec.ts new file mode 100644 index 000000000..1e561dc81 --- /dev/null +++ b/src/formatter/formatFunction.spec.ts @@ -0,0 +1,89 @@ +import type { NamedExoticComponent } from "react"; +import { describe, expect, it, vitest } from "vitest"; +import { generateOptionsFixture } from "../__tests__/generateOptionsFixture"; +import formatFunction from "./formatFunction"; + +vitest.mock( + "./formatReactElementNode", + () => (node: NamedExoticComponent) => `<${node.displayName} />`, +); + +function hello() { + return 1; +} + +describe("formatFunction", () => { + it("should replace a function with noRefCheck without showFunctions option", () => { + expect(formatFunction(hello, generateOptionsFixture({}))).toEqual( + "function noRefCheck() {}", + ); + }); + + it("should replace a function with noRefCheck if showFunctions is false", () => { + expect( + formatFunction( + hello, + generateOptionsFixture({ + showFunctions: false, + }), + ), + ).toEqual("function noRefCheck() {}"); + }); + + it("should format a function if showFunctions is true", () => { + expect( + formatFunction( + hello, + generateOptionsFixture({ + showFunctions: true, + }), + ), + ).toEqual("function hello() {return 1;}"); + }); + + it("should format a function without name if showFunctions is true", () => { + expect( + formatFunction( + () => 1, + generateOptionsFixture({ + showFunctions: true, + }), + ), + ).toEqual("() => 1"); + }); + + it("should use the functionValue option", () => { + expect( + formatFunction( + hello, + generateOptionsFixture({ + functionValue: () => "", + }), + ), + ).toEqual(""); + }); + + it("should use the functionValue option even if showFunctions is true", () => { + expect( + formatFunction( + hello, + generateOptionsFixture({ + showFunctions: true, + functionValue: () => "", + }), + ), + ).toEqual(""); + }); + + it("should use the functionValue option even if showFunctions is false", () => { + expect( + formatFunction( + hello, + generateOptionsFixture({ + showFunctions: false, + functionValue: () => "", + }), + ), + ).toEqual(""); + }); +}); diff --git a/src/formatter/formatFunction.js b/src/formatter/formatFunction.ts similarity index 60% rename from src/formatter/formatFunction.js rename to src/formatter/formatFunction.ts index f8474436b..2f352e6e0 100644 --- a/src/formatter/formatFunction.js +++ b/src/formatter/formatFunction.ts @@ -1,20 +1,22 @@ -import type { Options } from './../options'; +import type { Options } from "../options"; function noRefCheck() {} -export const inlineFunction = (fn: any): string => +export const inlineFunction = (fn: Function): string => fn .toString() - .split('\n') - .map(line => line.trim()) - .join(''); + .split("\n") + .map((line) => line.trim()) + .join(""); -export const preserveFunctionLineBreak = (fn: any): string => fn.toString(); +export const preserveFunctionLineBreak = (fn: Function): string => + fn.toString(); const defaultFunctionValue = inlineFunction; export default (fn: Function, options: Options): string => { const { functionValue = defaultFunctionValue, showFunctions } = options; + if (!showFunctions && functionValue === defaultFunctionValue) { return functionValue(noRefCheck); } diff --git a/src/formatter/formatProp.spec.js b/src/formatter/formatProp.spec.ts similarity index 51% rename from src/formatter/formatProp.spec.js rename to src/formatter/formatProp.spec.ts index 700c8fa9b..a9d53650c 100644 --- a/src/formatter/formatProp.spec.js +++ b/src/formatter/formatProp.spec.ts @@ -1,26 +1,26 @@ -/* @flow */ +import { beforeEach, describe, expect, it, vitest } from "vitest"; +import type { Options } from "../options"; +import formatProp from "./formatProp"; +import formatPropValue from "./formatPropValue"; -import formatProp from './formatProp'; -import formatPropValue from './formatPropValue'; - -jest.mock('./formatPropValue'); +vitest.mock("./formatPropValue"); const defaultOptions = { useBooleanShorthandSyntax: true, tabStop: 2, -}; +} as unknown as Options; -describe('formatProp', () => { +describe("formatProp", () => { beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); + vitest.clearAllMocks(); + vitest.resetAllMocks(); }); - it('should format prop with only a value', () => { - formatPropValue.mockReturnValue('"MockedPropValue"'); + it("should format prop with only a value", () => { + vitest.mocked(formatPropValue).mockReturnValue('"MockedPropValue"'); expect( - formatProp('foo', true, 'bar', false, null, true, 0, defaultOptions) + formatProp("foo", true, "bar", false, null, true, 0, defaultOptions), ).toEqual({ attributeFormattedInline: ' foo="MockedPropValue"', attributeFormattedMultiline: ` @@ -29,18 +29,18 @@ describe('formatProp', () => { }); expect(formatPropValue).toHaveBeenCalledWith( - 'bar', + "bar", true, 0, - defaultOptions + defaultOptions, ); }); - it('should format prop with only a default value', () => { - formatPropValue.mockReturnValue('"MockedPropValue"'); + it("should format prop with only a default value", () => { + vitest.mocked(formatPropValue).mockReturnValue('"MockedPropValue"'); expect( - formatProp('foo', false, null, true, 'baz', true, 0, defaultOptions) + formatProp("foo", false, null, true, "baz", true, 0, defaultOptions), ).toEqual({ attributeFormattedInline: ' foo="MockedPropValue"', attributeFormattedMultiline: ` @@ -49,18 +49,18 @@ describe('formatProp', () => { }); expect(formatPropValue).toHaveBeenCalledWith( - 'baz', + "baz", true, 0, - defaultOptions + defaultOptions, ); }); - it('should format prop with a value and a default value', () => { - formatPropValue.mockReturnValue('"MockedPropValue"'); + it("should format prop with a value and a default value", () => { + vitest.mocked(formatPropValue).mockReturnValue('"MockedPropValue"'); expect( - formatProp('foo', true, 'bar', true, 'baz', true, 0, defaultOptions) + formatProp("foo", true, "bar", true, "baz", true, 0, defaultOptions), ).toEqual({ attributeFormattedInline: ' foo="MockedPropValue"', attributeFormattedMultiline: ` @@ -69,25 +69,25 @@ describe('formatProp', () => { }); expect(formatPropValue).toHaveBeenCalledWith( - 'bar', + "bar", true, 0, - defaultOptions + defaultOptions, ); }); - it('should format a truthy boolean prop (with short syntax)', () => { + it("should format a truthy boolean prop (with short syntax)", () => { const options = { useBooleanShorthandSyntax: true, tabStop: 2, - }; + } as Options; - formatPropValue.mockReturnValue('{true}'); + vitest.mocked(formatPropValue).mockReturnValue("{true}"); expect( - formatProp('foo', true, true, false, false, true, 0, options) + formatProp("foo", true, true, false, false, true, 0, options), ).toEqual({ - attributeFormattedInline: ' foo', + attributeFormattedInline: " foo", attributeFormattedMultiline: ` foo`, isMultilineAttribute: false, @@ -96,37 +96,37 @@ describe('formatProp', () => { expect(formatPropValue).toHaveBeenCalledWith(true, true, 0, options); }); - it('should ignore a falsy boolean prop (with short syntax)', () => { + it("should ignore a falsy boolean prop (with short syntax)", () => { const options = { useBooleanShorthandSyntax: true, tabStop: 2, - }; + } as Options; - formatPropValue.mockReturnValue('{false}'); + vitest.mocked(formatPropValue).mockReturnValue("{false}"); expect( - formatProp('foo', true, false, false, null, true, 0, options) + formatProp("foo", true, false, false, null, true, 0, options), ).toEqual({ - attributeFormattedInline: '', - attributeFormattedMultiline: '', + attributeFormattedInline: "", + attributeFormattedMultiline: "", isMultilineAttribute: false, }); expect(formatPropValue).toHaveBeenCalledWith(false, true, 0, options); }); - it('should format a truthy boolean prop (with explicit syntax)', () => { + it("should format a truthy boolean prop (with explicit syntax)", () => { const options = { useBooleanShorthandSyntax: false, tabStop: 2, - }; + } as Options; - formatPropValue.mockReturnValue('{true}'); + vitest.mocked(formatPropValue).mockReturnValue("{true}"); expect( - formatProp('foo', true, true, false, false, true, 0, options) + formatProp("foo", true, true, false, false, true, 0, options), ).toEqual({ - attributeFormattedInline: ' foo={true}', + attributeFormattedInline: " foo={true}", attributeFormattedMultiline: ` foo={true}`, isMultilineAttribute: false, @@ -135,18 +135,18 @@ describe('formatProp', () => { expect(formatPropValue).toHaveBeenCalledWith(true, true, 0, options); }); - it('should format a falsy boolean prop (with explicit syntax)', () => { + it("should format a falsy boolean prop (with explicit syntax)", () => { const options = { useBooleanShorthandSyntax: false, tabStop: 2, - }; + } as Options; - formatPropValue.mockReturnValue('{false}'); + vitest.mocked(formatPropValue).mockReturnValue("{false}"); expect( - formatProp('foo', true, false, false, false, true, 0, options) + formatProp("foo", true, false, false, false, true, 0, options), ).toEqual({ - attributeFormattedInline: ' foo={false}', + attributeFormattedInline: " foo={false}", attributeFormattedMultiline: ` foo={false}`, isMultilineAttribute: false, @@ -155,23 +155,23 @@ describe('formatProp', () => { expect(formatPropValue).toHaveBeenCalledWith(false, true, 0, options); }); - it('should format a mulitline props', () => { - formatPropValue.mockReturnValue(`{[ + it("should format a mulitline props", () => { + vitest.mocked(formatPropValue).mockReturnValue(`{[ "a", "b" ]}`); expect( formatProp( - 'foo', + "foo", true, - ['a', 'b'], + ["a", "b"], false, false, false, 0, - defaultOptions - ) + defaultOptions, + ), ).toEqual({ attributeFormattedInline: ` foo={[ "a", @@ -186,37 +186,37 @@ describe('formatProp', () => { }); expect(formatPropValue).toHaveBeenCalledWith( - ['a', 'b'], + ["a", "b"], false, 0, - defaultOptions + defaultOptions, ); }); - it('should indent the formatted string', () => { + it("should indent the formatted string", () => { /* * lvl 4 and tabStop 2 : * - 4 * 2 = 8 spaces * - One new indentation = 2 spaces * - Expected indentation : 10 spaces */ - const options = { useBooleanShorthandSyntax: true, tabStop: 2, - }; + } as Options; - formatPropValue.mockReturnValue('"MockedPropValue"'); + vitest.mocked(formatPropValue).mockReturnValue('"MockedPropValue"'); expect( - formatProp('foo', true, 'bar', false, null, true, 4, options) + formatProp("foo", true, "bar", false, null, true, 4, options), ).toEqual({ attributeFormattedInline: ' foo="MockedPropValue"', attributeFormattedMultiline: ` - foo="MockedPropValue"`, // 10 spaces + foo="MockedPropValue"`, + // 10 spaces isMultilineAttribute: false, }); - expect(formatPropValue).toHaveBeenCalledWith('bar', true, 4, options); + expect(formatPropValue).toHaveBeenCalledWith("bar", true, 4, options); }); }); diff --git a/src/formatter/formatProp.js b/src/formatter/formatProp.ts similarity index 62% rename from src/formatter/formatProp.js rename to src/formatter/formatProp.ts index 9fcac3c01..411cf682d 100644 --- a/src/formatter/formatProp.js +++ b/src/formatter/formatProp.ts @@ -1,48 +1,47 @@ -/* @flow */ - -import spacer from './spacer'; -import formatPropValue from './formatPropValue'; -import type { Options } from './../options'; +import { type Options, defaultOptions } from "../options"; +import formatPropValue from "./formatPropValue"; +import spacer from "./spacer"; export default ( name: string, hasValue: boolean, - value: any, + value: unknown, hasDefaultValue: boolean, - defaultValue: any, + defaultValue: unknown, inline: boolean, lvl: number, - options: Options + options: Options, ): { - attributeFormattedInline: string, - attributeFormattedMultiline: string, - isMultilineAttribute: boolean, + attributeFormattedInline: string; + attributeFormattedMultiline: string; + isMultilineAttribute: boolean; } => { if (!hasValue && !hasDefaultValue) { throw new Error( - `The prop "${name}" has no value and no default: could not be formatted` + `The prop "${name}" has no value and no default: could not be formatted`, ); } const usedValue = hasValue ? value : defaultValue; - const { useBooleanShorthandSyntax, tabStop } = options; + const { useBooleanShorthandSyntax, tabStop = defaultOptions.tabStop } = + options; const formattedPropValue = formatPropValue(usedValue, inline, lvl, options); - let attributeFormattedInline = ' '; + let attributeFormattedInline = " "; let attributeFormattedMultiline = `\n${spacer(lvl + 1, tabStop)}`; - const isMultilineAttribute = formattedPropValue.includes('\n'); + const isMultilineAttribute = formattedPropValue.includes("\n"); if ( useBooleanShorthandSyntax && - formattedPropValue === '{false}' && + formattedPropValue === "{false}" && !hasDefaultValue ) { // If a boolean is false and not different from it's default, we do not render the attribute - attributeFormattedInline = ''; - attributeFormattedMultiline = ''; - } else if (useBooleanShorthandSyntax && formattedPropValue === '{true}') { + attributeFormattedInline = ""; + attributeFormattedMultiline = ""; + } else if (useBooleanShorthandSyntax && formattedPropValue === "{true}") { attributeFormattedInline += `${name}`; attributeFormattedMultiline += `${name}`; } else { diff --git a/src/formatter/formatPropValue.js b/src/formatter/formatPropValue.js deleted file mode 100644 index 5170c3721..000000000 --- a/src/formatter/formatPropValue.js +++ /dev/null @@ -1,70 +0,0 @@ -/* @flow */ - -import { isPlainObject } from 'is-plain-object'; -import { isValidElement } from 'react'; -import formatComplexDataStructure from './formatComplexDataStructure'; -import formatFunction from './formatFunction'; -import formatTreeNode from './formatTreeNode'; -import type { Options } from './../options'; -import parseReactElement from './../parser/parseReactElement'; - -const escape = (s: string): string => s.replace(/"/g, '"'); - -const formatPropValue = ( - propValue: any, - inline: boolean, - lvl: number, - options: Options -): string => { - if (typeof propValue === 'number') { - return `{${String(propValue)}}`; - } - - if (typeof propValue === 'string') { - return `"${escape(propValue)}"`; - } - - // > "Symbols (new in ECMAScript 2015, not yet supported in Flow)" - // @see: https://flow.org/en/docs/types/primitives/ - // $FlowFixMe: Flow does not support Symbol - if (typeof propValue === 'symbol') { - const symbolDescription = propValue - .valueOf() - .toString() - .replace(/Symbol\((.*)\)/, '$1'); - - if (!symbolDescription) { - return `{Symbol()}`; - } - - return `{Symbol('${symbolDescription}')}`; - } - - if (typeof propValue === 'function') { - return `{${formatFunction(propValue, options)}}`; - } - - if (isValidElement(propValue)) { - return `{${formatTreeNode( - parseReactElement(propValue, options), - true, - lvl, - options - )}}`; - } - - if (propValue instanceof Date) { - if (isNaN(propValue.valueOf())) { - return `{new Date(NaN)}`; - } - return `{new Date("${propValue.toISOString()}")}`; - } - - if (isPlainObject(propValue) || Array.isArray(propValue)) { - return `{${formatComplexDataStructure(propValue, inline, lvl, options)}}`; - } - - return `{${String(propValue)}}`; -}; - -export default formatPropValue; diff --git a/src/formatter/formatPropValue.spec.js b/src/formatter/formatPropValue.spec.js deleted file mode 100644 index 8d0a0eeb4..000000000 --- a/src/formatter/formatPropValue.spec.js +++ /dev/null @@ -1,138 +0,0 @@ -/* @flow */ - -import React from 'react'; -import formatPropValue from './formatPropValue'; -import parseReactElement from './../parser/parseReactElement'; -import formatTreeNode from './formatTreeNode'; -import formatComplexDataStructure from './formatComplexDataStructure'; - -jest.mock('./../parser/parseReactElement'); -jest.mock('./formatTreeNode', () => - jest.fn().mockReturnValue('') -); -jest.mock('./formatComplexDataStructure', () => - jest.fn().mockReturnValue('*Mocked formatComplexDataStructure result*') -); - -describe('formatPropValue', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should format an integer prop value', () => { - expect(formatPropValue(42, false, 0, {})).toBe('{42}'); - }); - - it('should escape double quote on prop value of string type', () => { - expect(formatPropValue('Hello "Jonh"!', false, 0, {})).toBe( - '"Hello "Jonh"!"' - ); - }); - - it('should format a symbol prop value', () => { - expect(formatPropValue(Symbol('Foo'), false, 0, {})).toBe( - "{Symbol('Foo')}" - ); - - // eslint-disable-next-line symbol-description - expect(formatPropValue(Symbol(), false, 0, {})).toBe('{Symbol()}'); - }); - - it('should replace a function prop value by a an empty generic function by default', () => { - const doThings = a => a * 2; - - expect(formatPropValue(doThings, false, 0, {})).toBe( - '{function noRefCheck() {}}' - ); - }); - - it('should show the function prop value implementation if "showFunctions" option is true', () => { - const doThings = a => a * 2; - - expect(formatPropValue(doThings, false, 0, { showFunctions: true })).toBe( - '{function doThings(a) {return a * 2;}}' - ); - }); - - it('should format the function prop value with the "functionValue" option', () => { - const doThings = a => a * 2; - - const functionValue = fn => { - expect(fn).toBe(doThings); - - return 'function Myfunction() {}'; - }; - - expect( - formatPropValue(doThings, false, 0, { - functionValue, - showFunctions: true, - }) - ).toBe('{function Myfunction() {}}'); - - expect( - formatPropValue(doThings, false, 0, { - functionValue, - showFunctions: false, - }) - ).toBe('{function Myfunction() {}}'); - }); - - it('should parse and format a react element prop value', () => { - expect(formatPropValue(
, false, 0, {})).toBe( - '{}' - ); - - expect(parseReactElement).toHaveBeenCalledTimes(1); - expect(formatTreeNode).toHaveBeenCalledTimes(1); - }); - - it('should format a date prop value', () => { - expect( - formatPropValue(new Date('2017-01-01T11:00:00.000Z'), false, 0, {}) - ).toBe('{new Date("2017-01-01T11:00:00.000Z")}'); - }); - - it('should format an invalid date prop value', () => { - expect(formatPropValue(new Date(NaN), false, 0, {})).toBe( - '{new Date(NaN)}' - ); - }); - - it('should format an object prop value', () => { - expect(formatPropValue({ foo: 42 }, false, 0, {})).toBe( - '{*Mocked formatComplexDataStructure result*}' - ); - - expect(formatComplexDataStructure).toHaveBeenCalledTimes(1); - }); - - it('should format an array prop value', () => { - expect(formatPropValue(['a', 'b', 'c'], false, 0, {})).toBe( - '{*Mocked formatComplexDataStructure result*}' - ); - - expect(formatComplexDataStructure).toHaveBeenCalledTimes(1); - }); - - it('should format a boolean prop value', () => { - expect(formatPropValue(true, false, 0, {})).toBe('{true}'); - expect(formatPropValue(false, false, 0, {})).toBe('{false}'); - }); - - it('should format null prop value', () => { - expect(formatPropValue(null, false, 0, {})).toBe('{null}'); - }); - - it('should format undefined prop value', () => { - expect(formatPropValue(undefined, false, 0, {})).toBe('{undefined}'); - }); - - it('should call the ".toString()" method on object instance prop value', () => { - expect(formatPropValue(new Set(['a', 'b', 42]), false, 0, {})).toBe( - '{[object Set]}' - ); - - expect(formatPropValue(new Map(), false, 0, {})).toBe('{[object Map]}'); - }); -}); diff --git a/src/formatter/formatPropValue.spec.tsx b/src/formatter/formatPropValue.spec.tsx new file mode 100644 index 000000000..010d4b9e5 --- /dev/null +++ b/src/formatter/formatPropValue.spec.tsx @@ -0,0 +1,194 @@ +import { beforeEach, describe, expect, it, vitest } from "vitest"; +import { generateOptionsFixture } from "../__tests__/generateOptionsFixture"; +import parseReactElement from "../parser/parseReactElement"; +import formatComplexDataStructure from "./formatComplexDataStructure"; +import formatPropValue from "./formatPropValue"; +import formatTreeNode from "./formatTreeNode"; + +vitest.mock("./../parser/parseReactElement"); +vitest.mock("./formatTreeNode"); +vitest.mock("./formatComplexDataStructure"); + +describe("formatPropValue", () => { + beforeEach(() => { + vitest + .mocked(formatTreeNode) + .mockReturnValue(""); + + vitest + .mocked(formatComplexDataStructure) + .mockReturnValue("*Mocked formatComplexDataStructure result*"); + }); + + it("should format an integer prop value", () => { + expect(formatPropValue(42, false, 0, generateOptionsFixture({}))).toBe( + "{42}", + ); + }); + + it("should escape double quote on prop value of string type", () => { + expect( + formatPropValue('Hello "Jonh"!', false, 0, generateOptionsFixture({})), + ).toBe('"Hello "Jonh"!"'); + }); + + it("should format a symbol prop value", () => { + expect( + formatPropValue(Symbol("Foo"), false, 0, generateOptionsFixture({})), + ).toBe("{Symbol('Foo')}"); + // eslint-disable-next-line symbol-description + expect( + formatPropValue(Symbol(), false, 0, generateOptionsFixture({})), + ).toBe("{Symbol()}"); + }); + + it("should replace a function prop value by a an empty generic function by default", () => { + const doThings = (a: number) => a * 2; + + expect( + formatPropValue(doThings, false, 0, generateOptionsFixture({})), + ).toBe("{function noRefCheck() {}}"); + }); + + it('should show the function prop value implementation if "showFunctions" option is true', () => { + function doThings(a: number) { + return a * 2; + } + + expect( + formatPropValue( + doThings, + false, + 0, + generateOptionsFixture({ + showFunctions: true, + }), + ), + ).toBe("{function doThings(a) {return a * 2;}}"); + }); + + it('should format the function prop value with the "functionValue" option', () => { + const doThings = (a: number) => a * 2; + + const functionValue = (fn: Function) => { + expect(fn).toBe(doThings); + + return "function Myfunction() {}"; + }; + + expect( + formatPropValue( + doThings, + false, + 0, + generateOptionsFixture({ + functionValue, + showFunctions: true, + }), + ), + ).toBe("{function Myfunction() {}}"); + + expect( + formatPropValue( + doThings, + false, + 0, + generateOptionsFixture({ + functionValue, + showFunctions: false, + }), + ), + ).toBe("{function Myfunction() {}}"); + }); + + it("should parse and format a react element prop value", () => { + expect(formatPropValue(
, false, 0, generateOptionsFixture({}))).toBe( + "{}", + ); + + expect(parseReactElement).toHaveBeenCalledTimes(1); + expect(formatTreeNode).toHaveBeenCalledTimes(1); + }); + + it("should format a date prop value", () => { + expect( + formatPropValue( + new Date("2017-01-01T11:00:00.000Z"), + false, + 0, + generateOptionsFixture({}), + ), + ).toBe('{new Date("2017-01-01T11:00:00.000Z")}'); + }); + + it("should format an invalid date prop value", () => { + expect( + formatPropValue( + new Date(Number.NaN), + false, + 0, + generateOptionsFixture({}), + ), + ).toBe("{new Date(NaN)}"); + }); + + it("should format an object prop value", () => { + expect( + formatPropValue( + { + foo: 42, + }, + false, + 0, + generateOptionsFixture({}), + ), + ).toBe("{*Mocked formatComplexDataStructure result*}"); + + expect(formatComplexDataStructure).toHaveBeenCalledTimes(1); + }); + + it("should format an array prop value", () => { + expect( + formatPropValue(["a", "b", "c"], false, 0, generateOptionsFixture({})), + ).toBe("{*Mocked formatComplexDataStructure result*}"); + + expect(formatComplexDataStructure).toHaveBeenCalledTimes(1); + }); + + it("should format a boolean prop value", () => { + expect(formatPropValue(true, false, 0, generateOptionsFixture({}))).toBe( + "{true}", + ); + + expect(formatPropValue(false, false, 0, generateOptionsFixture({}))).toBe( + "{false}", + ); + }); + + it("should format null prop value", () => { + expect(formatPropValue(null, false, 0, generateOptionsFixture({}))).toBe( + "{null}", + ); + }); + + it("should format undefined prop value", () => { + expect( + formatPropValue(undefined, false, 0, generateOptionsFixture({})), + ).toBe("{undefined}"); + }); + + it('should call the ".toString()" method on object instance prop value', () => { + expect( + formatPropValue( + new Set(["a", "b", 42]), + false, + 0, + generateOptionsFixture({}), + ), + ).toBe("{[object Set]}"); + + expect( + formatPropValue(new Map(), false, 0, generateOptionsFixture({})), + ).toBe("{[object Map]}"); + }); +}); diff --git a/src/formatter/formatPropValue.ts b/src/formatter/formatPropValue.ts new file mode 100644 index 000000000..1f65fceea --- /dev/null +++ b/src/formatter/formatPropValue.ts @@ -0,0 +1,70 @@ +import { isValidElement } from "react"; +import type { Options } from "../options"; +import parseReactElement from "../parser/parseReactElement"; +import formatComplexDataStructure from "./formatComplexDataStructure"; +import formatFunction from "./formatFunction"; +import formatTreeNode from "./formatTreeNode"; +import { isPlainObject } from "./isPlainObject"; + +const escapeQuotes = (s: string): string => s.replace(/"/g, """); + +const formatPropValue = ( + propValue: unknown, + inline: boolean, + lvl: number, + options: Options, +): string => { + if (typeof propValue === "number") { + return `{${String(propValue)}}`; + } + + if (typeof propValue === "string") { + return `"${escapeQuotes(propValue)}"`; + } + + if (typeof propValue === "symbol") { + const symbolDescription = propValue + .valueOf() + .toString() + .replace(/Symbol\((.*)\)/, "$1"); + + if (!symbolDescription) { + return "{Symbol()}"; + } + + return `{Symbol('${symbolDescription}')}`; + } + + if (typeof propValue === "function") { + return `{${formatFunction(propValue, options)}}`; + } + + if (isValidElement(propValue)) { + return `{${formatTreeNode( + parseReactElement(propValue, options), + true, + lvl, + options, + )}}`; + } + + if (propValue instanceof Date) { + if (Number.isNaN(propValue.valueOf())) { + return "{new Date(NaN)}"; + } + + return `{new Date("${propValue.toISOString()}")}`; + } + + if (isPlainObject(propValue)) { + return `{${formatComplexDataStructure(propValue, inline, lvl, options)}}`; + } + + if (Array.isArray(propValue)) { + return `{${formatComplexDataStructure(propValue, inline, lvl, options)}}`; + } + + return `{${String(propValue)}}`; +}; + +export default formatPropValue; diff --git a/src/formatter/formatReactElementNode.spec.js b/src/formatter/formatReactElementNode.spec.js deleted file mode 100644 index b4475457c..000000000 --- a/src/formatter/formatReactElementNode.spec.js +++ /dev/null @@ -1,154 +0,0 @@ -/* @flow */ - -import React from 'react'; -import formatReactElementNode from './formatReactElementNode'; - -const defaultOptions = { - filterProps: [], - showDefaultProps: true, - showFunctions: false, - tabStop: 2, - useBooleanShorthandSyntax: true, - sortProps: true, -}; - -describe('formatReactElementNode', () => { - it('should format a react element with a string a children', () => { - const tree = { - type: 'ReactElement', - displayName: 'h1', - defaultProps: {}, - props: {}, - childrens: [ - { - value: 'Hello world', - type: 'string', - }, - ], - }; - - expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( - `

- Hello world -

` - ); - }); - - it('should format a single depth react element', () => { - const tree = { - type: 'ReactElement', - displayName: 'aaa', - props: { - foo: '41', - }, - defaultProps: { - foo: '41', - }, - childrens: [], - }; - - expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( - '' - ); - }); - - it('should format a react element with an object as props', () => { - const tree = { - type: 'ReactElement', - displayName: 'div', - defaultProps: { - a: { aa: '1', bb: { cc: '3' } }, - }, - props: { - a: { aa: '1', bb: { cc: '3' } }, - }, - childrens: [], - }; - - expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( - `
` - ); - }); - - it('should format a react element with another react element as props', () => { - const tree = { - type: 'ReactElement', - displayName: 'div', - defaultProps: { - a: , - }, - props: { - a: , - }, - childrens: [], - }; - - expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( - '
} />' - ); - }); - - it('should format a react element with multiline children', () => { - const tree = { - type: 'ReactElement', - displayName: 'div', - defaultProps: {}, - props: {}, - childrens: [ - { - type: 'string', - value: 'first line\nsecond line\nthird line', - }, - ], - }; - - expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( - `
- first line - second line - third line -
` - ); - - expect(formatReactElementNode(tree, false, 2, defaultOptions)).toEqual( - `
- first line - second line - third line -
` - ); - }); - - it('should allow filtering props by function', () => { - const tree = { - type: 'ReactElement', - displayName: 'h1', - defaultProps: {}, - props: { className: 'myClass', onClick: () => {} }, - childrens: [ - { - value: 'Hello world', - type: 'string', - }, - ], - }; - - const options = { - ...defaultOptions, - filterProps: (val, key) => !key.startsWith('on'), - }; - - expect(formatReactElementNode(tree, false, 0, options)).toEqual( - `

- Hello world -

` - ); - }); -}); diff --git a/src/formatter/formatReactElementNode.spec.tsx b/src/formatter/formatReactElementNode.spec.tsx new file mode 100644 index 000000000..c25ce0d42 --- /dev/null +++ b/src/formatter/formatReactElementNode.spec.tsx @@ -0,0 +1,162 @@ +import { describe, expect, it } from "vitest"; +import { generateOptionsFixture } from "../__tests__/generateOptionsFixture"; +import formatReactElementNode from "./formatReactElementNode"; + +const defaultOptions = generateOptionsFixture({ + filterProps: [], + showDefaultProps: true, + showFunctions: false, + tabStop: 2, + useBooleanShorthandSyntax: true, + sortProps: true, +}); + +describe("formatReactElementNode", () => { + it("should format a react element with a string a children", () => { + const tree = { + type: "ReactElement" as const, + displayName: "h1", + defaultProps: {}, + props: {}, + children: [ + { + type: "string" as const, + value: "Hello world", + }, + ], + }; + + expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual(`

+ Hello world +

`); + }); + + it("should format a single depth react element", () => { + const tree = { + type: "ReactElement" as const, + displayName: "aaa", + props: { + foo: "41", + }, + defaultProps: { + foo: "41", + }, + children: [], + }; + + expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( + '', + ); + }); + + it("should format a react element with an object as props", () => { + const tree = { + type: "ReactElement" as const, + displayName: "div", + defaultProps: { + a: { + aa: "1", + bb: { + cc: "3", + }, + }, + }, + props: { + a: { + aa: "1", + bb: { + cc: "3", + }, + }, + }, + children: [], + }; + + expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual(`
`); + }); + + it("should format a react element with another react element as props", () => { + const tree = { + type: "ReactElement" as const, + displayName: "div", + defaultProps: { + a: , + }, + props: { + a: , + }, + children: [], + }; + + expect(formatReactElementNode(tree, false, 0, defaultOptions)).toEqual( + '
} />', + ); + }); + + it("should format a react element with multiline children", () => { + const tree = { + type: "ReactElement" as const, + displayName: "div", + defaultProps: {}, + props: {}, + children: [ + { + type: "string" as const, + value: "first line\nsecond line\nthird line", + }, + ], + }; + + expect( + formatReactElementNode(tree, false, 0, defaultOptions), + ).toEqual(`
+ first line + second line + third line +
`); + + expect( + formatReactElementNode(tree, false, 2, defaultOptions), + ).toEqual(`
+ first line + second line + third line +
`); + }); + + it("should allow filtering props by function", () => { + const tree = { + type: "ReactElement" as const, + displayName: "h1", + defaultProps: {}, + props: { + className: "myClass", + onClick: () => {}, + }, + children: [ + { + type: "string" as const, + value: "Hello world", + }, + ], + }; + + const options = { + ...defaultOptions, + filterProps: (val: unknown, key: string) => !key.startsWith("on"), + }; + + expect( + formatReactElementNode(tree, false, 0, options), + ).toEqual(`

+ Hello world +

`); + }); +}); diff --git a/src/formatter/formatReactElementNode.js b/src/formatter/formatReactElementNode.ts similarity index 60% rename from src/formatter/formatReactElementNode.js rename to src/formatter/formatReactElementNode.ts index 4e2d5820c..9a76c6825 100644 --- a/src/formatter/formatReactElementNode.js +++ b/src/formatter/formatReactElementNode.ts @@ -1,26 +1,24 @@ -/* @flow */ - -import spacer from './spacer'; -import formatTreeNode from './formatTreeNode'; -import formatProp from './formatProp'; -import mergeSiblingPlainStringChildrenReducer from './mergeSiblingPlainStringChildrenReducer'; -import sortPropsByNames from './sortPropsByNames'; -import createPropFilter from './createPropFilter'; -import type { Options } from './../options'; -import type { ReactElementTreeNode } from './../tree'; +import { type Options, defaultOptions } from "../options"; +import type { ReactElementTreeNode } from "../tree"; +import createPropFilter from "./createPropFilter"; +import formatProp from "./formatProp"; +import formatTreeNode from "./formatTreeNode"; +import mergeSiblingPlainStringChildrenReducer from "./mergeSiblingPlainStringChildrenReducer"; +import sortPropsByNames from "./sortPropsByNames"; +import spacer from "./spacer"; const compensateMultilineStringElementIndentation = ( - element, + element: any, formattedElement: string, inline: boolean, lvl: number, - options: Options + options: Options, ) => { const { tabStop } = options; - if (element.type === 'string') { + if (element.type === "string") { return formattedElement - .split('\n') + .split("\n") .map((line, offset) => { if (offset === 0) { return line; @@ -28,39 +26,38 @@ const compensateMultilineStringElementIndentation = ( return `${spacer(lvl, tabStop)}${line}`; }) - .join('\n'); + .join("\n"); } return formattedElement; }; -const formatOneChildren = ( - inline: boolean, - lvl: number, - options: Options -) => element => - compensateMultilineStringElementIndentation( - element, - formatTreeNode(element, inline, lvl, options), - inline, - lvl, - options - ); +const formatOneChildren = + (inline: boolean, lvl: number, options: Options) => (element: any) => + compensateMultilineStringElementIndentation( + element, + formatTreeNode(element, inline, lvl, options), + inline, + lvl, + options, + ); -const onlyPropsWithOriginalValue = (defaultProps, props) => propName => { - const haveDefaultValue = Object.keys(defaultProps).includes(propName); - return ( - !haveDefaultValue || - (haveDefaultValue && defaultProps[propName] !== props[propName]) - ); -}; +const onlyPropsWithOriginalValue = + (defaultProps: Record, props: Record) => + (propName: string) => { + const haveDefaultValue = Object.keys(defaultProps).includes(propName); + return ( + !haveDefaultValue || + (haveDefaultValue && defaultProps[propName] !== props[propName]) + ); + }; const isInlineAttributeTooLong = ( attributes: string[], inlineAttributeString: string, lvl: number, tabStop: number, - maxInlineAttributesLineLength: ?number + maxInlineAttributesLineLength: number | null | undefined, ): boolean => { if (!maxInlineAttributesLineLength) { return attributes.length > 1; @@ -79,14 +76,14 @@ const shouldRenderMultilineAttr = ( inline: boolean, lvl: number, tabStop: number, - maxInlineAttributesLineLength: ?number + maxInlineAttributesLineLength: number | null | undefined, ): boolean => (isInlineAttributeTooLong( attributes, inlineAttributeString, lvl, tabStop, - maxInlineAttributesLineLength + maxInlineAttributesLineLength, ) || containsMultilineAttr) && !inline; @@ -95,19 +92,19 @@ export default ( node: ReactElementTreeNode, inline: boolean, lvl: number, - options: Options + options: Options, ): string => { const { type, - displayName = '', - childrens, + displayName = "", + children, props = {}, defaultProps = {}, } = node; - if (type !== 'ReactElement') { + if (type !== "ReactElement") { throw new Error( - `The "formatReactElementNode" function could only format node of type "ReactElement". Given: ${type}` + `The "formatReactElementNode" function could only format node of type "ReactElement". Given: ${type}`, ); } @@ -116,7 +113,7 @@ export default ( maxInlineAttributesLineLength, showDefaultProps, sortProps, - tabStop, + tabStop = defaultOptions.tabStop, } = options; let out = `<${displayName}`; @@ -125,24 +122,26 @@ export default ( let outMultilineAttr = out; let containsMultilineAttr = false; - const visibleAttributeNames = []; + const visibleAttributeNames: Array = []; const propFilter = createPropFilter(props, filterProps); Object.keys(props) .filter(propFilter) .filter(onlyPropsWithOriginalValue(defaultProps, props)) - .forEach(propName => visibleAttributeNames.push(propName)); + .forEach((propName) => visibleAttributeNames.push(propName)); Object.keys(defaultProps) .filter(propFilter) .filter(() => showDefaultProps) - .filter(defaultPropName => !visibleAttributeNames.includes(defaultPropName)) - .forEach(defaultPropName => visibleAttributeNames.push(defaultPropName)); + .filter( + (defaultPropName) => !visibleAttributeNames.includes(defaultPropName), + ) + .forEach((defaultPropName) => visibleAttributeNames.push(defaultPropName)); const attributes = sortPropsByNames(sortProps)(visibleAttributeNames); - attributes.forEach(attributeName => { + attributes.forEach((attributeName) => { const { attributeFormattedInline, attributeFormattedMultiline, @@ -155,7 +154,7 @@ export default ( defaultProps[attributeName], inline, lvl, - options + options, ); if (isMultilineAttribute) { @@ -176,7 +175,7 @@ export default ( inline, lvl, tabStop, - maxInlineAttributesLineLength + maxInlineAttributesLineLength, ) ) { out = outMultilineAttr; @@ -184,25 +183,26 @@ export default ( out = outInlineAttr; } - if (childrens && childrens.length > 0) { + if (children && children.length > 0) { const newLvl = lvl + 1; - out += '>'; + out += ">"; if (!inline) { - out += '\n'; + out += "\n"; out += spacer(newLvl, tabStop); } - out += childrens + out += children .reduce(mergeSiblingPlainStringChildrenReducer, []) .map(formatOneChildren(inline, newLvl, options)) - .join(!inline ? `\n${spacer(newLvl, tabStop)}` : ''); + .join(!inline ? `\n${spacer(newLvl, tabStop)}` : ""); if (!inline) { - out += '\n'; + out += "\n"; out += spacer(newLvl - 1, tabStop); } + out += ``; } else { if ( @@ -211,13 +211,13 @@ export default ( outInlineAttr, lvl, tabStop, - maxInlineAttributesLineLength + maxInlineAttributesLineLength, ) ) { - out += ' '; + out += " "; } - out += '/>'; + out += "/>"; } return out; diff --git a/src/formatter/formatReactFragmentNode.spec.js b/src/formatter/formatReactFragmentNode.spec.js deleted file mode 100644 index 14c9386a8..000000000 --- a/src/formatter/formatReactFragmentNode.spec.js +++ /dev/null @@ -1,125 +0,0 @@ -/* @flow */ - -import formatReactFragmentNode from './formatReactFragmentNode'; - -const defaultOptions = { - filterProps: [], - showDefaultProps: true, - showFunctions: false, - tabStop: 2, - useBooleanShorthandSyntax: true, - useFragmentShortSyntax: true, - sortProps: true, -}; - -describe('formatReactFragmentNode', () => { - it('should format a react fragment with a string as children', () => { - const tree = { - type: 'ReactFragment', - childrens: [ - { - value: 'Hello world', - type: 'string', - }, - ], - }; - - expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( - `<> - Hello world -` - ); - }); - - it('should format a react fragment with a key', () => { - const tree = { - type: 'ReactFragment', - key: 'foo', - childrens: [ - { - value: 'Hello world', - type: 'string', - }, - ], - }; - - expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( - ` - Hello world -` - ); - }); - - it('should format a react fragment with multiple childrens', () => { - const tree = { - type: 'ReactFragment', - childrens: [ - { - type: 'ReactElement', - displayName: 'div', - props: { a: 'foo' }, - childrens: [], - }, - { - type: 'ReactElement', - displayName: 'div', - props: { b: 'bar' }, - childrens: [], - }, - ], - }; - - expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( - `<> -
-
-` - ); - }); - - it('should format an empty react fragment', () => { - const tree = { - type: 'ReactFragment', - childrens: [], - }; - - expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( - '' - ); - }); - - it('should format an empty react fragment with key', () => { - const tree = { - type: 'ReactFragment', - key: 'foo', - childrens: [], - }; - - expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( - '' - ); - }); - - it('should format a react fragment using the explicit syntax', () => { - const tree = { - type: 'ReactFragment', - childrens: [ - { - value: 'Hello world', - type: 'string', - }, - ], - }; - - expect( - formatReactFragmentNode(tree, false, 0, { - ...defaultOptions, - ...{ useFragmentShortSyntax: false }, - }) - ).toEqual( - ` - Hello world -` - ); - }); -}); diff --git a/src/formatter/formatReactFragmentNode.spec.ts b/src/formatter/formatReactFragmentNode.spec.ts new file mode 100644 index 000000000..5b0012e18 --- /dev/null +++ b/src/formatter/formatReactFragmentNode.spec.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from "vitest"; +import formatReactFragmentNode from "./formatReactFragmentNode"; + +const defaultOptions = { + filterProps: [], + showDefaultProps: true, + showFunctions: false, + tabStop: 2, + useBooleanShorthandSyntax: true, + useFragmentShortSyntax: true, + sortProps: true, +}; + +describe("formatReactFragmentNode", () => { + it("should format a react fragment with a string as children", () => { + const tree = { + type: "ReactFragment" as const, + children: [ + { + type: "string" as const, + value: "Hello world", + }, + ], + }; + + expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual(`<> + Hello world +`); + }); + + it("should format a react fragment with a key", () => { + const tree = { + type: "ReactFragment" as const, + key: "foo", + children: [ + { + type: "string" as const, + value: "Hello world", + }, + ], + }; + + expect( + formatReactFragmentNode(tree, false, 0, defaultOptions), + ).toEqual(` + Hello world +`); + }); + + it("should format a react fragment with multiple children", () => { + const tree = { + type: "ReactFragment" as const, + children: [ + { + type: "ReactElement" as const, + displayName: "div", + defaultProps: {}, + props: { + a: "foo", + }, + children: [], + }, + { + type: "ReactElement" as const, + displayName: "div", + defaultProps: {}, + props: { + b: "bar", + }, + children: [], + }, + ], + }; + + expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual(`<> +
+
+`); + }); + + it("should format an empty react fragment", () => { + const tree = { + type: "ReactFragment" as const, + children: [], + }; + + expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( + "", + ); + }); + + it("should format an empty react fragment with key", () => { + const tree = { + type: "ReactFragment" as const, + key: "foo", + children: [], + }; + + expect(formatReactFragmentNode(tree, false, 0, defaultOptions)).toEqual( + '', + ); + }); + + it("should format a react fragment using the explicit syntax", () => { + const tree = { + type: "ReactFragment" as const, + children: [ + { + type: "string" as const, + value: "Hello world", + }, + ], + }; + + expect( + formatReactFragmentNode(tree, false, 0, { + ...defaultOptions, + ...{ + useFragmentShortSyntax: false, + }, + }), + ).toEqual(` + Hello world +`); + }); +}); diff --git a/src/formatter/formatReactFragmentNode.js b/src/formatter/formatReactFragmentNode.ts similarity index 56% rename from src/formatter/formatReactFragmentNode.js rename to src/formatter/formatReactFragmentNode.ts index d6eb06c9d..43eec3abb 100644 --- a/src/formatter/formatReactFragmentNode.js +++ b/src/formatter/formatReactFragmentNode.ts @@ -1,57 +1,57 @@ -/* @flow */ - -import type { Key } from 'react'; -import formatReactElementNode from './formatReactElementNode'; -import type { Options } from './../options'; +import type { Key } from "react"; +import type { Options } from "../options"; import type { ReactElementTreeNode, ReactFragmentTreeNode, TreeNode, -} from './../tree'; +} from "../tree"; +import formatReactElementNode from "./formatReactElementNode"; -const REACT_FRAGMENT_TAG_NAME_SHORT_SYNTAX = ''; -const REACT_FRAGMENT_TAG_NAME_EXPLICIT_SYNTAX = 'React.Fragment'; +const REACT_FRAGMENT_TAG_NAME_SHORT_SYNTAX = ""; +const REACT_FRAGMENT_TAG_NAME_EXPLICIT_SYNTAX = "React.Fragment"; const toReactElementTreeNode = ( displayName: string, - key: ?Key, - childrens: TreeNode[] + key: Key | null | undefined, + children: TreeNode[], ): ReactElementTreeNode => { let props = {}; if (key) { - props = { key }; + props = { + key, + }; } return { - type: 'ReactElement', + type: "ReactElement", displayName, props, defaultProps: {}, - childrens, + children, }; }; const isKeyedFragment = ({ key }: ReactFragmentTreeNode) => Boolean(key); -const hasNoChildren = ({ childrens }: ReactFragmentTreeNode) => - childrens.length === 0; +const hasNoChildren = ({ children }: ReactFragmentTreeNode) => + children.length === 0; export default ( node: ReactFragmentTreeNode, inline: boolean, lvl: number, - options: Options + options: Options, ): string => { - const { type, key, childrens } = node; + const { type, key, children } = node; - if (type !== 'ReactFragment') { + if (type !== "ReactFragment") { throw new Error( - `The "formatReactFragmentNode" function could only format node of type "ReactFragment". Given: ${type}` + `The "formatReactFragmentNode" function could only format node of type "ReactFragment". Given: ${type}`, ); } const { useFragmentShortSyntax } = options; - let displayName; + let displayName: string; if (useFragmentShortSyntax) { if (hasNoChildren(node) || isKeyedFragment(node)) { displayName = REACT_FRAGMENT_TAG_NAME_EXPLICIT_SYNTAX; @@ -63,9 +63,9 @@ export default ( } return formatReactElementNode( - toReactElementTreeNode(displayName, key, childrens), + toReactElementTreeNode(displayName, key, children), inline, lvl, - options + options, ); }; diff --git a/src/formatter/formatTree.js b/src/formatter/formatTree.js deleted file mode 100644 index 7bc4f4573..000000000 --- a/src/formatter/formatTree.js +++ /dev/null @@ -1,8 +0,0 @@ -/* @flow */ - -import formatTreeNode from './formatTreeNode'; -import type { Options } from './../options'; -import type { TreeNode } from './../tree'; - -export default (node: TreeNode, options: Options): string => - formatTreeNode(node, false, 0, options); diff --git a/src/formatter/formatTree.spec.js b/src/formatter/formatTree.spec.js deleted file mode 100644 index f4f5fafd3..000000000 --- a/src/formatter/formatTree.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -/* @flow */ - -import formatTree from './formatTree'; -import formatTreeNode from './formatTreeNode'; - -jest.mock('./formatTreeNode', () => jest.fn(() => '')); - -describe('formatTree', () => { - it('should format the node as a root node', () => { - const tree = {}; - const options = {}; - - const result = formatTree(tree, options); - - expect(formatTreeNode).toHaveBeenCalledWith(tree, false, 0, options); - - expect(result).toBe(''); - }); -}); diff --git a/src/formatter/formatTree.spec.ts b/src/formatter/formatTree.spec.ts new file mode 100644 index 000000000..a9076e74a --- /dev/null +++ b/src/formatter/formatTree.spec.ts @@ -0,0 +1,22 @@ +import { describe, expect, it, vitest } from "vitest"; +import { generateOptionsFixture } from "../__tests__/generateOptionsFixture"; +import { createStringTreeNode } from "../tree"; +import formatTree from "./formatTree"; +import formatTreeNode from "./formatTreeNode"; + +vitest.mock("./formatTreeNode"); + +describe("formatTree", () => { + it("should format the node as a root node", () => { + vitest.mocked(formatTreeNode).mockReturnValue(""); + + const tree = createStringTreeNode("42"); + const options = generateOptionsFixture({}); + + const result = formatTree(tree, options); + + expect(formatTreeNode).toHaveBeenCalledWith(tree, false, 0, options); + + expect(result).toBe(""); + }); +}); diff --git a/src/formatter/formatTree.ts b/src/formatter/formatTree.ts new file mode 100644 index 000000000..abd913012 --- /dev/null +++ b/src/formatter/formatTree.ts @@ -0,0 +1,6 @@ +import type { Options } from "../options"; +import type { TreeNode } from "../tree"; +import formatTreeNode from "./formatTreeNode"; + +export default (node: TreeNode, options: Options): string => + formatTreeNode(node, false, 0, options); diff --git a/src/formatter/formatTreeNode.js b/src/formatter/formatTreeNode.js deleted file mode 100644 index 0d5ea3429..000000000 --- a/src/formatter/formatTreeNode.js +++ /dev/null @@ -1,58 +0,0 @@ -/* @flow */ - -import formatReactElementNode from './formatReactElementNode'; -import formatReactFragmentNode from './formatReactFragmentNode'; -import type { Options } from './../options'; -import type { TreeNode } from './../tree'; - -const jsxStopChars = ['<', '>', '{', '}']; -const shouldBeEscaped = (s: string) => - jsxStopChars.some(jsxStopChar => s.includes(jsxStopChar)); - -const escape = (s: string) => { - if (!shouldBeEscaped(s)) { - return s; - } - - return `{\`${s}\`}`; -}; - -const preserveTrailingSpace = (s: string) => { - let result = s; - if (result.endsWith(' ')) { - result = result.replace(/^(.*?)(\s+)$/, "$1{'$2'}"); - } - - if (result.startsWith(' ')) { - result = result.replace(/^(\s+)(.*)$/, "{'$1'}$2"); - } - - return result; -}; - -export default ( - node: TreeNode, - inline: boolean, - lvl: number, - options: Options -): string => { - if (node.type === 'number') { - return String(node.value); - } - - if (node.type === 'string') { - return node.value - ? `${preserveTrailingSpace(escape(String(node.value)))}` - : ''; - } - - if (node.type === 'ReactElement') { - return formatReactElementNode(node, inline, lvl, options); - } - - if (node.type === 'ReactFragment') { - return formatReactFragmentNode(node, inline, lvl, options); - } - - throw new TypeError(`Unknow format type "${node.type}"`); -}; diff --git a/src/formatter/formatTreeNode.spec.js b/src/formatter/formatTreeNode.spec.js deleted file mode 100644 index a3d172e51..000000000 --- a/src/formatter/formatTreeNode.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -/* @flow */ - -import formatTreeNode from './formatTreeNode'; - -jest.mock('./formatReactElementNode', () => () => - '' -); - -describe('formatTreeNode', () => { - it('should format number tree node', () => { - expect(formatTreeNode({ type: 'number', value: 42 }, true, 0, {})).toBe( - '42' - ); - }); - - it('should format string tree node', () => { - expect(formatTreeNode({ type: 'string', value: 'foo' }, true, 0, {})).toBe( - 'foo' - ); - }); - - it('should format react element tree node', () => { - expect( - formatTreeNode( - { - type: 'ReactElement', - displayName: 'Foo', - }, - true, - 0, - {} - ) - ).toBe(''); - }); - - const jsxDelimiters = ['<', '>', '{', '}']; - jsxDelimiters.forEach(char => { - it(`should escape string that contains the JSX delimiter "${char}"`, () => { - expect( - formatTreeNode( - { type: 'string', value: `I contain ${char}, is will be escaped` }, - true, - 0, - {} - ) - ).toBe(`{\`I contain ${char}, is will be escaped\`}`); - }); - }); - - it('should preserve the format of string', () => { - expect(formatTreeNode({ type: 'string', value: 'foo\nbar' }, true, 0, {})) - .toBe(`foo -bar`); - - expect( - formatTreeNode( - { - type: 'string', - value: JSON.stringify({ foo: 'bar' }, null, 2), - }, - false, - 0, - { - tabStop: 2, - } - ) - ).toBe(`{\`{ - "foo": "bar" -}\`}`); - }); -}); diff --git a/src/formatter/formatTreeNode.spec.ts b/src/formatter/formatTreeNode.spec.ts new file mode 100644 index 000000000..202b7af19 --- /dev/null +++ b/src/formatter/formatTreeNode.spec.ts @@ -0,0 +1,113 @@ +import { beforeEach, describe, expect, it, vitest } from "vitest"; +import { generateOptionsFixture } from "../__tests__/generateOptionsFixture"; +import formatReactElementNode from "./formatReactElementNode"; +import formatTreeNode from "./formatTreeNode"; + +vitest.mock("./formatReactElementNode"); + +describe("formatTreeNode", () => { + beforeEach(() => { + vitest + .mocked(formatReactElementNode) + .mockReturnValue(""); + }); + + it("should format number tree node", () => { + expect( + formatTreeNode( + { + type: "number", + value: 42, + }, + true, + 0, + generateOptionsFixture({}), + ), + ).toBe("42"); + }); + + it("should format string tree node", () => { + expect( + formatTreeNode( + { + type: "string", + value: "foo", + }, + true, + 0, + generateOptionsFixture({}), + ), + ).toBe("foo"); + }); + + it("should format react element tree node", () => { + expect( + formatTreeNode( + { + type: "ReactElement", + displayName: "Foo", + children: [], + props: {}, + defaultProps: {}, + }, + true, + 0, + generateOptionsFixture({}), + ), + ).toBe(""); + }); + + it.each([["<"], [">"], ["{"], ["}"]])( + `should escape string that contains the JSX delimiter "%s"`, + (char) => { + expect( + formatTreeNode( + { + type: "string", + value: `I contain ${char}, is will be escaped`, + }, + true, + 0, + generateOptionsFixture({}), + ), + ).toBe(`{\`I contain ${char}, is will be escaped\`}`); + }, + ); + + it("should preserve the format of string", () => { + expect( + formatTreeNode( + { + type: "string", + value: "foo\nbar", + }, + true, + 0, + generateOptionsFixture({}), + ), + ).toBe(`foo +bar`); + + expect( + formatTreeNode( + { + type: "string", + value: JSON.stringify( + { + foo: "bar", + }, + null, + 2, + ), + }, + false, + 0, + generateOptionsFixture({ + tabStop: 2, + }), + ), + ).toBe(`{\`{ + "foo": "bar" +}\`}`); + }); +}); diff --git a/src/formatter/formatTreeNode.ts b/src/formatter/formatTreeNode.ts new file mode 100644 index 000000000..09ea482e3 --- /dev/null +++ b/src/formatter/formatTreeNode.ts @@ -0,0 +1,57 @@ +import type { Options } from "../options"; +import type { TreeNode } from "../tree"; +import formatReactElementNode from "./formatReactElementNode"; +import formatReactFragmentNode from "./formatReactFragmentNode"; + +const jsxStopChars = ["<", ">", "{", "}"]; +const shouldBeEscaped = (s: string) => + jsxStopChars.some((jsxStopChar) => s.includes(jsxStopChar)); + +const escapeJsxStopChars = (s: string) => { + if (!shouldBeEscaped(s)) { + return s; + } + + return `{\`${s}\`}`; +}; + +const preserveTrailingSpace = (s: string) => { + let result = s; + if (result.endsWith(" ")) { + result = result.replace(/^(.*?)(\s+)$/, "$1{'$2'}"); + } + + if (result.startsWith(" ")) { + result = result.replace(/^(\s+)(.*)$/, "{'$1'}$2"); + } + + return result; +}; + +export default ( + node: TreeNode, + inline: boolean, + lvl: number, + options: Options, +): string => { + if (node.type === "number") { + return String(node.value); + } + + if (node.type === "string") { + return node.value + ? `${preserveTrailingSpace(escapeJsxStopChars(String(node.value)))}` + : ""; + } + + if (node.type === "ReactElement") { + return formatReactElementNode(node, inline, lvl, options); + } + + if (node.type === "ReactFragment") { + return formatReactFragmentNode(node, inline, lvl, options); + } + + // @ts-expect-error: So should never be executed + throw new TypeError(`Unknown format type "${node.type}"`); +}; diff --git a/src/formatter/isPlainObject.spec.ts b/src/formatter/isPlainObject.spec.ts new file mode 100644 index 000000000..d47126222 --- /dev/null +++ b/src/formatter/isPlainObject.spec.ts @@ -0,0 +1,36 @@ +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Licensed under the MIT License. + */ + +import assert from "node:assert"; +import { describe, it } from "vitest"; +import { isPlainObject } from "./isPlainObject"; + +describe("isPlainObject", () => { + it("should return `true` if the object is created by the `Object` constructor.", () => { + assert(isPlainObject(Object.create({}))); + assert(isPlainObject(Object.create(Object.prototype))); + assert(isPlainObject({ foo: "bar" })); + assert(isPlainObject({})); + assert(isPlainObject(Object.create(null))); + }); + + it("should return `false` if the object is not created by the `Object` constructor.", () => { + // biome-ignore lint/suspicious/noExplicitAny: + function Foo(this: any) { + this.abc = {}; + } + + assert(!isPlainObject(/foo/)); + assert(!isPlainObject(() => {})); + assert(!isPlainObject(1)); + assert(!isPlainObject(["foo", "bar"])); + assert(!isPlainObject([])); + // @ts-expect-error + assert(!isPlainObject(new Foo())); + assert(!isPlainObject(null)); + }); +}); diff --git a/src/formatter/isPlainObject.ts b/src/formatter/isPlainObject.ts new file mode 100644 index 000000000..33453dab0 --- /dev/null +++ b/src/formatter/isPlainObject.ts @@ -0,0 +1,38 @@ +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +// biome-ignore lint/complexity/noBannedTypes: In this case there nothing to replace Object +function isObject(o: unknown): o is Object { + return Object.prototype.toString.call(o) === "[object Object]"; +} + +export function isPlainObject(o: unknown): o is Record { + if (isObject(o) === false) { + return false; + } + + // If has modified constructor + const ctor = o.constructor; + if (ctor === undefined) { + return true; + } + + // If has modified prototype + const prot = ctor.prototype; + if (isObject(prot) === false) { + return false; + } + + // If constructor does not have an Object-specific method + // biome-ignore lint/suspicious/noPrototypeBuiltins: + if (prot.hasOwnProperty("isPrototypeOf") === false) { + return false; + } + + // Most likely a plain Object + return true; +} diff --git a/src/formatter/mergeSiblingPlainStringChildrenReducer.js b/src/formatter/mergeSiblingPlainStringChildrenReducer.js deleted file mode 100644 index 8752f5c8e..000000000 --- a/src/formatter/mergeSiblingPlainStringChildrenReducer.js +++ /dev/null @@ -1,35 +0,0 @@ -/* @flow */ - -import { createStringTreeNode } from './../tree'; -import type { TreeNode } from './../tree'; - -export default ( - previousNodes: TreeNode[], - currentNode: TreeNode -): TreeNode[] => { - const nodes = previousNodes.slice( - 0, - previousNodes.length > 0 ? previousNodes.length - 1 : 0 - ); - const previousNode = previousNodes[previousNodes.length - 1]; - - if ( - previousNode && - (currentNode.type === 'string' || currentNode.type === 'number') && - (previousNode.type === 'string' || previousNode.type === 'number') - ) { - nodes.push( - createStringTreeNode( - String(previousNode.value) + String(currentNode.value) - ) - ); - } else { - if (previousNode) { - nodes.push(previousNode); - } - - nodes.push(currentNode); - } - - return nodes; -}; diff --git a/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.js b/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.js deleted file mode 100644 index b8bbf6a2b..000000000 --- a/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.js +++ /dev/null @@ -1,100 +0,0 @@ -/* @flow */ - -import mergeSiblingPlainStringChildrenReducer from './mergeSiblingPlainStringChildrenReducer'; -import { - createNumberTreeNode, - createStringTreeNode, - createReactElementTreeNode, -} from './../tree'; -import type { TreeNode } from './../tree'; - -test('mergeSiblingPlainStringChildrenReducer should merge sibling string tree nodes', () => { - const childrens: TreeNode[] = [ - createStringTreeNode('a'), - createStringTreeNode('b'), - createStringTreeNode('c'), - ]; - - expect(childrens.reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([ - { - type: 'string', - value: 'abc', - }, - ]); -}); - -test('mergeSiblingPlainStringChildrenReducer should consider number as string', () => { - expect( - [ - createStringTreeNode('a'), - createNumberTreeNode(51), - createStringTreeNode('c'), - ].reduce(mergeSiblingPlainStringChildrenReducer, []) - ).toEqual([ - { - type: 'string', - value: 'a51c', - }, - ]); - - expect( - [ - createStringTreeNode(5), - createNumberTreeNode(1), - createStringTreeNode('a'), - ].reduce(mergeSiblingPlainStringChildrenReducer, []) - ).toEqual([ - { - type: 'string', - value: '51a', - }, - ]); -}); - -test('mergeSiblingPlainStringChildrenReducer should detect non string node', () => { - const childrens: TreeNode[] = [ - createReactElementTreeNode('MyFoo', {}, {}, ['foo']), - createStringTreeNode('a'), - createNumberTreeNode('b'), - createReactElementTreeNode('MyBar', {}, {}, ['bar']), - createStringTreeNode('c'), - createNumberTreeNode(42), - createReactElementTreeNode('MyBaz', {}, {}, ['baz']), - ]; - - expect(childrens.reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([ - { - type: 'ReactElement', - displayName: 'MyFoo', - props: {}, - defaultProps: {}, - childrens: ['foo'], - }, - { - type: 'string', - value: 'ab', - }, - { - type: 'ReactElement', - displayName: 'MyBar', - props: {}, - defaultProps: {}, - childrens: ['bar'], - }, - { - type: 'string', - value: 'c42', - }, - { - type: 'ReactElement', - displayName: 'MyBaz', - props: {}, - defaultProps: {}, - childrens: ['baz'], - }, - ]); -}); - -test('mergeSiblingPlainStringChildrenReducer should reduce empty array to an empty array', () => { - expect([].reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([]); -}); diff --git a/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.ts b/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.ts new file mode 100644 index 000000000..6d85d47ae --- /dev/null +++ b/src/formatter/mergeSiblingPlainStringChildrenReducer.spec.ts @@ -0,0 +1,105 @@ +import { expect, test } from "vitest"; +import { + createNumberTreeNode, + createReactElementTreeNode, + createStringTreeNode, +} from "../tree"; +import type { TreeNode } from "../tree"; +import mergeSiblingPlainStringChildrenReducer from "./mergeSiblingPlainStringChildrenReducer"; + +test("mergeSiblingPlainStringChildrenReducer should merge sibling string tree nodes", () => { + const children: TreeNode[] = [ + createStringTreeNode("a"), + createStringTreeNode("b"), + createStringTreeNode("c"), + ]; + + expect(children.reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([ + { + type: "string", + value: "abc", + }, + ]); +}); + +test("mergeSiblingPlainStringChildrenReducer should consider number as string", () => { + expect( + [ + createStringTreeNode("a"), + createNumberTreeNode(51), + createStringTreeNode("c"), + ].reduce(mergeSiblingPlainStringChildrenReducer, []), + ).toEqual([ + { + type: "string", + value: "a51c", + }, + ]); + + expect( + [ + createStringTreeNode("5"), + createNumberTreeNode(1), + createStringTreeNode("a"), + ].reduce(mergeSiblingPlainStringChildrenReducer, []), + ).toEqual([ + { + type: "string", + value: "51a", + }, + ]); +}); + +test("mergeSiblingPlainStringChildrenReducer should detect non string node", () => { + const children: TreeNode[] = [ + createReactElementTreeNode("MyFoo", {}, {}, [ + { type: "string", value: "foo" }, + ]), + createStringTreeNode("a"), + createNumberTreeNode(123), + createReactElementTreeNode("MyBar", {}, {}, [ + { type: "string", value: "bar" }, + ]), + createStringTreeNode("c"), + createNumberTreeNode(42), + createReactElementTreeNode("MyBaz", {}, {}, [ + { type: "string", value: "baz" }, + ]), + ]; + + expect(children.reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([ + { + type: "ReactElement", + displayName: "MyFoo", + props: {}, + defaultProps: {}, + children: [{ type: "string", value: "foo" }], + }, + { + type: "string", + value: "a123", + }, + { + type: "ReactElement", + displayName: "MyBar", + props: {}, + defaultProps: {}, + children: [{ type: "string", value: "bar" }], + }, + { + type: "string", + value: "c42", + }, + { + type: "ReactElement", + displayName: "MyBaz", + props: {}, + defaultProps: {}, + children: [{ type: "string", value: "baz" }], + }, + ]); +}); + +test("mergeSiblingPlainStringChildrenReducer should reduce empty array to an empty array", () => { + expect([].reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([]); +}); diff --git a/src/formatter/mergeSiblingPlainStringChildrenReducer.ts b/src/formatter/mergeSiblingPlainStringChildrenReducer.ts new file mode 100644 index 000000000..c5d1c87bf --- /dev/null +++ b/src/formatter/mergeSiblingPlainStringChildrenReducer.ts @@ -0,0 +1,33 @@ +import { createStringTreeNode } from "../tree"; +import type { TreeNode } from "../tree"; + +export default ( + previousNodes: TreeNode[], + currentNode: TreeNode, +): TreeNode[] => { + const nodes = previousNodes.slice( + 0, + previousNodes.length > 0 ? previousNodes.length - 1 : 0, + ); + const previousNode = previousNodes[previousNodes.length - 1]; + + if ( + previousNode && + (currentNode.type === "string" || currentNode.type === "number") && + (previousNode.type === "string" || previousNode.type === "number") + ) { + nodes.push( + createStringTreeNode( + String(previousNode.value) + String(currentNode.value), + ), + ); + } else { + if (previousNode) { + nodes.push(previousNode); + } + + nodes.push(currentNode); + } + + return nodes; +}; diff --git a/src/formatter/sortObject.spec.js b/src/formatter/sortObject.spec.js deleted file mode 100644 index 1b6ab3d45..000000000 --- a/src/formatter/sortObject.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -/* @flow */ - -import sortObject from './sortObject'; - -describe('sortObject', () => { - it('should sort keys in objects', () => { - const fixture = { - c: 2, - b: { x: 1, c: 'ccc' }, - a: [{ foo: 1, bar: 2 }], - }; - - expect(JSON.stringify(sortObject(fixture))).toEqual( - JSON.stringify({ - a: [{ bar: 2, foo: 1 }], - b: { c: 'ccc', x: 1 }, - c: 2, - }) - ); - }); - - it('should process an array', () => { - const fixture = [{ foo: 1, bar: 2 }, null, { b: 1, c: 2, a: 3 }]; - - expect(JSON.stringify(sortObject(fixture))).toEqual( - JSON.stringify([{ bar: 2, foo: 1 }, null, { a: 3, b: 1, c: 2 }]) - ); - }); - - it('should not break special values', () => { - const date = new Date(); - const regexp = /test/g; - const fixture = { - a: [date, regexp], - b: regexp, - c: date, - }; - - expect(sortObject(fixture)).toEqual({ - a: [date, regexp], - b: regexp, - c: date, - }); - }); -}); diff --git a/src/formatter/sortObject.spec.ts b/src/formatter/sortObject.spec.ts new file mode 100644 index 000000000..928910d6a --- /dev/null +++ b/src/formatter/sortObject.spec.ts @@ -0,0 +1,82 @@ +import { describe, expect, it } from "vitest"; +import sortObject from "./sortObject"; + +describe("sortObject", () => { + it("should sort keys in objects", () => { + const fixture = { + c: 2, + b: { + x: 1, + c: "ccc", + }, + a: [ + { + foo: 1, + bar: 2, + }, + ], + }; + + expect(JSON.stringify(sortObject(fixture))).toEqual( + JSON.stringify({ + a: [ + { + bar: 2, + foo: 1, + }, + ], + b: { + c: "ccc", + x: 1, + }, + c: 2, + }), + ); + }); + + it("should process an array", () => { + const fixture = [ + { + foo: 1, + bar: 2, + }, + null, + { + b: 1, + c: 2, + a: 3, + }, + ]; + + expect(JSON.stringify(sortObject(fixture))).toEqual( + JSON.stringify([ + { + bar: 2, + foo: 1, + }, + null, + { + a: 3, + b: 1, + c: 2, + }, + ]), + ); + }); + + it("should not break special values", () => { + const date = new Date(); + const regexp = /test/g; + const fixture = { + a: [date, regexp], + b: regexp, + c: date, + }; + + expect(sortObject(fixture)).toEqual({ + a: [date, regexp], + b: regexp, + c: date, + }); + }); +}); diff --git a/src/formatter/sortObject.js b/src/formatter/sortObject.ts similarity index 67% rename from src/formatter/sortObject.js rename to src/formatter/sortObject.ts index c070ef612..4c47584e2 100644 --- a/src/formatter/sortObject.js +++ b/src/formatter/sortObject.ts @@ -1,9 +1,8 @@ -/* @flow */ -import * as React from 'react'; +import * as React from "react"; -function safeSortObject(value: any, seen: WeakSet): any { +function safeSortObject(value: any, seen: WeakSet): any { // return non-object value as is - if (value === null || typeof value !== 'object') { + if (value === null || typeof value !== "object") { return value; } @@ -20,23 +19,26 @@ function safeSortObject(value: any, seen: WeakSet): any { // make a copy of array with each item passed through the sorting algorithm if (Array.isArray(value)) { - return value.map(v => safeSortObject(v, seen)); + return value.map((v) => safeSortObject(v, seen)); } // make a copy of object with key sorted return Object.keys(value) .sort() .reduce((result, key) => { - if (key === '_owner') { + if (key === "_owner") { return result; } - if (key === 'current' || seen.has(value[key])) { + if (key === "current" || seen.has(value[key])) { // eslint-disable-next-line no-param-reassign - result[key] = '[Circular]'; + // @ts-expect-error: flow to TS + result[key] = "[Circular]"; } else { // eslint-disable-next-line no-param-reassign + // @ts-expect-error: flow to TS result[key] = safeSortObject(value[key], seen); } + return result; }, {}); } diff --git a/src/formatter/sortPropsByNames.js b/src/formatter/sortPropsByNames.js deleted file mode 100644 index 649fd73bf..000000000 --- a/src/formatter/sortPropsByNames.js +++ /dev/null @@ -1,26 +0,0 @@ -/* @flow */ - -const isKeyOrRefProps = (propName: string) => ['key', 'ref'].includes(propName); - -export default (shouldSortUserProps: boolean) => ( - props: string[] -): string[] => { - const haveKeyProp = props.includes('key'); - const haveRefProp = props.includes('ref'); - - const userPropsOnly = props.filter(oneProp => !isKeyOrRefProps(oneProp)); - - const sortedProps = shouldSortUserProps - ? [...userPropsOnly.sort()] // We use basic lexical order - : [...userPropsOnly]; - - if (haveRefProp) { - sortedProps.unshift('ref'); - } - - if (haveKeyProp) { - sortedProps.unshift('key'); - } - - return sortedProps; -}; diff --git a/src/formatter/sortPropsByNames.spec.js b/src/formatter/sortPropsByNames.spec.js deleted file mode 100644 index f77144be2..000000000 --- a/src/formatter/sortPropsByNames.spec.js +++ /dev/null @@ -1,27 +0,0 @@ -/* @flow */ - -import sortPropsByNames from './sortPropsByNames'; - -test('sortPropsByNames should always move the `key` and `ref` keys first', () => { - const fixtures = ['c', 'key', 'a', 'ref', 'b']; - - expect(sortPropsByNames(false)(fixtures)).toEqual([ - 'key', - 'ref', - 'c', - 'a', - 'b', - ]); -}); - -test('sortPropsByNames should always sort the props and keep `key` and `ref` keys first', () => { - const fixtures = ['c', 'key', 'a', 'ref', 'b']; - - expect(sortPropsByNames(true)(fixtures)).toEqual([ - 'key', - 'ref', - 'a', - 'b', - 'c', - ]); -}); diff --git a/src/formatter/sortPropsByNames.spec.ts b/src/formatter/sortPropsByNames.spec.ts new file mode 100644 index 000000000..abba485bb --- /dev/null +++ b/src/formatter/sortPropsByNames.spec.ts @@ -0,0 +1,26 @@ +import { expect, test } from "vitest"; +import sortPropsByNames from "./sortPropsByNames"; + +test("sortPropsByNames should always move the `key` and `ref` keys first", () => { + const fixtures = ["c", "key", "a", "ref", "b"]; + + expect(sortPropsByNames(false)(fixtures)).toEqual([ + "key", + "ref", + "c", + "a", + "b", + ]); +}); + +test("sortPropsByNames should always sort the props and keep `key` and `ref` keys first", () => { + const fixtures = ["c", "key", "a", "ref", "b"]; + + expect(sortPropsByNames(true)(fixtures)).toEqual([ + "key", + "ref", + "a", + "b", + "c", + ]); +}); diff --git a/src/formatter/sortPropsByNames.ts b/src/formatter/sortPropsByNames.ts new file mode 100644 index 000000000..dc273e987 --- /dev/null +++ b/src/formatter/sortPropsByNames.ts @@ -0,0 +1,23 @@ +const isKeyOrRefProps = (propName: string) => ["key", "ref"].includes(propName); + +export default (shouldSortUserProps: boolean) => + (props: string[]): string[] => { + const haveKeyProp = props.includes("key"); + const haveRefProp = props.includes("ref"); + + const userPropsOnly = props.filter((oneProp) => !isKeyOrRefProps(oneProp)); + + const sortedProps = shouldSortUserProps + ? [...userPropsOnly.sort()] // We use basic lexical order + : [...userPropsOnly]; + + if (haveRefProp) { + sortedProps.unshift("ref"); + } + + if (haveKeyProp) { + sortedProps.unshift("key"); + } + + return sortedProps; + }; diff --git a/src/formatter/spacer.spec.js b/src/formatter/spacer.spec.js deleted file mode 100644 index dc4552ab9..000000000 --- a/src/formatter/spacer.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -/* @flow */ - -import spacer from './spacer'; - -describe('spacer', () => { - it('should generate a spaced string', () => { - expect(spacer(0, 1)).toEqual(''); - expect(spacer(0, 2)).toEqual(''); - expect(spacer(0, 3)).toEqual(''); - - expect(spacer(1, 1)).toEqual(' '); - expect(spacer(1, 2)).toEqual(' '); - expect(spacer(1, 3)).toEqual(' '); - - expect(spacer(2, 1)).toEqual(' '); - expect(spacer(2, 2)).toEqual(' '); - expect(spacer(2, 3)).toEqual(' '); - }); -}); diff --git a/src/formatter/spacer.spec.ts b/src/formatter/spacer.spec.ts new file mode 100644 index 000000000..c5384c5df --- /dev/null +++ b/src/formatter/spacer.spec.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from "vitest"; +import spacer from "./spacer"; + +describe("spacer", () => { + it("should generate a spaced string", () => { + expect(spacer(0, 1)).toEqual(""); + expect(spacer(0, 2)).toEqual(""); + expect(spacer(0, 3)).toEqual(""); + + expect(spacer(1, 1)).toEqual(" "); + expect(spacer(1, 2)).toEqual(" "); + expect(spacer(1, 3)).toEqual(" "); + + expect(spacer(2, 1)).toEqual(" "); + expect(spacer(2, 2)).toEqual(" "); + expect(spacer(2, 3)).toEqual(" "); + }); +}); diff --git a/src/formatter/spacer.js b/src/formatter/spacer.ts similarity index 51% rename from src/formatter/spacer.js rename to src/formatter/spacer.ts index b853d5812..b7180c440 100644 --- a/src/formatter/spacer.js +++ b/src/formatter/spacer.ts @@ -1,9 +1,7 @@ -/* @flow */ - export default (times: number, tabStop: number): string => { if (times === 0) { - return ''; + return ""; } - return new Array(times * tabStop).fill(' ').join(''); + return new Array(times * tabStop).fill(" ").join(""); }; diff --git a/src/index.spec.js b/src/index.spec.js deleted file mode 100644 index c27217a49..000000000 --- a/src/index.spec.js +++ /dev/null @@ -1,1363 +0,0 @@ -/** - * @jest-environment jsdom - */ - -/* @flow */ - -/* eslint-disable react/no-string-refs */ -/* eslint-disable react/prop-types */ - -import React, { Fragment, Component } from 'react'; -import { render, screen } from '@testing-library/react'; -import reactElementToJSXString, { preserveFunctionLineBreak } from './index'; -import AnonymousStatelessComponent from './AnonymousStatelessComponent'; - -class TestComponent extends React.Component {} - -function NamedStatelessComponent(props: { children: React.Children }) { - const { children } = props; - return
{children}
; -} - -class DefaultPropsComponent extends React.Component {} - -DefaultPropsComponent.defaultProps = { - test: 'test', - boolean: true, - number: 0, - undefinedProp: undefined, -}; - -class DisplayNamePrecedence extends React.Component {} - -DisplayNamePrecedence.displayName = 'This should take precedence'; - -describe('reactElementToJSXString(ReactElement)', () => { - it('reactElementToJSXString()', () => { - expect(reactElementToJSXString()).toEqual( - '' - ); - }); - - it('reactElementToJSXString()', () => { - expect(reactElementToJSXString()).toEqual( - '' - ); - }); - - it('reactElementToJSXString()', () => { - expect(reactElementToJSXString()).toEqual( - '' - ); - }); - - it('reactElementToJSXString() with a displayName', () => { - AnonymousStatelessComponent.displayName = 'I have a name!'; - - expect(reactElementToJSXString()).toEqual( - '' - ); - - delete AnonymousStatelessComponent.displayName; - }); - - it("reactElementToJSXString(React.createElement('div'))", () => { - expect(reactElementToJSXString(React.createElement('div'))).toEqual( - '
' - ); - }); - - it("reactElementToJSXString(React.createElement('div', {title: 'hello \"you\"'}))", () => { - expect( - reactElementToJSXString( - React.createElement('div', { title: 'hello "you"' }) - ) - ).toEqual('
'); - }); - - it("reactElementToJSXString(React.createElement('div', {title: '<'hello' you & you>'}))", () => { - expect( - reactElementToJSXString( - React.createElement('div', { title: "<'hello' you & you>" }) - ) - ).toEqual('
'); - }); - - it("reactElementToJSXString(
}} />)", () => { - /* eslint-disable react/no-unescaped-entities */ - expect( - reactElementToJSXString( -
Hello "' you
, - }} - /> - ) - ).toEqual( - `
Hello "' you
- }} - />` - ); - }); - - it("reactElementToJSXString(
)", () => { - expect( - reactElementToJSXString( -
- ) - ).toEqual( - `
` - ); - }); - - it("reactElementToJSXString(React.createElement('div', {title: Symbol('hello \"you\"')})", () => { - expect( - reactElementToJSXString( - React.createElement('div', { title: Symbol('hello "you"') }) - ) - ).toEqual('
'); - }); - - it('reactElementToJSXString(
)', () => { - expect(reactElementToJSXString(
)).toEqual('
'); - }); - - it('reactElementToJSXString(
{}}/>)', () => { - expect(reactElementToJSXString(
{}} />)).toEqual( - '
' - ); - }); - - it('reactElementToJSXString(
)', () => { - // eslint-disable-next-line react/jsx-no-bind - expect(reactElementToJSXString(
)).toEqual( - '
' - ); - }); - - it('reactElementToJSXString(
} />)', () => { - expect(reactElementToJSXString(
} />)).toEqual( - '
} />' - ); - }); - - it('reactElementToJSXString(
)', () => { - expect(reactElementToJSXString(
)).toEqual( - '
' - ); - }); - - it('reactElementToJSXString(
)', () => { - expect(reactElementToJSXString(
)).toEqual('
'); - }); - - it("reactElementToJSXString(
)", () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect( - reactElementToJSXString(
) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect( - reactElementToJSXString(
) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString()', () => { - expect( - reactElementToJSXString( - - ) - ).toEqual( - `` - ); - }); - - it('reactElementToJSXString()', () => { - expect( - reactElementToJSXString( - - ) - ).toEqual( - `` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect( - reactElementToJSXString( -
- ) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect(reactElementToJSXString(
)).toEqual('
'); - }); - - it('reactElementToJSXString(
)', () => { - /* eslint react/jsx-sort-props: 0 */ - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
, {sortProps: false})', () => { - /* eslint react/jsx-sort-props: 0 */ - expect( - reactElementToJSXString(
, { - sortProps: false, - }) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect(reactElementToJSXString(
Hello
)).toEqual( - `
- Hello -
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect( - reactElementToJSXString( -
- Hello -
- ) - ).toEqual( - `
- Hello -
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect(reactElementToJSXString(
Hello
)).toEqual( - `
- Hello -
` - ); - }); - - it('reactElementToJSXString(
Hello "Jonh" and \'Mike\'
)', () => { - expect(reactElementToJSXString(
Hello "Jonh" and 'Mike'
)).toEqual( - `
- Hello "Jonh" and 'Mike' -
` - ); - }); - - it('reactElementToJSXString(
{`foo\nbar`}
)', () => { - expect(reactElementToJSXString(
{`foo\nbar`}
)).toEqual( - `
- foo - bar -
` - ); - - expect( - reactElementToJSXString( -
-
{`foo\nbar`}
-
- ) - ).toEqual( - `
-
- foo - bar -
-
` - ); - }); - - it('reactElementToJSXString(
Hello
, {tabStop: 4})', () => { - expect(reactElementToJSXString(
Hello
, { tabStop: 4 })).toEqual( - `
- Hello -
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect( - reactElementToJSXString( -
-
Hello
-
- ) - ).toEqual( - `
-
- Hello -
-
` - ); - }); - - it('reactElementToJSXString(
Hello
, {tabStop: 4})', () => { - expect( - reactElementToJSXString( -
-
Hello
-
, - { tabStop: 4 } - ) - ).toEqual( - `
-
- Hello -
-
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect( - reactElementToJSXString( -
-
Hello
-
- ) - ).toEqual( - `
-
- Hello -
-
` - ); - }); - - it('reactElementToJSXString(
Hello
, {tabStop: 4})', () => { - expect( - reactElementToJSXString( -
-
Hello
-
, - { - tabStop: 4, - } - ) - ).toEqual( - `
-
- Hello -
-
` - ); - }); - - it('reactElementToJSXString(
Hello
)', () => { - expect( - reactElementToJSXString( -
-
Hello
-
- ) - ).toEqual( - `
-
- Hello -
-
` - ); - }); - - it('reactElementToJSXString()', () => { - expect(() => { - reactElementToJSXString(); - }).toThrow('react-element-to-jsx-string: Expected a ReactElement'); - }); - - it('reactElementToJSXString(null)', () => { - expect(() => { - reactElementToJSXString(null); - }).toThrow('react-element-to-jsx-string: Expected a ReactElement'); - }); - - it('ignores object keys order (sortobject)', () => { - expect(reactElementToJSXString(
)).toEqual( - reactElementToJSXString(
) - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - reactElementToJSXString(
) - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - reactElementToJSXString(
) - ); - }); - - it('reactElementToJSXString(
', () => { - expect( - reactElementToJSXString(
) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
, e: null}}}} />', () => { - expect( - reactElementToJSXString(
, e: null } } }} />) - ).toEqual( - `
, - e: null - } - } - }} - />` - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual('
'); - }); - - it('reactElementToJSXString(
)', () => { - expect( - reactElementToJSXString( -
- - -
- ) - ).toEqual( - `
- - -
` - ); - }); - - it('reactElementToJSXString(
foo
)', () => { - expect( - reactElementToJSXString( -
- foo -
-
- ) - ).toEqual( - `
- foo -
-
` - ); - }); - - it('reactElementToJSXString(
\nfoo bar baz qux quux\n
)', () => { - expect( - reactElementToJSXString( -
- foo bar baz qux quux -
- ) - ).toEqual(`
- foo bar{' '} - - {' '}baz{' '} - - {' '}qux quux -
`); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it("reactElementToJSXString(
)", () => { - expect( - reactElementToJSXString(
) - ).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual('
'); - }); - - it('reactElementToJSXString(
]} />', () => { - expect( - reactElementToJSXString( -
- -
, - ]} - /> - ) - ).toEqual( - `
- ]} - />` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect(reactElementToJSXString(
)).toEqual( - "
" - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
', () => { - expect( - reactElementToJSXString( -
- -
- ) - ).toEqual( - `
- -
` - ); - }); - - it('reactElementToJSXString(
', () => { - expect(reactElementToJSXString(
)).toEqual( - `
` - ); - }); - - it('reactElementToJSXString(
\\n {null}\\n
', () => { - const element =
{null}
; - - expect(reactElementToJSXString(element)).toEqual('
'); - }); - - it('reactElementToJSXString(
{true}
)', () => { - expect(reactElementToJSXString(
{true}
)).toEqual('
'); - }); - - it('reactElementToJSXString(
{false}
)', () => { - expect(reactElementToJSXString(
{false}
)).toEqual('
'); - }); - - it('reactElementToJSXString(
\n{false}\n
)', () => { - expect(reactElementToJSXString(
{false}
)).toEqual('
'); - }); - - it('reactElementToJSXString(
{false}
)', () => { - expect(reactElementToJSXString(
{false}
)).toEqual( - `
- {' '} -
` - ); - }); - - it('reactElementToJSXString(
{null}
)', () => { - expect(reactElementToJSXString(
{null}
)).toEqual('
'); - }); - - it('reactElementToJSXString(
{123}
)', () => { - expect(reactElementToJSXString(
{123}
)).toEqual( - `
- 123 -
` - ); - }); - - it("reactElementToJSXString(
{''}
)", () => { - expect(reactElementToJSXString(
{''}
)).toEqual( - reactElementToJSXString(
) - ); - }); - - it('reactElementToJSXString(
String with {1} js expression
)', () => { - expect( - reactElementToJSXString(
String with {1} js number
) - ).toEqual( - `
- String with 1 js number -
` - ); - }); - - it('reactElementToJSXString(, { displayName: toUpper })', () => { - expect( - reactElementToJSXString(, { - displayName: element => element.type.name.toUpperCase(), - }) - ).toEqual(''); - }); - - it("reactElementToJSXString(, { filterProps: ['key', 'className'] })", () => { - expect( - reactElementToJSXString( - , - { - filterProps: ['key', 'className'], - } - ) - ).toEqual(''); - }); - - it("reactElementToJSXString(, { filterProps: () => !key.startsWith('some')) })", () => { - expect( - reactElementToJSXString( - , - { - filterProps: (val, key) => !key.startsWith('some'), - } - ) - ).toEqual(''); - }); - - it('reactElementToJSXString(, { useBooleanShorthandSyntax: false })', () => { - expect( - reactElementToJSXString( - , - { - useBooleanShorthandSyntax: false, - } - ) - ).toEqual( - `` - ); - }); - - it('should render default props', () => { - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should not render default props if "showDefaultProps" option is false', () => { - expect( - reactElementToJSXString(, { - showDefaultProps: false, - }) - ).toEqual(''); - }); - - it('should render props that differ from their defaults if "showDefaultProps" option is false', () => { - expect( - reactElementToJSXString(, { - showDefaultProps: false, - }) - ).toEqual(''); - }); - - it('should render boolean props if value is `false`, default is `true` and "showDefaultProps" is false', () => { - expect( - reactElementToJSXString(, { - showDefaultProps: false, - }) - ).toEqual(''); - }); - - it('reactElementToJSXString(
} />, { displayName: toUpper })', () => { - expect( - reactElementToJSXString(
} />, { - displayName: element => element.type.toUpperCase(), - }) - ).toEqual('
} />'); - }); - - it('reactElementToJSXString(
}} />, { displayName: toUpper })', () => { - expect( - reactElementToJSXString(
}} />, { - displayName: element => element.type.toUpperCase(), - }) - ).toEqual( - `
- }} - />` - ); - }); - - it('should omit true as value', () => { - expect( - reactElementToJSXString(
) // eslint-disable-line react/jsx-boolean-value - ).toEqual('
'); - }); - - it('should omit attributes with false as value', () => { - expect( - reactElementToJSXString(
) // eslint-disable-line react/jsx-boolean-value - ).toEqual('
'); - }); - - it('should return the actual functions when "showFunctions" is true', () => { - /* eslint-disable arrow-body-style */ - const fn = () => { - return 'value'; - }; - - expect( - reactElementToJSXString(
, { - showFunctions: true, - }) - ).toEqual(`
`); - }); - - it('should expose the multiline "functionValue" formatter', () => { - /* eslint-disable arrow-body-style */ - const fn = () => { - return 'value'; - }; - - expect( - reactElementToJSXString(
, { - showFunctions: true, - functionValue: preserveFunctionLineBreak, - }) - ).toEqual(`
`); - }); - - it('reactElementToJSXString()', () => { - expect(reactElementToJSXString()).toEqual( - '' - ); - }); - - // maxInlineAttributesLineLength tests - // Validate two props will stay inline if their length is less than the option - it('reactElementToJSXString(
, { maxInlineAttributesLineLength: 100 }))', () => { - expect( - reactElementToJSXString(
, { - maxInlineAttributesLineLength: 100, - }) - ).toEqual('
'); - }); - // Validate one prop will go to new line if length is greater than option. One prop is a special case since - // the old logic operated on whether or not two or more attributes were present. Making sure this overrides - // that older logic - it('reactElementToJSXString(
, { maxInlineAttributesLineLength: 5 }))', () => { - expect( - reactElementToJSXString(
, { - maxInlineAttributesLineLength: 5, - }) - ).toEqual( - `
` - ); - }); - // Validate two props will go be multiline if their length is greater than the given option - it('reactElementToJSXString(
, { maxInlineAttributesLineLength: 10 }))', () => { - expect( - reactElementToJSXString(
, { - maxInlineAttributesLineLength: 10, - }) - ).toEqual( - `
` - ); - }); - - // Same tests as above but with elements that have children. The closing braces for elements with children and without children - // run through different code paths so we have both sets of test to specify the behavior of both when this option is present - it('reactElementToJSXString(
content
, { maxInlineAttributesLineLength: 100 }))', () => { - expect( - reactElementToJSXString( -
- content -
, - { - maxInlineAttributesLineLength: 100, - } - ) - ).toEqual( - `
- content -
` - ); - }); - it('reactElementToJSXString(
content
, { maxInlineAttributesLineLength: 5 }))', () => { - expect( - reactElementToJSXString(
content
, { - maxInlineAttributesLineLength: 5, - }) - ).toEqual( - `
- content -
` - ); - }); - it('reactElementToJSXString(
content
, { maxInlineAttributesLineLength: 10 }))', () => { - expect( - reactElementToJSXString( -
- content -
, - { - maxInlineAttributesLineLength: 10, - } - ) - ).toEqual( - `
- content -
` - ); - }); - - // Multi-level inline attribute test - it('reactElementToJSXString(
content
, { maxInlineAttributesLineLength: 24 }))', () => { - expect( - reactElementToJSXString( -
-
- content -
-
, - { - maxInlineAttributesLineLength: 24, - } - ) - ).toEqual( - `
-
- content -
-
` - ); - }); - it('should return functionValue result when it returns a string', () => { - expect( - reactElementToJSXString(
'value'} />, { - showFunctions: true, - functionValue: () => '...', - }) - ).toEqual('
'); - }); - it('sends the original fn to functionValue', () => { - const fn = () => {}; - const functionValue = receivedFn => expect(receivedFn).toBe(fn); - reactElementToJSXString(
, { functionValue }); - }); - it('should return noRefCheck when "showFunctions" is false and "functionValue" is not provided', () => { - expect(reactElementToJSXString(
{}} />)).toEqual( - '
' - ); - }); - - it('reactElementToJSXString(

foo

bar

)', () => { - expect( - reactElementToJSXString( - -

foo

-

bar

-
- ) - ).toEqual( - `<> -

- foo -

-

- bar -

-` - ); - }); - - it('reactElementToJSXString(
)', () => { - expect( - reactElementToJSXString( - -
-
- - ) - ).toEqual( - ` -
-
-` - ); - }); - - it('reactElementToJSXString()', () => { - expect(reactElementToJSXString()).toEqual(``); - }); - - it('reactElementToJSXString(
} />)', () => { - expect( - reactElementToJSXString( -
-
-
- - } - /> - ) - ).toEqual(`
} />`); - }); - - it('should not cause recursive loop when prop object contains an element', () => { - const Test = () =>
Test
; - - const Container = ({ title: { component } }) =>
{component}
; - - class App extends Component { - render() { - const inside = }} />; - - const insideString = reactElementToJSXString(inside); - - return ( -
- {insideString} - -
Hello world!
- -

Start editing to see some magic happen :)

-
- ); - } - } - - render(); - - expect(screen.getByText('Hello world!')).toBeInTheDocument(); - }); - - it('should not cause recursive loop when an element contains a ref', () => { - expect.assertions(2); - - class App extends Component { - constructor(props) { - super(props); - this.inputRef = React.createRef(); - } - componentDidMount() { - expect(reactElementToJSXString()).toEqual( - `` - ); - } - render() { - return ( - <> - -
Hello world!
- - ); - } - } - - render(); - - expect(screen.getByText('Hello world!')).toBeInTheDocument(); - }); - - it('should use inferred function name as display name for `forwardRef` element', () => { - const Tag = React.forwardRef(function Tag({ text }, ref) { - return {text}; - }); - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should use `displayName` instead of inferred function name as display name for `forwardRef` element', () => { - const Tag = React.forwardRef(function Tag({ text }, ref) { - return {text}; - }); - Tag.displayName = 'MyTag'; - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should use inferred function name as display name for `memo` element', () => { - const Tag = React.memo(function Tag({ text }) { - return {text}; - }); - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should use `displayName` instead of inferred function name as display name for `memo` element', () => { - const Tag = React.memo(function Tag({ text }) { - return {text}; - }); - Tag.displayName = 'MyTag'; - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should use inferred function name as display name for a `forwardRef` wrapped in `memo`', () => { - const Tag = React.memo( - React.forwardRef(function Tag({ text }, ref) { - return {text}; - }) - ); - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should use inferred function name as display name for a component wrapped in `memo` multiple times', () => { - const Tag = React.memo( - React.memo( - React.memo(function Tag({ text }) { - return {text}; - }) - ) - ); - expect(reactElementToJSXString()).toEqual( - `` - ); - }); - - it('should stringify `StrictMode` correctly', () => { - const App = () => null; - - expect( - reactElementToJSXString( - - - - ) - ).toEqual(` - -`); - }); - - it('should stringify `Suspense` correctly', () => { - const Spinner = () => null; - const ProfilePage = () => null; - - expect( - reactElementToJSXString( - }> - - - ) - ).toEqual(`}> - -`); - }); - - it('should stringify `Profiler` correctly', () => { - const Navigation = () => null; - - expect( - reactElementToJSXString( - {}}> - - - ) - ).toEqual(` - -`); - }); - - it('should stringify `Contex.Provider` correctly', () => { - const Ctx = React.createContext(); - const App = () => {}; - - expect( - reactElementToJSXString( - - - - ) - ).toEqual(` - -`); - }); - - it('should stringify `Context` correctly', () => { - const Ctx = React.createContext(); - const App = () => {}; - - expect( - reactElementToJSXString( - - - - ) - ).toEqual(` - -`); - }); - - it('should stringify `Contex.Provider` with `displayName` correctly', () => { - const Ctx = React.createContext(); - Ctx.displayName = 'MyCtx'; - - const App = () => {}; - - expect( - reactElementToJSXString( - - - - ) - ).toEqual(` - -`); - }); - - it('should stringify `Contex.Consumer` correctly', () => { - const Ctx = React.createContext(); - const Button = () => null; - - expect( - reactElementToJSXString( - {theme =>