From d87b226c8737731717774620ffdb3380dc5f8400 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Mar 2026 15:17:49 +0200 Subject: [PATCH 01/10] Adding Angular project scafolding --- .editorconfig | 17 + .gitignore | 44 + .prettierrc | 12 + .vscode/extensions.json | 4 + .vscode/launch.json | 20 + .vscode/mcp.json | 9 + .vscode/tasks.json | 42 + angular.json | 76 + notes.md | 14 + package-lock.json | 8558 +++++++++++++++++++++++++++++++++++++++ package.json | 32 + public/favicon.ico | Bin 0 -> 15086 bytes src/app/app.config.ts | 5 + src/app/app.html | 351 ++ src/app/app.scss | 0 src/app/app.spec.ts | 23 + src/app/app.ts | 11 + src/index.html | 13 + src/main.ts | 5 + src/styles.scss | 1 + tsconfig.app.json | 11 + tsconfig.json | 33 + tsconfig.spec.json | 10 + 23 files changed, 9291 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/mcp.json create mode 100644 .vscode/tasks.json create mode 100644 angular.json create mode 100644 notes.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/app/app.config.ts create mode 100644 src/app/app.html create mode 100644 src/app/app.scss create mode 100644 src/app/app.spec.ts create mode 100644 src/app/app.ts create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/styles.scss create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f166060 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..854acd5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/mcp.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings +__screenshots__/ + +# System files +.DS_Store +Thumbs.db diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d6c16d7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..77b3745 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..925af83 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 0000000..956af8c --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,9 @@ +{ + // For more information, visit: https://angular.dev/ai/mcp + "servers": { + "angular-cli": { + "command": "npx", + "args": ["-y", "@angular/cli", "mcp"] + } + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..244306f --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + } + ] +} diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..fe6bf7c --- /dev/null +++ b/angular.json @@ -0,0 +1,76 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "npm" + }, + "newProjectRoot": "projects", + "projects": { + "angular-code-test": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": ["src/styles.scss"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-code-test:build:production" + }, + "development": { + "buildTarget": "angular-code-test:build:development" + } + }, + "defaultConfiguration": "development" + }, + "test": { + "builder": "@angular/build:unit-test" + } + } + } + } +} diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..788f5cd --- /dev/null +++ b/notes.md @@ -0,0 +1,14 @@ +third acceptance critieria use appropriate RxJs, how I example things add comment +explain to your colleagues + +Observables big talking point +Angular 21. +standalone components was thinking class base components +Test coverage mucho important +AI tools with guidance + + + +Performance and Architecture +lazyLoading..more angular runtime performance + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6193faf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8558 @@ +{ + "name": "angular-code-test", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "angular-code-test", + "version": "0.0.0", + "dependencies": { + "@angular/common": "^21.2.0", + "@angular/compiler": "^21.2.0", + "@angular/core": "^21.2.0", + "@angular/forms": "^21.2.0", + "@angular/platform-browser": "^21.2.0", + "@angular/router": "^21.2.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@angular/build": "^21.2.3", + "@angular/cli": "^21.2.3", + "@angular/compiler-cli": "^21.2.0", + "jsdom": "^28.0.0", + "prettier": "^3.8.1", + "typescript": "~5.9.2", + "vitest": "^4.0.8" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/abtesting": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.14.1.tgz", + "integrity": "sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.48.1.tgz", + "integrity": "sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.48.1.tgz", + "integrity": "sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.48.1.tgz", + "integrity": "sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.48.1.tgz", + "integrity": "sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.48.1.tgz", + "integrity": "sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.48.1.tgz", + "integrity": "sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.48.1.tgz", + "integrity": "sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.48.1.tgz", + "integrity": "sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.48.1.tgz", + "integrity": "sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.48.1.tgz", + "integrity": "sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.48.1.tgz", + "integrity": "sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.48.1.tgz", + "integrity": "sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.48.1.tgz", + "integrity": "sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2102.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.3.tgz", + "integrity": "sha512-G4wSWUbtWp1WCKw5GMRqHH8g4m5RBpIyzt8n8IX5Pm6iYe/rwCBSKL3ktEkk7AYMwjtonkRlDtAK1GScFsf1Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.3", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.3.tgz", + "integrity": "sha512-i++JVHOijyFckjdYqKbSXUpKnvmO2a0Utt/wQVwiLAT0O9H1hR/2NGPzubB4hnLMNSyVWY8diminaF23mZ0xjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.3.tgz", + "integrity": "sha512-tc/bBloRTVIBWGRiMPln1QbW+2QPj+YnWL/nG79abLKWkdrL9dJLcCRXY7dsPNrxOc/QF+8tVpnr8JofhWL9cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.3", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.3.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/build": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.3.tgz", + "integrity": "sha512-u4bhVQruK7KOuHQuoltqlHg+szp0f6rnsGIUolJnT3ez5V6OuSoWIxUorSbvryi2DiKRD/3iwMq7qJN1aN9HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2102.3", + "@babel/core": "7.29.0", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.21", + "@vitejs/plugin-basic-ssl": "2.1.4", + "beasties": "0.4.1", + "browserslist": "^4.26.0", + "esbuild": "0.27.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.5", + "magic-string": "0.30.21", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.4", + "rolldown": "1.0.0-rc.4", + "sass": "1.97.3", + "semver": "7.7.4", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.15", + "undici": "7.22.0", + "vite": "7.3.1", + "watchpack": "2.5.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.5.1" + }, + "peerDependencies": { + "@angular/compiler": "^21.0.0", + "@angular/compiler-cli": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/localize": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/service-worker": "^21.0.0", + "@angular/ssr": "^21.2.3", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^21.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.9 <6.0", + "vitest": "^4.0.8" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/cli": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.3.tgz", + "integrity": "sha512-QzDxnSy8AUOz6ca92xfbNuEmRdWRDi1dfFkxDVr+4l6XUnA9X6VmOi7ioCO1I9oDR73LXHybOqkqHBYDlqt/Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2102.3", + "@angular-devkit/core": "21.2.3", + "@angular-devkit/schematics": "21.2.3", + "@inquirer/prompts": "7.10.1", + "@listr2/prompt-adapter-inquirer": "3.0.5", + "@modelcontextprotocol/sdk": "1.26.0", + "@schematics/angular": "21.2.3", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.48.1", + "ini": "6.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.5", + "npm-package-arg": "13.0.2", + "pacote": "21.3.1", + "parse5-html-rewriting-stream": "8.0.0", + "semver": "7.7.4", + "yargs": "18.0.0", + "zod": "4.3.6" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.5.tgz", + "integrity": "sha512-MTjCbsHBkF9W12CW9yYiTJdVfZv/qCqBCZ2iqhMpDA5G+ZJiTKP0IDTJVrx2N5iHfiJ1lnK719t/9GXROtEAvg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "21.2.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.5.tgz", + "integrity": "sha512-QloEsknGqLvmr+ED7QShDt7SoMY9mipV+gVnwn4hBI5sbl+TOBfYWXIaJMnxseFwSqjXTSCVGckfylIlynNcFg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.5.tgz", + "integrity": "sha512-Ox3vz6KAM7i47ujR/3M3NCOeCRn6vrC9yV1SHZRhSrYg6CWWcOMveavEEwtNjYtn3hOzrktO4CnuVwtDbU8pLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.29.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^5.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "21.2.5", + "typescript": ">=5.9 <6.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/core": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.5.tgz", + "integrity": "sha512-JgHU134Adb1wrpyGC9ozcv3hiRAgaFTvJFn1u9OU/AVXyxu4meMmVh2hp5QhAvPnv8XQdKWWIkAY+dbpPE6zKA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "21.2.5", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0 || ~0.16.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.5.tgz", + "integrity": "sha512-pqRuK+a1ZAFZbs8/dZoorFJah2IWaf/SH8axHUpaDJ7fyNrwNEcpczyObdxZ00lOgORpKAhWo/q0hlVS+In8cw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "21.2.5", + "@angular/core": "21.2.5", + "@angular/platform-browser": "21.2.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.5.tgz", + "integrity": "sha512-VuuYguxjgyI4XWuoXrKynmuA3FB991pXbkNhxHeCW0yX+7DGOnGLPF1oierd4/X+IvskmN8foBZLfjyg9u4Ffg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "21.2.5", + "@angular/common": "21.2.5", + "@angular/core": "21.2.5" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/router": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.5.tgz", + "integrity": "sha512-yQGhTVGvh8OMW3auj13+g+OCSQj7gyBQON/2X4LuCvIUG71NPV6Fqzfk9DKTKaXpqo0FThy8/LPJ0Lsy3CRejg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "21.2.5", + "@angular/core": "21.2.5", + "@angular/platform-browser": "21.2.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", + "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", + "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@gar/promise-retry": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", + "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@harperfast/extended-iterable": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", + "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@hono/node-server": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", + "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", + "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.5" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.1.tgz", + "integrity": "sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.5.1.tgz", + "integrity": "sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.5.1.tgz", + "integrity": "sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.5.1.tgz", + "integrity": "sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.5.1.tgz", + "integrity": "sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.5.1.tgz", + "integrity": "sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.5.1.tgz", + "integrity": "sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", + "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@npmcli/agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/fs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.113.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.113.0.tgz", + "integrity": "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.4.tgz", + "integrity": "sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.4.tgz", + "integrity": "sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.4.tgz", + "integrity": "sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.4.tgz", + "integrity": "sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.4.tgz", + "integrity": "sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.4.tgz", + "integrity": "sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.4.tgz", + "integrity": "sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.4.tgz", + "integrity": "sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.4.tgz", + "integrity": "sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.4.tgz", + "integrity": "sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.4.tgz", + "integrity": "sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.4.tgz", + "integrity": "sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.4.tgz", + "integrity": "sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.4.tgz", + "integrity": "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.3.tgz", + "integrity": "sha512-rCEprgpNbJLl9Rm/t92eRYc1eIqD4BAJqB1OO8fzQolyDajCcOBpohjXkuLYSwK9RMyS6f+szNnYGOQawlrPYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.3", + "@angular-devkit/schematics": "21.2.3", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.0.tgz", + "integrity": "sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", + "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", + "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", + "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.0", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.48.1.tgz", + "integrity": "sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.14.1", + "@algolia/client-abtesting": "5.48.1", + "@algolia/client-analytics": "5.48.1", + "@algolia/client-common": "5.48.1", + "@algolia/client-insights": "5.48.1", + "@algolia/client-personalization": "5.48.1", + "@algolia/client-query-suggestions": "5.48.1", + "@algolia/client-search": "5.48.1", + "@algolia/ingestion": "1.48.1", + "@algolia/monitoring": "1.48.1", + "@algolia/recommend": "5.48.1", + "@algolia/requester-browser-xhr": "5.48.1", + "@algolia/requester-fetch": "5.48.1", + "@algolia/requester-node-http": "5.48.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/beasties": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.4.1.tgz", + "integrity": "sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3", + "postcss-safe-parser": "^7.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", + "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssstyle": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", + "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.28", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz", + "integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz", + "integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", + "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.31", + "@asamuzakjp/dom-selector": "^6.8.1", + "@bramus/specificity": "^2.4.2", + "@exodus/bytes": "^1.11.0", + "cssstyle": "^6.0.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "undici": "^7.21.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.5.1.tgz", + "integrity": "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@harperfast/extended-iterable": "^1.0.3", + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.5.1", + "@lmdb/lmdb-darwin-x64": "3.5.1", + "@lmdb/lmdb-linux-arm": "3.5.1", + "@lmdb/lmdb-linux-arm64": "3.5.1", + "@lmdb/lmdb-linux-x64": "3.5.1", + "@lmdb/lmdb-win32-arm64": "3.5.1", + "@lmdb/lmdb-win32-x64": "3.5.1" + } + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-fetch-happen": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", + "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.9.tgz", + "integrity": "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-gyp": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", + "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-bundled": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-install-checks": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.1", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.3.1.tgz", + "integrity": "sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.4.tgz", + "integrity": "sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.4.tgz", + "integrity": "sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.113.0", + "@rolldown/pluginutils": "1.0.0-rc.4" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.4", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.4", + "@rolldown/binding-darwin-x64": "1.0.0-rc.4", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.4", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.4", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.4", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.4", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.4", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.4", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.4", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.4", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.4", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.4" + } + }, + "node_modules/rollup": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.97.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", + "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.1.tgz", + "integrity": "sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "7.5.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.12.tgz", + "integrity": "sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", + "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.27" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", + "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "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 + } + } + }, + "node_modules/vitest": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b3102d7 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "angular-code-test", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "packageManager": "npm@11.4.2", + "dependencies": { + "@angular/common": "^21.2.0", + "@angular/compiler": "^21.2.0", + "@angular/core": "^21.2.0", + "@angular/forms": "^21.2.0", + "@angular/platform-browser": "^21.2.0", + "@angular/router": "^21.2.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@angular/build": "^21.2.3", + "@angular/cli": "^21.2.3", + "@angular/compiler-cli": "^21.2.0", + "jsdom": "^28.0.0", + "prettier": "^3.8.1", + "typescript": "~5.9.2", + "vitest": "^4.0.8" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 GIT binary patch literal 15086 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 Nr__JTFzvMr^FKp4S3v*( literal 0 HcmV?d00001 diff --git a/src/app/app.config.ts b/src/app/app.config.ts new file mode 100644 index 0000000..45c753e --- /dev/null +++ b/src/app/app.config.ts @@ -0,0 +1,5 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; + +export const appConfig: ApplicationConfig = { + providers: [provideBrowserGlobalErrorListeners()], +}; diff --git a/src/app/app.html b/src/app/app.html new file mode 100644 index 0000000..1b67d43 --- /dev/null +++ b/src/app/app.html @@ -0,0 +1,351 @@ + + + + + + + + + + + +
+
+
+ +

Hello, {{ title() }}

+

Congratulations! Your app is running. 🎉

+
+ +
+
+ @for ( + item of [ + { title: 'Explore the Docs', link: 'https://angular.dev' }, + { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, + { + title: 'Prompt and best practices for AI', + link: 'https://angular.dev/ai/develop-with-ai', + }, + { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, + { + title: 'Angular Language Service', + link: 'https://angular.dev/tools/language-service', + }, + { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, + ]; + track item.title + ) { + + {{ item.title }} + + + + + } +
+ +
+
+
+ + + + + + + + diff --git a/src/app/app.scss b/src/app/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app.spec.ts b/src/app/app.spec.ts new file mode 100644 index 0000000..1ad6dc8 --- /dev/null +++ b/src/app/app.spec.ts @@ -0,0 +1,23 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should render title', async () => { + const fixture = TestBed.createComponent(App); + await fixture.whenStable(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, angular-code-test'); + }); +}); diff --git a/src/app/app.ts b/src/app/app.ts new file mode 100644 index 0000000..694fbf8 --- /dev/null +++ b/src/app/app.ts @@ -0,0 +1,11 @@ +import { Component, signal } from '@angular/core'; + +@Component({ + selector: 'app-root', + imports: [], + templateUrl: './app.html', + styleUrl: './app.scss', +}) +export class App { + protected readonly title = signal('angular-code-test'); +} diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..2ea1d83 --- /dev/null +++ b/src/index.html @@ -0,0 +1,13 @@ + + + + + AngularCodeTest + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..190f341 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..a0dcc37 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2ab7442 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..26230b0 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,10 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": ["vitest/globals"] + }, + "include": ["src/**/*.d.ts", "src/**/*.spec.ts"] +} From 8f47e009b34866cd91cf6626ac9d10a0b72deaa1 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Mar 2026 15:36:14 +0200 Subject: [PATCH 02/10] vehicle interface and vehicle services with comments --- .gitignore | 1 + src/app/core/interfaces/vehicle.interface.ts | 42 +++++++++++++ src/app/core/services/vehicle.service.ts | 66 ++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 .gitignore create mode 100644 src/app/core/interfaces/vehicle.interface.ts create mode 100644 src/app/core/services/vehicle.service.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..096746c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules/ \ No newline at end of file diff --git a/src/app/core/interfaces/vehicle.interface.ts b/src/app/core/interfaces/vehicle.interface.ts new file mode 100644 index 0000000..36cb5a1 --- /dev/null +++ b/src/app/core/interfaces/vehicle.interface.ts @@ -0,0 +1,42 @@ +export interface VehicleMedia { + name: string; + url: string; +} + +export interface VehicleEmissions { + template: string; + value: number; +} + +export interface VehicleMeta { + passengers: number; + drivetrain: string[]; + bodystyles: string[]; + emissions: VehicleEmissions; +} + +/** Shape returned by GET /api/vehicles/ */ +export interface VehicleSummary { + id: string; + name: string; + modelYear: string; + apiUrl: string; + media: VehicleMedia[]; +} + +/** Shape returned by GET /api/vehicles/:id */ +export interface VehicleDetail { + id: string; + description: string; + price: string; + meta: VehicleMeta; +} + +/** Merged type used throughout the application */ +export interface Vehicle extends VehicleSummary, VehicleDetail {} + +/** + * Discriminated union — extend with Motorbike when the API supports it. + * e.g. type AnyVehicle = Car | Motorbike; + */ +export type AnyVehicle = Vehicle; diff --git a/src/app/core/services/vehicle.service.ts b/src/app/core/services/vehicle.service.ts new file mode 100644 index 0000000..6116ee4 --- /dev/null +++ b/src/app/core/services/vehicle.service.ts @@ -0,0 +1,66 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable, signal } from '@angular/core'; +import { + EMPTY, + Observable, + catchError, + forkJoin, + map, + switchMap, +} from 'rxjs'; +import { + AnyVehicle, + VehicleDetail, + VehicleSummary, +} from '../interfaces/vehicle.interface'; + +const API_BASE = + 'https://frontend-code-test-api-1023992580432.europe-west2.run.app'; + +@Injectable({ providedIn: 'root' }) +export class VehicleService { + readonly loading = signal(false); + readonly error = signal(null); + + constructor(private readonly http: HttpClient) {} + + /** + * Fetches the vehicle list then retrieves all detail records in parallel. + * Uses switchMap so any re-trigger cancels the previous in-flight request, + * and forkJoin because HTTP calls are one-shot (complete after one emission). + */ + fetchAll(): Observable { + this.loading.set(true); + this.error.set(null); + + return this.http.get(`${API_BASE}/api/vehicles/`).pipe( + switchMap((summaries) => + forkJoin( + summaries.map((summary) => + this.http + .get(`${API_BASE}${summary.apiUrl}`) + .pipe( + map((detail) => this.merge(summary, detail)), + // Per-vehicle errors are swallowed so one bad record + // (e.g. "problematic") doesn't kill the entire list. + catchError(() => EMPTY), + ), + ), + ), + ), + map((vehicles) => { + this.loading.set(false); + return vehicles; + }), + catchError((err: Error) => { + this.loading.set(false); + this.error.set(err.message ?? 'Failed to load vehicles'); + return EMPTY; + }), + ); + } + + private merge(summary: VehicleSummary, detail: VehicleDetail): AnyVehicle { + return { ...summary, ...detail }; + } +} From 943ba77635b906fa8e83ab474141699173309939 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Mar 2026 17:56:17 +0200 Subject: [PATCH 03/10] Price and description UI --- .../vehicle-card/vehicle-card.component.html | 16 +++ .../vehicle-card/vehicle-card.component.scss | 101 +++++++++++++ .../vehicle-card/vehicle-card.component.ts | 36 +++++ .../vehicle-list/vehicle-list.component.html | 43 ++++++ .../vehicle-list/vehicle-list.component.scss | 134 ++++++++++++++++++ .../vehicle-list/vehicle-list.component.ts | 17 +++ 6 files changed, 347 insertions(+) create mode 100644 src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html create mode 100644 src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss create mode 100644 src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts create mode 100644 src/app/features/vehicles/components/vehicle-list/vehicle-list.component.html create mode 100644 src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss create mode 100644 src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html new file mode 100644 index 0000000..276a819 --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html @@ -0,0 +1,16 @@ +
+
+ +
+ +
+

{{ vehicle.name }}

+

From {{ vehicle.price }}

+

{{ vehicle.description }}

+
+
diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss new file mode 100644 index 0000000..a1b8164 --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss @@ -0,0 +1,101 @@ +// Animation runs on the host element so that the parent can control +// animation-delay via [style.animation-delay] without ViewEncapsulation issues. +:host { + display: block; + opacity: 0; + animation: vehicle-card-fade-in 0.5s ease forwards; +} + +@keyframes vehicle-card-fade-in { + to { + opacity: 1; + } +} + +.vehicle-card { + display: flex; + flex-direction: row; + align-items: center; + padding: 16px; + border-bottom: 1px solid #e0e0e0; + background-color: #fff; + + // ── Tablet and above: flip to vertical stacked layout ── + @media (min-width: 768px) { + flex-direction: column; + align-items: stretch; + padding: 0; + border-bottom: none; + } + + // ───────────────────────────────────────────── + // Image wrapper + // The same src is used at every breakpoint. + // Changing aspect-ratio + object-fit: cover gives the + // illusion of a different crop without swapping src. + // ───────────────────────────────────────────── + &__image-wrapper { + flex-shrink: 0; + width: 38%; + aspect-ratio: 1 / 1; // mobile: square crop + overflow: hidden; + + @media (min-width: 768px) { + width: 100%; + aspect-ratio: 16 / 9; // tablet+: widescreen crop + } + } + + &__image { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + } + + // ───────────────────────────────────────────── + // Text body + // ───────────────────────────────────────────── + &__body { + flex: 1; + padding: 0 16px; + + @media (min-width: 768px) { + padding: 20px 16px 28px; + text-align: center; + } + } + + &__name { + font-family: Georgia, 'Times New Roman', serif; + font-size: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + margin: 0 0 6px; + + @media (min-width: 768px) { + font-size: 1.0625rem; + text-decoration: underline; + text-underline-offset: 5px; + margin-bottom: 14px; + } + } + + &__price { + font-size: 0.875rem; + color: #333; + margin: 0 0 6px; + + @media (min-width: 768px) { + margin-bottom: 10px; + } + } + + &__description { + font-size: 0.875rem; + color: #555; + line-height: 1.45; + margin: 0; + } +} diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts new file mode 100644 index 0000000..380485a --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts @@ -0,0 +1,36 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; + +@Component({ + selector: 'app-vehicle-card', + imports: [], + templateUrl: './vehicle-card.component.html', + styleUrl: './vehicle-card.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class VehicleCardComponent { + @Input({ required: true }) vehicle!: AnyVehicle; + + /** + * Used by the parent list to stagger the fade-in animation via + * [style.animation-delay] bound on the host element. + */ + @Input() index = 0; + + /** + * Prefer the 16x9 image; CSS aspect-ratio + object-fit handles the + * visual crop at all breakpoints so we never need to swap src. + */ + get imageUrl(): string { + return ( + this.vehicle.media.find((m) => m.url.includes('16x9'))?.url ?? + this.vehicle.media[0]?.url ?? + '' + ); + } + + get emissionsLabel(): string { + const { template, value } = this.vehicle.meta.emissions; + return template.replace('$value', String(value)); + } +} diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.html b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.html new file mode 100644 index 0000000..216e61c --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.html @@ -0,0 +1,43 @@ +
+ + @if (vehicleService.loading()) { + + +
    + @for (_ of skeletonCount; track $index) { +
  • + +
  • + } +
+ + } @else if (vehicleService.error()) { + + + + } @else { + +
    + @for (vehicle of vehicleService.vehicles(); track vehicle.id; let i = $index) { +
  • + +
  • + } +
+ + } + +
diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss new file mode 100644 index 0000000..d14758d --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss @@ -0,0 +1,134 @@ +// ───────────────────────────────────────────────────────────────────────────── +// Shared shimmer animation used by skeleton elements +// ───────────────────────────────────────────────────────────────────────────── +@keyframes shimmer { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Section wrapper +// ───────────────────────────────────────────────────────────────────────────── +.vehicle-list { + max-width: 1440px; + margin: 0 auto; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Responsive grid +// +// Mobile (default): single-column stacked list — no grid needed. +// Tablet (≥768px): 2-column grid. The 1px gap + background-color on the +// container creates the dividing lines between cards without +// needing borders on every card. +// Desktop (≥1280px): 4-column grid. +// ───────────────────────────────────────────────────────────────────────────── +.vehicle-list__grid { + list-style: none; + margin: 0; + padding: 0; + + @media (min-width: 768px) { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1px; + background-color: #d0d0d0; // shows through the 1px gap as grid lines + } + + @media (min-width: 1280px) { + grid-template-columns: repeat(4, 1fr); + } +} + +// Each
  • needs its own background to mask the grid container's background. +.vehicle-list__item { + @media (min-width: 768px) { + background-color: #fff; + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Loading skeleton +// Mirrors the card layout so there's no layout shift when data arrives. +// ───────────────────────────────────────────────────────────────────────────── +%shimmer { + background: linear-gradient(90deg, #efefef 25%, #e0e0e0 50%, #efefef 75%); + background-size: 200% 100%; + animation: shimmer 1.5s infinite; +} + +.vehicle-list__skeleton { + display: flex; + flex-direction: row; + align-items: center; + padding: 16px; + border-bottom: 1px solid #e0e0e0; + background-color: #fff; + + @media (min-width: 768px) { + flex-direction: column; + padding: 0; + border-bottom: none; + } +} + +.vehicle-list__skeleton-image { + @extend %shimmer; + + flex-shrink: 0; + width: 38%; + aspect-ratio: 1 / 1; + + @media (min-width: 768px) { + width: 100%; + aspect-ratio: 16 / 9; + } +} + +.vehicle-list__skeleton-body { + flex: 1; + padding: 0 16px; + display: flex; + flex-direction: column; + gap: 10px; + + @media (min-width: 768px) { + padding: 20px 16px 28px; + align-items: center; + } +} + +.vehicle-list__skeleton-line { + @extend %shimmer; + + height: 14px; + border-radius: 2px; + width: 90%; + + &--title { + height: 18px; + width: 70%; + } + + &--short { + width: 55%; + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Error state +// ───────────────────────────────────────────────────────────────────────────── +.vehicle-list__error { + padding: 48px 24px; + text-align: center; +} + +.vehicle-list__error-message { + color: #c0392b; + font-size: 1rem; + margin: 0; +} diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts new file mode 100644 index 0000000..a366f60 --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { VehicleService } from '../../../../core/services/vehicle.service'; +import { VehicleCardComponent } from '../vehicle-card/vehicle-card.component'; + +@Component({ + selector: 'app-vehicle-list', + imports: [VehicleCardComponent], + templateUrl: './vehicle-list.component.html', + styleUrl: './vehicle-list.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class VehicleListComponent { + protected readonly vehicleService = inject(VehicleService); + + /** Drives the skeleton loading grid — one placeholder per expected vehicle. */ + protected readonly skeletonCount = Array.from({ length: 6 }); +} From 80318638c2c4b8011d3b41a9daf3d5d56bdf7954 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Mar 2026 20:57:19 +0200 Subject: [PATCH 04/10] added image fix by migrating images to the public folder Add tests for service and vehicle components --- {images => public/images}/16x9/fpace_k17.jpg | Bin {images => public/images}/16x9/ftype_k17.jpg | Bin {images => public/images}/16x9/ipace_k21.jpg | Bin {images => public/images}/16x9/xe_k17.jpg | Bin {images => public/images}/16x9/xf_k17.jpg | Bin {images => public/images}/16x9/xj_k16.jpg | Bin {images => public/images}/1x1/fpace_k17.jpg | Bin {images => public/images}/1x1/ftype_k17.jpg | Bin {images => public/images}/1x1/ipace_k21.jpg | Bin {images => public/images}/1x1/xe_k17.jpg | Bin {images => public/images}/1x1/xf_k17.jpg | Bin {images => public/images}/1x1/xj_k16.jpg | Bin src/app/app.html | 354 +----------------- src/app/app.spec.ts | 18 +- src/app/app.ts | 3 +- src/app/core/services/vehicle.service.spec.ts | 203 ++++++++++ src/app/core/services/vehicle.service.ts | 11 +- .../vehicle-card.component.spec.ts | 127 +++++++ .../vehicle-card/vehicle-card.component.ts | 1 + .../vehicle-list.component.spec.ts | 143 +++++++ .../vehicle-list/vehicle-list.component.ts | 11 +- 21 files changed, 507 insertions(+), 364 deletions(-) rename {images => public/images}/16x9/fpace_k17.jpg (100%) rename {images => public/images}/16x9/ftype_k17.jpg (100%) rename {images => public/images}/16x9/ipace_k21.jpg (100%) rename {images => public/images}/16x9/xe_k17.jpg (100%) rename {images => public/images}/16x9/xf_k17.jpg (100%) rename {images => public/images}/16x9/xj_k16.jpg (100%) rename {images => public/images}/1x1/fpace_k17.jpg (100%) rename {images => public/images}/1x1/ftype_k17.jpg (100%) rename {images => public/images}/1x1/ipace_k21.jpg (100%) rename {images => public/images}/1x1/xe_k17.jpg (100%) rename {images => public/images}/1x1/xf_k17.jpg (100%) rename {images => public/images}/1x1/xj_k16.jpg (100%) create mode 100644 src/app/core/services/vehicle.service.spec.ts create mode 100644 src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts create mode 100644 src/app/features/vehicles/components/vehicle-list/vehicle-list.component.spec.ts diff --git a/images/16x9/fpace_k17.jpg b/public/images/16x9/fpace_k17.jpg similarity index 100% rename from images/16x9/fpace_k17.jpg rename to public/images/16x9/fpace_k17.jpg diff --git a/images/16x9/ftype_k17.jpg b/public/images/16x9/ftype_k17.jpg similarity index 100% rename from images/16x9/ftype_k17.jpg rename to public/images/16x9/ftype_k17.jpg diff --git a/images/16x9/ipace_k21.jpg b/public/images/16x9/ipace_k21.jpg similarity index 100% rename from images/16x9/ipace_k21.jpg rename to public/images/16x9/ipace_k21.jpg diff --git a/images/16x9/xe_k17.jpg b/public/images/16x9/xe_k17.jpg similarity index 100% rename from images/16x9/xe_k17.jpg rename to public/images/16x9/xe_k17.jpg diff --git a/images/16x9/xf_k17.jpg b/public/images/16x9/xf_k17.jpg similarity index 100% rename from images/16x9/xf_k17.jpg rename to public/images/16x9/xf_k17.jpg diff --git a/images/16x9/xj_k16.jpg b/public/images/16x9/xj_k16.jpg similarity index 100% rename from images/16x9/xj_k16.jpg rename to public/images/16x9/xj_k16.jpg diff --git a/images/1x1/fpace_k17.jpg b/public/images/1x1/fpace_k17.jpg similarity index 100% rename from images/1x1/fpace_k17.jpg rename to public/images/1x1/fpace_k17.jpg diff --git a/images/1x1/ftype_k17.jpg b/public/images/1x1/ftype_k17.jpg similarity index 100% rename from images/1x1/ftype_k17.jpg rename to public/images/1x1/ftype_k17.jpg diff --git a/images/1x1/ipace_k21.jpg b/public/images/1x1/ipace_k21.jpg similarity index 100% rename from images/1x1/ipace_k21.jpg rename to public/images/1x1/ipace_k21.jpg diff --git a/images/1x1/xe_k17.jpg b/public/images/1x1/xe_k17.jpg similarity index 100% rename from images/1x1/xe_k17.jpg rename to public/images/1x1/xe_k17.jpg diff --git a/images/1x1/xf_k17.jpg b/public/images/1x1/xf_k17.jpg similarity index 100% rename from images/1x1/xf_k17.jpg rename to public/images/1x1/xf_k17.jpg diff --git a/images/1x1/xj_k16.jpg b/public/images/1x1/xj_k16.jpg similarity index 100% rename from images/1x1/xj_k16.jpg rename to public/images/1x1/xj_k16.jpg diff --git a/src/app/app.html b/src/app/app.html index 1b67d43..9a395ab 100644 --- a/src/app/app.html +++ b/src/app/app.html @@ -1,351 +1,3 @@ - - - - - - - - - - - -
    -
    -
    - -

    Hello, {{ title() }}

    -

    Congratulations! Your app is running. 🎉

    -
    - -
    -
    - @for ( - item of [ - { title: 'Explore the Docs', link: 'https://angular.dev' }, - { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, - { - title: 'Prompt and best practices for AI', - link: 'https://angular.dev/ai/develop-with-ai', - }, - { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, - { - title: 'Angular Language Service', - link: 'https://angular.dev/tools/language-service', - }, - { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, - ]; - track item.title - ) { - - {{ item.title }} - - - - - } -
    - -
    -
    -
    - - - - - - - - +
    + +
    \ No newline at end of file diff --git a/src/app/app.spec.ts b/src/app/app.spec.ts index 1ad6dc8..bfd345e 100644 --- a/src/app/app.spec.ts +++ b/src/app/app.spec.ts @@ -1,23 +1,29 @@ import { TestBed } from '@angular/core/testing'; +import { provideHttpClient } from '@angular/common/http'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; + import { App } from './app'; describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [App], + // App renders VehicleListComponent which injects VehicleService (HttpClient). + // provideHttpClientTesting() intercepts requests so no real network calls are made. + providers: [provideHttpClient(), provideHttpClientTesting()], }).compileComponents(); }); it('should create the app', () => { const fixture = TestBed.createComponent(App); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); + expect(fixture.componentInstance).toBeTruthy(); }); - it('should render title', async () => { + it('renders the vehicle list inside a main element', () => { const fixture = TestBed.createComponent(App); - await fixture.whenStable(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Hello, angular-code-test'); + fixture.detectChanges(); + const main = fixture.nativeElement.querySelector('main'); + expect(main).not.toBeNull(); + expect(main.querySelector('app-vehicle-list')).not.toBeNull(); }); }); diff --git a/src/app/app.ts b/src/app/app.ts index 694fbf8..7402635 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -1,8 +1,9 @@ import { Component, signal } from '@angular/core'; +import { VehicleListComponent } from './features/vehicles/components/vehicle-list/vehicle-list.component'; @Component({ selector: 'app-root', - imports: [], + imports: [VehicleListComponent], templateUrl: './app.html', styleUrl: './app.scss', }) diff --git a/src/app/core/services/vehicle.service.spec.ts b/src/app/core/services/vehicle.service.spec.ts new file mode 100644 index 0000000..6f104d5 --- /dev/null +++ b/src/app/core/services/vehicle.service.spec.ts @@ -0,0 +1,203 @@ +import { TestBed } from '@angular/core/testing'; +import { provideHttpClient } from '@angular/common/http'; +import { + HttpTestingController, + provideHttpClientTesting, +} from '@angular/common/http/testing'; + +import { VehicleService } from './vehicle.service'; +import { VehicleDetail, VehicleSummary } from '../interfaces/vehicle.interface'; + +// ───────────────────────────────────────────────────────────────────────────── +// Shared test fixtures +// +// Define minimal objects that satisfy the interface. Keeping them at the top +// makes it easy to reuse across tests and update when the interface changes. +// ───────────────────────────────────────────────────────────────────────────── + +const API_BASE = + 'https://frontend-code-test-api-1023992580432.europe-west2.run.app'; + +const mockSummary: VehicleSummary = { + id: 'xe', + name: 'XE', + modelYear: '2021', + apiUrl: '/api/vehicles/xe', + media: [{ name: 'xe 16x9', url: '/images/16x9/xe.jpg' }], +}; + +const mockDetail: VehicleDetail = { + id: 'xe', + description: 'A sports saloon', + price: '£30,000', + meta: { + passengers: 5, + drivetrain: ['AWD'], + bodystyles: ['Saloon'], + emissions: { template: 'CO2 $value g/km', value: 129 }, + }, +}; + +// ───────────────────────────────────────────────────────────────────────────── +// Helper — flushes the list request then each vehicle detail request. +// Extracted so individual tests only need to describe their own scenario. +// ───────────────────────────────────────────────────────────────────────────── +function flushSuccess( + httpMock: HttpTestingController, + summaries = [mockSummary], + detail = mockDetail, +): void { + httpMock.expectOne(`${API_BASE}/api/vehicles/`).flush(summaries); + summaries.forEach((s) => + httpMock.expectOne(`${API_BASE}${s.apiUrl}`).flush(detail), + ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Tests +// ───────────────────────────────────────────────────────────────────────────── + +describe('VehicleService', () => { + let service: VehicleService; + let httpMock: HttpTestingController; + + // beforeEach runs before every `it` block. + // provideHttpClientTesting() intercepts real HTTP calls and lets us + // control responses manually — no real network requests are made. + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [provideHttpClient(), provideHttpClientTesting()], + }); + + service = TestBed.inject(VehicleService); + httpMock = TestBed.inject(HttpTestingController); + }); + + // afterEach verifies no unexpected HTTP requests were made. + // If a test triggers a request it didn't explicitly expect, this will fail. + afterEach(() => httpMock.verify()); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + // ── Initial state ────────────────────────────────────────────────────────── + + describe('initial signal values', () => { + // Signals are just functions — call them with () to read the value. + it('loading starts as false', () => { + expect(service.loading()).toBe(false); + }); + + it('error starts as null', () => { + expect(service.error()).toBeNull(); + }); + + it('vehicles starts as an empty array', () => { + expect(service.vehicles()).toEqual([]); + }); + }); + + // ── fetchAll() — happy path ──────────────────────────────────────────────── + + describe('fetchAll() — success', () => { + it('sets loading to true immediately before any response arrives', () => { + service.fetchAll().subscribe(); + + // At this point the HTTP request is in-flight — loading should be true. + expect(service.loading()).toBe(true); + + // Clean up: satisfy the pending requests so afterEach verify() passes. + flushSuccess(httpMock); + }); + + it('populates the vehicles signal with merged data', () => { + service.fetchAll().subscribe(); + flushSuccess(httpMock); + + const vehicles = service.vehicles(); + expect(vehicles.length).toBe(1); + + // The merged vehicle should have fields from both summary and detail. + expect(vehicles[0].name).toBe('XE'); + expect(vehicles[0].price).toBe('£30,000'); + expect(vehicles[0].description).toBe('A sports saloon'); + }); + + it('sets loading to false after success', () => { + service.fetchAll().subscribe(); + flushSuccess(httpMock); + + expect(service.loading()).toBe(false); + }); + + it('clears any previous error on a fresh call', () => { + // Simulate a stale error from a previous failed call. + service.error.set('old error'); + + service.fetchAll().subscribe(); + + // The error should be cleared as soon as fetchAll() is called, + // before any response arrives. + expect(service.error()).toBeNull(); + + flushSuccess(httpMock); + }); + }); + + // ── fetchAll() — error paths ─────────────────────────────────────────────── + + describe('fetchAll() — list request fails', () => { + it('sets the error signal with the response message', () => { + service.fetchAll().subscribe(); + + httpMock + .expectOne(`${API_BASE}/api/vehicles/`) + .flush('Internal Server Error', { + status: 500, + statusText: 'Server Error', + }); + + expect(service.error()).toBeTruthy(); + }); + + it('sets loading to false after a list failure', () => { + service.fetchAll().subscribe(); + + httpMock + .expectOne(`${API_BASE}/api/vehicles/`) + .flush('Error', { status: 500, statusText: 'Server Error' }); + + expect(service.loading()).toBe(false); + }); + }); + + describe('fetchAll() — one detail request fails', () => { + // This tests the resilience pattern: a single bad vehicle record should + // not kill the entire list. The failing request emits null, which is + // filtered out, so the rest of the vehicles still appear. + it('still returns the other vehicles when one detail request fails', () => { + const secondSummary: VehicleSummary = { + ...mockSummary, + id: 'xf', + name: 'XF', + apiUrl: '/api/vehicles/xf', + }; + + service.fetchAll().subscribe(); + + httpMock + .expectOne(`${API_BASE}/api/vehicles/`) + .flush([mockSummary, secondSummary]); + + // XE succeeds, XF fails. + httpMock.expectOne(`${API_BASE}/api/vehicles/xe`).flush(mockDetail); + httpMock + .expectOne(`${API_BASE}/api/vehicles/xf`) + .flush('Not Found', { status: 404, statusText: 'Not Found' }); + + expect(service.vehicles().length).toBe(1); + expect(service.vehicles()[0].id).toBe('xe'); + }); + }); +}); diff --git a/src/app/core/services/vehicle.service.ts b/src/app/core/services/vehicle.service.ts index 6116ee4..eeaec17 100644 --- a/src/app/core/services/vehicle.service.ts +++ b/src/app/core/services/vehicle.service.ts @@ -6,6 +6,7 @@ import { catchError, forkJoin, map, + of, switchMap, } from 'rxjs'; import { @@ -21,6 +22,7 @@ const API_BASE = export class VehicleService { readonly loading = signal(false); readonly error = signal(null); + readonly vehicles = signal([]); constructor(private readonly http: HttpClient) {} @@ -41,14 +43,15 @@ export class VehicleService { .get(`${API_BASE}${summary.apiUrl}`) .pipe( map((detail) => this.merge(summary, detail)), - // Per-vehicle errors are swallowed so one bad record - // (e.g. "problematic") doesn't kill the entire list. - catchError(() => EMPTY), + // Per-vehicle errors emit null so forkJoin still completes. + catchError(() => of(null)), ), ), ), ), - map((vehicles) => { + map((results) => { + const vehicles = results.filter((v): v is AnyVehicle => v !== null); + this.vehicles.set(vehicles); this.loading.set(false); return vehicles; }), diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts new file mode 100644 index 0000000..191c275 --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts @@ -0,0 +1,127 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VehicleCardComponent } from './vehicle-card.component'; +import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; + +// ───────────────────────────────────────────────────────────────────────────── +// Fixture data +// ───────────────────────────────────────────────────────────────────────────── + +const mockVehicle: AnyVehicle = { + id: 'xe', + name: 'XE', + modelYear: '2021', + apiUrl: '/api/vehicles/xe', + media: [ + { name: 'xe 16x9', url: '/images/16x9/xe.jpg' }, + { name: 'xe 1x1', url: '/images/1x1/xe.jpg' }, + ], + description: 'A sports saloon.', + price: '£30,000', + meta: { + passengers: 5, + drivetrain: ['AWD'], + bodystyles: ['Saloon'], + emissions: { template: 'CO2 $value g/km', value: 129 }, + }, +}; + +// ───────────────────────────────────────────────────────────────────────────── +// Tests +// ───────────────────────────────────────────────────────────────────────────── + +describe('VehicleCardComponent', () => { + let component: VehicleCardComponent; + let fixture: ComponentFixture; + + // Standalone components are imported directly — no NgModule needed. + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VehicleCardComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(VehicleCardComponent); + component = fixture.componentInstance; + + // Set the required @Input before the first change detection cycle. + component.vehicle = mockVehicle; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + // ── imageUrl getter ──────────────────────────────────────────────────────── + + describe('imageUrl', () => { + // The getter prefers the 16x9 crop because CSS handles the visual + // crop at every breakpoint — no need to swap src on resize. + it('returns the 16x9 url when one exists in the media array', () => { + expect(component.imageUrl).toBe('/images/16x9/xe.jpg'); + }); + + it('falls back to the first media item when no 16x9 url exists', () => { + component.vehicle = { + ...mockVehicle, + media: [{ name: 'xe 4x3', url: '/images/4x3/xe.jpg' }], + }; + expect(component.imageUrl).toBe('/images/4x3/xe.jpg'); + }); + + it('returns an empty string when the media array is empty', () => { + component.vehicle = { ...mockVehicle, media: [] }; + expect(component.imageUrl).toBe(''); + }); + }); + + // ── emissionsLabel getter ────────────────────────────────────────────────── + + describe('emissionsLabel', () => { + it('replaces the $value placeholder with the numeric emissions value', () => { + expect(component.emissionsLabel).toBe('CO2 129 g/km'); + }); + }); + + // ── template ────────────────────────────────────────────────────────────── + // + // Query DOM elements by their BEM class name. + // textContent?.trim() guards against leading/trailing whitespace in the HTML. + + describe('template', () => { + let el: HTMLElement; + + beforeEach(() => { + el = fixture.nativeElement; + }); + + it('renders the vehicle name', () => { + expect(el.querySelector('.vehicle-card__name')?.textContent?.trim()).toBe( + 'XE', + ); + }); + + it('renders the vehicle price prefixed with "From"', () => { + expect( + el.querySelector('.vehicle-card__price')?.textContent?.trim(), + ).toContain('£30,000'); + }); + + it('renders the vehicle description', () => { + expect( + el.querySelector('.vehicle-card__description')?.textContent?.trim(), + ).toBe('A sports saloon.'); + }); + + it('sets the image src to the 16x9 url', () => { + const img = el.querySelector('.vehicle-card__image'); + // img.src is absolute in JSDOM, so use toContain rather than toBe. + expect(img?.src).toContain('/images/16x9/xe.jpg'); + }); + + it('sets the image alt to the vehicle name', () => { + const img = el.querySelector('.vehicle-card__image'); + expect(img?.alt).toBe('XE'); + }); + }); +}); diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts index 380485a..062f437 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts @@ -9,6 +9,7 @@ import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class VehicleCardComponent { + // TODO refactor to use signals input @Input({ required: true }) vehicle!: AnyVehicle; /** diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.spec.ts b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.spec.ts new file mode 100644 index 0000000..e085a9b --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.spec.ts @@ -0,0 +1,143 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { signal } from '@angular/core'; +import { of } from 'rxjs'; + +import { VehicleListComponent } from './vehicle-list.component'; +import { VehicleService } from '../../../../core/services/vehicle.service'; +import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; + +// ───────────────────────────────────────────────────────────────────────────── +// Fixture data +// ───────────────────────────────────────────────────────────────────────────── + +const mockVehicle: AnyVehicle = { + id: 'xe', + name: 'XE', + modelYear: '2021', + apiUrl: '/api/vehicles/xe', + media: [{ name: 'xe 16x9', url: '/images/16x9/xe.jpg' }], + description: 'A sports saloon.', + price: '£30,000', + meta: { + passengers: 5, + drivetrain: ['AWD'], + bodystyles: ['Saloon'], + emissions: { template: 'CO2 $value g/km', value: 129 }, + }, +}; + +// ───────────────────────────────────────────────────────────────────────────── +// Mock service +// +// We create writable signals so individual tests can call .set() on them to +// simulate different states (loading, error, success) without making any +// real HTTP calls. fetchAll() returns of([]) by default — an Observable that +// completes immediately with an empty array. +// ───────────────────────────────────────────────────────────────────────────── + +function createMockVehicleService() { + return { + loading: signal(false), + error: signal(null), + vehicles: signal([]), + fetchAll: vi.fn().mockReturnValue(of([])), + }; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Tests +// ───────────────────────────────────────────────────────────────────────────── + +describe('VehicleListComponent', () => { + let component: VehicleListComponent; + let fixture: ComponentFixture; + let mockService: ReturnType; + + beforeEach(async () => { + mockService = createMockVehicleService(); + + await TestBed.configureTestingModule({ + imports: [VehicleListComponent], + providers: [ + // Replace the real VehicleService with our mock. + // Angular's DI resolves VehicleService tokens to this object instead. + { provide: VehicleService, useValue: mockService }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(VehicleListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + // ── Initialisation ───────────────────────────────────────────────────────── + + it('calls fetchAll() once on init', () => { + expect(mockService.fetchAll).toHaveBeenCalledTimes(1); + }); + + // ── Loading state ────────────────────────────────────────────────────────── + // + // detectChanges() must be called after mutating a signal so Angular + // re-evaluates the template bindings in the test environment. + + it('shows 6 skeleton placeholders while loading', () => { + mockService.loading.set(true); + fixture.detectChanges(); + + const skeletons = + fixture.nativeElement.querySelectorAll('.vehicle-list__skeleton'); + expect(skeletons.length).toBe(6); + }); + + it('does not show the vehicle grid while loading', () => { + mockService.loading.set(true); + fixture.detectChanges(); + + const grid = fixture.nativeElement.querySelector('.vehicle-list__grid[aria-label="Vehicle list"]'); + expect(grid).toBeNull(); + }); + + // ── Error state ──────────────────────────────────────────────────────────── + + it('shows the error message when the error signal has a value', () => { + mockService.error.set('Failed to load vehicles'); + fixture.detectChanges(); + + const errorEl = fixture.nativeElement.querySelector( + '.vehicle-list__error-message', + ); + expect(errorEl?.textContent?.trim()).toBe('Failed to load vehicles'); + }); + + it('does not show the skeleton grid in the error state', () => { + mockService.error.set('Some error'); + fixture.detectChanges(); + + const skeletons = + fixture.nativeElement.querySelectorAll('.vehicle-list__skeleton'); + expect(skeletons.length).toBe(0); + }); + + // ── Success state ────────────────────────────────────────────────────────── + + it('renders one vehicle card per vehicle in the signal', () => { + mockService.vehicles.set([mockVehicle, { ...mockVehicle, id: 'xf', name: 'XF' }]); + fixture.detectChanges(); + + const cards = fixture.nativeElement.querySelectorAll('app-vehicle-card'); + expect(cards.length).toBe(2); + }); + + it('does not show the error block in the success state', () => { + mockService.vehicles.set([mockVehicle]); + fixture.detectChanges(); + + const errorEl = fixture.nativeElement.querySelector('.vehicle-list__error'); + expect(errorEl).toBeNull(); + }); +}); diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts index a366f60..3e80afd 100644 --- a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.ts @@ -1,4 +1,5 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { ChangeDetectionStrategy, Component, inject, OnInit } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { VehicleService } from '../../../../core/services/vehicle.service'; import { VehicleCardComponent } from '../vehicle-card/vehicle-card.component'; @@ -9,9 +10,15 @@ import { VehicleCardComponent } from '../vehicle-card/vehicle-card.component'; styleUrl: './vehicle-list.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class VehicleListComponent { +export class VehicleListComponent implements OnInit { protected readonly vehicleService = inject(VehicleService); /** Drives the skeleton loading grid — one placeholder per expected vehicle. */ protected readonly skeletonCount = Array.from({ length: 6 }); + + private readonly destroy$ = takeUntilDestroyed(); + + ngOnInit(): void { + this.vehicleService.fetchAll().pipe(this.destroy$).subscribe(); + } } From 72388e110f9e1d883dc27f4f85c6039bf9705cd9 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Mar 2026 21:35:30 +0200 Subject: [PATCH 05/10] made signal required so no need for ?. operators, code updated and cleaned up a bit --- .../vehicle-card/vehicle-card.component.html | 8 ++++---- .../vehicle-card/vehicle-card.component.spec.ts | 10 +++++----- .../vehicle-card/vehicle-card.component.ts | 16 ++++++---------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html index 276a819..42aa1eb 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html @@ -3,14 +3,14 @@
    -

    {{ vehicle.name }}

    -

    From {{ vehicle.price }}

    -

    {{ vehicle.description }}

    +

    {{ vehicle().name }}

    +

    From {{ vehicle().price }}

    +

    {{ vehicle().description || 'test' }}

    diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts index 191c275..e029b35 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts @@ -43,8 +43,8 @@ describe('VehicleCardComponent', () => { fixture = TestBed.createComponent(VehicleCardComponent); component = fixture.componentInstance; - // Set the required @Input before the first change detection cycle. - component.vehicle = mockVehicle; + // Signal inputs must be set via setInput() rather than direct assignment. + fixture.componentRef.setInput('vehicle', mockVehicle); fixture.detectChanges(); }); @@ -62,15 +62,15 @@ describe('VehicleCardComponent', () => { }); it('falls back to the first media item when no 16x9 url exists', () => { - component.vehicle = { + fixture.componentRef.setInput('vehicle', { ...mockVehicle, media: [{ name: 'xe 4x3', url: '/images/4x3/xe.jpg' }], - }; + }); expect(component.imageUrl).toBe('/images/4x3/xe.jpg'); }); it('returns an empty string when the media array is empty', () => { - component.vehicle = { ...mockVehicle, media: [] }; + fixture.componentRef.setInput('vehicle', { ...mockVehicle, media: [] }); expect(component.imageUrl).toBe(''); }); }); diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts index 062f437..c94085a 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; @Component({ @@ -9,29 +9,25 @@ import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class VehicleCardComponent { - // TODO refactor to use signals input - @Input({ required: true }) vehicle!: AnyVehicle; + vehicle = input.required(); /** * Used by the parent list to stagger the fade-in animation via * [style.animation-delay] bound on the host element. */ - @Input() index = 0; + index = input(0); /** * Prefer the 16x9 image; CSS aspect-ratio + object-fit handles the * visual crop at all breakpoints so we never need to swap src. */ get imageUrl(): string { - return ( - this.vehicle.media.find((m) => m.url.includes('16x9'))?.url ?? - this.vehicle.media[0]?.url ?? - '' - ); + const { media } = this.vehicle(); + return media.find((m) => m.url.includes('16x9'))?.url ?? media[0]?.url ?? ''; } get emissionsLabel(): string { - const { template, value } = this.vehicle.meta.emissions; + const { template, value } = this.vehicle().meta.emissions; return template.replace('$value', String(value)); } } From 5ad30a566133609fc9ce4e8b3591af0757541486 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 Mar 2026 11:02:31 +0200 Subject: [PATCH 06/10] Add modal component, implemented viewChild for modal using the signals viewChild --- .../vehicle-card/vehicle-card.component.html | 3 ++ .../vehicle-card/vehicle-card.component.ts | 7 +++-- .../vehicle-detail-modal.html | 15 ++++++++++ .../vehicle-detail-modal.scss | 0 .../vehicle-detail-modal.spec.ts | 22 +++++++++++++++ .../vehicle-detail-modal.ts | 28 +++++++++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.html create mode 100644 src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss create mode 100644 src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts create mode 100644 src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.ts diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html index 42aa1eb..05d0032 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html @@ -13,4 +13,7 @@

    {{ vehicle().name }}

    From {{ vehicle().price }}

    {{ vehicle().description || 'test' }}

    + + + diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts index c94085a..79cc724 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts @@ -1,9 +1,10 @@ -import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input, viewChild } from '@angular/core'; import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; +import { VehicleDetailModal } from "../vehicle-detail-modal/vehicle-detail-modal"; @Component({ selector: 'app-vehicle-card', - imports: [], + imports: [VehicleDetailModal], templateUrl: './vehicle-card.component.html', styleUrl: './vehicle-card.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, @@ -11,6 +12,8 @@ import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; export class VehicleCardComponent { vehicle = input.required(); + readonly modal = viewChild.required('modal'); + /** * Used by the parent list to stagger the fade-in animation via * [style.animation-delay] bound on the host element. diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.html b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.html new file mode 100644 index 0000000..162155f --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.html @@ -0,0 +1,15 @@ + +
    + +

    {{ vehicle().name }}

    +
      +
    • Bodystyles: {{ vehicle().meta.bodystyles.join(', ') }}
    • +
    • Drivetrain: {{ vehicle().meta.drivetrain.join(', ') }}
    • +
    • Passengers: {{ vehicle().meta.passengers }}
    • +
    • Emissions: {{ emissionsLabel() }}
    • +
    +
    + +
    \ No newline at end of file diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts new file mode 100644 index 0000000..acab1af --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VehicleDetailModal } from './vehicle-detail-modal'; + +describe('VehicleDetailModal', () => { + let component: VehicleDetailModal; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VehicleDetailModal], + }).compileComponents(); + + fixture = TestBed.createComponent(VehicleDetailModal); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.ts b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.ts new file mode 100644 index 0000000..47e9675 --- /dev/null +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.ts @@ -0,0 +1,28 @@ +import { Component, ElementRef, input, viewChild } from '@angular/core'; +import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; + +@Component({ + selector: 'app-vehicle-detail-modal', + imports: [], + templateUrl: './vehicle-detail-modal.html', + styleUrl: './vehicle-detail-modal.scss', +}) +export class VehicleDetailModal { + +vehicle = input.required(); +emissionsLabel = input(); + +// viewChild give you a signal based reference to the element +private readonly dialog = viewChild.required>('dialog'); + +open() { + this.dialog().nativeElement.showModal(); +} + +close() { + this.dialog().nativeElement.close(); +} + + + +} From 776c5f50258aaa7dd0b8f9e7517980f760bfaa7e Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 Mar 2026 14:00:03 +0200 Subject: [PATCH 07/10] Added car silhouette for a fallback image. added favicon, add button component and styles to match designs --- public/android-chrome-192x192.png | Bin 0 -> 11121 bytes public/android-chrome-512x512.png | Bin 0 -> 50468 bytes public/apple-touch-icon.png | Bin 0 -> 10018 bytes public/fallback.svg | 20 ++++++ public/favicon-16x16.png | Bin 0 -> 367 bytes public/favicon-32x32.png | Bin 0 -> 794 bytes public/favicon.ico | Bin 15086 -> 15406 bytes .../vehicle-card/vehicle-card.component.html | 26 ++++--- .../vehicle-card/vehicle-card.component.scss | 22 +++++- .../vehicle-card/vehicle-card.component.ts | 20 ++++-- .../vehicle-detail-modal.scss | 64 ++++++++++++++++++ .../vehicle-detail-modal.spec.ts | 55 +++++++++++++++ .../shared/ui/button/button.component.html | 8 +++ .../shared/ui/button/button.component.scss | 27 ++++++++ src/app/shared/ui/button/button.component.ts | 13 ++++ .../car-silhouette.component.html | 34 ++++++++++ .../car-silhouette.component.scss | 5 ++ .../car-silhouette.component.ts | 13 ++++ src/index.html | 5 +- 19 files changed, 293 insertions(+), 19 deletions(-) create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/fallback.svg create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 src/app/shared/ui/button/button.component.html create mode 100644 src/app/shared/ui/button/button.component.scss create mode 100644 src/app/shared/ui/button/button.component.ts create mode 100644 src/app/shared/ui/svg/car-silhouette/car-silhouette.component.html create mode 100644 src/app/shared/ui/svg/car-silhouette/car-silhouette.component.scss create mode 100644 src/app/shared/ui/svg/car-silhouette/car-silhouette.component.ts diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..d47761893098f4d54bae001a27ec16056bd3abd2 GIT binary patch literal 11121 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 literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..70ec5f90cc06bef4dc497f1d9f74268a1caf46f4 GIT binary patch literal 50468 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 z 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 PPy$`lz^G@anmzbGQW*q^ literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..77bb6e241bbba99165c4e2a332ee4defd6a25d6c GIT binary patch literal 10018 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 + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e68c17353be6c1fd8b8c390847e4b758c3393d90 GIT binary patch literal 367 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 literal 15086 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 Nr__JTFzvMr^FKp4S3v*( diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html index 05d0032..167f01c 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html @@ -1,19 +1,27 @@
    - + @if (showFallback()) { + + } @else { + + }

    {{ vehicle().name }}

    -

    From {{ vehicle().price }}

    -

    {{ vehicle().description || 'test' }}

    +

    From {{ vehicle().price || 'unlisted' }}

    +

    {{ vehicle().description }}

    - + +
    + +
    diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss index a1b8164..0e20e61 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss @@ -1,7 +1,9 @@ // Animation runs on the host element so that the parent can control // animation-delay via [style.animation-delay] without ViewEncapsulation issues. :host { - display: block; + display: flex; + flex-direction: column; + height: 100%; opacity: 0; animation: vehicle-card-fade-in 0.5s ease forwards; } @@ -19,6 +21,7 @@ padding: 16px; border-bottom: 1px solid #e0e0e0; background-color: #fff; + flex: 1; // ── Tablet and above: flip to vertical stacked layout ── @media (min-width: 768px) { @@ -67,6 +70,10 @@ } &__name { + border-top: 1px solid black; + border-bottom: 1px solid black; + width: fit-content; + padding-block: 4px; font-family: Georgia, 'Times New Roman', serif; font-size: 1rem; font-weight: 700; @@ -76,9 +83,8 @@ @media (min-width: 768px) { font-size: 1.0625rem; - text-decoration: underline; - text-underline-offset: 5px; margin-bottom: 14px; + margin-inline: auto; } } @@ -98,4 +104,14 @@ line-height: 1.45; margin: 0; } + + &__footer { + margin-top: auto; + padding: 12px 16px; + text-align: center; + + @media (min-width: 768px) { + padding: 16px; + } + } } diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts index 79cc724..e32ea9c 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.ts @@ -1,10 +1,12 @@ -import { ChangeDetectionStrategy, Component, input, viewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core'; import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; import { VehicleDetailModal } from "../vehicle-detail-modal/vehicle-detail-modal"; +import { ButtonComponent } from '../../../../shared/ui/button/button.component'; +import { CarSilhouetteComponent } from '../../../../shared/ui/svg/car-silhouette/car-silhouette.component'; @Component({ selector: 'app-vehicle-card', - imports: [VehicleDetailModal], + imports: [VehicleDetailModal, ButtonComponent, CarSilhouetteComponent], templateUrl: './vehicle-card.component.html', styleUrl: './vehicle-card.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, @@ -12,25 +14,31 @@ import { VehicleDetailModal } from "../vehicle-detail-modal/vehicle-detail-modal export class VehicleCardComponent { vehicle = input.required(); - readonly modal = viewChild.required('modal'); - /** * Used by the parent list to stagger the fade-in animation via * [style.animation-delay] bound on the host element. */ index = input(0); + imageError = signal(false); + /** * Prefer the 16x9 image; CSS aspect-ratio + object-fit handles the * visual crop at all breakpoints so we never need to swap src. */ - get imageUrl(): string { + readonly imageUrl = computed(() => { const { media } = this.vehicle(); return media.find((m) => m.url.includes('16x9'))?.url ?? media[0]?.url ?? ''; - } + }); + + readonly showFallback = computed(() => !this.imageUrl() || this.imageError()); get emissionsLabel(): string { const { template, value } = this.vehicle().meta.emissions; return template.replace('$value', String(value)); } + + onImageError(): void { + this.imageError.set(true); + } } diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss index e69de29..81927b3 100644 --- a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss @@ -0,0 +1,64 @@ +.vehicle-detail-modal { + border: none; + border-radius: 4px; + padding: 0; + width: min(560px, 90vw); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.35); + + &::backdrop { + background: rgba(0, 0, 0, 0.55); + backdrop-filter: blur(2px); + } + + &__content { + position: relative; + padding: 32px 28px 28px; + } + + &__close { + position: absolute; + top: 12px; + right: 14px; + background: none; + border: none; + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + color: #555; + padding: 4px 8px; + border-radius: 4px; + transition: background 0.15s ease, color 0.15s ease; + + &:hover { + background: #f0f0f0; + color: #1a1a1a; + } + } + + &__title { + font-family: Georgia, 'Times New Roman', serif; + font-size: 1.25rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + margin: 0 0 20px; + padding-right: 32px; + } + + &__list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 10px; + + li { + font-size: 0.9rem; + color: #333; + padding: 10px 12px; + background: #f7f7f7; + border-radius: 4px; + } + } +} diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts index acab1af..6743228 100644 --- a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts @@ -1,6 +1,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { VehicleDetailModal } from './vehicle-detail-modal'; +import { AnyVehicle } from '../../../../core/interfaces/vehicle.interface'; + +const mockVehicle: AnyVehicle = { + id: '1', + name: 'Test Vehicle', + modelYear: '2024', + apiUrl: '/api/vehicles/1', + media: [{ name: 'hero', url: '/img/hero-16x9.jpg' }], + description: 'A test vehicle description.', + price: '£30,000', + meta: { + passengers: 5, + drivetrain: ['AWD'], + bodystyles: ['SUV'], + emissions: { template: '$value g/km', value: 120 }, + }, +}; describe('VehicleDetailModal', () => { let component: VehicleDetailModal; @@ -13,10 +30,48 @@ describe('VehicleDetailModal', () => { fixture = TestBed.createComponent(VehicleDetailModal); component = fixture.componentInstance; + fixture.componentRef.setInput('vehicle', mockVehicle); + fixture.componentRef.setInput('emissionsLabel', '120 g/km'); await fixture.whenStable(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('open() calls showModal() on the dialog element', () => { + const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; + const spy = spyOn(dialog, 'showModal'); + component.open(); + expect(spy).toHaveBeenCalled(); + }); + + it('close() calls close() on the dialog element', () => { + const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; + const spy = spyOn(dialog, 'close'); + component.close(); + expect(spy).toHaveBeenCalled(); + }); + + it('renders the vehicle name in an h2', () => { + fixture.detectChanges(); + const h2 = fixture.nativeElement.querySelector('h2') as HTMLElement; + expect(h2.textContent).toContain('Test Vehicle'); + }); + + it('renders the emissions label in a list item', () => { + fixture.detectChanges(); + const items = fixture.nativeElement.querySelectorAll('li') as NodeListOf; + const emissionsItem = Array.from(items).find(li => li.textContent?.includes('Emissions')); + expect(emissionsItem?.textContent).toContain('120 g/km'); + }); + + it('clicking the close button calls close() on the dialog element', () => { + fixture.detectChanges(); + const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; + const spy = spyOn(dialog, 'close'); + const closeBtn = fixture.nativeElement.querySelector('.vehicle-detail-modal__close') as HTMLButtonElement; + closeBtn.click(); + expect(spy).toHaveBeenCalled(); + }); }); diff --git a/src/app/shared/ui/button/button.component.html b/src/app/shared/ui/button/button.component.html new file mode 100644 index 0000000..dde4011 --- /dev/null +++ b/src/app/shared/ui/button/button.component.html @@ -0,0 +1,8 @@ + diff --git a/src/app/shared/ui/button/button.component.scss b/src/app/shared/ui/button/button.component.scss new file mode 100644 index 0000000..34e7fe0 --- /dev/null +++ b/src/app/shared/ui/button/button.component.scss @@ -0,0 +1,27 @@ +.btn { + display: block; + width: 100%; + padding: 10px 20px; + font-size: 0.875rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + border: none; + cursor: pointer; + transition: opacity 0.2s ease; + + &:hover { + opacity: 0.85; + } + + &--primary { + background-color: #1a1a1a; + color: #fff; + } + + &--secondary { + background-color: #fff; + color: #1a1a1a; + border: 1px solid #1a1a1a; + } +} diff --git a/src/app/shared/ui/button/button.component.ts b/src/app/shared/ui/button/button.component.ts new file mode 100644 index 0000000..aa01065 --- /dev/null +++ b/src/app/shared/ui/button/button.component.ts @@ -0,0 +1,13 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-button', + templateUrl: './button.component.html', + styleUrl: './button.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ButtonComponent { + label = input.required(); + variant = input<'primary' | 'secondary'>('primary'); + type = input<'button' | 'submit'>('button'); +} diff --git a/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.html b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.html new file mode 100644 index 0000000..fd9aced --- /dev/null +++ b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.html @@ -0,0 +1,34 @@ + diff --git a/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.scss b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.scss new file mode 100644 index 0000000..722a403 --- /dev/null +++ b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.scss @@ -0,0 +1,5 @@ +.car-silhouette { + display: block; + width: 100%; + height: 100%; +} diff --git a/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.ts b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.ts new file mode 100644 index 0000000..d297361 --- /dev/null +++ b/src/app/shared/ui/svg/car-silhouette/car-silhouette.component.ts @@ -0,0 +1,13 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-car-silhouette', + templateUrl: './car-silhouette.component.html', + styleUrl: './car-silhouette.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class CarSilhouetteComponent { + primaryColor = input('#1a1a1a'); + secondaryColor = input('#f0f0f0'); + cssClass = input(''); +} diff --git a/src/index.html b/src/index.html index 2ea1d83..b03c200 100644 --- a/src/index.html +++ b/src/index.html @@ -5,7 +5,10 @@ AngularCodeTest - + + + + From 5b12ffbb6d727d865f4e4d516d2c1909586c1562 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 Mar 2026 14:35:50 +0200 Subject: [PATCH 08/10] Updated styles to be inline with designs of table mobile and desktop and added some root style variables --- .../vehicle-card/vehicle-card.component.html | 18 +++--- .../vehicle-card/vehicle-card.component.scss | 63 ++++++++++++------- .../vehicle-detail-modal.scss | 14 ++--- .../vehicle-list/vehicle-list.component.scss | 17 +++-- .../shared/ui/button/button.component.scss | 14 +++-- src/styles.scss | 40 ++++++++++++ 6 files changed, 116 insertions(+), 50 deletions(-) diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html index 167f01c..82ad9e1 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.html @@ -13,15 +13,17 @@ } -
    -

    {{ vehicle().name }}

    -

    From {{ vehicle().price || 'unlisted' }}

    -

    {{ vehicle().description }}

    -
    +
    +
    +

    {{ vehicle().name }}

    +

    From {{ vehicle().price || 'unlisted' }}

    +

    {{ vehicle().description }}

    +
    -
    - -
    +
    + +
    +
    diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss index 0e20e61..24d3d6f 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss @@ -16,26 +16,20 @@ .vehicle-card { display: flex; - flex-direction: row; - align-items: center; - padding: 16px; - border-bottom: 1px solid #e0e0e0; - background-color: #fff; + flex-direction: row; // mobile: image left, content right + align-items: stretch; + background-color: var(--secondary-colour); + border-bottom: 1px solid var(--colour-border); flex: 1; - // ── Tablet and above: flip to vertical stacked layout ── + // ── Tablet and above ── @media (min-width: 768px) { flex-direction: column; - align-items: stretch; - padding: 0; border-bottom: none; } // ───────────────────────────────────────────── // Image wrapper - // The same src is used at every breakpoint. - // Changing aspect-ratio + object-fit: cover gives the - // illusion of a different crop without swapping src. // ───────────────────────────────────────────── &__image-wrapper { flex-shrink: 0; @@ -45,7 +39,7 @@ @media (min-width: 768px) { width: 100%; - aspect-ratio: 16 / 9; // tablet+: widescreen crop + aspect-ratio: 16 / 9; } } @@ -56,32 +50,51 @@ object-fit: cover; } + // ───────────────────────────────────────────── + // Content wrapper — right-hand column on mobile, + // dissolves into normal flow on tablet+ + // ───────────────────────────────────────────── + &__content { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + + @media (min-width: 768px) { + display: contents; + } + } + // ───────────────────────────────────────────── // Text body // ───────────────────────────────────────────── &__body { flex: 1; - padding: 0 16px; + padding: 12px 16px 0; + display: flex; + flex-direction: column; + justify-content: center; // vertically centre content within the body area on mobile @media (min-width: 768px) { + display: block; padding: 20px 16px 28px; text-align: center; } } &__name { - border-top: 1px solid black; - border-bottom: 1px solid black; width: fit-content; - padding-block: 4px; font-family: Georgia, 'Times New Roman', serif; - font-size: 1rem; + font-size: 1.125rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; - margin: 0 0 6px; + margin: 0 0 8px; @media (min-width: 768px) { + border-top: 1px solid var(--primary-colour); + border-bottom: 1px solid var(--primary-colour); + padding-block: 4px; font-size: 1.0625rem; margin-bottom: 14px; margin-inline: auto; @@ -90,7 +103,7 @@ &__price { font-size: 0.875rem; - color: #333; + color: var(--colour-text); margin: 0 0 6px; @media (min-width: 768px) { @@ -100,18 +113,20 @@ &__description { font-size: 0.875rem; - color: #555; + color: var(--colour-text-muted); line-height: 1.45; margin: 0; } &__footer { - margin-top: auto; - padding: 12px 16px; - text-align: center; + padding: 8px 16px 12px; + display: flex; + justify-content: flex-end; // button bottom-right on mobile @media (min-width: 768px) { - padding: 16px; + display: block; + margin-top: auto; + padding: 0; } } } diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss index 81927b3..b73d41c 100644 --- a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss @@ -3,10 +3,10 @@ border-radius: 4px; padding: 0; width: min(560px, 90vw); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.35); + box-shadow: 0 8px 32px var(--colour-shadow); &::backdrop { - background: rgba(0, 0, 0, 0.55); + background: var(--colour-backdrop); backdrop-filter: blur(2px); } @@ -24,14 +24,14 @@ font-size: 1.5rem; line-height: 1; cursor: pointer; - color: #555; + color: var(--colour-text-muted); padding: 4px 8px; border-radius: 4px; transition: background 0.15s ease, color 0.15s ease; &:hover { - background: #f0f0f0; - color: #1a1a1a; + background: var(--colour-surface-hover); + color: var(--primary-colour); } } @@ -55,9 +55,9 @@ li { font-size: 0.9rem; - color: #333; + color: var(--colour-text); padding: 10px 12px; - background: #f7f7f7; + background: var(--colour-surface); border-radius: 4px; } } diff --git a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss index d14758d..15b9235 100644 --- a/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss +++ b/src/app/features/vehicles/components/vehicle-list/vehicle-list.component.scss @@ -36,7 +36,7 @@ display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; - background-color: #d0d0d0; // shows through the 1px gap as grid lines + background-color: var(--colour-divider); // shows through the 1px gap as grid lines } @media (min-width: 1280px) { @@ -47,7 +47,7 @@ // Each
  • needs its own background to mask the grid container's background. .vehicle-list__item { @media (min-width: 768px) { - background-color: #fff; + background-color: var(--secondary-colour); } } @@ -56,7 +56,12 @@ // Mirrors the card layout so there's no layout shift when data arrives. // ───────────────────────────────────────────────────────────────────────────── %shimmer { - background: linear-gradient(90deg, #efefef 25%, #e0e0e0 50%, #efefef 75%); + background: linear-gradient( + 90deg, + var(--colour-skeleton-base) 25%, + var(--colour-skeleton-shine) 50%, + var(--colour-skeleton-base) 75% + ); background-size: 200% 100%; animation: shimmer 1.5s infinite; } @@ -66,8 +71,8 @@ flex-direction: row; align-items: center; padding: 16px; - border-bottom: 1px solid #e0e0e0; - background-color: #fff; + border-bottom: 1px solid var(--colour-border); + background-color: var(--secondary-colour); @media (min-width: 768px) { flex-direction: column; @@ -128,7 +133,7 @@ } .vehicle-list__error-message { - color: #c0392b; + color: var(--colour-error); font-size: 1rem; margin: 0; } diff --git a/src/app/shared/ui/button/button.component.scss b/src/app/shared/ui/button/button.component.scss index 34e7fe0..fc587ca 100644 --- a/src/app/shared/ui/button/button.component.scss +++ b/src/app/shared/ui/button/button.component.scss @@ -1,3 +1,7 @@ +:host { + display: block; +} + .btn { display: block; width: 100%; @@ -15,13 +19,13 @@ } &--primary { - background-color: #1a1a1a; - color: #fff; + background-color: var(--primary-colour); + color: var(--colour-text-on-primary); } &--secondary { - background-color: #fff; - color: #1a1a1a; - border: 1px solid #1a1a1a; + background-color: var(--secondary-colour); + color: var(--primary-colour); + border: 1px solid var(--primary-colour); } } diff --git a/src/styles.scss b/src/styles.scss index 90d4ee0..f63a1e8 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1 +1,41 @@ /* You can add global styles to this file, and also import other style files */ + +// ───────────────────────────────────────────────────────────────────────────── +// Design tokens +// +// Override any variable here (or in a brand-specific stylesheet) to white-label +// the application without touching component styles. +// +// Brand colours — the two values most likely to change per client: +// --primary-colour dark/action colour (buttons, borders, headings) +// --secondary-colour light/surface colour (card backgrounds, button text) +// +// All other tokens are derived from or complement the brand pair. +// ───────────────────────────────────────────────────────────────────────────── +:root { + // ── Brand ────────────────────────────────────────────────────────────────── + --primary-colour: #312f2f; + --secondary-colour: #ffffff; + + // ── Text ─────────────────────────────────────────────────────────────────── + --colour-text: #333333; + --colour-text-muted: #555555; + --colour-text-on-primary: #ffffff; // text placed on a --primary-colour bg + + // ── Surfaces & borders ───────────────────────────────────────────────────── + --colour-border: #e0e0e0; + --colour-divider: #d0d0d0; // 1px grid gap rendered as a line + --colour-surface: #f7f7f7; // subtle panel / list-item bg + --colour-surface-hover: #f0f0f0; // interactive surface on hover + + // ── Feedback ─────────────────────────────────────────────────────────────── + --colour-error: #c0392b; + + // ── Skeleton loader ──────────────────────────────────────────────────────── + --colour-skeleton-base: #efefef; + --colour-skeleton-shine: #e0e0e0; + + // ── Overlays ─────────────────────────────────────────────────────────────── + --colour-shadow: rgba(0, 0, 0, 0.35); + --colour-backdrop: rgba(0, 0, 0, 0.55); +} From 5ece342ff34b89c25d05231c59b33e94b445af45 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 Mar 2026 14:40:51 +0200 Subject: [PATCH 09/10] set fontstyles and fixed unit tests --- .../vehicle-card/vehicle-card.component.spec.ts | 6 +++--- .../vehicle-detail-modal.spec.ts | 12 ++++++------ src/index.html | 3 +++ src/styles.scss | 5 +++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts index e029b35..7a35541 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.spec.ts @@ -58,7 +58,7 @@ describe('VehicleCardComponent', () => { // The getter prefers the 16x9 crop because CSS handles the visual // crop at every breakpoint — no need to swap src on resize. it('returns the 16x9 url when one exists in the media array', () => { - expect(component.imageUrl).toBe('/images/16x9/xe.jpg'); + expect(component.imageUrl()).toBe('/images/16x9/xe.jpg'); }); it('falls back to the first media item when no 16x9 url exists', () => { @@ -66,12 +66,12 @@ describe('VehicleCardComponent', () => { ...mockVehicle, media: [{ name: 'xe 4x3', url: '/images/4x3/xe.jpg' }], }); - expect(component.imageUrl).toBe('/images/4x3/xe.jpg'); + expect(component.imageUrl()).toBe('/images/4x3/xe.jpg'); }); it('returns an empty string when the media array is empty', () => { fixture.componentRef.setInput('vehicle', { ...mockVehicle, media: [] }); - expect(component.imageUrl).toBe(''); + expect(component.imageUrl()).toBe(''); }); }); diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts index 6743228..6bb12ab 100644 --- a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.spec.ts @@ -41,16 +41,16 @@ describe('VehicleDetailModal', () => { it('open() calls showModal() on the dialog element', () => { const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; - const spy = spyOn(dialog, 'showModal'); + dialog.showModal = vi.fn(); component.open(); - expect(spy).toHaveBeenCalled(); + expect(dialog.showModal).toHaveBeenCalled(); }); it('close() calls close() on the dialog element', () => { const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; - const spy = spyOn(dialog, 'close'); + dialog.close = vi.fn(); component.close(); - expect(spy).toHaveBeenCalled(); + expect(dialog.close).toHaveBeenCalled(); }); it('renders the vehicle name in an h2', () => { @@ -69,9 +69,9 @@ describe('VehicleDetailModal', () => { it('clicking the close button calls close() on the dialog element', () => { fixture.detectChanges(); const dialog = fixture.nativeElement.querySelector('dialog') as HTMLDialogElement; - const spy = spyOn(dialog, 'close'); + dialog.close = vi.fn(); const closeBtn = fixture.nativeElement.querySelector('.vehicle-detail-modal__close') as HTMLButtonElement; closeBtn.click(); - expect(spy).toHaveBeenCalled(); + expect(dialog.close).toHaveBeenCalled(); }); }); diff --git a/src/index.html b/src/index.html index b03c200..a6c4196 100644 --- a/src/index.html +++ b/src/index.html @@ -5,6 +5,9 @@ AngularCodeTest + + + diff --git a/src/styles.scss b/src/styles.scss index f63a1e8..902cf56 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,5 +1,10 @@ /* You can add global styles to this file, and also import other style files */ +* { + font-family: 'Roboto', sans-serif; +} + + // ───────────────────────────────────────────────────────────────────────────── // Design tokens // From 72db4d89ac4434e52d06b52ac25a4bc01037edff Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 Mar 2026 14:43:35 +0200 Subject: [PATCH 10/10] fixed font in other components --- .../vehicles/components/vehicle-card/vehicle-card.component.scss | 1 - .../components/vehicle-detail-modal/vehicle-detail-modal.scss | 1 - 2 files changed, 2 deletions(-) diff --git a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss index 24d3d6f..ea544f4 100644 --- a/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss +++ b/src/app/features/vehicles/components/vehicle-card/vehicle-card.component.scss @@ -84,7 +84,6 @@ &__name { width: fit-content; - font-family: Georgia, 'Times New Roman', serif; font-size: 1.125rem; font-weight: 700; text-transform: uppercase; diff --git a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss index b73d41c..d9d615f 100644 --- a/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss +++ b/src/app/features/vehicles/components/vehicle-detail-modal/vehicle-detail-modal.scss @@ -36,7 +36,6 @@ } &__title { - font-family: Georgia, 'Times New Roman', serif; font-size: 1.25rem; font-weight: 700; text-transform: uppercase;