From f61f8a131e2b924adb79acdf880a07a011164dc1 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:24:28 +0100 Subject: [PATCH 01/22] Update angular to 21 --- package-lock.json | 3881 ++++++++++------- package.json | 38 +- projects/components/tsconfig.lib.json | 3 +- .../view/src/view.component.spec.ts | 4 +- tsconfig.json | 1 - 5 files changed, 2272 insertions(+), 1655 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f0389b1..cd1fb30d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,19 +8,19 @@ "name": "zvoove-angular-components", "version": "0.0.0", "dependencies": { - "@angular-devkit/core": "^20.3.15", - "@angular-devkit/schematics": "^20.3.15", - "@angular/cdk": "^20.2.14", - "@angular/common": "^20.3.16", - "@angular/compiler": "^20.3.16", - "@angular/core": "^20.3.16", - "@angular/forms": "^20.3.16", - "@angular/material": "^20.2.14", - "@angular/platform-browser": "^20.3.16", - "@angular/platform-browser-dynamic": "^20.3.16", - "@angular/platform-server": "^20.3.16", - "@angular/router": "^20.3.16", - "@angular/ssr": "^20.3.15", + "@angular-devkit/core": "^21.2.3", + "@angular-devkit/schematics": "^21.2.3", + "@angular/cdk": "^21.2.3", + "@angular/common": "^21.2.5", + "@angular/compiler": "^21.2.5", + "@angular/core": "^21.2.5", + "@angular/forms": "^21.2.5", + "@angular/material": "^21.2.3", + "@angular/platform-browser": "^21.2.5", + "@angular/platform-browser-dynamic": "^21.2.5", + "@angular/platform-server": "^21.2.5", + "@angular/router": "^21.2.5", + "@angular/ssr": "^21.2.3", "express": "^5.2.1", "ngx-highlightjs": "^14.0.1", "ngx-mat-select-search": "^8.0.4", @@ -29,11 +29,11 @@ "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/build": "^20.3.15", - "@angular/cli": "^20.3.15", - "@angular/compiler-cli": "^20.3.16", - "@angular/language-service": "^20.3.16", - "@angular/localize": "^20.3.16", + "@angular/build": "^21.2.3", + "@angular/cli": "^21.2.3", + "@angular/compiler-cli": "^21.2.5", + "@angular/language-service": "^21.2.5", + "@angular/localize": "^21.2.5", "@types/express": "^5.0.6", "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", @@ -53,7 +53,7 @@ "karma-jasmine-html-reporter": "^2.2.0", "karma-time-stats-reporter": "^0.1.0", "lint-staged": "^16.2.7", - "ng-packagr": "^20.3.2", + "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", @@ -61,57 +61,57 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", - "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", - "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", - "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", - "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "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": { @@ -119,151 +119,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", - "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", - "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", - "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", - "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", - "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", - "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", - "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "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.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", - "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "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.35.0" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", - "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "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.35.0" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", - "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "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.35.0" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" @@ -299,10 +299,11 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/core": { + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { "version": "20.3.15", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.15.tgz", "integrity": "sha512-s7sE4S5Hy62dLrtHwizbZaMcupAE8fPhm6rF+jBkhHZ75zXGhGzXP8WKFztYCAuGnis4pPnGSEKP/xVTc2lw6Q==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "8.17.1", @@ -326,16 +327,59 @@ } } }, + "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==", + "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/core/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "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/@angular-devkit/schematics": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.15.tgz", - "integrity": "sha512-xMN1fyuhhP8Y5sNlmQvl4nMiOouHTKPkLR0zlhu5z6fHuwxxlverh31Gpq3eFzPHqmOzzb2TkgYCptCFXsXcrg==", + "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==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.15", + "@angular-devkit/core": "21.2.3", "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", + "magic-string": "0.30.21", + "ora": "9.3.0", "rxjs": "7.8.2" }, "engines": { @@ -359,6 +403,51 @@ "typescript": "*" } }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { + "version": "20.3.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", + "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", + "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": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/builder/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/@angular-eslint/bundled-angular-compiler": { "version": "20.7.0", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.7.0.tgz", @@ -419,6 +508,109 @@ "strip-json-comments": "3.1.1" } }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { + "version": "20.3.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", + "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", + "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": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/schematics": { + "version": "20.3.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.21.tgz", + "integrity": "sha512-CFX8TrZvvm4G398DpbcJ2GY8kwR81M8ssyIVYn19gD4Kr2UmeiCT3/dtUpx2FvSvSHbNwLmU6Ym0Rkh+E7p9bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.21", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.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-eslint/schematics/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/@angular-eslint/schematics/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/@angular-eslint/schematics/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/@angular-eslint/schematics/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular-eslint/schematics/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -429,6 +621,99 @@ "node": ">= 4" } }, + "node_modules/@angular-eslint/schematics/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/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/@angular-eslint/template-parser": { "version": "20.7.0", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.7.0.tgz", @@ -477,38 +762,39 @@ } }, "node_modules/@angular/build": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.15.tgz", - "integrity": "sha512-DMp/wb3I9/izveXRuOkCTYEQlEzvNlJVnqA215tijOSiJGjYoUsQLazTCxtEx/trftOhVpnMP/2OvvMQVAJJoQ==", + "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.2003.15", - "@babel/core": "7.28.3", + "@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.14", - "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.5", - "browserslist": "^4.23.0", - "esbuild": "0.25.9", + "@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.1", - "magic-string": "0.30.17", + "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.3", - "rollup": "4.52.3", - "sass": "1.90.0", - "semver": "7.7.2", + "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.14", - "vite": "7.1.11", - "watchpack": "2.4.4" + "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", @@ -516,25 +802,25 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.4.2" + "lmdb": "3.5.1" }, "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.15", + "@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": "^20.0.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.8 <6.0", - "vitest": "^3.1.1" + "typescript": ">=5.9 <6.0", + "vitest": "^4.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -575,61 +861,29 @@ } } }, - "node_modules/@angular/build/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/@angular/build/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/@angular/build/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/build/node_modules/listr2": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", - "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "node_modules/@angular/build/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": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" + "@angular-devkit/core": "21.2.3", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" }, "engines": { - "node": ">=20.0.0" + "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/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -639,226 +893,93 @@ "node": ">=10" } }, - "node_modules/@angular/build/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@angular/build/node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/@angular/build/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/@angular/cdk": { - "version": "20.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", - "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.3.tgz", + "integrity": "sha512-7t+UhfbSpIUG9uUyL4b8nI/HyYyrbgAvDwBT8kH4D7If0WiFQhUoottAM0+WZ7Uy+F4nx322K6TOomz/fZJOoQ==", "license": "MIT", "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.15.tgz", - "integrity": "sha512-OgPMhXtNLXds0wIw6YU5/X3dU8TlAZbmPy6LYHs9ifF8K4pXpbm27vWGSZhUevSf66dMvfz8wB/aE2e0s2e5Ng==", + "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.2003.15", - "@angular-devkit/core": "20.3.15", - "@angular-devkit/schematics": "20.3.15", - "@inquirer/prompts": "7.8.2", - "@listr2/prompt-adapter-inquirer": "3.0.1", - "@modelcontextprotocol/sdk": "1.25.2", - "@schematics/angular": "20.3.15", + "@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.35.0", - "ini": "5.0.0", + "algoliasearch": "5.48.1", + "ini": "6.0.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.1", - "npm-package-arg": "13.0.0", - "pacote": "21.0.4", - "resolve": "1.22.10", - "semver": "7.7.2", - "yargs": "18.0.0", - "zod": "4.1.13" - }, - "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/cli/node_modules/@listr2/prompt-adapter-inquirer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", - "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/type": "^3.0.7" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8", - "listr2": "9.0.1" - } - }, - "node_modules/@angular/cli/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/@angular/cli/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/@angular/cli/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/cli/node_modules/listr2": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", - "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.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/@angular/cli/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", + "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": { - "semver": "bin/semver.js" + "ng": "bin/ng.js" }, "engines": { - "node": ">=10" + "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/cli/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@angular/cli/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": { - "ansi-regex": "^6.0.1" + "@angular-devkit/core": "21.2.3", + "rxjs": "7.8.2" }, - "engines": { - "node": ">=12" + "bin": { + "architect": "bin/cli.js" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=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/@angular/cli/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==", + "node_modules/@angular/cli/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": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=10" } }, "node_modules/@angular/common": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.16.tgz", - "integrity": "sha512-GRAziNlntwdnJy3F+8zCOvDdy7id0gITjDnM6P9+n2lXvtDuBLGJKU3DWBbvxcCjtD6JK/g/rEX5fbCxbUHkQQ==", + "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" @@ -867,14 +988,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.16", + "@angular/core": "21.2.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.16.tgz", - "integrity": "sha512-Pt9Ms9GwTThgzdxWBwMfN8cH1JEtQ2DK5dc2yxYtPSaD+WKmG9AVL1PrzIYQEbaKcWk2jxASUHpEWSlNiwo8uw==", + "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" @@ -884,15 +1005,15 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.16.tgz", - "integrity": "sha512-l3xF/fXfJAl/UrNnH9Ufkr79myjMgXdHq1mmmph2UnpeqilRB1b8lC9sLBV9MipQHVn3dwocxMIvtrcryfOaXw==", + "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.28.3", + "@babel/core": "7.29.0", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", @@ -907,8 +1028,8 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.16", - "typescript": ">=5.8 <6.0" + "@angular/compiler": "21.2.5", + "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { "typescript": { @@ -917,9 +1038,9 @@ } }, "node_modules/@angular/core": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.16.tgz", - "integrity": "sha512-KSFPKvOmWWLCJBbEO+CuRUXfecX2FRuO0jNi9c54ptXMOPHlK1lIojUnyXmMNzjdHgRug8ci9qDuftvC2B7MKg==", + "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" @@ -928,9 +1049,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.16", + "@angular/compiler": "21.2.5", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" + "zone.js": "~0.15.0 || ~0.16.0" }, "peerDependenciesMeta": { "@angular/compiler": { @@ -942,27 +1063,28 @@ } }, "node_modules/@angular/forms": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.16.tgz", - "integrity": "sha512-1yzbXpExTqATpVcqA3wGrq4ACFIP3mRxA4pbso5KoJU+/4JfzNFwLsDaFXKpm5uxwchVnj8KM2vPaDOkvtp7NA==", + "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": "20.3.16", - "@angular/core": "20.3.16", - "@angular/platform-browser": "20.3.16", + "@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/language-service": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.3.16.tgz", - "integrity": "sha512-0A/tSQPq5geIz2mMcZA5fzzbzT39v+ADQksnfPr8htNxtkYWy+EI5+d0+++k59NuvjLY4uTBqhRTRB9b1PKrjw==", + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.2.5.tgz", + "integrity": "sha512-GnGcKMrR/gchWnqew1B6DEtI7Fgl3wDNC3QA4KnkzaD/+yTrCz1Osb+MRGm2Zj/oGOonLNxbHJ/yNxuozYv2NA==", "dev": true, "license": "MIT", "engines": { @@ -970,13 +1092,13 @@ } }, "node_modules/@angular/localize": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-20.3.16.tgz", - "integrity": "sha512-7S2ACDZC1Ag1+rc991BMvW6gDyBCH7ykGWpZL1aHOmnq4K70Sf8p2VyQMtYhaz7XfWeXxwBQjCncVYv6D7RO5A==", + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-21.2.5.tgz", + "integrity": "sha512-L/Aa+wMONTM3tvHczwHLYwKwgFhjXwU+TDYJFswu1/nFJ2epb0yNrJzgi9dHXDAMdihJy8920dZr9BI6J/OZ5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.28.3", + "@babel/core": "7.29.0", "@types/babel__core": "7.20.5", "tinyglobby": "^0.2.12", "yargs": "^18.0.0" @@ -990,31 +1112,31 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.16", - "@angular/compiler-cli": "20.3.16" + "@angular/compiler": "21.2.5", + "@angular/compiler-cli": "21.2.5" } }, "node_modules/@angular/material": { - "version": "20.2.14", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.2.14.tgz", - "integrity": "sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA==", + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.3.tgz", + "integrity": "sha512-mqmqhHRKIJwSKaYUtb9hH6/oHmozgqv/pYQMvMa3Fd5iipV0VxXN2GdNl3WE9LV9FJhHDBMitNU0hdE0uCM1nQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": "20.2.14", - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", - "@angular/forms": "^20.0.0 || ^21.0.0", - "@angular/platform-browser": "^20.0.0 || ^21.0.0", + "@angular/cdk": "21.2.3", + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/forms": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.16.tgz", - "integrity": "sha512-YsrLS6vyS77i4pVHg4gdSBW74qvzHjpQRTVQ5Lv/OxIjJdYYYkMmjNalCNgy1ZuyY6CaLIB11ccxhrNnxfKGOQ==", + "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" @@ -1023,9 +1145,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.3.16", - "@angular/common": "20.3.16", - "@angular/core": "20.3.16" + "@angular/animations": "21.2.5", + "@angular/common": "21.2.5", + "@angular/core": "21.2.5" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1034,9 +1156,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.16.tgz", - "integrity": "sha512-5mECCV9YeKH6ue239GXRTGeDSd/eTbM1j8dDejhm5cGnPBhTxRw4o+GgSrWTYtb6VmIYdwUGBTC+wCBphiaQ2A==", + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.5.tgz", + "integrity": "sha512-0yDogezPC4OaqkvL/3Pa5mBodOCCUnO4CTOxC+fPy7L+dRhQfVEwtOsN9XkZv5eMGemGeCcNKdchSuYsVkCA2g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1045,16 +1167,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.16", - "@angular/compiler": "20.3.16", - "@angular/core": "20.3.16", - "@angular/platform-browser": "20.3.16" + "@angular/common": "21.2.5", + "@angular/compiler": "21.2.5", + "@angular/core": "21.2.5", + "@angular/platform-browser": "21.2.5" } }, "node_modules/@angular/platform-server": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.3.16.tgz", - "integrity": "sha512-LxQscYd3UCWV8H3sdlnM05UB60MZVuVsdsHvXdkJ9+WOQjVDN1l1rYhj2aDL/5KkaRd/nqo0yFRnVjwceXDJhQ==", + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.2.5.tgz", + "integrity": "sha512-fZBxgffh/fD986Ub4EfjZvIVRqwNnF4DFWjcFwPgU8INBjcMEUh5dR/D/nnlBx0EsZSMCd6FbigT8lIrx3lsHQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0", @@ -1064,17 +1186,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.16", - "@angular/compiler": "20.3.16", - "@angular/core": "20.3.16", - "@angular/platform-browser": "20.3.16", + "@angular/common": "21.2.5", + "@angular/compiler": "21.2.5", + "@angular/core": "21.2.5", + "@angular/platform-browser": "21.2.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/router": { - "version": "20.3.16", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.16.tgz", - "integrity": "sha512-e1LiQFZaajKqc00cY5FboIrWJZSMnZ64GDp5R0UejritYrqorQQQNOqP1W85BMuY2owibMmxVfX+dJg/Mc8PuQ==", + "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" @@ -1083,25 +1205,25 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.16", - "@angular/core": "20.3.16", - "@angular/platform-browser": "20.3.16", + "@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/ssr": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.3.15.tgz", - "integrity": "sha512-FT2jrzFZgfcRIdKguUmA5FrdNpiBnFsnzeqXxu5Kp+YRd3YPYzUz3N3kxWSCbBoGeprnefxKFjcLMfSMQhQ/gQ==", + "version": "21.2.3", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-21.2.3.tgz", + "integrity": "sha512-vyBIZMoEA1QOghE0Q8Co1gVyxKaaG1eGUigOjnksRLrkOU9uB1ARaCBFFmnIMtFFMbrvVzhsl6Ojzm4RjKkKdA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/router": "^20.0.0" + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/router": "^21.0.0" }, "peerDependenciesMeta": { "@angular/platform-server": { @@ -1110,13 +1232,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "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.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -1125,9 +1247,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "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": { @@ -1135,22 +1257,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "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", @@ -1183,14 +1305,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "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.28.3", - "@babel/types": "^7.28.2", + "@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" @@ -1213,13 +1335,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "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.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1250,29 +1372,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "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.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "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.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1325,27 +1447,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "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.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "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.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1355,60 +1477,43 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "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.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@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.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "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.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@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/traverse/node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "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": { @@ -1450,10 +1555,44 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "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.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "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" ], @@ -1468,9 +1607,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "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" ], @@ -1485,9 +1624,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "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" ], @@ -1502,9 +1641,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "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" ], @@ -1519,9 +1658,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "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" ], @@ -1536,9 +1675,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "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" ], @@ -1553,9 +1692,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -1570,9 +1709,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -1587,9 +1726,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "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" ], @@ -1604,9 +1743,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "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" ], @@ -1621,9 +1760,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "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" ], @@ -1638,9 +1777,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "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" ], @@ -1655,9 +1794,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "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" ], @@ -1672,9 +1811,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "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" ], @@ -1689,9 +1828,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -1706,9 +1845,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -1723,9 +1862,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "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" ], @@ -1740,9 +1879,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "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" ], @@ -1757,9 +1896,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "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" ], @@ -1774,9 +1913,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "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" ], @@ -1791,9 +1930,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "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" ], @@ -1808,9 +1947,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "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" ], @@ -1825,9 +1964,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "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" ], @@ -1842,9 +1981,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "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" ], @@ -1859,9 +1998,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "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" ], @@ -1876,9 +2015,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "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" ], @@ -2095,10 +2234,28 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "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.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "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": { @@ -2206,14 +2363,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "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.1.15", - "@inquirer/type": "^3.0.8" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -2324,9 +2481,9 @@ } }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "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": { @@ -2418,22 +2575,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", - "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "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.2.1", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.17", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" + "@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" @@ -2537,29 +2694,6 @@ } } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2690,6 +2824,17 @@ "@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", @@ -2716,10 +2861,27 @@ "@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.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", - "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "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" ], @@ -2731,9 +2893,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", - "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "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" ], @@ -2745,9 +2907,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", - "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "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" ], @@ -2759,9 +2921,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", - "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "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" ], @@ -2773,9 +2935,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", - "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "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" ], @@ -2787,9 +2949,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", - "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "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" ], @@ -2801,9 +2963,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", - "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "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" ], @@ -2815,13 +2977,13 @@ ] }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", - "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", + "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.7", + "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -2829,14 +2991,15 @@ "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "jose": "^6.1.1", + "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.0" + "zod-to-json-schema": "^3.25.1" }, "engines": { "node": ">=18" @@ -3146,6 +3309,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3163,6 +3329,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3180,6 +3349,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3197,6 +3369,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3214,6 +3389,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3231,6 +3409,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3248,6 +3429,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3325,6 +3509,23 @@ "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", @@ -3343,9 +3544,9 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "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": { @@ -3366,18 +3567,18 @@ } }, "node_modules/@npmcli/git": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.1.tgz", - "integrity": "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==", + "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", - "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" }, @@ -3385,54 +3586,34 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/git/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/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "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/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/@npmcli/git/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "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": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" @@ -3469,9 +3650,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", - "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", + "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": { @@ -3481,34 +3662,57 @@ "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/@npmcli/package-json/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/@npmcli/package-json/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "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.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "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": { @@ -3516,25 +3720,25 @@ } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "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": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "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": { @@ -3542,22 +3746,12 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/package-json/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/@npmcli/promise-spawn": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", @@ -3572,23 +3766,23 @@ } }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "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": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" @@ -3608,9 +3802,9 @@ } }, "node_modules/@npmcli/run-script": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", - "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", + "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": { @@ -3618,62 +3812,35 @@ "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/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/@npmcli/run-script/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "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.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "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": "^1.0.3", + "detect-libc": "^2.0.3", "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">= 10.0.0" @@ -3683,25 +3850,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "@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.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "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" ], @@ -3720,9 +3887,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "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" ], @@ -3741,9 +3908,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "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" ], @@ -3762,9 +3929,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "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" ], @@ -3783,13 +3950,16 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3804,13 +3974,16 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3825,13 +3998,16 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3846,13 +4022,16 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3867,13 +4046,16 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3888,13 +4070,16 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3909,9 +4094,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "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" ], @@ -3930,9 +4115,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "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" ], @@ -3951,9 +4136,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "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" ], @@ -3971,20 +4156,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "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", @@ -4003,6 +4174,246 @@ "node": ">=14" } }, + "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, + "libc": [ + "glibc" + ], + "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, + "libc": [ + "musl" + ], + "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, + "libc": [ + "glibc" + ], + "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, + "libc": [ + "musl" + ], + "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/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", @@ -4048,9 +4459,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "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" ], @@ -4062,9 +4473,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "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" ], @@ -4076,9 +4487,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "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" ], @@ -4090,9 +4501,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "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" ], @@ -4104,9 +4515,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "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" ], @@ -4118,9 +4529,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "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" ], @@ -4132,13 +4543,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4146,13 +4560,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4160,13 +4577,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4174,13 +4594,16 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4188,13 +4611,33 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "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, + "libc": [ + "glibc" + ], + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4202,13 +4645,33 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "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, + "libc": [ + "glibc" + ], + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4216,13 +4679,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4230,13 +4696,16 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "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, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4244,13 +4713,16 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4258,13 +4730,16 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "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, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4272,23 +4747,40 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "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, + "libc": [ + "musl" + ], "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.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "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" ], @@ -4300,9 +4792,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "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" ], @@ -4314,9 +4806,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "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" ], @@ -4328,9 +4820,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "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" ], @@ -4342,9 +4834,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "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" ], @@ -4356,9 +4848,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.53.3.tgz", - "integrity": "sha512-mB8z32H6kz4kVjn+tfTGcrXBae7rIeAvm/g6itsE3IqcXpjSRRvk1/EOWDEi5wL8NNmxXiH71t4jtNfr128zpw==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.60.0.tgz", + "integrity": "sha512-b4MyEi8S6dvHy0ZAwxO/zQPxpagdv+VZQDlTDaQJloif+axEHbjaJ+dkjN+uTs4mj8qT3nOidkGtDdNvVj7rrg==", "dev": true, "license": "MIT", "dependencies": { @@ -4376,14 +4868,14 @@ } }, "node_modules/@schematics/angular": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.15.tgz", - "integrity": "sha512-WkhW1HO8pA8JT8e27tvjQHQg8eO5KaOz+WsGkN00RyL5DwHgPSzu4a3eYug+b3rW7OGFub7jadXBuGSrzqgonA==", + "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": "20.3.15", - "@angular-devkit/schematics": "20.3.15", + "@angular-devkit/core": "21.2.3", + "@angular-devkit/schematics": "21.2.3", "jsonc-parser": "3.3.1" }, "engines": { @@ -4406,9 +4898,9 @@ } }, "node_modules/@sigstore/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", - "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==", + "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": { @@ -4426,37 +4918,27 @@ } }, "node_modules/@sigstore/sign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", - "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", + "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.1.0", + "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.3", - "proc-log": "^6.1.0", - "promise-retry": "^2.0.1" + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@sigstore/sign/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/@sigstore/tuf": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", - "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", + "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": { @@ -4488,6 +4970,12 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "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/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -4536,22 +5024,56 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/@tufjs/models/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/@tufjs/models/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "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": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "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/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5058,9 +5580,9 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", - "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "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": { @@ -5176,26 +5698,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", - "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "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.1.0", - "@algolia/client-abtesting": "5.35.0", - "@algolia/client-analytics": "5.35.0", - "@algolia/client-common": "5.35.0", - "@algolia/client-insights": "5.35.0", - "@algolia/client-personalization": "5.35.0", - "@algolia/client-query-suggestions": "5.35.0", - "@algolia/client-search": "5.35.0", - "@algolia/ingestion": "1.35.0", - "@algolia/monitoring": "1.35.0", - "@algolia/recommend": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@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" @@ -5224,6 +5746,202 @@ "typescript-eslint": "^8.0.0" } }, + "node_modules/angular-eslint/node_modules/@angular-devkit/core": { + "version": "20.3.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", + "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", + "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": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/angular-eslint/node_modules/@angular-devkit/schematics": { + "version": "20.3.21", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.21.tgz", + "integrity": "sha512-CFX8TrZvvm4G398DpbcJ2GY8kwR81M8ssyIVYn19gD4Kr2UmeiCT3/dtUpx2FvSvSHbNwLmU6Ym0Rkh+E7p9bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.21", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.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-eslint/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/angular-eslint/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/angular-eslint/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/angular-eslint/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/angular-eslint/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/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/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -5341,9 +6059,9 @@ } }, "node_modules/beasties": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", - "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", + "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": { @@ -5354,10 +6072,11 @@ "htmlparser2": "^10.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.49", - "postcss-media-query-parser": "^0.2.3" + "postcss-media-query-parser": "^0.2.3", + "postcss-safe-parser": "^7.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/binary-extensions": { @@ -5489,9 +6208,9 @@ } }, "node_modules/cacache": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", - "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", + "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": { @@ -5504,35 +6223,57 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/cacache/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/cacache/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/cacache/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "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.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "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": { @@ -5540,25 +6281,25 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "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": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "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": { @@ -5566,7 +6307,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5654,16 +6395,16 @@ "license": "MIT" }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "devOptional": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5690,32 +6431,16 @@ "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, + "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==", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5984,7 +6709,8 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.1", @@ -6004,13 +6730,16 @@ } }, "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, "license": "MIT", "dependencies": { - "is-what": "^3.14.1" + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" @@ -6096,15 +6825,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/copyfiles/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, - "engines": { - "node": ">=8" - } - }, "node_modules/copyfiles/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6453,7 +7173,8 @@ "node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true }, "node_modules/encodeurl": { "version": "2.0.0", @@ -6463,31 +7184,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/engine.io": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", @@ -6544,6 +7240,7 @@ "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" }, @@ -6625,9 +7322,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "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", @@ -6638,32 +7335,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@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": { @@ -7108,11 +7805,14 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "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" }, @@ -7611,9 +8311,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "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==", "license": "MIT", "engines": { "node": ">=18" @@ -7696,7 +8396,8 @@ "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 + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", @@ -7793,12 +8494,11 @@ } }, "node_modules/hono": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", - "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz", + "integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } @@ -7817,9 +8517,9 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "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": { @@ -7833,9 +8533,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "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", @@ -7848,14 +8548,14 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "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": { @@ -7980,17 +8680,40 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/ignore-walk/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/ignore-walk/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "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": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8011,9 +8734,9 @@ } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "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" }, @@ -8060,13 +8783,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "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": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/injection-js": { @@ -8110,22 +8833,6 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8136,15 +8843,13 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-glob": { @@ -8199,11 +8904,17 @@ } }, "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } }, "node_modules/isarray": { "version": "0.0.1", @@ -8439,9 +9150,9 @@ } }, "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "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": { @@ -8781,15 +9492,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/karma/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, - "engines": { - "node": ">=8" - } - }, "node_modules/karma/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8926,21 +9628,20 @@ } }, "node_modules/less": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", - "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/less/-/less-4.6.4.tgz", + "integrity": "sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" }, "bin": { "lessc": "bin/lessc" }, "engines": { - "node": ">=14" + "node": ">=18" }, "optionalDependencies": { "errno": "^0.1.1", @@ -9194,14 +9895,15 @@ } }, "node_modules/lmdb": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", - "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "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", @@ -9212,13 +9914,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.2", - "@lmdb/lmdb-darwin-x64": "3.4.2", - "@lmdb/lmdb-linux-arm": "3.4.2", - "@lmdb/lmdb-linux-arm64": "3.4.2", - "@lmdb/lmdb-linux-x64": "3.4.2", - "@lmdb/lmdb-win32-arm64": "3.4.2", - "@lmdb/lmdb-win32-x64": "3.4.2" + "@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/locate-path": { @@ -9249,13 +9951,13 @@ "dev": true }, "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "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==", "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -9264,30 +9966,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/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==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "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", @@ -9436,12 +10114,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -9466,13 +10144,15 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", - "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", + "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", @@ -9481,7 +10161,6 @@ "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "ssri": "^13.0.0" }, "engines": { @@ -9498,16 +10177,6 @@ "node": ">= 0.6" } }, - "node_modules/make-fetch-happen/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/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -9632,10 +10301,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "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" } @@ -9654,21 +10324,39 @@ } }, "node_modules/minipass-fetch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.0.tgz", - "integrity": "sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==", + "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": "^1.0.3", + "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" + } + }, + "node_modules/minipass-fetch/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", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minipass-flush": { @@ -9738,38 +10426,18 @@ "license": "ISC" }, "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { "node": ">=8" } }, - "node_modules/minipass-sized/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/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", @@ -9811,9 +10479,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "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, @@ -9893,9 +10561,9 @@ "dev": true }, "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz", + "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==", "dev": true, "license": "MIT", "optional": true, @@ -9934,9 +10602,9 @@ } }, "node_modules/ng-packagr": { - "version": "20.3.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-20.3.2.tgz", - "integrity": "sha512-yW5ME0hqTz38r/th/7zVwX5oSIw1FviSA2PUlGZdVjghDme/KX6iiwmOBmlt9E9whNmwijEC6Gn3KKbrsBx8ig==", + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-21.2.1.tgz", + "integrity": "sha512-rk0aL0wWkC+FTA4wyzJIfjcUgAKMAEB19ULvP0QkAoAkzjS+3SBEf0n3MS6z7gcOW8SRU9rw1BmsouEAXD+SCw==", "dev": true, "license": "MIT", "dependencies": { @@ -9945,19 +10613,19 @@ "@rollup/wasm-node": "^4.24.0", "ajv": "^8.17.1", "ansi-colors": "^4.1.3", - "browserslist": "^4.22.1", - "chokidar": "^4.0.1", + "browserslist": "^4.26.0", + "chokidar": "^5.0.0", "commander": "^14.0.0", "dependency-graph": "^1.0.0", - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "find-cache-directory": "^6.0.0", "injection-js": "^2.4.0", "jsonc-parser": "^3.3.1", "less": "^4.2.0", - "ora": "^8.2.0", + "ora": "^9.0.0", "piscina": "^5.0.0", "postcss": "^8.4.47", - "rollup-plugin-dts": "^6.2.0", + "rollup-plugin-dts": "^6.4.0", "rxjs": "^7.8.1", "sass": "^1.81.0", "tinyglobby": "^0.2.12" @@ -9972,10 +10640,10 @@ "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^20.0.0", + "@angular/compiler-cli": "^21.0.0 || ^21.2.0-next", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.8 <6.0" + "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { "tailwindcss": { @@ -10061,33 +10729,23 @@ } }, "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20" } }, "node_modules/node-gyp/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "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": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" @@ -10175,25 +10833,25 @@ } }, "node_modules/npm-package-arg": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", - "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "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": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", - "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", + "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": { @@ -10204,16 +10862,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-packlist/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/npm-pick-manifest": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", @@ -10250,16 +10898,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-registry-fetch/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/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -10331,23 +10969,22 @@ } }, "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "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": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10377,13 +11014,29 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/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==", + "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/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -10393,9 +11046,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", - "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "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 @@ -10450,9 +11103,9 @@ "dev": true }, "node_modules/pacote": { - "version": "21.0.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.4.tgz", - "integrity": "sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==", + "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": { @@ -10481,16 +11134,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/pacote/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/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10614,13 +11257,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -10683,9 +11319,9 @@ } }, "node_modules/piscina": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", - "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", + "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": { @@ -10722,9 +11358,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -10757,6 +11393,33 @@ "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/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10783,13 +11446,13 @@ } }, "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "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": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/process-nextick-args": { @@ -10898,13 +11561,13 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "devOptional": true, "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -10941,27 +11604,6 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -11033,10 +11675,42 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "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": { @@ -11050,63 +11724,66 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@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/rollup-plugin-dts": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.3.0.tgz", - "integrity": "sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.4.1.tgz", + "integrity": "sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.5.5", + "convert-source-map": "^2.0.0", "magic-string": "^0.30.21" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/Swatinem" }, "optionalDependencies": { - "@babel/code-frame": "^7.27.1" + "@babel/code-frame": "^7.29.0" }, "peerDependencies": { "rollup": "^3.29.4 || ^4", - "typescript": "^4.5 || ^5.0" + "typescript": "^4.5 || ^5.0 || ^6.0" } }, - "node_modules/rollup-plugin-dts/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==", + "node_modules/rollup-plugin-dts/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", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } + "license": "MIT" }, "node_modules/router": { "version": "2.2.0", @@ -11166,9 +11843,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", - "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "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": { @@ -11186,13 +11863,46 @@ "@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/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true, "license": "BlueOak-1.0.0", - "optional": true + "optional": true, + "engines": { + "node": ">=11.0.0" + } }, "node_modules/semver": { "version": "7.7.3", @@ -11396,34 +12106,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -11520,6 +12202,7 @@ "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" } @@ -11543,17 +12226,6 @@ "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -11562,9 +12234,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "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": { @@ -11573,16 +12245,16 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "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.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", - "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", + "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": { @@ -11601,9 +12273,9 @@ } }, "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.1.tgz", + "integrity": "sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==", "license": "MIT", "engines": { "node": ">=18" @@ -11645,6 +12317,7 @@ "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, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -11678,19 +12351,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/string-width-cjs/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, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { "node": ">=12" }, @@ -11702,6 +12367,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -11761,23 +12427,10 @@ "node": ">=4" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12069,6 +12722,16 @@ "node": "*" } }, + "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/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", @@ -12076,32 +12739,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unique-filename": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", - "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/unique-slug": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", - "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -12198,25 +12835,14 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "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": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/vary": { @@ -12228,13 +12854,13 @@ } }, "node_modules/vite": { - "version": "7.1.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", - "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "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.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -12312,9 +12938,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "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": { @@ -12438,15 +13064,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/wrap-ansi-cjs/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, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -12504,16 +13121,6 @@ "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", @@ -12654,6 +13261,18 @@ "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==", + "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", @@ -12668,9 +13287,9 @@ } }, "node_modules/zod": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", - "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "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": { diff --git a/package.json b/package.json index 956d85c2..2e4e8fad 100644 --- a/package.json +++ b/package.json @@ -24,19 +24,19 @@ }, "private": false, "dependencies": { - "@angular-devkit/core": "^20.3.15", - "@angular-devkit/schematics": "^20.3.15", - "@angular/cdk": "^20.2.14", - "@angular/common": "^20.3.16", - "@angular/compiler": "^20.3.16", - "@angular/core": "^20.3.16", - "@angular/forms": "^20.3.16", - "@angular/material": "^20.2.14", - "@angular/platform-browser": "^20.3.16", - "@angular/platform-browser-dynamic": "^20.3.16", - "@angular/platform-server": "^20.3.16", - "@angular/router": "^20.3.16", - "@angular/ssr": "^20.3.15", + "@angular-devkit/core": "^21.2.3", + "@angular-devkit/schematics": "^21.2.3", + "@angular/cdk": "^21.2.3", + "@angular/common": "^21.2.5", + "@angular/compiler": "^21.2.5", + "@angular/core": "^21.2.5", + "@angular/forms": "^21.2.5", + "@angular/material": "^21.2.3", + "@angular/platform-browser": "^21.2.5", + "@angular/platform-browser-dynamic": "^21.2.5", + "@angular/platform-server": "^21.2.5", + "@angular/router": "^21.2.5", + "@angular/ssr": "^21.2.3", "express": "^5.2.1", "ngx-highlightjs": "^14.0.1", "ngx-mat-select-search": "^8.0.4", @@ -45,11 +45,11 @@ "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/build": "^20.3.15", - "@angular/cli": "^20.3.15", - "@angular/compiler-cli": "^20.3.16", - "@angular/language-service": "^20.3.16", - "@angular/localize": "^20.3.16", + "@angular/build": "^21.2.3", + "@angular/cli": "^21.2.3", + "@angular/compiler-cli": "^21.2.5", + "@angular/language-service": "^21.2.5", + "@angular/localize": "^21.2.5", "@types/express": "^5.0.6", "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", @@ -69,7 +69,7 @@ "karma-jasmine-html-reporter": "^2.2.0", "karma-time-stats-reporter": "^0.1.0", "lint-staged": "^16.2.7", - "ng-packagr": "^20.3.2", + "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", diff --git a/projects/components/tsconfig.lib.json b/projects/components/tsconfig.lib.json index e3eecd30..571cc678 100644 --- a/projects/components/tsconfig.lib.json +++ b/projects/components/tsconfig.lib.json @@ -5,8 +5,7 @@ "declarationMap": true, "declaration": true, "inlineSources": true, - "types": ["node", "@angular/localize"], - "lib": ["dom", "es2022"] + "types": ["node", "@angular/localize"] }, "angularCompilerOptions": { "skipTemplateCodegen": true, diff --git a/projects/components/view/src/view.component.spec.ts b/projects/components/view/src/view.component.spec.ts index 619aac23..b36879c1 100644 --- a/projects/components/view/src/view.component.spec.ts +++ b/projects/components/view/src/view.component.spec.ts @@ -1,6 +1,6 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { CommonModule } from '@angular/common'; + import { ChangeDetectionStrategy, Component, signal, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { IZvException } from '@zvoove/components/core'; @@ -26,7 +26,7 @@ class TestViewDataSource implements IZvViewDataSource { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection changeDetection: ChangeDetectionStrategy.Default, - imports: [CommonModule, ZvView], + imports: [ZvView], }) export class TestDataSourceComponent { public dataSource: TestViewDataSource; diff --git a/tsconfig.json b/tsconfig.json index e7d48f15..d8734294 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,7 +35,6 @@ "importHelpers": true, "target": "es2022", "module": "es2022", - "lib": ["es2022", "dom"], "paths": { "@zvoove/components/*": ["projects/components/*"] From 4ff9ae654ba2920cd66e32d676b6666b6435ddf4 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:25:07 +0100 Subject: [PATCH 02/22] Update angular-eslint to 21 --- package-lock.json | 666 ++++++---------------------------------------- package.json | 2 +- 2 files changed, 78 insertions(+), 590 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd1fb30d..137eac82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", - "angular-eslint": "^20.7.0", + "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^9.39.2", "eslint-plugin-jasmine": "^4.2.2", @@ -284,47 +284,22 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2003.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.15.tgz", - "integrity": "sha512-HmGnUTLVwpvOFilc3gTP6CL9o+UbkVyu9S4WENkQbInbW3zp54lkzY71uWJIP7QvuXPa+bS4WHEmoGNQtNvv1A==", + "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": "20.3.15", + "@angular-devkit/core": "21.2.3", "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-devkit/architect/node_modules/@angular-devkit/core": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.15.tgz", - "integrity": "sha512-s7sE4S5Hy62dLrtHwizbZaMcupAE8fPhm6rF+jBkhHZ75zXGhGzXP8WKFztYCAuGnis4pPnGSEKP/xVTc2lw6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" + "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" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } } }, "node_modules/@angular-devkit/core": { @@ -389,226 +364,82 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.7.0.tgz", - "integrity": "sha512-qgf4Cfs1z0VsVpzF/OnxDRvBp60OIzeCsp4mzlckWYVniKo19EPIN6kFDol5eTAIOMPgiBQlMIwgQMHgocXEig==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.3.1.tgz", + "integrity": "sha512-1f1Lyp5e7OH6txiV224HaY3G1uRCj91OSKq7hT2Vw9NRw6zWFc1anBpDeLVjpL9ptUxzUGIQR5jEV54hOPayoQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", - "@angular-devkit/core": ">= 20.0.0 < 21.0.0" + "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "@angular/cli": ">= 21.0.0 < 22.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { - "version": "20.3.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", - "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", - "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": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/builder/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/@angular-eslint/bundled-angular-compiler": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.7.0.tgz", - "integrity": "sha512-9KPz24YoiL0SvTtTX6sd1zmysU5cKOCcmpEiXkCoO3L2oYZGlVxmMT4hfSaHMt8qmfvV2KzQMoR6DZM84BwRzQ==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.3.1.tgz", + "integrity": "sha512-jjbnJPUXQeQBJ8RM+ahlbt4GH2emVN8JvG3AhFbPci1FrqXi9cOOfkbwLmvpoyTli4LF8gy7g4ctFqnlRgqryw==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.7.0.tgz", - "integrity": "sha512-aHH2YTiaonojsKN+y2z4IMugCwdsH/dYIjYBig6kfoSPyf9rGK4zx+gnNGq/pGRjF3bOYrmFgIviYpQVb80inQ==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.3.1.tgz", + "integrity": "sha512-08NNTxwawRLTWPLl8dg1BnXMwimx93y4wMEwx2aWQpJbIt4pmNvwJzd+NgoD/Ag2VdLS/gOMadhJH5fgaYKsPQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.7.0", - "@angular-eslint/utils": "20.7.0", + "@angular-eslint/bundled-angular-compiler": "21.3.1", + "@angular-eslint/utils": "21.3.1", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.7.0.tgz", - "integrity": "sha512-WFmvW2vBR6ExsSKEaActQTteyw6ikWyuJau9XmWEPFd+2eusEt/+wO21ybjDn3uc5FTp1IcdhfYy+U5OdDjH5w==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.3.1.tgz", + "integrity": "sha512-ndPWJodkcEOu2PVUxlUwyz4D2u3r9KO7veWmStVNOLeNrICJA+nQvrz2BWCu0l48rO0K5ezsy0JFcQDVwE/5mw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.7.0", - "@angular-eslint/utils": "20.7.0", + "@angular-eslint/bundled-angular-compiler": "21.3.1", + "@angular-eslint/utils": "21.3.1", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { - "@angular-eslint/template-parser": "20.7.0", + "@angular-eslint/template-parser": "21.3.1", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/schematics": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.7.0.tgz", - "integrity": "sha512-S0onfRipDUIL6gFGTFjiWwUDhi42XYrBoi3kJ3wBbKBeIgYv9SP1ppTKDD4ZoDaDU9cQE8nToX7iPn9ifMw6eQ==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.3.1.tgz", + "integrity": "sha512-1U2u4ZsZvwT30aXRLsIJf6tULIiioo9BtASNsldpYecU3/m/1+F61lCYG79qt7YWbif9KABPYZlFTJUFGN8HWA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/eslint-plugin": "20.7.0", - "@angular-eslint/eslint-plugin-template": "20.7.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/eslint-plugin": "21.3.1", + "@angular-eslint/eslint-plugin-template": "21.3.1", "ignore": "7.0.5", - "semver": "7.7.3", + "semver": "7.7.4", "strip-json-comments": "3.1.1" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { - "version": "20.3.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", - "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", - "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": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/schematics": { - "version": "20.3.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.21.tgz", - "integrity": "sha512-CFX8TrZvvm4G398DpbcJ2GY8kwR81M8ssyIVYn19gD4Kr2UmeiCT3/dtUpx2FvSvSHbNwLmU6Ym0Rkh+E7p9bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.3.21", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.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-eslint/schematics/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/@angular-eslint/schematics/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/@angular-eslint/schematics/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/@angular-eslint/schematics/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@angular/cli": ">= 21.0.0 < 22.0.0" } }, "node_modules/@angular-eslint/schematics/node_modules/ignore": { @@ -621,121 +452,30 @@ "node": ">= 4" } }, - "node_modules/@angular-eslint/schematics/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular-eslint/schematics/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/@angular-eslint/template-parser": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.7.0.tgz", - "integrity": "sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.3.1.tgz", + "integrity": "sha512-moERVCTekQKOvR8RMuEOtWSO3VS1qrzA3keI1dPto/JVB8Nqp9w3R5ZpEoXHzh4zgEryosxmPgdi6UczJe2ouQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.7.0", - "eslint-scope": "^9.0.0" + "@angular-eslint/bundled-angular-compiler": "21.3.1", + "eslint-scope": "9.1.2" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.0.0.tgz", - "integrity": "sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, @@ -747,17 +487,17 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.7.0.tgz", - "integrity": "sha512-B6EJHbsk2W/lnS3kS/gm56VGvX735419z/DzgbRDcOvqMGMLwD1ILzv5OTEcL1rzpnB0AHW+IxOu6y/aCzSNUA==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.3.1.tgz", + "integrity": "sha512-Q3SGA1/36phZhmsp1mYrKzp/jcmqofRr861MYn46FaWIKSYXBYRzl+H3FIJKBu5CE36Bggu6hbNpwGPuUp+MCg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.7.0" + "@angular-eslint/bundled-angular-compiler": "21.3.1" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*" } }, @@ -861,38 +601,6 @@ } } }, - "node_modules/@angular/build/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/build/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/@angular/cdk": { "version": "21.2.3", "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.3.tgz", @@ -944,38 +652,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/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/cli/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/@angular/common": { "version": "21.2.5", "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.5.tgz", @@ -5153,6 +4829,13 @@ "@types/node": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -5724,224 +5407,29 @@ } }, "node_modules/angular-eslint": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.7.0.tgz", - "integrity": "sha512-BCiTCLO3dr8pGPaM7qLcCruWNcoNNHnLn4DPqE5tHk1TAnTx5TcGy0p/FygharZw5RjWfDHLBjFfpeh4XWLMmQ==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.3.1.tgz", + "integrity": "sha512-VGQWTyuPAEO/AnZuqHxGBJMYSiZ0tbrHx/OgPCRTKHfbrFU4x+zivS84h9UWoDpDtius1RyD+ZReFjTAEWptiA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/builder": "20.7.0", - "@angular-eslint/eslint-plugin": "20.7.0", - "@angular-eslint/eslint-plugin-template": "20.7.0", - "@angular-eslint/schematics": "20.7.0", - "@angular-eslint/template-parser": "20.7.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/builder": "21.3.1", + "@angular-eslint/eslint-plugin": "21.3.1", + "@angular-eslint/eslint-plugin-template": "21.3.1", + "@angular-eslint/schematics": "21.3.1", + "@angular-eslint/template-parser": "21.3.1", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "@angular/cli": ">= 21.0.0 < 22.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": "*", "typescript-eslint": "^8.0.0" } }, - "node_modules/angular-eslint/node_modules/@angular-devkit/core": { - "version": "20.3.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.21.tgz", - "integrity": "sha512-+flPAkPPn6MLVOa4ereSo6M5QRqxElKvDL6rCJWOJHRzH7K4CcfA269vr5mQSlImI5ZZc/EAPpm9rwEfWZRwew==", - "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": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/angular-eslint/node_modules/@angular-devkit/schematics": { - "version": "20.3.21", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.21.tgz", - "integrity": "sha512-CFX8TrZvvm4G398DpbcJ2GY8kwR81M8ssyIVYn19gD4Kr2UmeiCT3/dtUpx2FvSvSHbNwLmU6Ym0Rkh+E7p9bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.3.21", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.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-eslint/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/angular-eslint/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/angular-eslint/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/angular-eslint/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/angular-eslint/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/angular-eslint/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/angular-eslint/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/angular-eslint/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/angular-eslint/node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/angular-eslint/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/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -11905,9 +11393,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index 2e4e8fad..05f9f415 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", - "angular-eslint": "^20.7.0", + "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^9.39.2", "eslint-plugin-jasmine": "^4.2.2", From 4b7d838dcc9ae8d7547ed0d24c1ffba9197bd720 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:28:38 +0100 Subject: [PATCH 03/22] Update dependencies --- package-lock.json | 792 +++++++++++++++++----------------------------- package.json | 15 +- 2 files changed, 289 insertions(+), 518 deletions(-) diff --git a/package-lock.json b/package-lock.json index 137eac82..8a7d8541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,8 +25,7 @@ "ngx-highlightjs": "^14.0.1", "ngx-mat-select-search": "^8.0.4", "rxjs": "^7.8.2", - "tslib": "^2.8.1", - "zone.js": "~0.15.0" + "tslib": "^2.8.1" }, "devDependencies": { "@angular/build": "^21.2.3", @@ -35,16 +34,16 @@ "@angular/language-service": "^21.2.5", "@angular/localize": "^21.2.5", "@types/express": "^5.0.6", - "@types/jasmine": "^5.1.13", + "@types/jasmine": "^6.0.0", "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", - "eslint": "^9.39.2", + "eslint": "^10.1.0", "eslint-plugin-jasmine": "^4.2.2", "husky": "^9.1.7", - "jasmine": "^5.13.0", - "jasmine-core": "^5.13.0", + "jasmine": "^6.1.0", + "jasmine-core": "^6.1.0", "jasmine-spec-reporter": "^7.0.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", @@ -52,12 +51,12 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.2.0", "karma-time-stats-reporter": "^0.1.0", - "lint-staged": "^16.2.7", + "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", - "typescript-eslint": "^8.54.0" + "typescript-eslint": "^8.57.2" } }, "node_modules/@algolia/abtesting": { @@ -467,25 +466,6 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@angular-eslint/utils": { "version": "21.3.1", "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.3.1.tgz", @@ -1737,177 +1717,107 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@eslint/config-array/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", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "node_modules/@eslint/config-array/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": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@eslint/core": "^1.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.1.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@gar/promise-retry": { @@ -2489,6 +2399,13 @@ "node": ">=8" } }, + "node_modules/@jasminejs/reporters": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jasminejs/reporters/-/reporters-1.0.0.tgz", + "integrity": "sha512-rM3GG4vx2H1Gp5kYCTr9aKlOEJFd43pzpiMAiy5b1+FUc2ub4e6bS6yCi/WQNDzAa5MVp9++dwcoEtcIfoEnhA==", + "dev": true, + "license": "MIT" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -4875,9 +4792,9 @@ "license": "MIT" }, "node_modules/@types/jasmine": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.13.tgz", - "integrity": "sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-6.0.0.tgz", + "integrity": "sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==", "dev": true, "license": "MIT" }, @@ -4948,17 +4865,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", + "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/type-utils": "8.57.2", + "@typescript-eslint/utils": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -4971,8 +4888,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.57.2", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -4987,16 +4904,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", + "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "engines": { @@ -5007,7 +4924,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -5030,14 +4947,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", + "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.57.2", + "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "engines": { @@ -5070,14 +4987,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", + "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5088,9 +5005,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", + "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", "dev": true, "license": "MIT", "engines": { @@ -5105,15 +5022,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", + "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -5125,7 +5042,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -5148,9 +5065,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", + "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", "dev": true, "license": "MIT", "engines": { @@ -5162,18 +5079,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", + "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.57.2", + "@typescript-eslint/tsconfig-utils": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -5189,6 +5106,29 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5207,17 +5147,33 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", + "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.57.2", + "@typescript-eslint/types": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5227,19 +5183,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", + "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.57.2", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5250,13 +5206,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5305,9 +5261,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -5494,13 +5450,6 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -5830,16 +5779,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001759", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", @@ -6072,9 +6011,9 @@ } }, "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -6875,33 +6814,30 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", + "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.3", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -6911,8 +6847,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -6920,7 +6855,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -6946,17 +6881,19 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6975,10 +6912,11 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6990,65 +6928,29 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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==", + "node_modules/eslint/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, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "18 || 20 || >=22" } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/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==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=7.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/eslint/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 - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -7062,13 +6964,13 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7086,81 +6988,66 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node": "18 || 20 || >=22" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -7512,7 +7399,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -7909,19 +7797,6 @@ "node": "*" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -8228,23 +8103,6 @@ "dev": true, "license": "MIT" }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8587,23 +8445,24 @@ } }, "node_modules/jasmine": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.13.0.tgz", - "integrity": "sha512-oLCXIhEb5e0zzjn9GyuvcuisvLBwUjmgz7a0RNGWKwQtJCDld4m+vwKUpAIJVLB5vbmQFdtKhT86/tIZlJ5gYw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-6.1.0.tgz", + "integrity": "sha512-WPphPqEMY0uBRMjuhRHoVoxQNvJuxIMqz0yIcJ3k3oYxBedeGoH60/NXNgasxnx2FvfXrq5/r+2wssJ7WE8ABw==", "dev": true, "license": "MIT", "dependencies": { - "glob": "^10.2.2", - "jasmine-core": "~5.13.0" + "@jasminejs/reporters": "^1.0.0", + "glob": "^10.2.2 || ^11.0.3 || ^12.0.0 || ^13.0.0", + "jasmine-core": "~6.1.0" }, "bin": { "jasmine": "bin/jasmine.js" } }, "node_modules/jasmine-core": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.13.0.tgz", - "integrity": "sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.1.0.tgz", + "integrity": "sha512-p/tjBw58O6vxKIWMlrU+yys8lqR3+l3UrqwNTT7wpj+dQ7N4etQekFM8joI+cWzPDYqZf54kN+hLC1+s5TvZvg==", "dev": true, "license": "MIT" }, @@ -8654,19 +8513,6 @@ "dev": true, "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -9206,19 +9052,18 @@ } }, "node_modules/lint-staged": { - "version": "16.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", - "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.2", + "commander": "^14.0.3", "listr2": "^9.0.5", - "micromatch": "^4.0.8", - "nano-spawn": "^2.0.0", - "pidtree": "^0.6.0", + "picomatch": "^4.0.3", "string-argv": "^0.3.2", - "yaml": "^2.8.1" + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -9432,12 +9277,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "node_modules/log-symbols": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", @@ -9695,31 +9534,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -10010,19 +9824,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/nano-spawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", - "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -10622,19 +10423,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -10785,18 +10573,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -11092,16 +10868,6 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -11988,6 +11754,16 @@ "safe-buffer": "~5.1.0" } }, + "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", @@ -12026,9 +11802,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -12161,16 +11937,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.2.tgz", + "integrity": "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.57.2", + "@typescript-eslint/parser": "8.57.2", + "@typescript-eslint/typescript-estree": "8.57.2", + "@typescript-eslint/utils": "8.57.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12180,7 +11956,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, @@ -12289,6 +12065,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -12298,6 +12075,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -12793,12 +12571,6 @@ "peerDependencies": { "zod": "^3.25 || ^4" } - }, - "node_modules/zone.js": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", - "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT" } } } diff --git a/package.json b/package.json index 05f9f415..16bb9a48 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,7 @@ "ngx-highlightjs": "^14.0.1", "ngx-mat-select-search": "^8.0.4", "rxjs": "^7.8.2", - "tslib": "^2.8.1", - "zone.js": "~0.15.0" + "tslib": "^2.8.1" }, "devDependencies": { "@angular/build": "^21.2.3", @@ -51,16 +50,16 @@ "@angular/language-service": "^21.2.5", "@angular/localize": "^21.2.5", "@types/express": "^5.0.6", - "@types/jasmine": "^5.1.13", + "@types/jasmine": "^6.0.0", "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", - "eslint": "^9.39.2", + "eslint": "^10.1.0", "eslint-plugin-jasmine": "^4.2.2", "husky": "^9.1.7", - "jasmine": "^5.13.0", - "jasmine-core": "^5.13.0", + "jasmine": "^6.1.0", + "jasmine-core": "^6.1.0", "jasmine-spec-reporter": "^7.0.0", "karma": "^6.4.4", "karma-chrome-launcher": "^3.2.0", @@ -68,12 +67,12 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.2.0", "karma-time-stats-reporter": "^0.1.0", - "lint-staged": "^16.2.7", + "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", - "typescript-eslint": "^8.54.0" + "typescript-eslint": "^8.57.2" }, "lint-staged": { "*.{ts,json,scss,html}": "prettier --write" From 026f9fdf142ffd04164202b9fd8b87106b44f9c4 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:29:49 +0100 Subject: [PATCH 04/22] Update dependencies --- package-lock.json | 3139 ++++++++++++++++++++------------------------- 1 file changed, 1365 insertions(+), 1774 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a7d8541..5ac65e1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -328,22 +328,6 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "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/@angular-devkit/schematics": { "version": "21.2.3", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.3.tgz", @@ -441,16 +425,6 @@ "@angular/cli": ">= 21.0.0 < 22.0.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@angular-eslint/template-parser": { "version": "21.3.1", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.3.1.tgz", @@ -1185,6 +1159,7 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } @@ -1194,6 +1169,7 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1206,6 +1182,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1731,45 +1708,6 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/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/@eslint/config-array/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@eslint/config-array/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/@eslint/config-helpers": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", @@ -1856,41 +1794,31 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1900,9 +1828,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2066,23 +1994,6 @@ } } }, - "node_modules/@inquirer/external-editor/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/@inquirer/figures": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", @@ -2280,102 +2191,6 @@ } } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -2433,6 +2248,7 @@ "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" } @@ -2610,70 +2426,6 @@ } } }, - "node_modules/@modelcontextprotocol/sdk/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/@modelcontextprotocol/sdk/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/@modelcontextprotocol/sdk/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/@modelcontextprotocol/sdk/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/@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", @@ -3261,29 +3013,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json/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/@npmcli/package-json/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@npmcli/package-json/node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -3302,66 +3031,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/package-json/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==", + "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": "BlueOak-1.0.0", + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, "engines": { - "node": "20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json/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/@npmcli/package-json/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/@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==", + "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": { @@ -3757,16 +3443,6 @@ "license": "MIT", "optional": true }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "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", @@ -4561,7 +4237,8 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@standard-schema/spec": { "version": "1.1.0", @@ -4570,28 +4247,32 @@ "license": "MIT" }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", @@ -4617,45 +4298,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@tufjs/models/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/@tufjs/models/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@tufjs/models/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/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -4713,10 +4355,11 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -4727,21 +4370,17 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4773,10 +4412,11 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", - "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4815,16 +4455,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, "node_modules/@types/node": { - "version": "24.10.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", - "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4832,24 +4466,26 @@ } }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", - "dev": true + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -4864,6 +4500,16 @@ "@types/node": "*" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", @@ -4893,16 +4539,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/parser": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", @@ -4928,24 +4564,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser/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/@typescript-eslint/project-service": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", @@ -4968,24 +4586,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/project-service/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/@typescript-eslint/scope-manager": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", @@ -5046,24 +4646,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/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/@typescript-eslint/types": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", @@ -5106,63 +4688,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", @@ -5235,7 +4760,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/abbrev": { "version": "4.0.0", @@ -5248,13 +4774,13 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" @@ -5284,10 +4810,11 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -5306,9 +4833,10 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5324,6 +4852,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -5396,20 +4925,38 @@ "node": ">=6" } }, - "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==", + "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, - "engines": { - "node": ">=8" - } + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -5432,9 +4979,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -5448,7 +4995,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/aria-query": { "version": "5.3.2", @@ -5471,28 +5019,36 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "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/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", - "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", + "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.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/beasties": { @@ -5530,44 +5086,29 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, + "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==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "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": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -5576,12 +5117,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -5589,6 +5134,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -5634,12 +5180,14 @@ "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 + "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==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5666,29 +5214,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/cacache/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/cacache/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/cacache/node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -5717,39 +5242,6 @@ "node": "20 || >=22" } }, - "node_modules/cacache/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/cacache/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/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", @@ -5780,9 +5272,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "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": [ { @@ -5805,6 +5297,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5814,6 +5307,39 @@ "node": ">=4" } }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chardet": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", @@ -5851,6 +5377,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" }, @@ -5873,6 +5400,23 @@ "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", @@ -5924,14 +5468,32 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "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/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "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.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -5963,6 +5525,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -5972,6 +5535,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -5980,19 +5544,22 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "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 + "dev": true, + "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } @@ -6002,6 +5569,7 @@ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, + "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -6031,13 +5599,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -6053,6 +5623,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6062,6 +5633,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6071,6 +5643,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -6088,13 +5661,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -6107,6 +5682,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6128,6 +5704,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6140,9 +5717,10 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6197,6 +5775,7 @@ "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" }, @@ -6207,11 +5786,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/copyfiles/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/copyfiles/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6222,6 +5809,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -6233,6 +5821,7 @@ "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" }, @@ -6244,19 +5833,32 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/copyfiles/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 + "dev": true, + "license": "MIT" + }, + "node_modules/copyfiles/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/copyfiles/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6269,6 +5871,7 @@ "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", @@ -6283,6 +5886,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6300,6 +5904,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -6318,6 +5923,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -6326,32 +5932,40 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, + "dev": true, + "license": "MIT" + }, "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "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/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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", @@ -6395,21 +6009,24 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -6426,13 +6043,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -6444,6 +6063,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6463,6 +6083,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6483,13 +6104,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -6499,6 +6122,7 @@ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, + "license": "MIT", "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", @@ -6579,54 +6203,52 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "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==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.266", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", - "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", + "version": "1.5.323", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.323.tgz", + "integrity": "sha512-oQm+FxbazvN2WICCbvJgj3IYPKV8awip57+W5VP+Aatk4kFU4pDYCPHZOX22Z27zpw8uttBehEqgK+VTJAYrVw==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true + "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==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", + "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", + "@types/ws": "^8.5.12", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "ws": "~8.18.3" }, "engines": { "node": ">=10.2.0" @@ -6637,26 +6259,69 @@ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/ent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", - "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "dev": true, + "license": "MIT", "dependencies": { - "punycode": "^1.4.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6690,6 +6355,7 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -6795,6 +6461,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6802,15 +6469,20 @@ "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==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { @@ -6904,6 +6576,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6928,41 +6601,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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/eslint/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", @@ -6976,16 +6614,14 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 4" } }, "node_modules/eslint/node_modules/json-schema-traverse": { @@ -6995,22 +6631,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/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/espree": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", @@ -7060,6 +6680,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7072,6 +6693,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -7088,6 +6710,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -7096,6 +6719,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7104,7 +6728,8 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", @@ -7198,258 +6823,88 @@ "express": ">= 4.11" } }, - "node_modules/express/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==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "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==", + "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", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "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.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=16.0.0" } }, - "node_modules/express/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/express/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==", - "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/express/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "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/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/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==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/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==", - "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/express/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/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==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "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==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" - }, - "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/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" @@ -7476,23 +6931,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/find-cache-directory": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz", @@ -7515,6 +6953,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7544,6 +6983,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -7553,15 +6993,16 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "dev": true, "funding": [ { @@ -7569,6 +7010,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7578,26 +7020,11 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7616,6 +7043,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -7642,7 +7070,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -7663,6 +7092,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7682,6 +7112,7 @@ "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.*" } @@ -7739,8 +7170,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7757,15 +7189,16 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -7775,21 +7208,30 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7813,15 +7255,17 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-symbols": { @@ -7836,10 +7280,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7893,7 +7354,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "10.1.0", @@ -7936,18 +7398,23 @@ "license": "BSD-2-Clause" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "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": { @@ -7955,6 +7422,7 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8009,21 +7477,25 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -8043,45 +7515,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/ignore-walk/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/ignore-walk/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/ignore-walk/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/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -8108,6 +7541,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -8118,6 +7552,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8126,7 +7561,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "6.0.0", @@ -8162,6 +7598,7 @@ "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==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -8184,18 +7621,25 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "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==", + "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": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -8203,6 +7647,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8227,6 +7672,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -8237,6 +7683,25 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -8266,13 +7731,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -8284,13 +7751,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "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" } @@ -8317,6 +7786,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -8326,32 +7796,12 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^2.0.5", @@ -8368,6 +7818,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=6" } @@ -8377,6 +7828,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -8391,6 +7843,7 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -8403,6 +7856,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -8412,15 +7866,17 @@ "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/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -8429,21 +7885,6 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jasmine": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-6.1.0.tgz", @@ -8477,20 +7918,18 @@ } }, "node_modules/jasmine/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "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": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8530,7 +7969,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", @@ -8545,7 +7985,8 @@ "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==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", @@ -8558,13 +7999,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "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" }, @@ -8575,13 +8018,15 @@ "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==" + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -8650,6 +8095,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8674,21 +8120,30 @@ "url": "https://github.com/sponsors/mattlewis92" } }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8728,7 +8183,8 @@ "version": "4.6.1", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/karma-time-stats-reporter": { "version": "0.1.0", @@ -8746,6 +8202,7 @@ "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" }, @@ -8756,11 +8213,44 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/karma/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8796,6 +8286,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8807,6 +8298,7 @@ "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" }, @@ -8818,19 +8310,101 @@ "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 + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, "node_modules/karma/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 + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/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/karma/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8843,6 +8417,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -8850,10 +8425,17 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/karma/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/karma/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -8863,6 +8445,38 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/karma/node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "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/karma/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/karma/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -8881,6 +8495,7 @@ "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" } @@ -8890,6 +8505,7 @@ "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", @@ -8899,13 +8515,18 @@ "node": ">=8" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/karma/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, "engines": { - "node": ">=14.14" + "node": ">= 0.6" } }, "node_modules/karma/node_modules/wrap-ansi": { @@ -8913,6 +8534,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8930,6 +8552,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8948,6 +8571,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -8957,6 +8581,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -9043,6 +8668,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9098,76 +8724,44 @@ "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/listr2/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/listr2/node_modules/cli-truncate": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^7.1.0", - "string-width": "^8.0.0" - }, + "license": "MIT", "engines": { - "node": ">=20" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "node_modules/listr2/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", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, "engines": { - "node": ">=20" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "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/listr2/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==", + "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": { - "get-east-asian-width": "^1.3.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" @@ -9176,31 +8770,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/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/listr2/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "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.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9261,6 +8838,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -9272,10 +8850,11 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "7.0.1", @@ -9298,6 +8877,7 @@ "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", @@ -9312,26 +8892,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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" }, @@ -9340,10 +8906,11 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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" }, @@ -9351,44 +8918,49 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "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": { - "get-east-asian-width": "^1.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "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": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "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/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "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.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9398,10 +8970,11 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "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", @@ -9419,6 +8992,7 @@ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -9454,6 +9028,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -9468,7 +9043,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "15.0.5", @@ -9494,16 +9070,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/make-fetch-happen/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/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -9514,12 +9080,12 @@ } }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { @@ -9539,6 +9105,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9547,30 +9114,35 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "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==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -9579,15 +9151,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9598,6 +9171,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9643,24 +9217,6 @@ "iconv-lite": "^0.7.2" } }, - "node_modules/minipass-fetch/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", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -9758,6 +9314,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -9778,7 +9335,8 @@ "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==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/msgpackr": { "version": "1.11.9", @@ -9847,7 +9405,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/needle": { "version": "3.5.0", @@ -9882,10 +9441,10 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10044,9 +9603,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "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" }, @@ -10055,6 +9614,7 @@ "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", "dev": true, + "license": "ISC", "dependencies": { "inherits": "^2.0.1", "readable-stream": "~1.0.31" @@ -10081,6 +9641,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10205,6 +9766,7 @@ "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" } @@ -10225,6 +9787,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -10236,15 +9799,32 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10266,51 +9846,11 @@ "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/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/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==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/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==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "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" @@ -10319,19 +9859,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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==", + "node_modules/ora/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==", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/ordered-binary": { @@ -10347,6 +9884,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10362,6 +9900,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -10385,12 +9924,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, "node_modules/pacote": { "version": "21.3.1", "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.3.1.tgz", @@ -10502,6 +10035,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10511,6 +10045,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10520,6 +10055,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10529,37 +10065,54 @@ "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": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "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": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "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==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "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 + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.3", @@ -10578,6 +10131,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10689,6 +10243,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -10723,7 +10278,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/promise-retry": { "version": "2.0.1", @@ -10743,6 +10299,7 @@ "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==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10763,24 +10320,26 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.9" } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -10793,23 +10352,24 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, "node_modules/readable-stream": { @@ -10817,6 +10377,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -10850,6 +10411,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10858,6 +10420,7 @@ "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==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10866,12 +10429,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" @@ -10883,20 +10448,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dependencies": { - "mimic-function": "^5.0.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", @@ -10911,7 +10462,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", @@ -10919,6 +10471,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -11055,33 +10608,6 @@ "node": ">= 18" } }, - "node_modules/router/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/router/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==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -11091,10 +10617,36 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sass": { "version": "1.97.3", @@ -11172,46 +10724,25 @@ } }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "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.0", - "mime-types": "^3.0.1", + "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.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" - } - }, - "node_modules/send/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/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==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" }, "funding": { "type": "opencollective", @@ -11219,9 +10750,9 @@ } }, "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -11231,18 +10762,24 @@ }, "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==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "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" }, @@ -11255,6 +10792,7 @@ "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" } @@ -11335,6 +10873,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -11360,6 +10899,36 @@ "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/slice-ansi/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/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -11372,15 +10941,16 @@ } }, "node_modules/socket.io": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", - "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" @@ -11390,28 +10960,77 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "debug": "~4.4.1", + "ws": "~8.18.3" } }, "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", "dev": true, + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "engines": { "node": ">=10.0.0" } }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -11466,6 +11085,7 @@ "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" @@ -11476,6 +11096,7 @@ "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" } @@ -11519,9 +11140,10 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11543,6 +11165,7 @@ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, + "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -11556,60 +11179,40 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "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, + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/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 - }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -11618,12 +11221,12 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -11637,19 +11240,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "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" }, @@ -11662,6 +11253,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11670,15 +11262,16 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/tar": { @@ -11713,6 +11306,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -11722,13 +11316,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11739,17 +11335,12 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -11781,11 +11372,22 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -11797,6 +11399,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -11879,29 +11482,12 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tuf-js/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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -11910,13 +11496,14 @@ } }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" @@ -11961,9 +11548,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", - "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", "dev": true, "funding": [ { @@ -11979,6 +11566,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -12008,6 +11596,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -12016,6 +11605,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12025,14 +11615,15 @@ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "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": [ { @@ -12084,13 +11675,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -12099,7 +11692,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-name": { "version": "7.0.2", @@ -12115,6 +11709,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12199,6 +11794,7 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12222,6 +11818,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -12239,6 +11836,7 @@ "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" }, @@ -12254,6 +11852,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12273,77 +11872,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/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 - }, - "node_modules/wrap-ansi-cjs/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 - }, - "node_modules/wrap-ansi-cjs/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, - "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/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12387,6 +11915,16 @@ "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", @@ -12405,13 +11943,15 @@ "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==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -12442,6 +11982,7 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } @@ -12451,6 +11992,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12463,9 +12005,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", "bin": { @@ -12506,11 +12048,59 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yargs/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/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/yargs/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/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -12520,6 +12110,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, From c959a9ff6ecacc59c7083e52c3d83261e111cf80 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 15:56:59 +0100 Subject: [PATCH 05/22] eslint --- eslint.config.js | 1 + package-lock.json | 22 +++++++++++++++++++ package.json | 1 + .../src/action-button.component.spec.ts | 2 +- .../block-ui/src/block-ui.component.spec.ts | 2 +- .../card/src/card.component.spec.ts | 2 +- .../src/date-time-input.component.spec.ts | 6 ++--- .../src/dialog-wrapper.component.spec.ts | 4 ++-- .../src/file-input.component.spec.ts | 2 +- .../src/flip-container.component.spec.ts | 2 +- .../src/form-field.component.spec.ts | 8 +++---- .../form/src/form.component.spec.ts | 2 +- .../header/src/header.component.spec.ts | 2 +- .../select/src/select.component.spec.ts | 10 ++++----- .../table/src/directives/table.directives.ts | 2 ++ .../table-actions.component.spec.ts | 2 +- .../table-header.component.spec.ts | 2 +- .../table-pagination.component.spec.ts | 2 +- .../table-row-actions.component.spec.ts | 2 +- .../table-search.component.spec.ts | 2 +- .../table-settings.component.spec.ts | 2 +- .../table-sort.component.spec.ts | 2 +- .../table/src/table.component.spec.ts | 2 +- .../view/src/view-data-source.spec.ts | 4 +--- .../view/src/view.component.spec.ts | 2 +- .../zvoove-components-demo/eslint.config.js | 1 + .../common/api-doc/api-doc-input.component.ts | 1 + .../api-doc/api-doc-method.component.ts | 1 + .../api-doc/api-doc-output.component.ts | 1 + .../api-doc/api-doc-property.component.ts | 1 + .../form-control-demo-card.component.ts | 2 +- 31 files changed, 63 insertions(+), 34 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 9cc4a38d..560b229f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -22,6 +22,7 @@ const baseTsLintConfig = { { type: ["attribute", "element"], prefix: "zv", + style: "camelCase", }, ], '@angular-eslint/no-conflicting-lifecycle': 'warn', diff --git a/package-lock.json b/package-lock.json index 5ac65e1c..676c9b12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "@angular/compiler-cli": "^21.2.5", "@angular/language-service": "^21.2.5", "@angular/localize": "^21.2.5", + "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", "@types/jasmine": "^6.0.0", "@types/jasminewd2": "^2.0.13", @@ -1734,6 +1735,27 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, "node_modules/@eslint/object-schema": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", diff --git a/package.json b/package.json index 16bb9a48..6ef73d35 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@angular/compiler-cli": "^21.2.5", "@angular/language-service": "^21.2.5", "@angular/localize": "^21.2.5", + "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", "@types/jasmine": "^6.0.0", "@types/jasminewd2": "^2.0.13", diff --git a/projects/components/action-button/src/action-button.component.spec.ts b/projects/components/action-button/src/action-button.component.spec.ts index 661e6996..3823166d 100644 --- a/projects/components/action-button/src/action-button.component.spec.ts +++ b/projects/components/action-button/src/action-button.component.spec.ts @@ -14,7 +14,7 @@ import { ZvButtonColors } from '@zvoove/components/core'; label `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvActionButtonComponent], }) export class TestComponent { diff --git a/projects/components/block-ui/src/block-ui.component.spec.ts b/projects/components/block-ui/src/block-ui.component.spec.ts index 53672b9a..24e19777 100644 --- a/projects/components/block-ui/src/block-ui.component.spec.ts +++ b/projects/components/block-ui/src/block-ui.component.spec.ts @@ -14,7 +14,7 @@ import { ZvBlockUiHarness } from './testing/block-ui.harness'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvBlockUi], }) export class TestComponent { diff --git a/projects/components/card/src/card.component.spec.ts b/projects/components/card/src/card.component.spec.ts index c81e82ce..01b52d36 100644 --- a/projects/components/card/src/card.component.spec.ts +++ b/projects/components/card/src/card.component.spec.ts @@ -41,7 +41,7 @@ import { ZvCardHarness } from './testing/card.harness'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvCardModule], }) export class TestDataSourceComponent { diff --git a/projects/components/date-time-input/src/date-time-input.component.spec.ts b/projects/components/date-time-input/src/date-time-input.component.spec.ts index 5c82bf62..c39a5ff8 100644 --- a/projects/components/date-time-input/src/date-time-input.component.spec.ts +++ b/projects/components/date-time-input/src/date-time-input.component.spec.ts @@ -689,7 +689,7 @@ function isValidDate(date: unknown) { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvDateTimeInput, MatDatepickerModule], providers: [ provideDateTimeAdapters(ZvNativeDateTimeAdapter, ZvNativeDateAdapter, ZvNativeTimeAdapter), @@ -716,7 +716,7 @@ export class ValueTestComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvDateTimeInput, MatDatepickerModule, FormsModule], providers: [ provideDateTimeAdapters(ZvNativeDateTimeAdapter, ZvNativeDateAdapter, ZvNativeTimeAdapter), @@ -739,7 +739,7 @@ export class InputsTestComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvDateTimeInput, MatDatepickerModule, ReactiveFormsModule], providers: [ provideDateTimeAdapters(ZvNativeDateTimeAdapter, ZvNativeDateAdapter, ZvNativeTimeAdapter), diff --git a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts index 2f3b208e..cb2aa37b 100644 --- a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts +++ b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts @@ -73,7 +73,7 @@ export class TestDialogWrapperDataSource implements IZvDialogWrapperDataSource { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvDialogWrapper], }) export class ZvDialogWrapperTestDialog { @@ -101,7 +101,7 @@ export class ZvDialogWrapperTestDialog { selector: 'zv-dialog-wrapper-test', template: ``, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvDialogWrapper], }) export class ZvDialogWrapperTestComponent { diff --git a/projects/components/file-input/src/file-input.component.spec.ts b/projects/components/file-input/src/file-input.component.spec.ts index d1b8616c..c32bab58 100644 --- a/projects/components/file-input/src/file-input.component.spec.ts +++ b/projects/components/file-input/src/file-input.component.spec.ts @@ -10,7 +10,7 @@ import { ZvFileInputHarness } from './testing/file-input.harness'; selector: 'zv-test-component', template: ` `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvFileInput], }) export class TestComponent { diff --git a/projects/components/flip-container/src/flip-container.component.spec.ts b/projects/components/flip-container/src/flip-container.component.spec.ts index 7b8074f5..6f5f0ead 100644 --- a/projects/components/flip-container/src/flip-container.component.spec.ts +++ b/projects/components/flip-container/src/flip-container.component.spec.ts @@ -13,7 +13,7 @@ import { ZvFlipContainerModule } from './flip-container.module'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvFlipContainerModule], }) export class TestComponent { diff --git a/projects/components/form-field/src/form-field.component.spec.ts b/projects/components/form-field/src/form-field.component.spec.ts index ef1af024..fdd136b9 100644 --- a/projects/components/form-field/src/form-field.component.spec.ts +++ b/projects/components/form-field/src/form-field.component.spec.ts @@ -59,7 +59,7 @@ class TestZvFormService extends BaseZvFormService { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, MatInputModule, ZvFormField], }) export class TestNoFormComponent { @@ -75,7 +75,7 @@ export class TestNoFormComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, MatInputModule, ZvFormField], }) export class TestNgModelComponent { @@ -97,7 +97,7 @@ export class TestNgModelComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ReactiveFormsModule, MatInputModule, ZvFormField], }) export class TestFormComponent { @@ -124,7 +124,7 @@ export class TestFormComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ReactiveFormsModule, MatCheckboxModule, ZvFormField, AsyncPipe], }) export class TestCheckboxComponent { diff --git a/projects/components/form/src/form.component.spec.ts b/projects/components/form/src/form.component.spec.ts index f38bcbf8..d40213ff 100644 --- a/projects/components/form/src/form.component.spec.ts +++ b/projects/components/form/src/form.component.spec.ts @@ -43,7 +43,7 @@ class TestZvFormService extends BaseZvFormService { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvForm], }) export class TestDataSourceComponent { diff --git a/projects/components/header/src/header.component.spec.ts b/projects/components/header/src/header.component.spec.ts index 403dbd72..ca1695ad 100644 --- a/projects/components/header/src/header.component.spec.ts +++ b/projects/components/header/src/header.component.spec.ts @@ -28,7 +28,7 @@ import { ZvHeaderHarness } from './testing/header.harness'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvHeaderModule, MatButtonModule], }) export class TestDataSourceComponent { diff --git a/projects/components/select/src/select.component.spec.ts b/projects/components/select/src/select.component.spec.ts index a30df2e0..e86cd1f1 100644 --- a/projects/components/select/src/select.component.spec.ts +++ b/projects/components/select/src/select.component.spec.ts @@ -139,7 +139,7 @@ function createZvSelect(options?: { dataSource?: ZvSelectDataSource; service?: Z `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, ReactiveFormsModule, ZvSelect], }) export class TestComponent implements OnDestroy { @@ -194,7 +194,7 @@ const ITEMS = { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, ReactiveFormsModule, ZvSelect, ZvSelectTriggerTemplate], }) export class TestMultipleComponent { @@ -213,7 +213,7 @@ export class TestMultipleComponent { selector: 'zv-test-value', template: ``, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, ReactiveFormsModule, ZvSelect], }) export class TestValueComponent { @@ -236,7 +236,7 @@ export class TestValueComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, ReactiveFormsModule, ZvSelect, ZvSelectTriggerTemplate, ZvSelectOptionTemplate], }) export class TestCustomTemplateComponent { @@ -253,7 +253,7 @@ export class TestCustomTemplateComponent { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvSelect, ZvFormField, MatLabel, FormsModule], }) export class TestWithFormFieldComponent { diff --git a/projects/components/table/src/directives/table.directives.ts b/projects/components/table/src/directives/table.directives.ts index 1f32cf77..14e5b945 100644 --- a/projects/components/table/src/directives/table.directives.ts +++ b/projects/components/table/src/directives/table.directives.ts @@ -13,6 +13,7 @@ export class ZvTableColumnTemplate {} export class ZvTableColumnHeaderTemplate {} @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'zv-table-column', standalone: true, }) @@ -55,6 +56,7 @@ export class ZvTableCustomSettingsTemplate {} export class ZvTableRowDetailTemplate {} @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'zv-table-row-detail', standalone: true, }) diff --git a/projects/components/table/src/subcomponents/table-actions.component.spec.ts b/projects/components/table/src/subcomponents/table-actions.component.spec.ts index bcb91df7..a22500b7 100644 --- a/projects/components/table/src/subcomponents/table-actions.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-actions.component.spec.ts @@ -19,7 +19,7 @@ import { ZvTableActionsComponent } from './table-actions.component'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableActionsComponent, MatIcon, MatIconButton, MatMenuTrigger], }) export class TestComponent { diff --git a/projects/components/table/src/subcomponents/table-header.component.spec.ts b/projects/components/table/src/subcomponents/table-header.component.spec.ts index 84f4ccb4..618d8207 100644 --- a/projects/components/table/src/subcomponents/table-header.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-header.component.spec.ts @@ -9,7 +9,7 @@ import { ZvTableHeaderComponent } from './table-header.component'; `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableHeaderComponent], }) export class TestComponent { diff --git a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts index da2747b1..90badf16 100644 --- a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts @@ -19,7 +19,7 @@ import { ZvTablePaginationComponent } from './table-pagination.component'; /> `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTablePaginationComponent], }) class PaginationTestComponent { diff --git a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts index f6980a87..0d6fc8e2 100644 --- a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts @@ -20,7 +20,7 @@ import { MatButtonHarness } from '@angular/material/button/testing'; /> `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableRowActionsComponent], }) export class TestComponent { diff --git a/projects/components/table/src/subcomponents/table-search.component.spec.ts b/projects/components/table/src/subcomponents/table-search.component.spec.ts index ed655027..21d71f91 100644 --- a/projects/components/table/src/subcomponents/table-search.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-search.component.spec.ts @@ -9,7 +9,7 @@ import { ZvTableSearchComponent } from './table-search.component'; selector: 'zv-test-component', template: ` `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableSearchComponent], }) export class TestComponent { diff --git a/projects/components/table/src/subcomponents/table-settings.component.spec.ts b/projects/components/table/src/subcomponents/table-settings.component.spec.ts index 0a6ff2c2..117533cc 100644 --- a/projects/components/table/src/subcomponents/table-settings.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-settings.component.spec.ts @@ -24,7 +24,7 @@ import { ZvTableSettingsComponent } from './table-settings.component'; /> `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableSettingsComponent], }) export class TestComponent { diff --git a/projects/components/table/src/subcomponents/table-sort.component.spec.ts b/projects/components/table/src/subcomponents/table-sort.component.spec.ts index 3c88a6ce..c939273a 100644 --- a/projects/components/table/src/subcomponents/table-sort.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-sort.component.spec.ts @@ -18,7 +18,7 @@ import { ZvTableSortComponent } from './table-sort.component'; /> `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableSortComponent], }) export class TestComponent { diff --git a/projects/components/table/src/table.component.spec.ts b/projects/components/table/src/table.component.spec.ts index ad87db26..ba35125d 100644 --- a/projects/components/table/src/table.component.spec.ts +++ b/projects/components/table/src/table.component.spec.ts @@ -123,7 +123,7 @@ function createColDef(data: { property?: string; header?: string; sortable?: boo `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [MatIconTestingModule, ZvTableModule], }) export class TestComponent { diff --git a/projects/components/view/src/view-data-source.spec.ts b/projects/components/view/src/view-data-source.spec.ts index 2afb86a4..d2c3e1ad 100644 --- a/projects/components/view/src/view-data-source.spec.ts +++ b/projects/components/view/src/view-data-source.spec.ts @@ -162,14 +162,12 @@ describe('ViewDataSource', () => { it('should cancel loadingSub', fakeAsync(() => { let loadFnCalled; - let loadingFn = () => of({}); const vds = new ZvViewDataSource({ loadTrigger$: of({}), - loadFn: loadingFn, + loadFn: () => timer(1000).pipe(tap(() => (loadFnCalled = false))), }); vds.connect(); expect(loadFnCalled).toBeUndefined(); - loadingFn = () => timer(1000).pipe(tap(() => (loadFnCalled = false))); vds.updateData(); vds.disconnect(); tick(1000); diff --git a/projects/components/view/src/view.component.spec.ts b/projects/components/view/src/view.component.spec.ts index b36879c1..cbd9a89a 100644 --- a/projects/components/view/src/view.component.spec.ts +++ b/projects/components/view/src/view.component.spec.ts @@ -25,7 +25,7 @@ class TestViewDataSource implements IZvViewDataSource { `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvView], }) export class TestDataSourceComponent { diff --git a/projects/zvoove-components-demo/eslint.config.js b/projects/zvoove-components-demo/eslint.config.js index 458be6c1..6922a49b 100644 --- a/projects/zvoove-components-demo/eslint.config.js +++ b/projects/zvoove-components-demo/eslint.config.js @@ -12,6 +12,7 @@ module.exports = tseslint.config( { type: ["element", "attribute"], prefix: "app", + style: "camelCase", }, ], "@angular-eslint/component-selector": [ diff --git a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-input.component.ts b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-input.component.ts index 59cf667e..3efadf95 100644 --- a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-input.component.ts +++ b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-input.component.ts @@ -1,6 +1,7 @@ import { Directive, Input } from '@angular/core'; @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'app-api-doc-input', standalone: true, }) diff --git a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-method.component.ts b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-method.component.ts index 7393a047..6f99986e 100644 --- a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-method.component.ts +++ b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-method.component.ts @@ -1,6 +1,7 @@ import { Directive, Input } from '@angular/core'; @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'app-api-doc-method', standalone: true, }) diff --git a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-output.component.ts b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-output.component.ts index 92753555..c13ccec6 100644 --- a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-output.component.ts +++ b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-output.component.ts @@ -1,6 +1,7 @@ import { Directive, Input } from '@angular/core'; @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'app-api-doc-output', standalone: true, }) diff --git a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-property.component.ts b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-property.component.ts index 96718bcc..bd4c9c8d 100644 --- a/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-property.component.ts +++ b/projects/zvoove-components-demo/src/app/common/api-doc/api-doc-property.component.ts @@ -1,6 +1,7 @@ import { Directive, Input } from '@angular/core'; @Directive({ + // eslint-disable-next-line @angular-eslint/directive-selector selector: 'app-api-doc-property', standalone: true, }) diff --git a/projects/zvoove-components-demo/src/app/common/form-control-card/form-control-demo-card.component.ts b/projects/zvoove-components-demo/src/app/common/form-control-card/form-control-demo-card.component.ts index 01b85c11..e94f17d5 100644 --- a/projects/zvoove-components-demo/src/app/common/form-control-card/form-control-demo-card.component.ts +++ b/projects/zvoove-components-demo/src/app/common/form-control-card/form-control-demo-card.component.ts @@ -10,7 +10,7 @@ import { AppCodeFilesComponent, CodeFiles } from '../code-files/code-files.compo templateUrl: './form-control-demo-card.component.html', styleUrls: ['./form-control-demo-card.component.scss'], // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, imports: [KeyValuePipe, MatCardModule, MatIconModule, JsonPipe, AppCodeFilesComponent], }) export class FormControlDemoCard { From f8db4ff7b8205594d80fb1bd209ffbfff952e70b Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 21:40:13 +0100 Subject: [PATCH 06/22] vitest --- .claude/settings.local.json | 10 + angular.json | 17 +- eslint.config.js | 17 - package-lock.json | 2715 ++++++----------- package.json | 19 +- .../src/action-button.component.spec.ts | 65 +- .../block-ui/src/block-ui.component.spec.ts | 38 +- .../card/src/card.component.spec.ts | 62 +- .../action-data-source.spec.ts | 52 +- .../native-date-time-adapter.spec.ts | 6 +- .../core/src/date/native-date-adapter.spec.ts | 16 +- .../core/src/time/native-time-adapter.spec.ts | 25 +- .../src/date-time-input.component.spec.ts | 76 +- .../src/time-input.directive.ts | 2 +- .../src/dialog-wrapper.component.spec.ts | 12 +- .../src/file-input.component.spec.ts | 13 +- .../src/flip-container.component.spec.ts | 66 +- .../form-base/src/form.service.spec.ts | 75 +- .../src/form-field.component.spec.ts | 192 +- .../form/src/form.component.spec.ts | 102 +- .../header/src/header.component.spec.ts | 48 +- projects/components/karma.conf.js | 43 - .../src/number-input.component.spec.ts | 4 +- projects/components/polyfills-test.ts | 1 - .../default-select-data-source.spec.ts | 244 +- .../defaults/default-select-service.spec.ts | 29 +- .../select/src/select.component.spec.ts | 338 +- .../components/select/src/select.component.ts | 2 +- .../select/src/select.module.spec.ts | 8 +- .../table/src/data/table-data-source.spec.ts | 83 +- .../table-actions.component.spec.ts | 8 +- .../table-data.component.spec.ts | 6 +- .../table-header.component.spec.ts | 88 +- .../table-pagination.component.spec.ts | 86 +- .../table-row-actions.component.spec.ts | 54 +- .../table-search.component.spec.ts | 119 +- .../table-settings.component.spec.ts | 97 +- .../table-sort.component.spec.ts | 15 +- .../table/src/table.component.spec.ts | 244 +- projects/components/test-setup.ts | 17 + projects/components/test.ts | 8 - projects/components/tsconfig.spec.json | 3 +- .../utils/src/auto-form-array.spec.ts | 6 +- .../utils/src/inject-destroy.spec.ts | 20 +- .../view/src/view-data-source.spec.ts | 44 +- .../view/src/view.component.spec.ts | 35 +- projects/zvoove-components-demo/karma.conf.js | 38 - projects/zvoove-components-demo/src/test.ts | 9 - .../zvoove-components-demo/tsconfig.spec.json | 3 +- 49 files changed, 2312 insertions(+), 2968 deletions(-) create mode 100644 .claude/settings.local.json delete mode 100644 projects/components/karma.conf.js delete mode 100644 projects/components/polyfills-test.ts create mode 100644 projects/components/test-setup.ts delete mode 100644 projects/components/test.ts delete mode 100644 projects/zvoove-components-demo/karma.conf.js delete mode 100644 projects/zvoove-components-demo/src/test.ts diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..44adfa84 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(npx vitest:*)", + "Bash(node_modules/.bin/vitest run:*)", + "Bash(export PATH=\"$HOME/.nvm/versions/node/v24.14.1/bin:$PATH\")", + "Bash(npx ng:*)" + ] + } +} diff --git a/angular.json b/angular.json index 948c4230..895d7e90 100644 --- a/angular.json +++ b/angular.json @@ -82,16 +82,7 @@ } }, "test": { - "builder": "@angular/build:karma", - "options": { - "main": "projects/zvoove-components-demo/src/test.ts", - "polyfills": ["projects/zvoove-components-demo/src/polyfills.ts"], - "tsConfig": "projects/zvoove-components-demo/tsconfig.spec.json", - "karmaConfig": "projects/zvoove-components-demo/karma.conf.js", - "assets": ["projects/zvoove-components-demo/src/favicon.ico", "projects/zvoove-components-demo/src/assets"], - "styles": ["projects/zvoove-components-demo/src/styles.scss"], - "scripts": [] - } + "builder": "@angular/build:unit-test" }, "lint": { "builder": "@angular-eslint/builder:lint", @@ -121,11 +112,11 @@ } }, "test": { - "builder": "@angular/build:karma", + "builder": "@angular/build:unit-test", "options": { - "polyfills": ["zone.js", "zone.js/testing", "projects/components/polyfills-test.ts"], "tsConfig": "projects/components/tsconfig.spec.json", - "karmaConfig": "projects/components/karma.conf.js" + "buildTarget": "components:build", + "setupFiles": ["projects/components/test-setup.ts"] } }, "lint": { diff --git a/eslint.config.js b/eslint.config.js index 560b229f..e00d45c6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,6 @@ const eslint = require("@eslint/js"); const tseslint = require("typescript-eslint"); const angular = require("angular-eslint"); -const jasmine = require("eslint-plugin-jasmine"); /** @type tseslint.ConfigWithExtends */ const baseTsLintConfig = { @@ -94,9 +93,6 @@ module.exports = tseslint.config( tsconfigRootDir: __dirname }, }, - plugins: { - jasmine: jasmine, - }, processor: angular.processInlineTemplates, rules: { ...baseTsLintConfig.rules, @@ -112,19 +108,6 @@ module.exports = tseslint.config( '@typescript-eslint/no-unsafe-return': 'off', // useful, but some false positives '@typescript-eslint/unbound-method': 'off', // would warn on form validators '@typescript-eslint/require-await': 'off', - - "jasmine/expect-single-argument": "error", - "jasmine/missing-expect": "error", - "jasmine/no-disabled-tests": "error", - "jasmine/no-focused-tests": "error", - "jasmine/no-pending-tests": "error", - "jasmine/no-promise-without-done-fail": "error", - "jasmine/no-spec-dupes": "error", - "jasmine/no-suite-callback-args": "error", - "jasmine/no-suite-dupes": "error", - "jasmine/no-unsafe-spy": "error", - "jasmine/prefer-jasmine-matcher": "error", - "jasmine/prefer-promise-strategies": "error", }, }, { diff --git a/package-lock.json b/package-lock.json index 676c9b12..ff00c2f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,29 +35,20 @@ "@angular/localize": "^21.2.5", "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", - "@types/jasmine": "^6.0.0", - "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^10.1.0", - "eslint-plugin-jasmine": "^4.2.2", "husky": "^9.1.7", "jasmine": "^6.1.0", - "jasmine-core": "^6.1.0", - "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.4.4", - "karma-chrome-launcher": "^3.2.0", - "karma-coverage-istanbul-reporter": "~3.0.3", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "^2.2.0", - "karma-time-stats-reporter": "^0.1.0", + "jsdom": "^29.0.1", "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", - "typescript-eslint": "^8.57.2" + "typescript-eslint": "^8.57.2", + "vitest": "^4.1.1" } }, "node_modules/@algolia/abtesting": { @@ -862,6 +853,67 @@ } } }, + "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": "7.0.4", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.4.tgz", + "integrity": "sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.7" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "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", @@ -1155,14 +1207,17 @@ "node": ">=6.9.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "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", - "engines": { - "node": ">=0.1.90" + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" } }, "node_modules/@cspotcode/source-map-support": { @@ -1189,6 +1244,146 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "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", @@ -1780,6 +1975,24 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "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", @@ -4255,13 +4468,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -4387,6 +4593,17 @@ "@types/node": "*" } }, + "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/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -4397,15 +4614,12 @@ "@types/node": "*" } }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "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", - "dependencies": { - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@types/esrecurse": { "version": "4.3.1", @@ -4453,23 +4667,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/jasmine": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-6.0.0.tgz", - "integrity": "sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jasminewd2": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.13.tgz", - "integrity": "sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jasmine": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4522,16 +4719,6 @@ "@types/node": "*" } }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", @@ -4778,83 +4965,213 @@ "vite": "^6.0.0 || ^7.0.0" } }, - "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==", + "node_modules/@vitest/expect": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz", + "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", "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==", "license": "MIT", "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/@vitest/mocker": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz", + "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@vitest/spy": "4.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@vitest/mocker/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", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz", + "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.0" + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/@vitest/runner": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.1.tgz", + "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 14" + "dependencies": { + "@vitest/utils": "4.1.1", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/ajv": { + "node_modules/@vitest/snapshot": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.1.tgz", + "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "@vitest/utils": "4.1.1", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz", + "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz", + "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "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==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", @@ -4973,46 +5290,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5030,6 +5307,16 @@ "node": ">= 0.4" } }, + "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/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -5050,16 +5337,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/baseline-browser-mapping": { "version": "2.10.10", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", @@ -5094,17 +5371,14 @@ "node": ">=18.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "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", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "require-from-string": "^2.0.2" } }, "node_modules/body-parser": { @@ -5151,19 +5425,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -5314,52 +5575,14 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=18" } }, "node_modules/chardet": { @@ -5542,33 +5765,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -5576,30 +5772,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -5624,127 +5796,42 @@ "dev": true, "license": "MIT" }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, + "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==", "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "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==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "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==", "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "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==", - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">= 0.6" } }, "node_modules/cookie-signature": { @@ -6014,6 +6101,20 @@ "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", @@ -6027,21 +6128,18 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "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": ">=4.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/debug": { @@ -6061,6 +6159,13 @@ } } }, + "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/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6068,19 +6173,6 @@ "dev": true, "license": "MIT" }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6100,17 +6192,6 @@ "node": ">=4" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -6122,13 +6203,6 @@ "node": ">=8" } }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" - }, "node_modules/diff": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", @@ -6139,19 +6213,6 @@ "node": ">=0.3.1" } }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -6254,101 +6315,6 @@ "node": ">= 0.8" } }, - "node_modules/engine.io": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", - "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "@types/ws": "^8.5.12", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", - "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -6424,6 +6390,13 @@ "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", @@ -6563,17 +6536,6 @@ } } }, - "node_modules/eslint-plugin-jasmine": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.2.2.tgz", - "integrity": "sha512-nALbewRk63uz28UGNhUTJyd6GofXxVNFpWFNAwr9ySc6kpSRIoO4suwZqIYz3cfJmCacilmjp7+1Ocjr7zRagA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8", - "npm": ">=6" - } - }, "node_modules/eslint-scope": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", @@ -6746,13 +6708,6 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -6776,6 +6731,16 @@ "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", @@ -6845,13 +6810,6 @@ "express": ">= 4.11" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6919,19 +6877,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -7021,27 +6966,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -7060,21 +6984,6 @@ "node": ">= 0.8" } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -7280,16 +7189,6 @@ "dev": true, "license": "ISC" }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -7302,22 +7201,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "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", @@ -7372,12 +7255,18 @@ "node": "20 || >=22" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "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" + "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", @@ -7439,21 +7328,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -7625,23 +7499,10 @@ "node": ">= 0.10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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", "engines": { @@ -7689,15 +7550,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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", - "engines": { - "node": ">=0.12.0" - } + "license": "MIT" }, "node_modules/is-promise": { "version": "4.0.0", @@ -7705,25 +7563,6 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -7756,19 +7595,6 @@ "dev": true, "license": "MIT" }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7803,110 +7629,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/istanbul-lib-source-maps/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/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jasmine": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-6.1.0.tgz", @@ -7929,16 +7651,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "colors": "1.4.0" - } - }, "node_modules/jasmine/node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -7952,651 +7664,167 @@ }, "engines": { "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/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-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "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/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/mattlewis92" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.2.0.tgz", - "integrity": "sha512-J0laEC43Oy2RdR5V5R3bqmdo7yRIYySq6XHKbA+e5iSAgLjhR1oICLGeSREPlJXpeyNcdJf3J17YcdhD0mRssQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0 || ^6.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma-time-stats-reporter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/karma-time-stats-reporter/-/karma-time-stats-reporter-0.1.0.tgz", - "integrity": "sha512-7oCfFIqFs8D3xcDBfP75taNlmiSe9KeWfi+VChy31EHG+JL7Hf9B58Opyb5uG0aeKdsXfLWptG3KTt0duwCzjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "columnify": "^1.5.4" - } - }, - "node_modules/karma/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/karma/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/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/karma/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/karma/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/karma/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/karma/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/karma/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/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/karma/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "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", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "node_modules/karma/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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/karma/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/jsdom": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz", + "integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==", "dev": true, "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.0.1", + "@asamuzakjp/dom-selector": "^7.0.3", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.1", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.7", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.24.5", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, "engines": { - "node": ">=8.6" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/karma/node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "node_modules/jsdom/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": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "20 || >=22" } }, - "node_modules/karma/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "node_modules/jsdom/node_modules/undici": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", + "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", "dev": true, "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=20.18.1" } }, - "node_modules/karma/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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", - "dependencies": { - "picomatch": "^2.2.1" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=8.10.0" + "node": ">=6" } }, - "node_modules/karma/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==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/karma/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==", + "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", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/karma/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "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==", + "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": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } + "license": "BSD-2-Clause" }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } + "license": "MIT" }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "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==", + "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, - "license": "ISC", - "engines": { - "node": ">=10" - } + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", @@ -8871,13 +8099,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", @@ -9009,23 +8230,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -9045,22 +8249,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -9101,6 +8289,13 @@ "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", @@ -9122,19 +8317,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -9188,16 +8370,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -9658,16 +8830,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-bundled": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", @@ -9805,6 +8967,17 @@ "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", @@ -10129,6 +9302,13 @@ "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", @@ -10154,6 +9334,7 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=6" } @@ -10338,23 +9519,6 @@ "license": "MIT", "optional": true }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.9" - } - }, "node_modules/qs": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", @@ -10447,13 +9611,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -10487,23 +9644,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rolldown": { "version": "1.0.0-rc.4", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.4.tgz", @@ -10646,24 +9786,6 @@ "dev": true, "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -10732,6 +9854,19 @@ "node": ">=11.0.0" } }, + "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", @@ -10891,6 +10026,13 @@ "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", @@ -10962,97 +10104,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socket.io": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", - "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.4.1", - "ws": "~8.18.3" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -11161,6 +10212,13 @@ "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", @@ -11170,6 +10228,13 @@ "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", @@ -11182,21 +10247,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -11283,18 +10333,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/tar": { "version": "7.5.13", @@ -11367,6 +10411,13 @@ "safe-buffer": "~5.1.0" } }, + "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", @@ -11394,29 +10445,36 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "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.14" + "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "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": { - "is-number": "^7.0.0" + "tldts-core": "^7.0.27" }, - "engines": { - "node": ">=8.0" + "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", @@ -11426,6 +10484,42 @@ "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/tr46/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/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -11569,33 +10663,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/undici": { "version": "7.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", @@ -11613,16 +10680,6 @@ "dev": true, "license": "MIT" }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11700,16 +10757,6 @@ "dev": true, "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -11811,14 +10858,99 @@ } } }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "node_modules/vitest": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.1.tgz", + "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.1", + "@vitest/mocker": "4.1.1", + "@vitest/pretty-format": "4.1.1", + "@vitest/runner": "4.1.1", + "@vitest/snapshot": "4.1.1", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "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", + "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.1", + "@vitest/browser-preview": "4.1.1", + "@vitest/browser-webdriverio": "4.1.1", + "@vitest/ui": "4.1.1", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.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": ">=0.10.0" + "node": ">=18" } }, "node_modules/watchpack": { @@ -11835,16 +10967,6 @@ "node": ">=10.13.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -11853,6 +10975,41 @@ "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", @@ -11869,6 +11026,23 @@ "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/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -11968,28 +11142,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xhr2": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", @@ -11999,6 +11151,23 @@ "node": ">= 6" } }, + "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/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 6ef73d35..7c476ee6 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,11 @@ "build:components-lib": "ng build components --configuration production", "build:components-schematics": "tsc -p projects/components/tsconfig.schematics.json", "test": "ng test", - "test:components": "ng test components --watch=false --no-progress --browsers=ChromeHeadlessNoSandbox", + "test:components": "ng test components --watch=false --no-progress", "test:schematics": "npm run build:components-schematics && jasmine dist/components/schematics/**/*_spec.js", "lint": "ng lint", "commit": "git-cz", - "release:test": "ng lint components && ng test components --watch false", + "release:test": "ng lint components && ng test components --watch=false", "copy:schemas": "copyfiles -u 3 projects/components/schematics/*/schema.json dist/components/schematics/", "copy:files": "copyfiles -u 3 projects/components/schematics/*/files/** dist/components/schematics/", "copy:collection": "copyfiles -f projects/components/schematics/migrations.json dist/components/schematics/", @@ -51,29 +51,20 @@ "@angular/localize": "^21.2.5", "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", - "@types/jasmine": "^6.0.0", - "@types/jasminewd2": "^2.0.13", "@types/node": "^24.10.12", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^10.1.0", - "eslint-plugin-jasmine": "^4.2.2", "husky": "^9.1.7", "jasmine": "^6.1.0", - "jasmine-core": "^6.1.0", - "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.4.4", - "karma-chrome-launcher": "^3.2.0", - "karma-coverage-istanbul-reporter": "~3.0.3", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "^2.2.0", - "karma-time-stats-reporter": "^0.1.0", + "jsdom": "^29.0.1", "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", "prettier": "^3.8.1", "ts-node": "^10.9.2", "typescript": "~5.9.3", - "typescript-eslint": "^8.57.2" + "typescript-eslint": "^8.57.2", + "vitest": "^4.1.1" }, "lint-staged": { "*.{ts,json,scss,html}": "prettier --write" diff --git a/projects/components/action-button/src/action-button.component.spec.ts b/projects/components/action-button/src/action-button.component.spec.ts index 3823166d..a30fc18a 100644 --- a/projects/components/action-button/src/action-button.component.spec.ts +++ b/projects/components/action-button/src/action-button.component.spec.ts @@ -1,7 +1,8 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { tap, timer } from 'rxjs'; import { ZvActionButtonDataSource } from './action-button-data-source'; import { ZvActionButtonComponent } from './action-button.component'; @@ -41,6 +42,7 @@ describe('ZvActionButton', () => { let harness: ZvActionButtonHarness; beforeEach(async () => { + vi.useFakeTimers(); TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); @@ -51,44 +53,49 @@ describe('ZvActionButton', () => { harness = await loader.getHarness(ZvActionButtonHarness); }); + afterEach(() => { + vi.useRealTimers(); + }); + it('should create', () => { expect(component).toBeDefined(); }); it('should call dataSource.execute() on click', async () => { - expect(component.actionFnCalled).toBeFalse(); + expect(component.actionFnCalled).toBe(false); await harness.click(); - expect(component.actionFnCalled).toBeTrue(); + await vi.advanceTimersByTimeAsync(100); + expect(component.actionFnCalled).toBe(true); }); - it('should be blocked while loading', fakeAsync(async () => { + it('should be blocked while loading', async () => { await harness.click(); - tick(1); - expect(component.dataSource.showLoading()).toBeTrue(); - expect(await harness.isLoading()).toBeTrue(); - })); + await vi.advanceTimersByTimeAsync(1); + expect(component.dataSource.showLoading()).toBe(true); + expect(await harness.isLoading()).toBe(true); + }); - it('should be disabled while loading', fakeAsync(async () => { + it('should be disabled while loading', async () => { await harness.click(); - tick(1); - expect(component.dataSource.showLoading()).toBeTrue(); - expect(await harness.isDisabled()).toBeTrue(); - })); + await vi.advanceTimersByTimeAsync(1); + expect(component.dataSource.showLoading()).toBe(true); + expect(await harness.isDisabled()).toBe(true); + }); it('should respect disabled property', async () => { - expect(await harness.isDisabled()).toBeFalse(); + expect(await harness.isDisabled()).toBe(false); component.isDisabled.set(true); - expect(await harness.isDisabled()).toBeTrue(); + expect(await harness.isDisabled()).toBe(true); component.isDisabled.set(false); - expect(await harness.isDisabled()).toBeFalse(); + expect(await harness.isDisabled()).toBe(false); }); it('should respect color property', async () => { - expect(await harness.hasClass('mat-primary')).toBeTrue(); + expect(await harness.hasClass('mat-primary')).toBe(true); component.color.set('accent'); - expect(await harness.hasClass('mat-accent')).toBeTrue(); + expect(await harness.hasClass('mat-accent')).toBe(true); component.color.set('warn'); - expect(await harness.hasClass('mat-warn')).toBeTrue(); + expect(await harness.hasClass('mat-warn')).toBe(true); }); it('should show icon', async () => { @@ -100,23 +107,23 @@ describe('ZvActionButton', () => { expect(buttonContent).toContain('label'); }); - it('should show success icon for 2 seconds', fakeAsync(async () => { + it('should show success icon for 2 seconds', async () => { await harness.click(); - tick(100); - expect(component.dataSource.showLoading()).toBeFalse(); - expect(component.dataSource.showSuccess()).toBeTrue(); + await vi.advanceTimersByTimeAsync(100); + expect(component.dataSource.showLoading()).toBe(false); + expect(component.dataSource.showSuccess()).toBe(true); expect(await harness.getIcon()).toBe('check_circle'); - tick(2000); - expect(component.dataSource.showSuccess()).toBeFalse(); + await vi.advanceTimersByTimeAsync(2000); + expect(component.dataSource.showSuccess()).toBe(false); expect(await harness.getIcon()).toBe('home'); - })); + }); - it('should show error message', fakeAsync(async () => { + it('should show error message', async () => { component.throwError = new Error('action failed'); await harness.click(); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(await harness.getIcon()).toBe('error'); expect(await harness.getErrorMessage()).toBe(component.throwError.message); - })); + }); }); diff --git a/projects/components/block-ui/src/block-ui.component.spec.ts b/projects/components/block-ui/src/block-ui.component.spec.ts index 24e19777..629e4665 100644 --- a/projects/components/block-ui/src/block-ui.component.spec.ts +++ b/projects/components/block-ui/src/block-ui.component.spec.ts @@ -1,7 +1,7 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { ZvBlockUi } from './block-ui.component'; import { ZvBlockUiHarness } from './testing/block-ui.harness'; @@ -9,7 +9,7 @@ import { ZvBlockUiHarness } from './testing/block-ui.harness'; @Component({ selector: 'zv-test-component', template: ` - +
test text
`, @@ -18,8 +18,8 @@ import { ZvBlockUiHarness } from './testing/block-ui.harness'; imports: [ZvBlockUi], }) export class TestComponent { - public blocked = false; - public spinnerText = ''; + public blocked = signal(false); + public spinnerText = signal(''); } describe('ZvBlockUi', () => { @@ -35,6 +35,7 @@ describe('ZvBlockUi', () => { fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; + fixture.autoDetectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); blockui = await loader.getHarness(ZvBlockUiHarness); }); @@ -43,38 +44,39 @@ describe('ZvBlockUi', () => { expect(component).toBeDefined(); }); - it('should show ng-content', waitForAsync(() => { + it('should show ng-content', async () => { const contentDebugEl = fixture.debugElement.query(By.css('#content')); expect(contentDebugEl).not.toBe(null); expect(contentDebugEl.nativeElement.textContent).toBe('test text'); - })); + }); it('should not display spinner when not blocked', async () => { - component.blocked = false; + component.blocked.set(false); + fixture.detectChanges(); - expect(await blockui.isBlocked()).toBeFalse(); + expect(await blockui.isBlocked()).toBe(false); expect(await blockui.getSpinnerText()).toBe(null); expect(await blockui.getSpinnerDiameter()).toBe(0); expect(await blockui.isClickthrough()).toBe(false); }); it('should display spinner when blocked', async () => { - component.blocked = true; - const div = await blockui.getContentDiv(); - const minDimension = Math.min(await div!.getProperty('offsetWidth'), await div!.getProperty('offsetHeight')); - const expectedDiameter = Math.max(Math.min(minDimension, 100), 20); + component.blocked.set(true); + fixture.detectChanges(); - expect(await blockui.isBlocked()).toBeTrue(); + expect(await blockui.isBlocked()).toBe(true); expect(await blockui.getSpinnerText()).toBe(null); - expect(await blockui.getSpinnerDiameter()).toBe(expectedDiameter); + // In jsdom, rendered dimensions are always 0, so check the component's calculated diameter instead + expect(fixture.debugElement.children[0].componentInstance.spinnerDiameter()).toBe(20); expect(await blockui.isClickthrough()).toBe(false); }); it('should display spinner text when provided', async () => { - component.blocked = true; - component.spinnerText = 'spinner text'; + component.blocked.set(true); + component.spinnerText.set('spinner text'); + fixture.detectChanges(); - expect(await blockui.isBlocked()).toBeTrue(); + expect(await blockui.isBlocked()).toBe(true); expect(await blockui.getSpinnerText()).toBe('spinner text'); expect(await blockui.isClickthrough()).toBe(false); }); diff --git a/projects/components/card/src/card.component.spec.ts b/projects/components/card/src/card.component.spec.ts index 01b52d36..c2991576 100644 --- a/projects/components/card/src/card.component.spec.ts +++ b/projects/components/card/src/card.component.spec.ts @@ -1,6 +1,6 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, signal, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatButtonModule } from '@angular/material/button'; import { ZvHeaderHarness } from '@zvoove/components/header/src/testing/header.harness'; @@ -11,29 +11,29 @@ import { ZvCardHarness } from './testing/card.harness'; @Component({ selector: 'zv-test-component', template: ` - + - @if (addCaptionTemplate) { + @if (addCaptionTemplate()) {

customCaption

}
- @if (addDescriptionTemplate) { + @if (addDescriptionTemplate()) { customDescription } - @if (addTopButton) { + @if (addTopButton()) { } - @if (addFooterTemplate) { + @if (addFooterTemplate()) { testFooter } - @if (addCardActionButton) { + @if (addCardActionButton()) { } @@ -45,13 +45,13 @@ import { ZvCardHarness } from './testing/card.harness'; imports: [ZvCardModule], }) export class TestDataSourceComponent { - public caption: string; - public description: string; - public addTopButton = false; - public addCardActionButton = false; - public addCaptionTemplate = false; - public addDescriptionTemplate = false; - public addFooterTemplate = false; + public caption = signal(undefined); + public description = signal(undefined); + public addTopButton = signal(false); + public addCardActionButton = signal(false); + public addCaptionTemplate = signal(false); + public addDescriptionTemplate = signal(false); + public addFooterTemplate = signal(false); @ViewChild(ZvCard) headerComponent: ZvCard; } @@ -67,6 +67,7 @@ describe('ZvCard', () => { }).compileComponents(); fixture = TestBed.createComponent(TestDataSourceComponent); component = fixture.componentInstance; + fixture.autoDetectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); card = await loader.getHarness(ZvCardHarness); @@ -76,14 +77,16 @@ describe('ZvCard', () => { it('should show caption text', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.caption = 'foo'; + component.caption.set('foo'); + fixture.detectChanges(); expect(await header.getCaptionText()).toBe('foo'); }); it('should show caption template', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.addCaptionTemplate = true; + component.addCaptionTemplate.set(true); + fixture.detectChanges(); const nodes = await header.getCaptionTemplateNodes(); expect(nodes.length).toEqual(1); @@ -94,10 +97,12 @@ describe('ZvCard', () => { it('should show caption text when input and template are set at the same time', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.caption = 'foo'; + component.caption.set('foo'); + fixture.detectChanges(); expect(await header.getCaptionText()).toBeTruthy(); - component.addCaptionTemplate = true; + component.addCaptionTemplate.set(true); + fixture.detectChanges(); expect(await header.getCaptionText()).toBeTruthy(); const nodes = await header.getCaptionTemplateNodes(); expect(nodes.length).toEqual(0); @@ -106,14 +111,16 @@ describe('ZvCard', () => { it('should show description text', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.description = 'bar'; + component.description.set('bar'); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBe('bar'); }); it('should show description template', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.addDescriptionTemplate = true; + component.addDescriptionTemplate.set(true); + fixture.detectChanges(); const nodes = await header.getDescriptionTemplateNodes(); expect(nodes.length).toEqual(1); @@ -124,10 +131,12 @@ describe('ZvCard', () => { it('should show description text when input and template are set at the same time', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.description = 'foo'; + component.description.set('foo'); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBeTruthy(); - component.addDescriptionTemplate = true; + component.addDescriptionTemplate.set(true); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBeTruthy(); const nodes = await header.getDescriptionTemplateNodes(); expect(nodes.length).toEqual(0); @@ -137,7 +146,8 @@ describe('ZvCard', () => { let nodes = await header.getActionTemplateNodes(); expect(nodes.length).toBe(0); - component.addTopButton = true; + component.addTopButton.set(true); + fixture.detectChanges(); nodes = await header.getActionTemplateNodes(); expect(nodes.length).toBe(1); @@ -150,7 +160,8 @@ describe('ZvCard', () => { let nodes = await card.getActionTemplateNodes(); expect(nodes.length).toBe(0); - component.addCardActionButton = true; + component.addCardActionButton.set(true); + fixture.detectChanges(); nodes = await card.getActionTemplateNodes(); expect(nodes.length).toBe(1); expect(await nodes[0].text()).toEqual('testActionButton'); @@ -160,7 +171,8 @@ describe('ZvCard', () => { let nodes = await card.getFooterTemplateNodes(); expect(nodes.length).toBe(0); - component.addFooterTemplate = true; + component.addFooterTemplate.set(true); + fixture.detectChanges(); nodes = await card.getFooterTemplateNodes(); expect(nodes.length).toBe(1); expect(await nodes[0].text()).toEqual('testFooter'); diff --git a/projects/components/core/src/action-data-source/action-data-source.spec.ts b/projects/components/core/src/action-data-source/action-data-source.spec.ts index 6ad6a468..30514e64 100644 --- a/projects/components/core/src/action-data-source/action-data-source.spec.ts +++ b/projects/components/core/src/action-data-source/action-data-source.spec.ts @@ -1,4 +1,5 @@ -import { fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { switchMap, throwError, timer } from 'rxjs'; import { ZvActionDataSource } from './action-data-source'; @@ -6,9 +7,19 @@ describe('ActionDataSource', () => { beforeAll(() => { TestBed.configureTestingModule({}); }); - it('should set properties correctly', fakeAsync(() => { + + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should set properties correctly', async () => { + let dataSource: ZvActionDataSource; TestBed.runInInjectionContext(() => { - const dataSource = new ZvActionDataSource({ actionFn: () => timer(1) }); + dataSource = new ZvActionDataSource({ actionFn: () => timer(1) }); expect(dataSource.error()).toBe(null); expect(dataSource.isLoading()).toBe(false); expect(dataSource.hasError()).toBe(false); @@ -19,19 +30,20 @@ describe('ActionDataSource', () => { expect(dataSource.isLoading()).toBe(true); expect(dataSource.hasError()).toBe(false); expect(dataSource.succeeded()).toBe(false); - - tick(1); - expect(dataSource.error()).toBe(null); - expect(dataSource.isLoading()).toBe(false); - expect(dataSource.hasError()).toBe(false); - expect(dataSource.succeeded()).toBe(true); }); - })); - it('should set error correctly', fakeAsync(() => { + await vi.advanceTimersByTimeAsync(1); + expect(dataSource.error()).toBe(null); + expect(dataSource.isLoading()).toBe(false); + expect(dataSource.hasError()).toBe(false); + expect(dataSource.succeeded()).toBe(true); + }); + + it('should set error correctly', async () => { + const error = new Error('action failed'); + let dataSource: ZvActionDataSource; TestBed.runInInjectionContext(() => { - const error = new Error('action failed'); - const dataSource = new ZvActionDataSource({ actionFn: () => timer(1).pipe(switchMap(() => throwError(() => error))) }); + dataSource = new ZvActionDataSource({ actionFn: () => timer(1).pipe(switchMap(() => throwError(() => error))) }); expect(dataSource.error()).toBe(null); expect(dataSource.isLoading()).toBe(false); expect(dataSource.hasError()).toBe(false); @@ -42,12 +54,12 @@ describe('ActionDataSource', () => { expect(dataSource.isLoading()).toBe(true); expect(dataSource.hasError()).toBe(false); expect(dataSource.succeeded()).toBe(false); - - tick(1); - expect(dataSource.error()).toBe(error); - expect(dataSource.isLoading()).toBe(false); - expect(dataSource.hasError()).toBe(true); - expect(dataSource.succeeded()).toBe(false); }); - })); + + await vi.advanceTimersByTimeAsync(1); + expect(dataSource.error()).toBe(error); + expect(dataSource.isLoading()).toBe(false); + expect(dataSource.hasError()).toBe(true); + expect(dataSource.succeeded()).toBe(false); + }); }); diff --git a/projects/components/core/src/date-time/native-date-time-adapter.spec.ts b/projects/components/core/src/date-time/native-date-time-adapter.spec.ts index 647ae0e7..c3cb76f8 100644 --- a/projects/components/core/src/date-time/native-date-time-adapter.spec.ts +++ b/projects/components/core/src/date-time/native-date-time-adapter.spec.ts @@ -1,4 +1,4 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; +import { TestBed, inject } from '@angular/core/testing'; import { ZvNativeDateAdapter } from '../date/native-date-adapter'; import { ZV_NATIVE_DATE_FORMATS } from '../date/native-date-formats'; import { provideDateTimeFormats, provideDateTimeAdapters } from '../date-time-providers'; @@ -10,14 +10,14 @@ import { ZvNativeDateTimeAdapter } from './native-date-time-adapter'; describe('ZvNativeDateTimeAdapter', () => { let adapter: ZvNativeDateTimeAdapter; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ providers: [ provideDateTimeFormats(ZV_NATIVE_DATE_FORMATS, ZV_NATIVE_TIME_FORMATS), provideDateTimeAdapters(ZvNativeDateTimeAdapter, ZvNativeDateAdapter, ZvNativeTimeAdapter), ], }).compileComponents(); - })); + }); beforeEach(inject([ZvDateTimeAdapter], (dateAdapter: ZvNativeDateTimeAdapter) => { adapter = dateAdapter; diff --git a/projects/components/core/src/date/native-date-adapter.spec.ts b/projects/components/core/src/date/native-date-adapter.spec.ts index 148987b3..faae32a7 100644 --- a/projects/components/core/src/date/native-date-adapter.spec.ts +++ b/projects/components/core/src/date/native-date-adapter.spec.ts @@ -1,16 +1,16 @@ import { LOCALE_ID } from '@angular/core'; -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; +import { TestBed, inject } from '@angular/core/testing'; import { ZvDateAdapter } from './date-adapter'; import { ZvNativeDateAdapter } from './native-date-adapter'; describe('ZvNativeDateAdapter', () => { let adapter: ZvNativeDateAdapter; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ providers: [{ provide: ZvDateAdapter, useClass: ZvNativeDateAdapter }], }).compileComponents(); - })); + }); beforeEach(inject([ZvDateAdapter], (dateAdapter: ZvNativeDateAdapter) => { adapter = dateAdapter; @@ -38,10 +38,8 @@ describe('ZvNativeDateAdapter', () => { it('should parse invalid value as invalid', () => { const d = adapter.parse('hello'); expect(d).not.toBeNull(); - expect(adapter.isDateInstance(d)).withContext('Expected string to have been fed through Date.parse').toBe(true); - expect(adapter.isValid(d as Date)) - .withContext('Expected to parse as "invalid date" object') - .toBe(false); + expect(adapter.isDateInstance(d), 'Expected string to have been fed through Date.parse').toBe(true); + expect(adapter.isValid(d as Date), 'Expected to parse as "invalid date" object').toBe(false); }); it('should return localized format example', () => { @@ -52,14 +50,14 @@ describe('ZvNativeDateAdapter', () => { describe('ZvNativeDateAdapter with LOCALE_ID override', () => { let adapter: ZvNativeDateAdapter; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ providers: [ { provide: ZvDateAdapter, useClass: ZvNativeDateAdapter }, { provide: LOCALE_ID, useValue: 'da-DK' }, ], }).compileComponents(); - })); + }); beforeEach(inject([ZvDateAdapter], (dateAdapter: ZvNativeDateAdapter) => { adapter = dateAdapter; diff --git a/projects/components/core/src/time/native-time-adapter.spec.ts b/projects/components/core/src/time/native-time-adapter.spec.ts index 0b7e5a2e..db467ca1 100644 --- a/projects/components/core/src/time/native-time-adapter.spec.ts +++ b/projects/components/core/src/time/native-time-adapter.spec.ts @@ -1,5 +1,5 @@ import { LOCALE_ID } from '@angular/core'; -import { inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { inject, TestBed } from '@angular/core/testing'; import { Time } from '../time/time'; import { ZvNativeTimeAdapter } from './native-time-adapter'; import { ZvTimeAdapter } from './time-adapter'; @@ -12,24 +12,25 @@ describe('ZvNativeTimeAdapter', () => { let adapter: ZvNativeTimeAdapter; let assertValidTime: (d: Time | null, valid: boolean) => void; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ providers: [ { provide: ZvTimeAdapter, useClass: ZvNativeTimeAdapter }, { provide: LOCALE_ID, useValue: 'de-DE' }, ], }).compileComponents(); - })); + }); beforeEach(inject([ZvTimeAdapter], (timeAdapter: ZvNativeTimeAdapter) => { adapter = timeAdapter; assertValidTime = (t: Time | null, valid: boolean) => { // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string - expect(adapter.isTimeInstance(t)).not.withContext(`Expected ${t} to be a time instance`).toBeNull(); - expect(adapter.isValid(t!)) - .withContext(`Expected ${JSON.stringify(t)} to be ${valid ? 'valid' : 'invalid'}, but ` + `was ${valid ? 'invalid' : 'valid'}`) - .toBe(valid); + expect(adapter.isTimeInstance(t), `Expected ${t} to be a time instance`).not.toBeNull(); + expect( + adapter.isValid(t!), + `Expected ${JSON.stringify(t)} to be ${valid ? 'valid' : 'invalid'}, but ` + `was ${valid ? 'invalid' : 'valid'}` + ).toBe(valid); }; })); @@ -72,10 +73,8 @@ describe('ZvNativeTimeAdapter', () => { it('should parse invalid value as invalid', () => { const t = adapter.parse('hello'); expect(t).not.toBeNull(); - expect(adapter.isTimeInstance(t)).withContext('Expected string to have been fed through Time.parse').toBe(true); - expect(adapter.isValid(t as Time)) - .withContext('Expected to parse as "invalid Time" object') - .toBe(false); + expect(adapter.isTimeInstance(t), 'Expected string to have been fed through Time.parse').toBe(true); + expect(adapter.isValid(t as Time), 'Expected to parse as "invalid Time" object').toBe(false); }); it('should format as 24 hour format', () => { @@ -173,14 +172,14 @@ describe('ZvNativeTimeAdapter', () => { describe('ZvNativeTimeAdapter with LOCALE_ID override', () => { let adapter: ZvNativeTimeAdapter; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ providers: [ { provide: ZvTimeAdapter, useClass: ZvNativeTimeAdapter }, { provide: LOCALE_ID, useValue: 'en-US' }, ], }).compileComponents(); - })); + }); beforeEach(inject([ZvTimeAdapter], (timeAdapter: ZvNativeTimeAdapter) => { adapter = timeAdapter; diff --git a/projects/components/date-time-input/src/date-time-input.component.spec.ts b/projects/components/date-time-input/src/date-time-input.component.spec.ts index c39a5ff8..93e51f0a 100644 --- a/projects/components/date-time-input/src/date-time-input.component.spec.ts +++ b/projects/components/date-time-input/src/date-time-input.component.spec.ts @@ -2,7 +2,7 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HarnessLoader, TestKey } from '@angular/cdk/testing'; -import { ChangeDetectionStrategy, Component, LOCALE_ID, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, LOCALE_ID, signal, ViewChild } from '@angular/core'; import { FormControl, FormsModule, NgModel, ReactiveFormsModule } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; import { MatDatepickerInput, MatDatepickerModule } from '@angular/material/datepicker'; @@ -57,13 +57,15 @@ describe('ZvDateTimeInput', () => { expect(await timeInput.isDisabled()).toEqual(false); expect(await host.getAttribute('aria-disabled')).toBe('false'); - fixture.componentInstance.disabled = true; + fixture.componentInstance.disabled.set(true); + fixture.detectChanges(); expect(await dateInput.isDisabled()).toEqual(true); expect(await timeInput.isDisabled()).toEqual(true); expect(await host.getAttribute('aria-disabled')).toBe('true'); - fixture.componentInstance.disabled = false; + fixture.componentInstance.disabled.set(false); + fixture.detectChanges(); expect(await dateInput.isDisabled()).toEqual(false); expect(await timeInput.isDisabled()).toEqual(false); @@ -79,6 +81,7 @@ describe('ZvDateTimeInput', () => { expect(await host.getAttribute('aria-disabled')).toBe('false'); cmp.setDisabledState(true); + fixture.detectChanges(); expect(cmp.disabled).toBe(true); expect(await dateInput.isDisabled()).toEqual(true); @@ -86,6 +89,7 @@ describe('ZvDateTimeInput', () => { expect(await host.getAttribute('aria-disabled')).toBe('true'); cmp.setDisabledState(false); + fixture.detectChanges(); expect(cmp.disabled).toBe(false); expect(await dateInput.isDisabled()).toEqual(false); @@ -122,9 +126,12 @@ describe('ZvDateTimeInput', () => { it('should respect id input', async () => { const defaultId = await harness.getId(); - expect(defaultId.startsWith('zv-date-time-input-')).toBeTrue(); + expect(defaultId.startsWith('zv-date-time-input-')).toBe(true); cmp.id = 'my-id'; + cmp._changeDetectorRef.markForCheck(); + fixture.detectChanges(); + fixture.detectChanges(); expect(await harness.getId()).toBe('my-id'); }); @@ -138,6 +145,9 @@ describe('ZvDateTimeInput', () => { expect(await host.getAttribute('aria-describedby')).toBe(null); cmp.setDescribedByIds(['a', 'b']); + cmp._changeDetectorRef.markForCheck(); + fixture.detectChanges(); + fixture.detectChanges(); expect(await host.getAttribute('aria-describedby')).toBe('a b'); }); @@ -151,8 +161,8 @@ describe('ZvDateTimeInput', () => { await dateInput.openCalendar(); const calendar = await dateInput.getCalendar(); - spyOn(cmp._changeDetectorRef, 'markForCheck'); - spyOn(cmp.stateChanges, 'next'); + vi.spyOn(cmp._changeDetectorRef, 'markForCheck'); + vi.spyOn(cmp.stateChanges, 'next'); await calendar.selectCell({ today: true }); @@ -170,18 +180,18 @@ describe('ZvDateTimeInput', () => { now.setMilliseconds(0); const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); - expect(fixture.componentInstance.value).toEqual(null); + expect(fixture.componentInstance.value()).toEqual(null); await dateInput.openCalendar(); const calendar = await dateInput.getCalendar(); await calendar.selectCell({ today: true }); - expect(fixture.componentInstance.value).toEqual(today); + expect(fixture.componentInstance.value()).toEqual(today); await timeInput.setValue(now.getHours() + ':' + now.getMinutes()); - expect(fixture.componentInstance.value).toEqual(now); + expect(fixture.componentInstance.value()).toEqual(now); await dateInput.setValue(''); - expect(isValidDate(fixture.componentInstance.value)).toEqual(false); + expect(isValidDate(fixture.componentInstance.value())).toEqual(false); }); it('should format values on blur', async () => { @@ -407,13 +417,15 @@ describe('ZvDateTimeInput', () => { expect(await timeInput.isRequired()).toEqual(false); expect(await host.getAttribute('aria-required')).toBe('false'); - fixture.componentInstance.required = true; + fixture.componentInstance.required.set(true); + fixture.detectChanges(); expect(await dateInput.isRequired()).toEqual(true); expect(await timeInput.isRequired()).toEqual(true); expect(await host.getAttribute('aria-required')).toBe('true'); - fixture.componentInstance.required = false; + fixture.componentInstance.required.set(false); + fixture.detectChanges(); expect(await dateInput.isRequired()).toEqual(false); expect(await timeInput.isRequired()).toEqual(false); @@ -425,7 +437,7 @@ describe('ZvDateTimeInput', () => { expect(cmp.errorState).toEqual(false); expect(await host.getAttribute('aria-invalid')).toBe('false'); - fixture.componentInstance.errorStateMatcher = { isErrorState: () => true }; + fixture.componentInstance.errorStateMatcher.set({ isErrorState: () => true }); fixture.detectChanges(); expect(cmp.errorState).toEqual(true); expect(await host.getAttribute('aria-invalid')).toBe('true'); @@ -463,12 +475,14 @@ describe('ZvDateTimeInput', () => { expect(await host.getAttribute('aria-disabled')).toBe('false'); formControl.disable(); + fixture.detectChanges(); expect(await dateInput.isDisabled()).toEqual(true); expect(await timeInput.isDisabled()).toEqual(true); expect(await host.getAttribute('aria-disabled')).toBe('true'); formControl.enable(); + fixture.detectChanges(); expect(await dateInput.isDisabled()).toEqual(false); expect(await timeInput.isDisabled()).toEqual(false); @@ -515,6 +529,7 @@ describe('ZvDateTimeInput', () => { const [dateInput, timeInput] = await harness.getInputs(); formControl.setValue(new Date(2000, 5, 7, 9, 45)); + fixture.detectChanges(); expect(await dateInput.getValue()).toEqual('06/07/2000'); expect(await timeInput.getValue()).toEqual('09:45 AM'); @@ -685,7 +700,7 @@ function isValidDate(date: unknown) { @Component({ selector: 'zv-value-test-component', template: ` - + `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -697,9 +712,10 @@ function isValidDate(date: unknown) { ], }) export class ValueTestComponent { - @ViewChild(ZvDateTimeInput) dateTimeInputCmp!: ZvDateTimeInput; - disabled = false; - value: Date | null = null; + @ViewChild(ZvDateTimeInput) + dateTimeInputCmp!: ZvDateTimeInput; + disabled = signal(false); + value = signal(null); } @Component({ @@ -707,10 +723,11 @@ export class ValueTestComponent { template: ` @@ -724,12 +741,14 @@ export class ValueTestComponent { ], }) export class InputsTestComponent { - @ViewChild(ZvDateTimeInput) dateTimeInputCmp!: ZvDateTimeInput; - @ViewChild('dateInput', { read: NgModel }) ngModel: NgModel; - disabled = false; - value: Date | null = null; - required = false; - errorStateMatcher: ErrorStateMatcher = null; + @ViewChild(ZvDateTimeInput) + dateTimeInputCmp!: ZvDateTimeInput; + @ViewChild('dateInput', { read: NgModel }) + ngModel: NgModel; + disabled = signal(false); + value = signal(null); + required = signal(false); + errorStateMatcher = signal(null); } @Component({ @@ -747,6 +766,7 @@ export class InputsTestComponent { ], }) export class FormTestComponent { - @ViewChild(ZvDateTimeInput) dateTimeInputCmp!: ZvDateTimeInput; + @ViewChild(ZvDateTimeInput) + dateTimeInputCmp!: ZvDateTimeInput; control = new FormControl(null); } diff --git a/projects/components/date-time-input/src/time-input.directive.ts b/projects/components/date-time-input/src/time-input.directive.ts index 41f455a1..9fb4ffe2 100644 --- a/projects/components/date-time-input/src/time-input.directive.ts +++ b/projects/components/date-time-input/src/time-input.directive.ts @@ -66,7 +66,7 @@ export const ZV_TIME_VALIDATORS: any = { host: { class: 'zv-time-input', '[disabled]': 'disabled', - '(input)': '_onInput($event.target.value)', + '(input)': '_onInput($any($event.target).value)', '(change)': '_onChange()', '(blur)': '_onBlur()', }, diff --git a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts index cb2aa37b..061608de 100644 --- a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts +++ b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts @@ -146,8 +146,8 @@ describe('DialogUnitTestComponent', () => { }); it('should call actionFunction on ok click', async () => { - spyOn(dialogRef.componentInstance, 'actionFunction').and.callThrough(); - spyOn(dialogRef.componentInstance.dataSource, 'confirm').and.callThrough(); + vi.spyOn(dialogRef.componentInstance, 'actionFunction'); + vi.spyOn(dialogRef.componentInstance.dataSource, 'confirm'); const btns = await dialogWrapper.getActionButtons({ text: 'Ok' }); expect(btns.length).toEqual(1); @@ -158,15 +158,19 @@ describe('DialogUnitTestComponent', () => { }); it('should call cancelFunction and then close on cancel click', async () => { - const cancelSpy = spyOn(dialogRef.componentInstance, 'cancelFunction').and.callThrough(); - const closeSpy = spyOn(dialogRef.componentInstance.dataSource, 'close').and.callThrough(); + const cancelSpy = vi.spyOn(dialogRef.componentInstance, 'cancelFunction'); + const closeSpy = vi.spyOn(dialogRef.componentInstance.dataSource, 'close'); const btns = await dialogWrapper.getActionButtons({ text: 'Cancel' }); expect(btns.length).toEqual(1); await btns[0].click(); + fixture.detectChanges(); expect(cancelSpy).toHaveBeenCalledTimes(1); expect(closeSpy).toHaveBeenCalledTimes(1); + // Wait for dialog close animation to complete + await new Promise((resolve) => setTimeout(resolve, 0)); + fixture.detectChanges(); expect((await rootLoader.getAllHarnesses(ZvDialogWrapperHarness)).length).toEqual(0); }); diff --git a/projects/components/file-input/src/file-input.component.spec.ts b/projects/components/file-input/src/file-input.component.spec.ts index c32bab58..e2520ce1 100644 --- a/projects/components/file-input/src/file-input.component.spec.ts +++ b/projects/components/file-input/src/file-input.component.spec.ts @@ -14,7 +14,8 @@ import { ZvFileInputHarness } from './testing/file-input.harness'; imports: [ZvFileInput], }) export class TestComponent { - @ViewChild(ZvFileInput) fileInputCmp!: ZvFileInput; + @ViewChild(ZvFileInput) + fileInputCmp!: ZvFileInput; } describe('ZvFileInput', () => { @@ -68,30 +69,30 @@ describe('ZvFileInput', () => { cmp.value = null; detectChanges(); - expect(cmp.empty).toBeTrue(); + expect(cmp.empty).toBe(true); expect(await harness.getText()).toEqual(cmp.fileSelectText); cmp.value = new File([], 'test.png'); detectChanges(); - expect(cmp.empty).toBeFalse(); + expect(cmp.empty).toBe(false); expect(await harness.getText()).toEqual('test.png'); await harness.clickRemove(); - expect(cmp.empty).toBeTrue(); + expect(cmp.empty).toBe(true); expect(await harness.getText()).toEqual(cmp.fileSelectText); cmp.writeValue(new File([], 'test2.png')); detectChanges(); - expect(cmp.empty).toBeFalse(); + expect(cmp.empty).toBe(false); expect(await harness.getText()).toEqual('test2.png'); cmp.onFileSelected({ target: { files: [new File([], 'test3.png')] } as unknown as HTMLInputElement } as unknown as Event); detectChanges(); - expect(cmp.empty).toBeFalse(); + expect(cmp.empty).toBe(false); expect(await harness.getText()).toEqual('test3.png'); }); }); diff --git a/projects/components/flip-container/src/flip-container.component.spec.ts b/projects/components/flip-container/src/flip-container.component.spec.ts index 6f5f0ead..56c3b6d1 100644 --- a/projects/components/flip-container/src/flip-container.component.spec.ts +++ b/projects/components/flip-container/src/flip-container.component.spec.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { By } from '@angular/platform-browser'; import { ZvFlipContainer } from './flip-container.component'; import { ZvFlipContainerModule } from './flip-container.module'; @@ -23,13 +24,18 @@ export class TestComponent { } describe('ZvFlipContainer', () => { - beforeEach(waitForAsync(() => { + beforeEach(async () => { + vi.useFakeTimers(); TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); - })); + }); - it('should initially show front and correctly switch between front and back', fakeAsync(() => { + afterEach(() => { + vi.useRealTimers(); + }); + + it('should initially show front and correctly switch between front and back', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; fixture.detectChanges(); @@ -39,68 +45,68 @@ describe('ZvFlipContainer', () => { component.cmp.toggleFlip(); expect(component.cmp.active).toEqual('back'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('back'); component.cmp.toggleFlip(); expect(component.cmp.active).toEqual('front'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('front'); component.cmp.showFront(); expect(component.cmp.active).toEqual('front'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('front'); component.cmp.showBack(); expect(component.cmp.active).toEqual('back'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('back'); component.cmp.showBack(); expect(component.cmp.active).toEqual('back'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('back'); component.cmp.show('back'); expect(component.cmp.active).toEqual('back'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('back'); component.cmp.show('front'); expect(component.cmp.active).toEqual('front'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('front'); component.cmp.show('front'); expect(component.cmp.active).toEqual('front'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('front'); component.cmp.show('back'); expect(component.cmp.active).toEqual('back'); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(component.cmp.active).toEqual('back'); - })); + }); - it('should hide DOM nodes with removeHiddenNodes false', fakeAsync(() => { + it('should hide DOM nodes with removeHiddenNodes false', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; component.removeHiddenNodes = false; @@ -117,16 +123,16 @@ describe('ZvFlipContainer', () => { component.cmp.toggleFlip(); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(backEl.hidden).toEqual(false); expect(backEl.children.length).toEqual(1); expect(frontEl.hidden).toEqual(true); expect(frontEl.children.length).toEqual(1); - })); + }); - it('should hide and remove DOM nodes with removeHiddenNodes true', fakeAsync(() => { + it('should hide and remove DOM nodes with removeHiddenNodes true', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; component.removeHiddenNodes = true; @@ -143,16 +149,16 @@ describe('ZvFlipContainer', () => { component.cmp.toggleFlip(); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(backEl.hidden).toEqual(false); expect(backEl.children.length).toEqual(1); expect(frontEl.hidden).toEqual(true); expect(frontEl.children.length).toEqual(0); - })); + }); - it('should set active css class', fakeAsync(() => { + it('should set active css class', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; component.removeHiddenNodes = true; @@ -166,13 +172,13 @@ describe('ZvFlipContainer', () => { expect(flipBoxDbgEl.className).toContain('zv-flip-container__flip-box--active-back'); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); expect(flipBoxDbgEl.className).toContain('zv-flip-container__flip-box--active-back'); - })); + }); - it('should set inert attribute', fakeAsync(() => { + it('should set inert attribute', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; component.removeHiddenNodes = true; @@ -181,16 +187,16 @@ describe('ZvFlipContainer', () => { const backEl = fixture.debugElement.query(By.css('.zv-flip-container__side__back')).nativeElement as HTMLDivElement; const frontEl = fixture.debugElement.query(By.css('.zv-flip-container__side__front')).nativeElement as HTMLDivElement; - expect(frontEl.inert).toEqual(false); - expect(backEl.inert).toEqual(true); + expect(frontEl.hasAttribute('inert')).toEqual(false); + expect(backEl.hasAttribute('inert')).toEqual(true); component.cmp.toggleFlip(); fixture.detectChanges(); - tick(300); + await vi.advanceTimersByTimeAsync(300); fixture.detectChanges(); - expect(frontEl.inert).toEqual(true); - expect(backEl.inert).toEqual(false); - })); + expect(frontEl.hasAttribute('inert')).toEqual(true); + expect(backEl.hasAttribute('inert')).toEqual(false); + }); }); diff --git a/projects/components/form-base/src/form.service.spec.ts b/projects/components/form-base/src/form.service.spec.ts index 34ac56bd..59d67fc0 100644 --- a/projects/components/form-base/src/form.service.spec.ts +++ b/projects/components/form-base/src/form.service.spec.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { fakeAsync, tick } from '@angular/core/testing'; +import { vi } from 'vitest'; import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms'; import { Observable, of } from 'rxjs'; @@ -34,32 +34,37 @@ describe('BaseZvFormService', () => { describe('filterErrors', () => { let service: TestZvFormService; beforeEach(() => { + vi.useFakeTimers(); service = new TestZvFormService(); }); - it('should call filterErrors for getFormErrors', fakeAsync(() => { - spyOn(service, 'filterErrors').and.callThrough(); + afterEach(() => { + vi.useRealTimers(); + }); + + it('should call filterErrors for getFormErrors', async () => { + vi.spyOn(service, 'filterErrors'); const form = new FormGroup({}); service.getFormErrors(form, false).subscribe(); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(service.filterErrors).toHaveBeenCalledWith([], false, 'form'); - })); + }); - it('should call filterErrors for getControlErrors', fakeAsync(() => { - spyOn(service, 'filterErrors').and.callThrough(); + it('should call filterErrors for getControlErrors', async () => { + vi.spyOn(service, 'filterErrors'); const form = new FormControl({}); service.getControlErrors(form).subscribe(); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(service.filterErrors).toHaveBeenCalledWith([], true, 'control'); - })); + }); - it('result should be used', fakeAsync(() => { + it('result should be used', async () => { const expected = { errorKey: 'key', controlPath: null, @@ -76,19 +81,24 @@ describe('BaseZvFormService', () => { result = errors; }); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(result.length).toBe(1); expect(result[0].data).toBe(expected); - })); + }); }); describe('getControlErrors', () => { let service: TestZvFormService; beforeEach(() => { + vi.useFakeTimers(); service = new TestZvFormService(); }); - it('should return errors in the right order (control)', fakeAsync(() => { + afterEach(() => { + vi.useRealTimers(); + }); + + it('should return errors in the right order (control)', async () => { const control = new FormControl('a', [Validators.minLength(2), Validators.pattern('test')]); let resultChecked = false; @@ -99,12 +109,12 @@ describe('BaseZvFormService', () => { resultChecked = true; }); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(resultChecked).toBeTruthy(); - })); + }); - it('should set data property with right values (control)', fakeAsync(() => { + it('should set data property with right values (control)', async () => { const control = new FormControl('', [Validators.required]); let resultChecked = false; @@ -118,20 +128,25 @@ describe('BaseZvFormService', () => { resultChecked = true; }); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(resultChecked).toBeTruthy(); - })); + }); }); describe('getFormErrors', () => { let service: TestZvFormService; beforeEach(() => { + vi.useFakeTimers(); service = new TestZvFormService(); }); + afterEach(() => { + vi.useRealTimers(); + }); + // eslint-disable-next-line jasmine/missing-expect - it('should return errors in the right order (group)', fakeAsync(() => + it('should return errors in the right order (group)', async () => validateGetFormErrors(true, [ 'array.0.nested1:required', 'array.0.nested2:minlength', @@ -139,19 +154,19 @@ describe('BaseZvFormService', () => { 'array.0:pattern', 'array:maxlength', ':pattern', - ]))); + ])); // eslint-disable-next-line jasmine/missing-expect - it('shouldnt return control errors if includeControls is false', fakeAsync(() => - validateGetFormErrors(false, ['array.0:pattern', 'array:maxlength', ':pattern']))); + it('shouldnt return control errors if includeControls is false', async () => + validateGetFormErrors(false, ['array.0:pattern', 'array:maxlength', ':pattern'])); // eslint-disable-next-line jasmine/missing-expect - it('should fall back to options.includeControlsDefault if includeControls is null', fakeAsync(() => { + it('should fall back to options.includeControlsDefault if includeControls is null', async () => { service.options.includeControlsDefault = false; - validateGetFormErrors(null, ['array.0:pattern', 'array:maxlength', ':pattern']); - })); + await validateGetFormErrors(null, ['array.0:pattern', 'array:maxlength', ':pattern']); + }); - it('should set data property with right values (group)', fakeAsync(() => { + it('should set data property with right values (group)', async () => { const form = new FormGroup({ array: new FormArray( [ @@ -189,12 +204,12 @@ describe('BaseZvFormService', () => { resultChecked = true; }); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(resultChecked).toBeTruthy(); - })); + }); - function validateGetFormErrors(includeControls: boolean | null, expected: string[]) { + async function validateGetFormErrors(includeControls: boolean | null, expected: string[]) { const form = new FormGroup( { array: new FormArray( @@ -223,7 +238,7 @@ describe('BaseZvFormService', () => { resultChecked = true; }); - tick(100); + await vi.advanceTimersByTimeAsync(100); expect(resultChecked).toBeTruthy(); } diff --git a/projects/components/form-field/src/form-field.component.spec.ts b/projects/components/form-field/src/form-field.component.spec.ts index fdd136b9..fb64e6fa 100644 --- a/projects/components/form-field/src/form-field.component.spec.ts +++ b/projects/components/form-field/src/form-field.component.spec.ts @@ -9,9 +9,11 @@ import { Injectable, ViewChild, inject, + signal, viewChild, } from '@angular/core'; -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; @@ -70,7 +72,7 @@ export class TestNoFormComponent { selector: 'zv-test-component', template: ` - + test `, @@ -81,7 +83,7 @@ export class TestNoFormComponent { export class TestNgModelComponent { public readonly cd = inject(ChangeDetectorRef); - value: any = null; + value = signal(null); readonly formField = viewChild(ZvFormField); } @@ -89,11 +91,11 @@ export class TestNgModelComponent { @Component({ selector: 'zv-test-component', template: ` - - @if (customLabel) { - {{ customLabel }} + + @if (customLabel()) { + {{ customLabel() }} } - + `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -104,11 +106,11 @@ export class TestFormComponent { public readonly cd = inject(ChangeDetectorRef); formControl = new FormControl('', [Validators.pattern('pattern'), Validators.minLength(5)]); - customLabel: string | null = null; - hint: string | null = null; - subscriptType: ZvFormFieldSubscriptType | null = null; - hintToggle = false; - required = false; + customLabel = signal(null); + hint = signal(null); + subscriptType = signal(null); + hintToggle = signal(false); + required = signal(false); readonly formField = viewChild(ZvFormField); } @@ -139,66 +141,81 @@ export class TestCheckboxComponent { describe('ZvFormField', () => { describe('checkbox', () => { - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ imports: [TestCheckboxComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], }).compileComponents(); - })); + }); - it('should set checkbox label if no label is set in the template', waitForAsync(() => { + it('should set checkbox label if no label is set in the template', async () => { const fixture = TestBed.createComponent(TestCheckboxComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); + (component.formControl as any).zvLabel = 'service label'; fixture.detectChanges(); + // Allow async label resolution to settle (multiple cycles for RxJS operators) + await new Promise((resolve) => setTimeout(resolve, 10)); + fixture.detectChanges(); + await new Promise((resolve) => setTimeout(resolve, 10)); + fixture.detectChanges(); expect(fixture.debugElement.query(By.css('.template-label')).query(By.css('label')).nativeElement.textContent.trim()).toBe( 'async label' ); expect(fixture.debugElement.query(By.css('.no-label')).query(By.css('label')).nativeElement.textContent.trim()).toBe('service label'); - })); + }); }); describe('formControl', () => { - beforeEach(waitForAsync(() => { + beforeEach(async () => { + vi.useFakeTimers(); TestBed.configureTestingModule({ imports: [TestFormComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], }).compileComponents(); - })); + }); + + afterEach(() => { + vi.useRealTimers(); + }); - it('should set label', fakeAsync(() => { + it('should set label', async () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); // Label calculated from the service (component.formControl as any).zvLabel = 'service label'; fixture.detectChanges(); + await vi.advanceTimersByTimeAsync(0); + fixture.detectChanges(); expect(fixture.debugElement.query(By.css('mat-label')).nativeElement.textContent.trim()).toBe('service label'); // label defined with - component.customLabel = 'custom label'; + component.customLabel.set('custom label'); fixture.detectChanges(); expect(fixture.debugElement.query(By.css('mat-label')).nativeElement.textContent.trim()).toBe('custom label'); // Label calculated from the service with delay - component.customLabel = null; + component.customLabel.set(null); (component.formControl as any).zvLabel = 'async label'; (TestBed.inject(ZvFormService) as TestZvFormService).labelDelay = 10; fixture.detectChanges(); - tick(10); + await vi.advanceTimersByTimeAsync(10); fixture.detectChanges(); expect(fixture.debugElement.query(By.css('mat-label')).nativeElement.textContent.trim()).toBe('async label'); - })); + }); - it('should show errors', fakeAsync(() => { + it('should show errors', async () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - fixture.autoDetectChanges(); + fixture.detectChanges(); component.formControl.setValue('a'); component.formControl.markAsTouched(); @@ -212,23 +229,24 @@ describe('ZvFormField', () => { expect(e.map((x) => x.errorText)).toEqual(['pattern', 'minlength']); errorsChecked = true; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(errorsChecked).toBeTruthy(); - })); + }); - it('should work with hint toggle button', () => { + it('should work with hint toggle button', async () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - component.hintToggle = true; + fixture.detectChanges(); + component.hintToggle.set(true); fixture.detectChanges(); // no hint -> no hint button expect(getHelpButton(fixture)).toBeFalsy(); // hint -> hint button but initially no hint text - component.hint = 'myhint'; - detectChangesAndIgnoreChangeAfterChecked(fixture); + component.hint.set('myhint'); + fixture.detectChanges(); const helpButton = getHelpButton(fixture); expect(helpButton).toBeTruthy(); @@ -236,55 +254,57 @@ describe('ZvFormField', () => { // 1. hint button click -> hint text helpButton.triggerEventHandler('click', new Event('click')); - detectChangesAndIgnoreChangeAfterChecked(fixture); + fixture.detectChanges(); expect(getShownHelpText(fixture)).toEqual('myhint'); // 2. hint button click -> no hint text helpButton.triggerEventHandler('click', new Event('click')); - detectChangesAndIgnoreChangeAfterChecked(fixture); + fixture.detectChanges(); expect(getShownHelpText(fixture)).toBeFalsy(); // no hint -> no hint button/text - component.hint = null; - detectChangesAndIgnoreChangeAfterChecked(fixture); + component.hint.set(null); + fixture.detectChanges(); expect(getHelpButton(fixture)).toBeFalsy(); expect(getShownHelpText(fixture)).toBeFalsy(); }); - it('should work without hint toggle button', () => { + it('should work without hint toggle button', async () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - component.hintToggle = false; + fixture.detectChanges(); + component.hintToggle.set(false); fixture.detectChanges(); // no hint -> no hint button expect(getHelpButton(fixture)).toBeFalsy(); // hint -> hint text but still no hint button - component.hint = 'myhint'; - detectChangesAndIgnoreChangeAfterChecked(fixture); + component.hint.set('myhint'); + fixture.detectChanges(); const helpButton = getHelpButton(fixture); expect(helpButton).toBeFalsy(); expect(getShownHelpText(fixture)).toEqual('myhint'); }); - it('should set correct classes for subscriptType', () => { + it('should set correct classes for subscriptType', async () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); - component.hintToggle = false; - component.hint = 'hint'; - component.subscriptType = 'single-line'; - detectChangesAndIgnoreChangeAfterChecked(fixture); + component.hintToggle.set(false); + component.hint.set('hint'); + component.subscriptType.set('single-line'); + fixture.detectChanges(); let classes = getFormFieldClasses(fixture); expect(classes.contains('zv-form-field--subscript-resize')).toBeFalsy(); - component.subscriptType = 'resize'; - detectChangesAndIgnoreChangeAfterChecked(fixture); + component.subscriptType.set('resize'); + fixture.detectChanges(); classes = getFormFieldClasses(fixture); expect(classes.contains('zv-form-field--subscript-resize')).toBeTruthy(); }); @@ -293,18 +313,19 @@ describe('ZvFormField', () => { describe('ngModel', () => { let fixture: ComponentFixture; let loader: HarnessLoader; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ imports: [TestNgModelComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], }).compileComponents(); fixture = TestBed.createComponent(TestNgModelComponent); loader = TestbedHarnessEnvironment.loader(fixture); - })); + }); it('should work with ngModel', async () => { const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const formFieldHarness = await loader.getHarness(MatFormFieldHarness); @@ -312,7 +333,8 @@ describe('ZvFormField', () => { expect(component.formField().noUnderline).toBe(false); expect(await formFieldHarness.isLabelFloating()).toBe(false); - component.value = 'test'; + component.value.set('test'); + fixture.detectChanges(); expect(await formFieldHarness.isLabelFloating()).toBe(true); }); @@ -321,14 +343,14 @@ describe('ZvFormField', () => { describe('no form', () => { let fixture: ComponentFixture; let loader: HarnessLoader; - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ imports: [TestNoFormComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], }).compileComponents(); fixture = TestBed.createComponent(TestNoFormComponent); loader = TestbedHarnessEnvironment.loader(fixture); - })); + }); it('should work without form binding on matInput', async () => { const component = fixture.componentInstance; @@ -349,7 +371,7 @@ describe('ZvFormField', () => { }); describe('initialization', () => { - it('should initialize properly with its own default settings', waitForAsync(() => { + it('should initialize properly with its own default settings', async () => { TestBed.configureTestingModule({ imports: [TestFormComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], @@ -360,9 +382,9 @@ describe('ZvFormField', () => { expect(component).toBeDefined(); expect(component.formField().floatLabel).toEqual('auto'); - })); + }); - it('should priorize MAT_FORM_FIELD_DEFAULT_OPTIONS over its own settings', waitForAsync(() => { + it('should priorize MAT_FORM_FIELD_DEFAULT_OPTIONS over its own settings', async () => { TestBed.configureTestingModule({ imports: [TestFormComponent], providers: [ @@ -378,11 +400,11 @@ describe('ZvFormField', () => { const component = fixture.componentInstance; expect(component).toBeDefined(); expect(component.formField().floatLabel).toEqual('always'); - })); + }); }); describe('hint', () => { - it('should show the right supporting text when ZV_FORM_FIELD_CONFIG.requiredText is set', waitForAsync(() => { + it('should show the right supporting text when ZV_FORM_FIELD_CONFIG.requiredText is set', async () => { TestBed.configureTestingModule({ imports: [TestFormComponent], providers: [ @@ -391,40 +413,41 @@ describe('ZvFormField', () => { ], }).compileComponents(); - const assertHintEquals = (text: string) => { - fixture.detectChanges(); - expect(getShownHelpText(fixture)).toEqual(text); - }; - const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); + + const assertHintEquals = async (text: string) => { + fixture.detectChanges(); + expect(getShownHelpText(fixture)).toEqual(text); + }; // not required & no hint -> no hint - assertHintEquals(''); + await assertHintEquals(''); // required & no hint & not disabled -> required text in hint - component.required = true; - assertHintEquals('foo'); + component.required.set(true); + await assertHintEquals('foo'); // required & no hint & disabled -> no hint component.formControl.disable(); - assertHintEquals(''); + await assertHintEquals(''); - component.hint = 'bar'; + component.hint.set('bar'); // required & hint & disabled -> hint - assertHintEquals('bar'); + await assertHintEquals('bar'); component.formControl.enable(); // required & hint & not disabled -> required text and the hint separated by ". " - assertHintEquals('foo. bar'); + await assertHintEquals('foo. bar'); // not required & hint & not disabled -> only the hint - component.required = false; - assertHintEquals('bar'); - })); + component.required.set(false); + await assertHintEquals('bar'); + }); - it('should show the right supporting text when ZV_FORM_FIELD_CONFIG.requiredText is not set', waitForAsync(() => { + it('should show the right supporting text when ZV_FORM_FIELD_CONFIG.requiredText is not set', async () => { TestBed.configureTestingModule({ imports: [TestFormComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], @@ -433,25 +456,26 @@ describe('ZvFormField', () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); // not required & no hint -> no hint - expect(getShownHelpText(fixture)).toEqual(null); + expect(getShownHelpText(fixture)).toBeFalsy(); // required & no hint -> no hint - component.required = true; + component.required.set(true); fixture.detectChanges(); - expect(getShownHelpText(fixture)).toEqual(''); + expect(getShownHelpText(fixture)).toBeFalsy(); // required & hint -> only the hint - component.hint = 'dummy'; + component.hint.set('dummy'); fixture.detectChanges(); expect(getShownHelpText(fixture)).toEqual('dummy'); // not required & hint -> only the hint - component.required = false; + component.required.set(false); fixture.detectChanges(); expect(getShownHelpText(fixture)).toEqual('dummy'); - })); + }); }); }); @@ -475,15 +499,3 @@ function getFormFieldClasses(fixture: ComponentFixture): DOMTokenList { } return null; } - -function detectChangesAndIgnoreChangeAfterChecked(fixture: ComponentFixture) { - try { - fixture.detectChanges(); - } catch (e) { - // Expression has changed after it was checked. Previous value: 'aria-describedby: null'. Current value: 'aria-describedby: mat-hint-0'. - if (e instanceof Error && e.message.indexOf('Expression has changed after it was checked') === -1) { - throw e; - } - } - fixture.detectChanges(); -} diff --git a/projects/components/form/src/form.component.spec.ts b/projects/components/form/src/form.component.spec.ts index d40213ff..32e75680 100644 --- a/projects/components/form/src/form.component.spec.ts +++ b/projects/components/form/src/form.component.spec.ts @@ -1,6 +1,6 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { ChangeDetectionStrategy, Component, DebugElement, Injectable, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, DebugElement, Injectable, ViewChild, signal } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormControl, FormGroup } from '@angular/forms'; import { MatButtonHarness } from '@angular/material/button/testing'; import { MatIcon } from '@angular/material/icon'; @@ -18,7 +18,11 @@ class TestZvFormService extends BaseZvFormService { this.options.debounceTime = null; } - public getLabel(formControl: FormControl & { zvLabel: string }): Observable | null { + public getLabel( + formControl: FormControl & { + zvLabel: string; + } + ): Observable | null { return formControl.zvLabel ? of(formControl.zvLabel) : null; } protected mapDataToError(errorData: IZvFormErrorData[]): Observable { @@ -34,7 +38,7 @@ class TestZvFormService extends BaseZvFormService { @Component({ selector: 'zv-test-component', template: ` - +
content text
hight strech
@@ -47,41 +51,45 @@ class TestZvFormService extends BaseZvFormService { imports: [ZvForm], }) export class TestDataSourceComponent { - public dataSource: IZvFormDataSource; - @ViewChild(ZvForm) formComponent: ZvForm; + public dataSource = signal(undefined); + @ViewChild(ZvForm) + formComponent: ZvForm; } describe('ZvForm', () => { describe('integration with dataSource', () => { - beforeEach(waitForAsync(() => { + beforeEach(async () => { TestBed.configureTestingModule({ imports: [TestDataSourceComponent], providers: [{ provide: ZvFormService, useClass: TestZvFormService }], }).compileComponents(); - })); + }); it('should render buttons correctly', async () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const loader = TestbedHarnessEnvironment.loader(fixture); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); let btn2Clicked = false; - component.dataSource = createDataSource({ - buttons: [ - { type: 'stroked', label: 'btn1', color: 'primary', disabled: () => true, click: () => {} }, - { - type: 'raised', - label: 'btn2', - dataCy: 'btn2', - color: 'accent', - disabled: () => false, - click: () => { - btn2Clicked = true; + component.dataSource.set( + createDataSource({ + buttons: [ + { type: 'stroked', label: 'btn1', color: 'primary', disabled: () => true, click: () => {} }, + { + type: 'raised', + label: 'btn2', + dataCy: 'btn2', + color: 'accent', + disabled: () => false, + click: () => { + btn2Clicked = true; + }, }, - }, - ], - }); + ], + }) + ); fixture.detectChanges(); const buttons = await loader.getAllHarnesses(MatButtonHarness); @@ -97,10 +105,10 @@ describe('ZvForm', () => { expect(btn1Button).toBeTruthy(); expect(await btn1Button.getVariant()).toBe('basic'); expect(await btn1Button.getAppearance()).toBe('outlined'); - expect(await btn1Button.isDisabled()).toBeTrue(); + expect(await btn1Button.isDisabled()).toBe(true); const host = await btn1Button.host(); - expect(await host.hasClass('mat-primary')).toBeTrue(); - expect(await host.hasClass('zv-btn-primary')).toBeTrue(); + expect(await host.hasClass('mat-primary')).toBe(true); + expect(await host.hasClass('zv-btn-primary')).toBe(true); } { @@ -108,10 +116,10 @@ describe('ZvForm', () => { expect(btn2Button).toBeTruthy(); expect(await btn2Button.getVariant()).toBe('basic'); expect(await btn2Button.getAppearance()).toBe('elevated'); - expect(await btn2Button.isDisabled()).toBeFalse(); + expect(await btn2Button.isDisabled()).toBe(false); const host = await btn2Button.host(); - expect(await host.hasClass('mat-accent')).toBeTrue(); - expect(await host.hasClass('zv-btn-accent')).toBeTrue(); + expect(await host.hasClass('mat-accent')).toBe(true); + expect(await host.hasClass('zv-btn-accent')).toBe(true); expect(await host.getAttribute('data-cy')).toEqual('btn2'); await btn2Button.click(); expect(btn2Clicked).toBeTruthy(); @@ -122,14 +130,15 @@ describe('ZvForm', () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); - component.dataSource = createDataSource({ progress: null }); + component.dataSource.set(createDataSource({ progress: null })); fixture.detectChanges(); expect(getProgress(fixture)).toBe(null); expect(isProgressBarVisible(fixture)).toBe(false); - component.dataSource = createDataSource({ progress: 50 }); + component.dataSource.set(createDataSource({ progress: 50 })); fixture.detectChanges(); expect(getProgress(fixture)).toBe('50%'); @@ -140,9 +149,10 @@ describe('ZvForm', () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const dataSource = createDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); fixture.detectChanges(); expect(getErrorContainer(fixture)).toBe(null); @@ -186,9 +196,10 @@ describe('ZvForm', () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const dataSource = createDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); fixture.detectChanges(); const blockUi = getBlockUi(fixture); @@ -206,9 +217,10 @@ describe('ZvForm', () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const dataSource = createDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); fixture.detectChanges(); let contentNode = fixture.debugElement.query(By.css('#content')); @@ -222,23 +234,24 @@ describe('ZvForm', () => { expect(contentNode).toBeFalsy(); }); - it("should call dataSource's connect() once per new dataSource", () => { + it("should call dataSource's connect() once per new dataSource", async () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const ds1 = createDataSource(); - component.dataSource = ds1; - spyOn(ds1, 'connect').and.callThrough(); + vi.spyOn(ds1, 'connect'); + component.dataSource.set(ds1); fixture.detectChanges(); expect(ds1.connect).toHaveBeenCalledTimes(1); const ds2 = createDataSource(); - component.dataSource = ds2; - spyOn(ds1, 'disconnect').and.callThrough(); - spyOn(ds2, 'connect').and.callThrough(); + vi.spyOn(ds1, 'disconnect'); + vi.spyOn(ds2, 'connect'); + component.dataSource.set(ds2); fixture.detectChanges(); @@ -266,6 +279,7 @@ describe('ZvForm', () => { const fixture = TestBed.createComponent(TestDataSourceComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); const ds = createDataSource(); const errorInViewValues: boolean[] = []; @@ -279,7 +293,9 @@ describe('ZvForm', () => { }; ds.exception = { errorObject: new Error('asdf') }; - component.dataSource = ds; + component.dataSource.set(ds); + fixture.detectChanges(); + // Allow the data source connect and error card to render fixture.detectChanges(); expect(opts).toBeDefined(); @@ -290,7 +306,7 @@ describe('ZvForm', () => { }); expect(getErrorContainer(fixture)).not.toBe(null); expect(observedEl).toBe(component.formComponent.errorCardWrapper.nativeElement); - spyOn(component.formComponent.errorCardWrapper.nativeElement, 'scrollIntoView').and.callThrough(); + vi.spyOn(component.formComponent.errorCardWrapper.nativeElement, 'scrollIntoView'); opts.scrollToError(); expect(component.formComponent.errorCardWrapper.nativeElement.scrollIntoView).toHaveBeenCalledTimes(1); @@ -308,7 +324,9 @@ describe('ZvForm', () => { type ITestZvFormDataSource = { -readonly [K in keyof IZvFormDataSource]: IZvFormDataSource[K]; }; -function createDataSource(override: Partial = {}): ITestZvFormDataSource & { cdTrigger$: Subject } { +function createDataSource(override: Partial = {}): ITestZvFormDataSource & { + cdTrigger$: Subject; +} { const cdTrigger$ = new Subject(); return { autocomplete: 'off', diff --git a/projects/components/header/src/header.component.spec.ts b/projects/components/header/src/header.component.spec.ts index ca1695ad..52c300cb 100644 --- a/projects/components/header/src/header.component.spec.ts +++ b/projects/components/header/src/header.component.spec.ts @@ -1,6 +1,6 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, signal, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatButtonModule } from '@angular/material/button'; import { ZvHeader, ZvHeaderModule } from '..'; @@ -9,19 +9,19 @@ import { ZvHeaderHarness } from './testing/header.harness'; @Component({ selector: 'zv-test-component', template: ` - + - @if (addButtons) { + @if (addButtons()) { } - @if (addCaptionTemplate) { + @if (addCaptionTemplate()) {

caption text

}
- @if (addDescriptionTemplate) { + @if (addDescriptionTemplate()) { description text } @@ -32,11 +32,11 @@ import { ZvHeaderHarness } from './testing/header.harness'; imports: [ZvHeaderModule, MatButtonModule], }) export class TestDataSourceComponent { - public caption: string; - public description: string; - public addButtons = false; - public addCaptionTemplate = false; - public addDescriptionTemplate = false; + public caption = signal(undefined); + public description = signal(undefined); + public addButtons = signal(false); + public addCaptionTemplate = signal(false); + public addDescriptionTemplate = signal(false); @ViewChild(ZvHeader) headerComponent: ZvHeader; } @@ -51,6 +51,7 @@ describe('ZvHeader', () => { }).compileComponents(); fixture = TestBed.createComponent(TestDataSourceComponent); component = fixture.componentInstance; + fixture.autoDetectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); header = await loader.getHarness(ZvHeaderHarness); @@ -59,14 +60,16 @@ describe('ZvHeader', () => { it('should show caption text', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.caption = 'foo'; + component.caption.set('foo'); + fixture.detectChanges(); expect(await header.getCaptionText()).toBe('foo'); }); it('should show caption template', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.addCaptionTemplate = true; + component.addCaptionTemplate.set(true); + fixture.detectChanges(); const nodes = await header.getCaptionTemplateNodes(); expect(nodes.length).toEqual(1); @@ -77,10 +80,12 @@ describe('ZvHeader', () => { it('should show caption text when input and template are set at the same time', async () => { expect(await header.getCaptionText()).toBeFalsy(); - component.caption = 'foo'; + component.caption.set('foo'); + fixture.detectChanges(); expect(await header.getCaptionText()).toBeTruthy(); - component.addCaptionTemplate = true; + component.addCaptionTemplate.set(true); + fixture.detectChanges(); expect(await header.getCaptionText()).toBeTruthy(); const nodes = await header.getCaptionTemplateNodes(); expect(nodes.length).toEqual(0); @@ -89,14 +94,16 @@ describe('ZvHeader', () => { it('should show description text', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.description = 'bar'; + component.description.set('bar'); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBe('bar'); }); it('should show description template', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.addDescriptionTemplate = true; + component.addDescriptionTemplate.set(true); + fixture.detectChanges(); const nodes = await header.getDescriptionTemplateNodes(); expect(nodes.length).toEqual(1); @@ -107,10 +114,12 @@ describe('ZvHeader', () => { it('should show description text when input and template are set at the same time', async () => { expect(await header.getDescriptionText()).toBeFalsy(); - component.description = 'foo'; + component.description.set('foo'); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBeTruthy(); - component.addDescriptionTemplate = true; + component.addDescriptionTemplate.set(true); + fixture.detectChanges(); expect(await header.getDescriptionText()).toBeTruthy(); const nodes = await header.getDescriptionTemplateNodes(); expect(nodes.length).toEqual(0); @@ -120,7 +129,8 @@ describe('ZvHeader', () => { let btns = await header.getActionTemplateNodes(); expect(btns.length).toBe(0); - component.addButtons = true; + component.addButtons.set(true); + fixture.detectChanges(); btns = await header.getActionTemplateNodes(); expect(btns.length).toBe(1); expect(await btns[0].text()).toEqual('testButton'); diff --git a/projects/components/karma.conf.js b/projects/components/karma.conf.js deleted file mode 100644 index 5e8faa10..00000000 --- a/projects/components/karma.conf.js +++ /dev/null @@ -1,43 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function(config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - - require('karma-time-stats-reporter') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/components'), - reports: ['html', 'lcovonly'], - fixWebpackSourcePaths: true - }, - timeStatsReporter: { - reportTimeStats: true, - longestTestsCount: 50, - }, - reporters: ['progress', 'kjhtml', 'time-stats'], - customLaunchers: { - ChromeHeadlessNoSandbox: { - base: 'ChromeHeadless', - flags: ['--no-sandbox'] - } - }, - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true - }); -}; diff --git a/projects/components/number-input/src/number-input.component.spec.ts b/projects/components/number-input/src/number-input.component.spec.ts index 15f2e0d3..68043c5b 100644 --- a/projects/components/number-input/src/number-input.component.spec.ts +++ b/projects/components/number-input/src/number-input.component.spec.ts @@ -27,7 +27,7 @@ describe('ZvNumberInput', () => { fixture.detectChanges(); const spinnerUp = fixture.nativeElement.querySelector('.zv-number-input__button-up'); - const clearTimerSpy = spyOn(spinner, '_clearTimer').and.callThrough(); + const clearTimerSpy = vi.spyOn(spinner, '_clearTimer'); triggerEvent(spinnerUp, 'mousedown'); triggerEvent(spinnerUp, 'mouseup'); triggerEvent(spinnerUp, 'mousedown'); @@ -45,7 +45,7 @@ describe('ZvNumberInput', () => { fixture.detectChanges(); const spinnerDown = fixture.nativeElement.querySelector('.zv-number-input__button-down'); - const clearTimerSpy = spyOn(spinner, '_clearTimer').and.callThrough(); + const clearTimerSpy = vi.spyOn(spinner, '_clearTimer'); triggerEvent(spinnerDown, 'mousedown'); triggerEvent(spinnerDown, 'mouseup'); triggerEvent(spinnerDown, 'mousedown'); diff --git a/projects/components/polyfills-test.ts b/projects/components/polyfills-test.ts deleted file mode 100644 index 09e37ad3..00000000 --- a/projects/components/polyfills-test.ts +++ /dev/null @@ -1 +0,0 @@ -import '@angular/localize/init'; diff --git a/projects/components/select/src/defaults/default-select-data-source.spec.ts b/projects/components/select/src/defaults/default-select-data-source.spec.ts index c6eceeba..421bc5f2 100644 --- a/projects/components/select/src/defaults/default-select-data-source.spec.ts +++ b/projects/components/select/src/defaults/default-select-data-source.spec.ts @@ -1,12 +1,19 @@ -import { fakeAsync, tick } from '@angular/core/testing'; import { BehaviorSubject, Subject, of, throwError } from 'rxjs'; import { delay, switchMap, tap } from 'rxjs/operators'; +import { vi } from 'vitest'; import { ZvSelectItem } from '../models'; import { DefaultZvSelectDataSource, ZvSelectDataSourceOptions, ZvSelectLoadTrigger, ZvSelectSortBy } from './default-select-data-source'; describe('DefaultZvSelectDataSource', () => { - it('should work with array data', fakeAsync(() => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + it('should work with array data', async () => { const item = createItem('item', 1); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions([item])); @@ -14,27 +21,27 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.selectedValuesChanged([]); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.searchTextChanged('hallo'); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); dataSource.searchTextChanged('item'); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.panelOpenChanged(true); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.disconnect(); - })); + }); - it('should work with observable data', fakeAsync(() => { + it('should work with observable data', async () => { const item = createItem('item', 1); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(of([item]))); @@ -42,27 +49,27 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.selectedValuesChanged([]); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.searchTextChanged('hallo'); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); dataSource.searchTextChanged('item'); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.panelOpenChanged(true); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.disconnect(); - })); + }); - it('should subscribe only when connection to data, when it is an observable and no load trigger is configured', fakeAsync(() => { + it('should subscribe only when connection to data, when it is an observable and no load trigger is configured', async () => { let loadDataCallCount = 0; const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions( @@ -75,7 +82,7 @@ describe('DefaultZvSelectDataSource', () => { ); dataSource.connect().subscribe(); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(loadDataCallCount).toBe(1); dataSource.selectedValuesChanged([]); dataSource.searchTextChanged('hallo'); @@ -83,43 +90,43 @@ describe('DefaultZvSelectDataSource', () => { expect(loadDataCallCount).toBe(1); dataSource.disconnect(); - })); + }); - it('should update loading flag', fakeAsync(() => { + it('should update loading flag', async () => { const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions(() => of([]).pipe(delay(1000)), { loadTrigger: ZvSelectLoadTrigger.all }) ); expect(dataSource.loading).toBe(false); dataSource.connect().subscribe(); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(dataSource.loading).toBe(true); - tick(1001); + await vi.advanceTimersByTimeAsync(1001); expect(dataSource.loading).toBe(false); dataSource.searchTextChanged('hello'); expect(dataSource.loading).toBe(false); - tick(150); // debounce time / 2 + await vi.advanceTimersByTimeAsync(150); // debounce time / 2 expect(dataSource.loading).toBe(false); - tick(150); // debounce time / 2 + await vi.advanceTimersByTimeAsync(150); // debounce time / 2 expect(dataSource.loading).toBe(false); dataSource.panelOpenChanged(true); expect(dataSource.loading).toBe(true); - tick(1001); + await vi.advanceTimersByTimeAsync(1001); expect(dataSource.loading).toBe(false); dataSource.panelOpenChanged(false); dataSource.panelOpenChanged(true); expect(dataSource.loading).toBe(true); - tick(1001); + await vi.advanceTimersByTimeAsync(1001); expect(dataSource.loading).toBe(false); dataSource.disconnect(); - })); + }); - it('should filter for searchText and ignore casing', fakeAsync(() => { + it('should filter for searchText and ignore casing', async () => { const halloWeltItem = createItem('Hallo Welt', 1); const halloItem = createItem('Hallo', 2); const weltItem = createItem('Welt', 3); @@ -139,28 +146,28 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([halloOption, halloWeltOption, weltOption]); // Testen, ob exakt übereinstimmender Text gefunden wird dataSource.searchTextChanged('Hallo Welt'); - tick(50); + await vi.advanceTimersByTimeAsync(50); expect(currentRenderOptions).toEqual([halloOptionHidden, halloWeltOption, weltOptionHidden]); // Testen, partieller Text mit anderem casing gefunden wird dataSource.searchTextChanged('eL'); - tick(50); + await vi.advanceTimersByTimeAsync(50); expect(currentRenderOptions).toEqual([halloOptionHidden, halloWeltOption, weltOption]); // Testen, ob es funktioniert, wenn nichts gefunden wird dataSource.searchTextChanged('asdf'); - tick(50); + await vi.advanceTimersByTimeAsync(50); expect(currentRenderOptions).toEqual([halloOptionHidden, halloWeltOptionHidden, weltOptionHidden]); dataSource.disconnect(); - })); + }); - it('should debounce searchText', fakeAsync(() => { + it('should debounce searchText', async () => { const item = createItem('item', 1); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(of([item]), { searchDebounce: 50 })); @@ -170,57 +177,57 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item)]); // Testen, das die options wirklich erst nach der debounce time neu geladen werden dataSource.searchTextChanged('debounce search'); - tick(49); + await vi.advanceTimersByTimeAsync(49); expect(currentRenderOptions).toEqual([createIdOption(item)]); // debounce time noch nicht rum - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); // debounce time erreicht // Testen, das das debounce bei mehreren eingaben functoniert dataSource.searchTextChanged('i'); - tick(49); + await vi.advanceTimersByTimeAsync(49); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); dataSource.searchTextChanged('it'); - tick(49); + await vi.advanceTimersByTimeAsync(49); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); dataSource.searchTextChanged('item'); - tick(49); + await vi.advanceTimersByTimeAsync(49); expect(currentRenderOptions).toEqual([createIdOption(item, true)]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item)]); dataSource.disconnect(); - })); + }); - it('should not refresh options when searchText changes to the same value', fakeAsync(() => { + it('should not refresh options when searchText changes to the same value', async () => { const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(of([createItem('item', 1)]), { searchDebounce: 50 })); let optionsRefreshTime = 0; dataSource.connect().subscribe(() => { ++optionsRefreshTime; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); // Search Text setzen, warten bis reloaded wurde und den call count resetten dataSource.searchTextChanged('text'); - tick(50); + await vi.advanceTimersByTimeAsync(50); optionsRefreshTime = 0; // Suchtext ändern und innerhalb der debounceTime zurück ändern dataSource.searchTextChanged('i'); - tick(49); + await vi.advanceTimersByTimeAsync(49); dataSource.searchTextChanged('text'); - tick(50); + await vi.advanceTimersByTimeAsync(50); expect(optionsRefreshTime).toEqual(0); dataSource.disconnect(); - })); + }); - it('should by default only load options when connecting', fakeAsync(() => { + it('should by default only load options when connecting', async () => { let loadDataCallCount = 0; const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions(() => { @@ -233,7 +240,7 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(createItem('item', 1))]); dataSource.selectedValuesChanged([]); @@ -242,16 +249,16 @@ describe('DefaultZvSelectDataSource', () => { dataSource.panelOpenChanged(true); dataSource.panelOpenChanged(true); dataSource.searchTextChanged('item'); - tick(300); + await vi.advanceTimersByTimeAsync(300); dataSource.searchTextChanged(''); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(loadDataCallCount).toBe(1); dataSource.disconnect(); - })); + }); - it('should only load options on first panel open if loadTrigger is FirstPanelOpen', fakeAsync(() => { + it('should only load options on first panel open if loadTrigger is FirstPanelOpen', async () => { let loadDataCallCount = 0; const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions( @@ -264,15 +271,15 @@ describe('DefaultZvSelectDataSource', () => { ); dataSource.connect().subscribe(); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.selectedValuesChanged([]); dataSource.selectedValuesChanged([7]); dataSource.selectedValuesChanged([7, 13]); dataSource.searchTextChanged('item'); - tick(300); + await vi.advanceTimersByTimeAsync(300); dataSource.searchTextChanged(''); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(loadDataCallCount).toBe(0); @@ -283,9 +290,9 @@ describe('DefaultZvSelectDataSource', () => { expect(loadDataCallCount).toBe(1); dataSource.disconnect(); - })); + }); - it('should load options on forced reload', fakeAsync(() => { + it('should load options on forced reload', async () => { let loadDataCallCount = 0; const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions(() => { @@ -298,7 +305,7 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(loadDataCallCount).toBe(1); expect(currentRenderOptions).toEqual([createIdOption(createItem('item', 1))]); @@ -306,9 +313,9 @@ describe('DefaultZvSelectDataSource', () => { expect(loadDataCallCount).toBe(2); dataSource.disconnect(); - })); + }); - it('should load options on every panel open if loadTrigger is EveryPanelOpen', fakeAsync(() => { + it('should load options on every panel open if loadTrigger is EveryPanelOpen', async () => { let loadDataCallCount = 0; const dataSource = new DefaultZvSelectDataSource( createDataSourceOptions( @@ -321,15 +328,15 @@ describe('DefaultZvSelectDataSource', () => { ); dataSource.connect().subscribe(); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.selectedValuesChanged([]); dataSource.selectedValuesChanged([7]); dataSource.selectedValuesChanged([7, 13]); dataSource.searchTextChanged('item'); - tick(300); + await vi.advanceTimersByTimeAsync(300); dataSource.searchTextChanged(''); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(loadDataCallCount).toBe(0); @@ -349,9 +356,9 @@ describe('DefaultZvSelectDataSource', () => { expect(loadDataCallCount).toBe(3); dataSource.disconnect(); - })); + }); - it('should add selected values to loaded options, if they are missing', fakeAsync(() => { + it('should add selected values to loaded options, if they are missing', async () => { const items$ = new Subject(); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(() => items$)); @@ -359,11 +366,11 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); // Selected Items sollten sofort gerendert werden, obwohl die options noch laden (items$ subject is noch leer) dataSource.selectedValuesChanged([1, 5]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(1), createMissingOption(5)]); const item = createItem('item', 1); @@ -371,33 +378,33 @@ describe('DefaultZvSelectDataSource', () => { const item3 = createItem('9', 11); items$.next([item]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(5), createIdOption(item)]); dataSource.selectedValuesChanged([7]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(7), createIdOption(item)]); dataSource.selectedValuesChanged([9, 10]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(10), createMissingOption(9), createIdOption(item)]); items$.next([item, item2]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(10), createIdOption(item2), createIdOption(item)]); // Sollte auch mit custom compareWith function gehen (value 9 und value 11 identisch) dataSource.compareWith = (a: number, b: number) => (a === 11 && b === 9) || (a === 9 && b === 11); items$.next([item, item3]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item3), createMissingOption(10), createIdOption(item)]); dataSource.disconnect(); items$.complete(); - })); + }); - it('should handle errors', fakeAsync(() => { + it('should handle errors', async () => { let shouldThrow = true; const item = createItem('item', 1); const dataSource = new DefaultZvSelectDataSource( @@ -417,29 +424,30 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([]); expect(dataSource.error).toBeNull(); - tick(5); + await vi.advanceTimersByTimeAsync(5); expect(currentRenderOptions).toEqual([]); expect(dataSource.error).toBeDefined(); dataSource.selectedValuesChanged([5]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(5)]); expect(dataSource.error).toBeDefined(); shouldThrow = false; dataSource.panelOpenChanged(true); - tick(5); + await vi.advanceTimersByTimeAsync(5); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createMissingOption(5), createIdOption(item)]); expect(dataSource.error).toBeNull(); dataSource.disconnect(); - })); + }); - it('should sort selected options to the top after panel close', fakeAsync(() => { + it('should sort selected options to the top after panel close', async () => { const item1 = createItem('item 1', 1); const item2 = createItem('item 2', 2); const item3 = createItem('item 3', 3); @@ -449,7 +457,7 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item1), createIdOption(item2), createIdOption(item3)]); // Wenn Panel offen, nicht umsortieren @@ -466,9 +474,9 @@ describe('DefaultZvSelectDataSource', () => { expect(currentRenderOptions).toEqual([createIdOption(item2), createIdOption(item3), createIdOption(item1)]); dataSource.disconnect(); - })); + }); - it('should emit data only when needed', fakeAsync(() => { + it('should emit data only when needed', async () => { const items$ = new BehaviorSubject([createItem('item 1', 1)]); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(() => items$, { loadTrigger: ZvSelectLoadTrigger.all })); @@ -476,43 +484,43 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe(() => { ++dataEmitCount; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(dataEmitCount).toBe(1); dataSource.panelOpenChanged(true); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.panelOpenChanged(true); expect(dataEmitCount).toBe(2); dataSource.panelOpenChanged(false); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.panelOpenChanged(false); expect(dataEmitCount).toBe(3); dataSource.panelOpenChanged(true); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.panelOpenChanged(true); expect(dataEmitCount).toBe(4); dataSource.selectedValuesChanged(['item 1', 'x']); - tick(1); + await vi.advanceTimersByTimeAsync(1); dataSource.selectedValuesChanged(['item 1', 'x']); expect(dataEmitCount).toBe(5); dataSource.searchTextChanged('te'); dataSource.searchTextChanged('test'); expect(dataEmitCount).toBe(5); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(dataEmitCount).toBe(6); items$.next([createItem('item 1', 1), createItem('item 2', 2), createItem('item x', 'x')]); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(dataEmitCount).toBe(7); dataSource.disconnect(); - })); + }); - it('should set entity of SelectItem in mode id', fakeAsync(() => { + it('should set entity of SelectItem in mode id', async () => { const item = createItem('1', 1); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions([item])); let currentRenderOptions: ZvSelectItem[] = []; @@ -520,15 +528,15 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createIdOption(item)]); const currentOption = currentRenderOptions[0]; expect(currentOption.entity).toBe(item); dataSource.disconnect(); - })); + }); - it('should set entity of SelectItem in mode entity', fakeAsync(() => { + it('should set entity of SelectItem in mode entity', async () => { const item = createItem('1', 1); const dataSource = new DefaultZvSelectDataSource(createDataSourceOptions([item], { mode: 'entity' })); let currentRenderOptions: ZvSelectItem[] = []; @@ -536,13 +544,13 @@ describe('DefaultZvSelectDataSource', () => { dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(currentRenderOptions).toEqual([createEntityOption(item)]); const currentOption = currentRenderOptions[0]; expect(currentOption.entity).toBe(item); dataSource.disconnect(); - })); + }); describe('should respect sort options', () => { let dataSource: DefaultZvSelectDataSource; @@ -555,24 +563,24 @@ describe('DefaultZvSelectDataSource', () => { const initialItems = [item1Label1, item2Label4, item3Label2Selected, item4Label3, item5Label6Selected, item6Label5Selected]; let currentRenderOptions: ZvSelectItem[]; - function initDataSource(sort: ZvSelectSortBy, sortCompare?: (a: ZvSelectItem, b: ZvSelectItem) => number) { + async function initDataSource(sort: ZvSelectSortBy, sortCompare?: (a: ZvSelectItem, b: ZvSelectItem) => number) { dataSource = new DefaultZvSelectDataSource(createDataSourceOptions(of(initialItems), { sortBy: sort })); if (sortCompare) { dataSource.sortCompare = sortCompare; } // eslint-disable-next-line jasmine/no-unsafe-spy - spyOn(dataSource, 'sortCompare').and.callThrough(); + vi.spyOn(dataSource, 'sortCompare'); dataSource.selectedValuesChanged([item3Label2Selected.value, item5Label6Selected.value, item6Label5Selected.value]); currentRenderOptions = null; dataSource.connect().subscribe((options) => { currentRenderOptions = options; }); - tick(1); + await vi.advanceTimersByTimeAsync(1); } - it('null', fakeAsync(() => { - initDataSource(null); + it('null', async () => { + await initDataSource(null); const expectedOptions = [item3Label2Selected, item6Label5Selected, item5Label6Selected, item1Label1, item4Label3, item2Label4].map( (x) => createIdOption(x) @@ -581,20 +589,20 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.None', fakeAsync(() => { - initDataSource(ZvSelectSortBy.none); + it('ZvSelectSort.None', async () => { + await initDataSource(ZvSelectSortBy.none); const expectedOptions = initialItems.map((x) => createIdOption(x)); expect(currentRenderOptions).toEqual(expectedOptions); expect(dataSource.sortCompare).not.toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.Selected', fakeAsync(() => { - initDataSource(ZvSelectSortBy.selected); + it('ZvSelectSort.Selected', async () => { + await initDataSource(ZvSelectSortBy.selected); const expectedOptions = [item3Label2Selected, item5Label6Selected, item6Label5Selected, item1Label1, item2Label4, item4Label3].map( (x) => createIdOption(x) @@ -603,10 +611,10 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).not.toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.Comparer', fakeAsync(() => { - initDataSource(ZvSelectSortBy.comparer); + it('ZvSelectSort.Comparer', async () => { + await initDataSource(ZvSelectSortBy.comparer); const expectedOptions = [item1Label1, item3Label2Selected, item4Label3, item2Label4, item6Label5Selected, item5Label6Selected].map( (x) => createIdOption(x) @@ -615,10 +623,10 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.Comparer with custom reverse sorting', fakeAsync(() => { - initDataSource(ZvSelectSortBy.comparer, (a, b) => b.value - a.value); // reverse sort + it('ZvSelectSort.Comparer with custom reverse sorting', async () => { + await initDataSource(ZvSelectSortBy.comparer, (a, b) => b.value - a.value); // reverse sort const expectedOptions = [item5Label6Selected, item6Label5Selected, item2Label4, item4Label3, item3Label2Selected, item1Label1].map( (x) => createIdOption(x) @@ -627,10 +635,10 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.Both', fakeAsync(() => { - initDataSource(ZvSelectSortBy.both); + it('ZvSelectSort.Both', async () => { + await initDataSource(ZvSelectSortBy.both); const expectedOptions = [item3Label2Selected, item6Label5Selected, item5Label6Selected, item1Label1, item4Label3, item2Label4].map( (x) => createIdOption(x) @@ -639,10 +647,10 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).toHaveBeenCalled(); dataSource.disconnect(); - })); + }); - it('ZvSelectSort.Both with custom reverse sorting', fakeAsync(() => { - initDataSource(ZvSelectSortBy.both, (a, b) => b.value - a.value); // reverse sort + it('ZvSelectSort.Both with custom reverse sorting', async () => { + await initDataSource(ZvSelectSortBy.both, (a, b) => b.value - a.value); // reverse sort const expectedOptions = [item5Label6Selected, item6Label5Selected, item3Label2Selected, item2Label4, item4Label3, item1Label1].map( (x) => createIdOption(x) @@ -651,7 +659,7 @@ describe('DefaultZvSelectDataSource', () => { expect(dataSource.sortCompare).toHaveBeenCalled(); dataSource.disconnect(); - })); + }); }); }); diff --git a/projects/components/select/src/defaults/default-select-service.spec.ts b/projects/components/select/src/defaults/default-select-service.spec.ts index a425785f..46c8fe71 100644 --- a/projects/components/select/src/defaults/default-select-service.spec.ts +++ b/projects/components/select/src/defaults/default-select-service.spec.ts @@ -1,4 +1,3 @@ -import { fakeAsync } from '@angular/core/testing'; import { Observable, of } from 'rxjs'; import { ZvSelectDataSource } from '../data/select-data-source'; import { ZvSelectItem } from '../models'; @@ -6,7 +5,7 @@ import { ZvSelectLoadTrigger } from './default-select-data-source'; import { DefaultZvSelectService } from './default-select-service'; describe('DefaultZvSelectService', () => { - it('should work with custom DataSource', fakeAsync(() => { + it('should work with custom DataSource', () => { class TestDataSource implements ZvSelectDataSource { public loading: boolean; public error: any; @@ -37,9 +36,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([{ value: 42, label: 'test', hidden: true }]); - })); + }); - it('should work with data object in entity mode', fakeAsync(() => { + it('should work with data object in entity mode', () => { const service = new DefaultZvSelectService(); const item = { a: 1, b: 'item 1' }; @@ -51,9 +50,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', item, item)]); - })); + }); - it('should work with data object in id mode', fakeAsync(() => { + it('should work with data object in id mode', () => { const service = new DefaultZvSelectService(); const item = { a: 1, b: 'item 1' }; @@ -65,9 +64,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', 1, item)]); - })); + }); - it('should work with data observable and custom options', fakeAsync(() => { + it('should work with data observable and custom options', () => { const service = new DefaultZvSelectService(); const item = { x: 1, y: 'item 1' }; @@ -89,9 +88,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', item, item)]); - })); + }); - it('should work with data array', fakeAsync(() => { + it('should work with data array', () => { const service = new DefaultZvSelectService(); const item = { value: 1, label: 'item 1' }; @@ -103,9 +102,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', 1, item)]); - })); + }); - it('should work with observable array', fakeAsync(() => { + it('should work with observable array', () => { const service = new DefaultZvSelectService(); const item = { value: 1, label: 'item 1' }; @@ -117,9 +116,9 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', 1, item)]); - })); + }); - it('should set disabled to value of item[disabledKey]', fakeAsync(() => { + it('should set disabled to value of item[disabledKey]', () => { const service = new DefaultZvSelectService(); const item = { a: 1, b: 'item 1', d: true }; @@ -127,7 +126,7 @@ describe('DefaultZvSelectService', () => { const renderOptions = getRenderData(dataSource); expect(renderOptions).toEqual([createOption('item 1', item, item, false, true)]); - })); + }); }); function getRenderData(dataSource: ZvSelectDataSource) { diff --git a/projects/components/select/src/select.component.spec.ts b/projects/components/select/src/select.component.spec.ts index e86cd1f1..2c6b88ac 100644 --- a/projects/components/select/src/select.component.spec.ts +++ b/projects/components/select/src/select.component.spec.ts @@ -10,8 +10,9 @@ import { Type, ViewChild, inject, + signal, } from '@angular/core'; -import { ComponentFixture, TestBed, fakeAsync } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AbstractControl, FormControl, @@ -131,10 +132,10 @@ function createZvSelect(options?: { dataSource?: ZvSelectDataSource; service?: Z
`, @@ -143,17 +144,18 @@ function createZvSelect(options?: { dataSource?: ZvSelectDataSource; service?: Z imports: [FormsModule, ReactiveFormsModule, ZvSelect], }) export class TestComponent implements OnDestroy { - dataSource: any = [ITEMS.red, ITEMS.green, ITEMS.blue]; + dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); control = new FormControl(null, [Validators.required]); form = new FormGroup({ select: this.control, }); emittedValues: any[] = []; - errorStateMatcher: ErrorStateMatcher = null; - panelClass: Record = {}; - clearable = true; + errorStateMatcher = signal(null); + panelClass = signal>({}); + clearable = signal(true); - @ViewChild(ZvSelect, { static: true }) select: ZvSelect; + @ViewChild(ZvSelect, { static: true }) + select: ZvSelect; private valuesSubscription: Subscription; constructor() { @@ -177,13 +179,14 @@ const ITEMS = { selector: 'zv-test-multiple-component', template: ` - @if (customTemplate) { + @if (customTemplate()) { custom: @for (item of items; track item) { @@ -200,31 +203,32 @@ const ITEMS = { export class TestMultipleComponent { public readonly cd = inject(ChangeDetectorRef); - showToggleAll = true; - dataSource: any = [ITEMS.red, ITEMS.green, ITEMS.blue]; - value: any = null; - selectedLabel = true; - customTemplate = false; + showToggleAll = signal(true); + dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); + value = signal(null); + selectedLabel = signal(true); + customTemplate = signal(false); - @ViewChild(ZvSelect, { static: true }) select: ZvSelect; + @ViewChild(ZvSelect, { static: true }) + select: ZvSelect; } @Component({ selector: 'zv-test-value', - template: ``, + template: ``, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection changeDetection: ChangeDetectionStrategy.Eager, imports: [FormsModule, ReactiveFormsModule, ZvSelect], }) export class TestValueComponent { public items = [ITEMS.red, ITEMS.green, ITEMS.blue]; - public value: any = null; + public value = signal(null); } @Component({ selector: 'zv-test-custom-template', template: ` - + trigger:{{ item.value }}:{{ item.viewValue }} @@ -241,7 +245,7 @@ export class TestValueComponent { }) export class TestCustomTemplateComponent { public items = [ITEMS.red, ITEMS.green, ITEMS.blue]; - public value: any = null; + public value = signal(null); } @Component({ @@ -249,7 +253,7 @@ export class TestCustomTemplateComponent { template: ` My Select - + `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -257,23 +261,33 @@ export class TestCustomTemplateComponent { imports: [ZvSelect, ZvFormField, MatLabel, FormsModule], }) export class TestWithFormFieldComponent { - public dataSource: any = [ITEMS.red, ITEMS.green, ITEMS.blue]; - public value: any = null; - public clearable = false; + public dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); + public value = signal(null); + public clearable = signal(false); } @Injectable({ providedIn: 'root' }) export class TestZvSelectService extends DefaultZvSelectService { - static calledwith: { dataSource: any; control: AbstractControl }[] = []; + static calledwith: { + dataSource: any; + control: AbstractControl; + }[] = []; public override createDataSource(dataSource: ZvSelectData, control: AbstractControl | null): ZvSelectDataSource { TestZvSelectService.calledwith.push({ dataSource: dataSource, control: control }); return super.createDataSource(dataSource, control); } } -async function initTest( - type: Type -): Promise<{ fixture: ComponentFixture; component: T; loader: HarnessLoader; zvSelect: ZvSelectHarness }> { +async function flushMicrotasks() { + await new Promise((resolve) => setTimeout(resolve, 0)); +} + +async function initTest(type: Type): Promise<{ + fixture: ComponentFixture; + component: T; + loader: HarnessLoader; + zvSelect: ZvSelectHarness; +}> { TestZvSelectService.calledwith = []; await TestBed.configureTestingModule({ imports: [type], @@ -282,6 +296,10 @@ async function initTest( const fixture = TestBed.createComponent(type); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.detectChanges(); + // Allow async data source subscriptions to settle + await new Promise((resolve) => setTimeout(resolve, 0)); + fixture.detectChanges(); const loader = TestbedHarnessEnvironment.loader(fixture); return { @@ -351,8 +369,8 @@ describe('ZvSelect', () => { const matFormField = await loader.getHarness(MatFormFieldHarness); - component.value = ITEMS.red; - component.clearable = true; + component.value.set(ITEMS.red); + component.clearable.set(true); await zvSelect.open(); expect(await zvSelect.isEmpty()).toBe(false); @@ -372,18 +390,18 @@ describe('ZvSelect', () => { expect(await matFormField.isLabelFloating()).toBe(false); }); - it('should fix MatSelect.close() not emitting stateChanges', fakeAsync(() => { + it('should fix MatSelect.close() not emitting stateChanges', () => { const matSelect = createFakeMatSelect(); const { component } = createZvSelect(); component.setMatSelect = matSelect; - spyOn(matSelect.stateChanges, 'next'); + vi.spyOn(matSelect.stateChanges, 'next'); matSelect.close(); expect(matSelect.stateChanges.next).toHaveBeenCalled(); - })); + }); it('should update disabled property when calling setDisabledState', () => { const { component } = createZvSelect(); @@ -400,7 +418,7 @@ describe('ZvSelect', () => { const { component, service } = createZvSelect(); const items = [{ value: 1, label: 'i1', hidden: false }]; const ds = createFakeDataSource(items); - spyOn(service, 'createDataSource').and.returnValue(ds); + vi.spyOn(service, 'createDataSource').mockReturnValue(ds); component.dataSource = { lookup: 'a' } as any; component.ngOnInit(); @@ -433,13 +451,13 @@ describe('ZvSelect', () => { it('should work with ngModel', async () => { const { component, zvSelect: zvSelect } = await initTest(TestMultipleComponent); await zvSelect.clickOptions({ text: ITEMS.green.label }); - expect(component.value).toEqual([ITEMS.green.value]); + expect(component.value()).toEqual([ITEMS.green.value]); }); it('should work with value binding', async () => { const { component, zvSelect: zvSelect } = await initTest(TestValueComponent); await zvSelect.clickOptions({ text: ITEMS.red.label }); - expect(component.value).toEqual(ITEMS.red.value); + expect(component.value()).toEqual(ITEMS.red.value); }); it('should emit only once when selecting an option', async () => { @@ -450,35 +468,40 @@ describe('ZvSelect', () => { }); it('should use the error state matcher input', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestComponent); + const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); // Default matcher component.control.patchValue(null); expect(await zvSelect.isErrorState()).toBe(false); // Custom matcher - empty value - component.errorStateMatcher = { + component.errorStateMatcher.set({ isErrorState: (control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean => !!(control && control.invalid), - }; + }); + fixture.detectChanges(); expect(await zvSelect.isErrorState()).toBe(true); // Custom matcher - item 1 component.control.patchValue(1); + fixture.detectChanges(); expect(await zvSelect.isErrorState()).toBe(false); }); it('should use clearable input', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestComponent); - component.clearable = true; + const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); + component.clearable.set(true); + fixture.detectChanges(); await zvSelect.open(); expect(await zvSelect.getEmptyOption()).toBeTruthy(); - component.clearable = false; + component.clearable.set(false); + fixture.detectChanges(); expect(await zvSelect.getEmptyOption()).toBeFalsy(); }); it('toggle all functionality should work', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestMultipleComponent); - component.showToggleAll = true; + const { fixture, component, zvSelect: zvSelect } = await initTest(TestMultipleComponent); + component.showToggleAll.set(true); + fixture.detectChanges(); await zvSelect.open(); const selectSearch = await zvSelect.getPanelHeader(); const toggle = await selectSearch.getToggleAll(); @@ -498,19 +521,25 @@ describe('ZvSelect', () => { await toggle.check(); expect(await getOptionIsSelected(zvSelect)).toEqual([true, true, true]); - component.showToggleAll = false; + component.showToggleAll.set(false); + fixture.detectChanges(); expect(await selectSearch.getToggleAll()).toBeFalsy(); }); it('should set the focus corectly', async () => { - const { component, zvSelect } = await initTest(TestComponent); + const { fixture, component, zvSelect } = await initTest(TestComponent); const items$ = new ReplaySubject(1); - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: () => items$ as Observable, - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: () => items$ as Observable, + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); expect(component.select.focused).toBe(false); await zvSelect.open(); expect(component.select.focused).toBe(true); @@ -522,9 +551,9 @@ describe('ZvSelect', () => { const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); let errorState = false; - component.errorStateMatcher = { + component.errorStateMatcher.set({ isErrorState: (_control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean => errorState, - }; + }); await zvSelect.open(); @@ -551,12 +580,14 @@ describe('ZvSelect', () => { // Required component.select.required = true; + (component.select as any).cd.markForCheck(); + fixture.detectChanges(); fixture.detectChanges(); assertZvSelectCssClasses(fixture, ['zv-select', 'zv-select-required']); component.select.required = false; // mat-option - component.panelClass = { 'custom-mat-option-class': true }; + component.panelClass.set({ 'custom-mat-option-class': true }); fixture.detectChanges(); const matSelectTrigger = fixture.debugElement.query(By.css('.mat-mdc-select-trigger')); @@ -610,18 +641,23 @@ describe('ZvSelect', () => { }); it('should disable matOption for item with disable', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestMultipleComponent); - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - disabledKey: 'disabled', - items: [ - { label: 'disabled', value: 1, disabled: true }, - { label: 'active', value: 2, disabled: false }, - { label: 'default', value: 3 }, - ], - }); + const { fixture, component, zvSelect: zvSelect } = await initTest(TestMultipleComponent); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + disabledKey: 'disabled', + items: [ + { label: 'disabled', value: 1, disabled: true }, + { label: 'active', value: 2, disabled: false }, + { label: 'default', value: 3 }, + ], + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); expect(await (await zvSelect.getOptions({ text: 'disabled' }))[0].isDisabled()).toBeTruthy(); @@ -631,17 +667,22 @@ describe('ZvSelect', () => { it('should show (x selected) depending on [selectLabel] value with and without custom template', async () => { const { component, zvSelect: zvSelect, fixture } = await initTest(TestMultipleComponent); - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: [ - { label: 'item1', value: 1 }, - { label: 'item2', value: 2 }, - { label: 'item3', value: 3 }, - { label: 'item4', value: 4 }, - ], - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: [ + { label: 'item1', value: 1 }, + { label: 'item2', value: 2 }, + { label: 'item3', value: 3 }, + { label: 'item4', value: 4 }, + ], + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); const options = await zvSelect.getOptions(); @@ -652,26 +693,26 @@ describe('ZvSelect', () => { expect(await zvSelect.getValueText()).toEqual('item1, item2, item3, item4 (4 selected)'); - component.selectedLabel = false; + component.selectedLabel.set(false); fixture.detectChanges(); expect(await zvSelect.getValueText()).toEqual('item1, item2, item3, item4'); - component.selectedLabel = true; - component.customTemplate = true; + component.selectedLabel.set(true); + component.customTemplate.set(true); fixture.detectChanges(); expect(await zvSelect.getValueText()).toEqual('custom: 1:2:3:4: (4 selected)'); - component.selectedLabel = false; + component.selectedLabel.set(false); fixture.detectChanges(); expect(await zvSelect.getValueText()).toEqual('custom: 1:2:3:4:'); }); it('should take DataSource compareWith function', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestComponent); - component.dataSource = new DefaultZvSelectDataSource({ + const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); + const ds = new DefaultZvSelectDataSource({ mode: 'id', labelKey: 'label', idKey: 'value', @@ -680,12 +721,16 @@ describe('ZvSelect', () => { { label: '2', value: 2 }, ], }); + component.dataSource.set(ds); let calledCount = 0; - component.dataSource.compareWith = (a: any, b: any) => { + ds.compareWith = (a: any, b: any) => { ++calledCount; return a === 1 && b === 2; }; component.control.patchValue(2); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); const optionTexts = await getOptionData(zvSelect, (o) => o.getText(), { isSelected: true }); @@ -697,20 +742,24 @@ describe('ZvSelect', () => { const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); TestZvSelectService.calledwith = []; - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: [ - { label: '1', value: 1 }, - { label: '2', value: 2 }, - ], - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: [ + { label: '1', value: 1 }, + { label: '2', value: 2 }, + ], + }) + ); component.control.patchValue(2); + fixture.detectChanges(); + await flushMicrotasks(); fixture.detectChanges(); expect(TestZvSelectService.calledwith.length).toBe(1); - expect(TestZvSelectService.calledwith[0].dataSource).toBe(component.dataSource); + expect(TestZvSelectService.calledwith[0].dataSource).toBe(component.dataSource()); expect(TestZvSelectService.calledwith[0].control).toBe(component.control); await zvSelect.open(); @@ -726,19 +775,23 @@ describe('ZvSelect', () => { } { - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: [ - { label: '3', value: 3 }, - { label: '1', value: 1 }, - // selected label missing - ], - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: [ + { label: '3', value: 3 }, + { label: '1', value: 1 }, + // selected label missing + ], + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); fixture.detectChanges(); expect(TestZvSelectService.calledwith.length).toBe(2); - expect(TestZvSelectService.calledwith[1].dataSource).toBe(component.dataSource); + expect(TestZvSelectService.calledwith[1].dataSource).toBe(component.dataSource()); expect(TestZvSelectService.calledwith[1].control).toBe(component.control); const selectedOptionTexts = await getOptionData(zvSelect, (o) => o.getText(), { isSelected: true }); @@ -758,14 +811,21 @@ describe('ZvSelect', () => { it('should show load errors as disabled option, but still show selected option', async () => { const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: () => throwError(() => 'my error'), - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: () => throwError(() => 'my error'), + }) + ); component.control.patchValue(2); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); + fixture.detectChanges(); + await flushMicrotasks(); fixture.detectChanges(); await zvSelect.open(); @@ -794,14 +854,19 @@ describe('ZvSelect', () => { }); it('should show loading spinner while loading and open', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestComponent); + const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); const items$ = new ReplaySubject(1); - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: () => items$ as Observable, - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: () => items$ as Observable, + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); const header = await zvSelect.getPanelHeader(); @@ -816,17 +881,22 @@ describe('ZvSelect', () => { }); it('should force a reload on the datasource through reload button after error', async () => { - const { component, zvSelect: zvSelect } = await initTest(TestComponent); + const { fixture, component, zvSelect: zvSelect } = await initTest(TestComponent); let dataLoadCount = 0; - component.dataSource = new DefaultZvSelectDataSource({ - mode: 'id', - labelKey: 'label', - idKey: 'value', - items: () => { - dataLoadCount++; - return throwError(() => 'my error'); - }, - }); + component.dataSource.set( + new DefaultZvSelectDataSource({ + mode: 'id', + labelKey: 'label', + idKey: 'value', + items: () => { + dataLoadCount++; + return throwError(() => 'my error'); + }, + }) + ); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); expect(dataLoadCount).toBe(1); diff --git a/projects/components/select/src/select.component.ts b/projects/components/select/src/select.component.ts index 3b1ee9dd..00213318 100644 --- a/projects/components/select/src/select.component.ts +++ b/projects/components/select/src/select.component.ts @@ -349,7 +349,7 @@ export class ZvSelect implements ControlValueAccessor, MatFormField } public onContainerClick(_: MouseEvent): void { - this._matSelect.onContainerClick(); + this._matSelect.onContainerClick(_); } public setDescribedByIds(ids: string[]): void { diff --git a/projects/components/select/src/select.module.spec.ts b/projects/components/select/src/select.module.spec.ts index 9e76f7fe..6726710a 100644 --- a/projects/components/select/src/select.module.spec.ts +++ b/projects/components/select/src/select.module.spec.ts @@ -1,12 +1,12 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { ZvSelectModule } from './select.module'; describe('SelectModule', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [ZvSelectModule], }).compileComponents(); - })); + }); it('should create', () => { expect(ZvSelectModule).toBeDefined(); diff --git a/projects/components/table/src/data/table-data-source.spec.ts b/projects/components/table/src/data/table-data-source.spec.ts index 4202e419..00b72112 100644 --- a/projects/components/table/src/data/table-data-source.spec.ts +++ b/projects/components/table/src/data/table-data-source.spec.ts @@ -1,11 +1,11 @@ -import { fakeAsync, tick } from '@angular/core/testing'; import { NEVER, of, Subject, throwError } from 'rxjs'; import { delay, map } from 'rxjs/operators'; +import { vi } from 'vitest'; import { ZvTableDataSource, ZvTableDataSourceOptions, IExtendedZvTableUpdateDataInfo } from '../data/table-data-source'; describe('ZvTableDataSource', () => { - it('should have sensible default values', fakeAsync(() => { + it('should have sensible default values', () => { const loadedData = [{ prop: 'x' }]; const dataSource = new ZvTableDataSource(() => of(loadedData).pipe(delay(500))); dataSource.tableReady = true; @@ -23,9 +23,9 @@ describe('ZvTableDataSource', () => { expect(dataSource.dataLength).toEqual(0); expect(dataSource.selectionModel.isMultipleSelection()).toEqual(true); expect(dataSource.selectionModel.selected).toEqual([]); - })); + }); - it('should return empty array on connect, even if data is not loaded yet', fakeAsync(() => { + it('should return empty array on connect, even if data is not loaded yet', () => { const dataSource = new ZvTableDataSource(() => NEVER as any); dataSource.tableReady = true; @@ -38,21 +38,21 @@ describe('ZvTableDataSource', () => { dataSource.disconnect(); sub.unsubscribe(); - })); + }); - it('should not start loading data on connect (the table has to triggers this)', fakeAsync(() => { + it('should not start loading data on connect (the table has to triggers this)', () => { const dataSource = new ZvTableDataSource(() => NEVER as any); dataSource.tableReady = true; - spyOn(dataSource, 'updateData'); + vi.spyOn(dataSource, 'updateData'); const sub = dataSource.connect().subscribe(); dataSource.disconnect(); sub.unsubscribe(); expect(dataSource.updateData).not.toHaveBeenCalled(); - })); + }); - it('should not load data until the table is ready', fakeAsync(() => { + it('should not load data until the table is ready', () => { let dataLoadCalled = false; const dataSource = new ZvTableDataSource(() => { dataLoadCalled = true; @@ -71,13 +71,13 @@ describe('ZvTableDataSource', () => { dataSource.updateData(false); expect(dataLoadCalled).toBeTruthy(); - })); + }); - it('should work with minimal options object and set default values', fakeAsync(() => { + it('should work with minimal options object and set default values', () => { const options: ZvTableDataSourceOptions = { loadDataFn: () => of([]), }; - spyOn(options, 'loadDataFn').and.callThrough(); + vi.spyOn(options, 'loadDataFn'); const dataSource = new ZvTableDataSource(options); dataSource.tableReady = true; @@ -92,16 +92,16 @@ describe('ZvTableDataSource', () => { sub.unsubscribe(); expect(options.loadDataFn).toHaveBeenCalledTimes(1); - })); + }); - it('should work with complete options object', fakeAsync(() => { + it('should work with complete options object', () => { const trigger$ = new Subject(); const options: ZvTableDataSourceOptions = { loadTrigger$: trigger$, loadDataFn: () => of([]), mode: 'server', }; - spyOn(options, 'loadDataFn').and.callThrough(); + vi.spyOn(options, 'loadDataFn'); const dataSource = new ZvTableDataSource(options); dataSource.tableReady = true; @@ -118,9 +118,10 @@ describe('ZvTableDataSource', () => { sub.unsubscribe(); expect(options.loadDataFn).toHaveBeenCalledTimes(1); - })); + }); - it('should reset error/loading/data/selection before updateData and after', fakeAsync(() => { + it('should reset error/loading/data/selection before updateData and after', async () => { + vi.useFakeTimers(); let doThrowError: Error = null; let beforeVisibleRows: any[] = []; const beforeDataItem = {}; @@ -148,7 +149,7 @@ describe('ZvTableDataSource', () => { initDirtyState([beforeDataItem]); dataSource.updateData(false); expectAsyncLoadingState(); - tick(500); + await vi.advanceTimersByTimeAsync(500); expectErrorState(); // as long as no data is successfullyloaded, it should load data from the server @@ -156,7 +157,7 @@ describe('ZvTableDataSource', () => { initDirtyState([beforeDataItem]); dataSource.updateData(false); expectAsyncLoadingState(); - tick(500); + await vi.advanceTimersByTimeAsync(500); expectLoadedState(loadedData, loadedData.length, loadedData); // when data is already loaded, just update the visible items and clear the selection model @@ -219,7 +220,7 @@ describe('ZvTableDataSource', () => { initDirtyState([beforeDataItem]); dataSource.updateData(true); expectAsyncLoadingState(); - tick(500); + await vi.advanceTimersByTimeAsync(500); expectLoadedState(loadedData, loadedData.length, loadedData); function initDirtyState(data: any[]) { @@ -268,7 +269,9 @@ describe('ZvTableDataSource', () => { expect(renderDataUpdates.length).toEqual(1); expect(renderDataUpdates.pop()).toEqual([]); } - })); + + vi.useRealTimers(); + }); it('should not sort/filter/page, but provide info to loadData when mode is server', () => { const loadedData = Array.from(new Array(20).keys()).map((x) => ({ prop: x })); @@ -279,11 +282,11 @@ describe('ZvTableDataSource', () => { }, 'server'); dataSource.tableReady = true; - spyOn(dataSource, 'filterProperties'); - spyOn(dataSource, 'filterValues'); - spyOn(dataSource, 'filterPredicate'); - spyOn(dataSource, 'sortingDataAccessor'); - spyOn(dataSource, 'sortData'); + vi.spyOn(dataSource, 'filterProperties'); + vi.spyOn(dataSource, 'filterValues'); + vi.spyOn(dataSource, 'filterPredicate'); + vi.spyOn(dataSource, 'sortingDataAccessor'); + vi.spyOn(dataSource, 'sortData'); let renderData: any[] = []; const sub = dataSource.connect().subscribe((data) => { @@ -316,12 +319,12 @@ describe('ZvTableDataSource', () => { sub.unsubscribe(); }); - it('should call sortData with the right parameters when mode is client', fakeAsync(() => { + it('should call sortData with the right parameters when mode is client', () => { const loadedData = [{ prop: 'a' }]; const dataSource = new ZvTableDataSource(() => of(loadedData), 'client'); dataSource.tableReady = true; - spyOn(dataSource, 'sortData').and.returnValue([{ x: 'sorted' }]); + vi.spyOn(dataSource, 'sortData').mockReturnValue([{ x: 'sorted' }]); let renderData: any[] = []; const sub = dataSource.connect().subscribe((data) => { @@ -343,9 +346,9 @@ describe('ZvTableDataSource', () => { expect(renderData).toEqual([{ x: 'sorted' }]); sub.unsubscribe(); - })); + }); - it('should use cached data if loading is not neccessary in client mode', fakeAsync(() => { + it('should use cached data if loading is not neccessary in client mode', () => { let counter = 0; let throwErr = false; const dataProvider = { @@ -380,14 +383,14 @@ describe('ZvTableDataSource', () => { expect(renderData).toEqual([{ a: 3 }]); sub.unsubscribe(); - })); + }); - it('should never cache data for server mode', fakeAsync(() => { + it('should never cache data for server mode', () => { let counter = 0; const dataProvider = { loadData: () => of([{ a: ++counter }]), }; - spyOn(dataProvider, 'loadData').and.callThrough(); + vi.spyOn(dataProvider, 'loadData'); const serverDataSource = new ZvTableDataSource(() => dataProvider.loadData(), 'server'); serverDataSource.tableReady = true; @@ -396,7 +399,7 @@ describe('ZvTableDataSource', () => { serverDataSource.updateData(true); serverDataSource.updateData(false); expect(dataProvider.loadData).toHaveBeenCalledTimes(4); - })); + }); describe('sortingDataAccessor', () => { it('should return the requested property value', () => { @@ -449,7 +452,7 @@ describe('ZvTableDataSource', () => { it('should use sortingDataAccessor to get the sort property', () => { const dataSource = new ZvTableDataSource(() => of([]), 'client'); dataSource.tableReady = true; - spyOn(dataSource, 'sortingDataAccessor').and.callThrough(); + vi.spyOn(dataSource, 'sortingDataAccessor'); const data = [{ prop: 'b' }, { prop: 'a' }]; dataSource.sortData(data, { sortColumn: 'prop', sortDirection: 'asc' }); @@ -458,12 +461,12 @@ describe('ZvTableDataSource', () => { }); }); - it('should call filterPredicate with the right parameters when mode is client', fakeAsync(() => { + it('should call filterPredicate with the right parameters when mode is client', () => { const loadedData = [{ prop: 'a' }]; const dataSource = new ZvTableDataSource(() => of(loadedData), 'client'); dataSource.tableReady = true; - spyOn(dataSource, 'filterPredicate').and.callThrough(); + vi.spyOn(dataSource, 'filterPredicate'); let renderData: any[] = []; const sub = dataSource.connect().subscribe((data) => { @@ -483,7 +486,7 @@ describe('ZvTableDataSource', () => { expect(renderData).toEqual([{ prop: 'a' }]); sub.unsubscribe(); - })); + }); describe('filterProperties', () => { it('should return all object keys, but no nested keys', () => { @@ -498,7 +501,7 @@ describe('ZvTableDataSource', () => { it('should call filterProperties and return the values of the given properties', () => { const dataSource = new ZvTableDataSource(() => of([]), 'client'); dataSource.tableReady = true; - spyOn(dataSource, 'filterProperties').and.returnValue(['a', 'c c']); + vi.spyOn(dataSource, 'filterProperties').mockReturnValue(['a', 'c c']); const obj = { a: 1, b: { b_a: 2 }, 'c c': 3, invisible: 5 }; expect(dataSource.filterValues(obj)).toEqual([1, 3]); @@ -510,7 +513,7 @@ describe('ZvTableDataSource', () => { it('should call filterValues and search for the filter text on the values', () => { const dataSource = new ZvTableDataSource(() => of([]), 'client'); dataSource.tableReady = true; - spyOn(dataSource, 'filterValues').and.returnValue(['value 1', 'value 2']); + vi.spyOn(dataSource, 'filterValues').mockReturnValue(['value 1', 'value 2']); const obj = { a: 1, b: { b_a: 2 }, 'c c': 3 }; expect(dataSource.filterPredicate(obj, '1')).toBe(true); diff --git a/projects/components/table/src/subcomponents/table-actions.component.spec.ts b/projects/components/table/src/subcomponents/table-actions.component.spec.ts index a22500b7..14fad210 100644 --- a/projects/components/table/src/subcomponents/table-actions.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-actions.component.spec.ts @@ -1,6 +1,6 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { MatIconButton } from '@angular/material/button'; import { MatButtonHarness } from '@angular/material/button/testing'; import { MatIcon } from '@angular/material/icon'; @@ -30,11 +30,11 @@ export class TestComponent { } describe('ZvTableActionsComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [RouterModule.forRoot([]), TestComponent], }).compileComponents(); - })); + }); const disabledFnTestCases: { isDisabledFn?: () => boolean; diff --git a/projects/components/table/src/subcomponents/table-data.component.spec.ts b/projects/components/table/src/subcomponents/table-data.component.spec.ts index 42fd6006..58f7d64e 100644 --- a/projects/components/table/src/subcomponents/table-data.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-data.component.spec.ts @@ -12,7 +12,7 @@ describe('ZvTableDataComponent', () => { it('onSortChanged should emit sortChanged', () => { const component = TestBed.createComponent(ZvTableDataComponent).componentInstance; - spyOn(component.sortChanged, 'emit'); + vi.spyOn(component.sortChanged, 'emit'); component.onSortChanged({ active: 'test', direction: 'asc' }); expect(component.sortChanged.emit).toHaveBeenCalledWith({ sortColumn: 'test', sortDirection: 'asc' }); @@ -64,7 +64,7 @@ describe('ZvTableDataComponent', () => { const component = fixture.componentInstance; // overwrite the component's cd as testbed provider is ignored - const cdSpy = { markForCheck: jasmine.createSpy('markForCheck') }; + const cdSpy = { markForCheck: vi.fn() }; (component as any).cd = cdSpy; let toggledRow: any = null; @@ -85,7 +85,7 @@ describe('ZvTableDataComponent', () => { const component = TestBed.createComponent(ZvTableDataComponent).componentInstance; component.dataSource = createDataSourceMock(); - spyOn(component.dataSource, 'toggleVisibleRowSelection'); + vi.spyOn(component.dataSource, 'toggleVisibleRowSelection'); component.onMasterToggleChange(); expect(component.dataSource.toggleVisibleRowSelection).toHaveBeenCalled(); }); diff --git a/projects/components/table/src/subcomponents/table-header.component.spec.ts b/projects/components/table/src/subcomponents/table-header.component.spec.ts index 618d8207..8d63893c 100644 --- a/projects/components/table/src/subcomponents/table-header.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-header.component.spec.ts @@ -1,11 +1,16 @@ -import { ChangeDetectionStrategy, Component, TemplateRef, ViewChild } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, signal, TemplateRef, ViewChild } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { ZvTableHeaderComponent } from './table-header.component'; @Component({ selector: 'zv-test-component', template: ` - + `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -13,10 +18,10 @@ import { ZvTableHeaderComponent } from './table-header.component'; imports: [ZvTableHeaderComponent], }) export class TestComponent { - public caption = 'caption'; - public showSorting = true; - public filterable = true; - public topButtonSection: TemplateRef | null = null; + public caption = signal('caption'); + public showSorting = signal(true); + public filterable = signal(true); + public topButtonSection = signal | null>(null); @ViewChild(ZvTableHeaderComponent, { static: true }) cmp: ZvTableHeaderComponent; @@ -25,57 +30,58 @@ export class TestComponent { } describe('ZvTableHeaderComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); - })); + }); - it('should only add top padding if sort, search or action buttons are visible without a caption', () => { + it('should only add top padding if sort, search or action buttons are visible without a caption', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); + fixture.autoDetectChanges(); - component.caption = ''; - component.showSorting = false; - component.filterable = false; - component.topButtonSection = null; - fixture.detectChanges(); + component.caption.set(''); + component.showSorting.set(false); + component.filterable.set(false); + component.topButtonSection.set(null); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('0'); - component.caption = 'test'; - component.showSorting = false; - component.filterable = false; - component.topButtonSection = null; - fixture.detectChanges(); + component.caption.set('test'); + component.showSorting.set(false); + component.filterable.set(false); + component.topButtonSection.set(null); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('0'); - component.caption = 'test'; - component.showSorting = true; - component.filterable = true; - component.topButtonSection = component.dummyTpl; - fixture.detectChanges(); + component.caption.set('test'); + component.showSorting.set(true); + component.filterable.set(true); + component.topButtonSection.set(component.dummyTpl); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('0'); - component.caption = ''; - component.showSorting = true; - component.filterable = false; - component.topButtonSection = null; - fixture.detectChanges(); + component.caption.set(''); + component.showSorting.set(true); + component.filterable.set(false); + component.topButtonSection.set(null); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('1em'); - component.caption = ''; - component.showSorting = false; - component.filterable = true; - component.topButtonSection = null; - fixture.detectChanges(); + component.caption.set(''); + component.showSorting.set(false); + component.filterable.set(true); + component.topButtonSection.set(null); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('1em'); - component.caption = ''; - component.showSorting = false; - component.filterable = false; - component.topButtonSection = component.dummyTpl; - fixture.detectChanges(); + component.caption.set(''); + component.showSorting.set(false); + component.filterable.set(false); + component.topButtonSection.set(component.dummyTpl); + await fixture.whenStable(); expect(component.cmp.paddingTop).toBe('1em'); }); }); diff --git a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts index 90badf16..8fcc71a8 100644 --- a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component, DebugElement, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, DebugElement, signal, ViewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { FormsModule } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MatPaginatorModule, PageEvent } from '@angular/material/paginator'; @@ -10,11 +11,11 @@ import { ZvTablePaginationComponent } from './table-pagination.component'; @Component({ template: ` `, @@ -23,10 +24,11 @@ import { ZvTablePaginationComponent } from './table-pagination.component'; imports: [ZvTablePaginationComponent], }) class PaginationTestComponent { - public pageSize = 5; - public dataLength = 15; - public pageIndex = 0; - public pageDebounce: number; + public pageSize = signal(5); + public dataLength = signal(15); + public pageIndex = signal(0); + public pageSizeOptions: number[] = [5, 10, 25]; + public pageDebounce = signal(undefined); @ViewChild(ZvTablePaginationComponent) public pagination: ZvTablePaginationComponent; @@ -47,29 +49,34 @@ describe('ZvTablePaginationComponent', () => { component = fixture.componentInstance; debugElement = fixture.debugElement.query(By.directive(ZvTablePaginationComponent)); - fixture.detectChanges(); + fixture.autoDetectChanges(); }); - it('should debounce pageEvent, if pageDebounce-Property is set', fakeAsync(() => { - const onPageSpy = spyOn(component, 'onPage'); - component.pageDebounce = 300; - fixture.detectChanges(); - - const paginatorNextButtonEl = debugElement.nativeElement - .querySelectorAll('.mat-mdc-paginator-navigation-next') - .item(0) as HTMLButtonElement; - paginatorNextButtonEl.dispatchEvent(new MouseEvent('click')); - - tick(299); - expect(onPageSpy).not.toHaveBeenCalled(); - - tick(2); - expect(onPageSpy).toHaveBeenCalledTimes(1); - expect(onPageSpy).toHaveBeenCalledWith({ previousPageIndex: 0, pageIndex: 1, pageSize: 5, length: 15 }); - })); + it('should debounce pageEvent, if pageDebounce-Property is set', async () => { + vi.useFakeTimers(); + try { + const onPageSpy = vi.spyOn(component, 'onPage'); + component.pageDebounce.set(300); + await fixture.whenStable(); + + const paginatorNextButtonEl = debugElement.nativeElement + .querySelectorAll('.mat-mdc-paginator-navigation-next') + .item(0) as HTMLButtonElement; + paginatorNextButtonEl.dispatchEvent(new MouseEvent('click')); + + await vi.advanceTimersByTimeAsync(299); + expect(onPageSpy).not.toHaveBeenCalled(); + + await vi.advanceTimersByTimeAsync(2); + expect(onPageSpy).toHaveBeenCalledTimes(1); + expect(onPageSpy).toHaveBeenCalledWith({ previousPageIndex: 0, pageIndex: 1, pageSize: 5, length: 15 }); + } finally { + vi.useRealTimers(); + } + }); - it('should bind the page events correctly', fakeAsync(() => { - const onPageSpy = spyOn(component, 'onPage'); + it('should bind the page events correctly', () => { + const onPageSpy = vi.spyOn(component, 'onPage'); const paginatorNextButtonEl = debugElement.nativeElement .querySelectorAll('.mat-mdc-paginator-navigation-next') @@ -77,26 +84,27 @@ describe('ZvTablePaginationComponent', () => { paginatorNextButtonEl.dispatchEvent(new MouseEvent('click')); expect(onPageSpy).toHaveBeenCalledWith({ previousPageIndex: 0, pageIndex: 1, pageSize: 5, length: 15 }); - })); + }); - it('should calculate pages correctly', () => { + it('should calculate pages correctly', async () => { for (const data of [ [15, 5, 3], [11, 5, 3], [15, 10, 2], ]) { - component.dataLength = data[0]; - component.pageSize = data[1]; - fixture.detectChanges(); + component.dataLength.set(data[0]); + component.pageSize.set(data[1]); + component.pageIndex.set(0); + await fixture.whenStable(); expect(component.pagination.pages().length).toEqual(data[2]); } }); - it('should update pages correctly', () => { - component.dataLength = 15; - component.pageSize = 5; - fixture.detectChanges(); + it('should update pages correctly', async () => { + component.dataLength.set(15); + component.pageSize.set(5); + await fixture.whenStable(); expect(component.pagination.pages().length).toEqual(3); }); }); diff --git a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts index 0d6fc8e2..c5018c1b 100644 --- a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts @@ -1,6 +1,6 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, signal, ViewChild } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { MatIconHarness } from '@angular/material/icon/testing'; import { Observable } from 'rxjs'; import { IZvTableAction, IZvTableActionRouterLink, ZvTableActionScope } from '../models'; @@ -12,11 +12,11 @@ import { MatButtonHarness } from '@angular/material/button/testing'; selector: 'zv-test-component', template: ` `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -24,37 +24,39 @@ import { MatButtonHarness } from '@angular/material/button/testing'; imports: [ZvTableRowActionsComponent], }) export class TestComponent { - public actions: IZvTableAction[] = []; - public loadActionsFn: (data: any, actions: IZvTableAction[]) => Observable[]> = null; - public openMenuFn: (data: any, actions: IZvTableAction[]) => Observable[]> | IZvTableAction[] | null = null; - public item: any = {}; - public moreMenuThreshold = 2; + public actions = signal[]>([]); + public loadActionsFn = signal<(data: any, actions: IZvTableAction[]) => Observable[]>>(null); + public openMenuFn = + signal<(data: any, actions: IZvTableAction[]) => Observable[]> | IZvTableAction[] | null>(null); + public item = signal({}); + public moreMenuThreshold = signal(2); - @ViewChild(ZvTableRowActionsComponent, { static: true }) comp: ZvTableRowActionsComponent; + @ViewChild(ZvTableRowActionsComponent, { static: true }) + comp: ZvTableRowActionsComponent; } describe('ZvTableRowActionsComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [RouterModule.forRoot([]), TestComponent], }).compileComponents(); - })); + }); it('should respect threshold', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - component.actions = [{ icon: 'remove', label: 'Remove', scope: ZvTableActionScope.row, actionFn: () => {} }]; - const loader = TestbedHarnessEnvironment.loader(fixture); + component.actions.set([{ icon: 'remove', label: 'Remove', scope: ZvTableActionScope.row, actionFn: () => {} }]); + component.moreMenuThreshold.set(2); + fixture.autoDetectChanges(); - component.moreMenuThreshold = 2; - fixture.detectChanges(); + const loader = TestbedHarnessEnvironment.loader(fixture); - await expectAsync(loader.getHarness(MatIconHarness.with({ name: 'more_vert' }))).toBeRejectedWithError(); + await expect(loader.getHarness(MatIconHarness.with({ name: 'more_vert' }))).rejects.toThrowError(); - component.moreMenuThreshold = 0; - fixture.detectChanges(); + component.moreMenuThreshold.set(0); + await fixture.whenStable(); const icon = await loader.getHarness(MatIconHarness.with({ name: 'more_vert' })); expect(icon).toBeDefined(); @@ -84,7 +86,7 @@ describe('ZvTableRowActionsComponent', () => { const component = fixture.componentInstance; expect(component).toBeDefined(); - component.actions = [ + component.actions.set([ { icon: 'remove', label: 'Remove', @@ -93,9 +95,9 @@ describe('ZvTableRowActionsComponent', () => { isDisabledFn: testCase.isDisabledFn, routerLink: testCase.routerLink, }, - ]; + ]); const loader = TestbedHarnessEnvironment.loader(fixture); - fixture.detectChanges(); + fixture.autoDetectChanges(); const button = await loader.getHarness(MatButtonHarness); expect(button).toBeDefined(); diff --git a/projects/components/table/src/subcomponents/table-search.component.spec.ts b/projects/components/table/src/subcomponents/table-search.component.spec.ts index 21d71f91..741f1e59 100644 --- a/projects/components/table/src/subcomponents/table-search.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-search.component.spec.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing'; +import { ChangeDetectionStrategy, Component, signal, ViewChild } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { MatIconButton } from '@angular/material/button'; import { MatInput } from '@angular/material/input'; import { By } from '@angular/platform-browser'; @@ -7,96 +8,105 @@ import { ZvTableSearchComponent } from './table-search.component'; @Component({ selector: 'zv-test-component', - template: ` `, + template: ` `, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection changeDetection: ChangeDetectionStrategy.Eager, imports: [ZvTableSearchComponent], }) export class TestComponent { - public searchText = 'search text'; + public searchText = signal('search text'); - @ViewChild(ZvTableSearchComponent, { static: true }) tableSearch: ZvTableSearchComponent; + @ViewChild(ZvTableSearchComponent, { static: true }) + tableSearch: ZvTableSearchComponent; public onSearchChanged(_event: string) {} } describe('ZvTableSearchComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); - })); + }); - it('should not emit searchChanged after destroy', fakeAsync(() => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should not emit searchChanged after destroy', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); - fixture.detectChanges(); + vi.spyOn(component, 'onSearchChanged'); + fixture.autoDetectChanges(); const input = fixture.debugElement.query(By.directive(MatInput)); input.nativeElement.value = 'new text'; input.triggerEventHandler('keyup', new KeyboardEvent('keyup', { key: 'a' } as any)); - tick(50); + await vi.advanceTimersByTimeAsync(50); component.tableSearch.ngOnDestroy(); - tick(999); + await vi.advanceTimersByTimeAsync(999); expect(component.onSearchChanged).not.toHaveBeenCalled(); - })); + }); - it('should emit searchChanged on changes after debounce time', fakeAsync(() => { + it('should emit searchChanged on changes after debounce time', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = 'initial text'; - fixture.detectChanges(); + component.searchText.set('initial text'); + fixture.autoDetectChanges(); const input = fixture.debugElement.query(By.directive(MatInput)); input.nativeElement.value = 'new text'; input.triggerEventHandler('keyup', new KeyboardEvent('keyup', { key: 'a' } as any)); - tick(299); + await vi.advanceTimersByTimeAsync(299); expect(component.onSearchChanged).not.toHaveBeenCalled(); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(component.onSearchChanged).toHaveBeenCalledWith('new text'); - })); + }); - it("should not emit searchChanged after debounce time when the value didn't change", fakeAsync(() => { + it("should not emit searchChanged after debounce time when the value didn't change", async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = 'initial text'; - fixture.detectChanges(); + component.searchText.set('initial text'); + fixture.autoDetectChanges(); const input = fixture.debugElement.query(By.directive(MatInput)); input.nativeElement.value = 'new text'; input.triggerEventHandler('keyup', new KeyboardEvent('keyup', { key: 'a' } as any)); - tick(50); + await vi.advanceTimersByTimeAsync(50); input.nativeElement.value = 'initial text'; input.triggerEventHandler('keyup', new KeyboardEvent('keyup', { key: 'a' } as any)); - tick(250); + await vi.advanceTimersByTimeAsync(250); expect(component.onSearchChanged).not.toHaveBeenCalled(); - })); + }); - it('should emit searchChanged on clear click and ignore debounce time', fakeAsync(() => { + it('should emit searchChanged on clear click and ignore debounce time', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = 'initial text'; - fixture.detectChanges(); + component.searchText.set('initial text'); + fixture.autoDetectChanges(); const clearButton = fixture.debugElement.query(By.directive(MatIconButton)); @@ -104,49 +114,50 @@ describe('ZvTableSearchComponent', () => { expect(component.onSearchChanged).toHaveBeenCalledWith(''); - fixture.detectChanges(); + await vi.advanceTimersByTimeAsync(0); const input = fixture.debugElement.query(By.directive(MatInput)); expect(input.nativeElement.value).toBe(''); - })); + }); - it('should only show clear button if either searchText or currentSearchText is set', fakeAsync(() => { + it('should only show clear button if either searchText or currentSearchText is set', async () => { // Because of the debounceTime we have to show the button if either is not empty. // If we only check searchText, then the button would appear delayed when filling the input // If we only check currentSearchText then the button would not show up if the searchText is initially filled via the @Input() const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = 'text'; + component.searchText.set('text'); component.tableSearch.currentSearchText.set(''); - fixture.detectChanges(); + fixture.autoDetectChanges(); expect(fixture.debugElement.query(By.directive(MatIconButton))).not.toBe(null); - component.searchText = ''; + component.searchText.set(''); + fixture.detectChanges(); component.tableSearch.currentSearchText.set('text'); fixture.detectChanges(); expect(fixture.debugElement.query(By.directive(MatIconButton))).not.toBe(null); - component.searchText = 'text'; + component.searchText.set('text'); component.tableSearch.currentSearchText.set('text'); fixture.detectChanges(); expect(fixture.debugElement.query(By.directive(MatIconButton))).not.toBe(null); - component.searchText = ''; + component.searchText.set(''); component.tableSearch.currentSearchText.set(''); fixture.detectChanges(); expect(fixture.debugElement.query(By.directive(MatIconButton))).toBe(null); - })); + }); - it('should clear input on escape and ignore debounce time', fakeAsync(() => { + it('should clear input on escape and ignore debounce time', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = 'initial text'; - fixture.detectChanges(); + component.searchText.set('initial text'); + fixture.autoDetectChanges(); const input = fixture.debugElement.query(By.directive(MatInput)); @@ -155,25 +166,25 @@ describe('ZvTableSearchComponent', () => { expect(component.onSearchChanged).toHaveBeenCalledWith(''); - fixture.detectChanges(); + await vi.advanceTimersByTimeAsync(0); expect(input.nativeElement.value).toBe(''); - })); + }); - it('should not emit searchChanged on escape if the input was already empty', fakeAsync(() => { + it('should not emit searchChanged on escape if the input was already empty', async () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSearchChanged'); + vi.spyOn(component, 'onSearchChanged'); - component.searchText = ''; - fixture.detectChanges(); + component.searchText.set(''); + fixture.autoDetectChanges(); const input = fixture.debugElement.query(By.directive(MatInput)); input.triggerEventHandler('keyup', new KeyboardEvent('keyup', { key: 'Escape' } as any)); - tick(300); + await vi.advanceTimersByTimeAsync(300); expect(component.onSearchChanged).not.toHaveBeenCalled(); - })); + }); }); diff --git a/projects/components/table/src/subcomponents/table-settings.component.spec.ts b/projects/components/table/src/subcomponents/table-settings.component.spec.ts index 117533cc..291f1923 100644 --- a/projects/components/table/src/subcomponents/table-settings.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-settings.component.spec.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { MatButton } from '@angular/material/button'; import { MatCardActions } from '@angular/material/card'; import { MatCheckboxChange } from '@angular/material/checkbox'; @@ -33,7 +34,8 @@ export class TestComponent { public sortDefinitions: IZvTableSortDefinition[] = []; public pageSizeOptions: number[] = [1, 3, 7]; - @ViewChild(ZvTableSettingsComponent, { static: true }) tableSearch: ZvTableSettingsComponent; + @ViewChild(ZvTableSettingsComponent, { static: true }) + tableSearch: ZvTableSettingsComponent; public onSettingsSaved() {} public onSettingsAborted() {} @@ -41,54 +43,59 @@ export class TestComponent { describe('ZvTableSettingsComponent', () => { describe('integration', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); - })); + }); - it('should emit settingsAborted on cancel click', fakeAsync(() => { + it('should emit settingsAborted on cancel click', () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; fixture.detectChanges(); - spyOn(component, 'onSettingsAborted'); + vi.spyOn(component, 'onSettingsAborted'); const [, cancelBtn] = fixture.debugElement.query(By.directive(MatCardActions)).queryAll(By.directive(MatButton)); cancelBtn.triggerEventHandler('click', null); expect(component.onSettingsAborted).toHaveBeenCalled(); - })); + }); - it('should call service save and emit settingsSaved on save click', fakeAsync(() => { - const fixture = TestBed.createComponent(TestComponent); - const component = fixture.componentInstance; + it('should call service save and emit settingsSaved on save click', async () => { + vi.useFakeTimers(); + try { + const fixture = TestBed.createComponent(TestComponent); + const component = fixture.componentInstance; - const settings: IZvTableSetting = { - columnBlacklist: ['prop_b'], - pageSize: 11, - sortColumn: 'prop_a', - sortDirection: 'desc', - }; - component.tableId = 'tableA'; - component.tableSearch.settingsService.getStream = () => of(settings); - fixture.detectChanges(); + const settings: IZvTableSetting = { + columnBlacklist: ['prop_b'], + pageSize: 11, + sortColumn: 'prop_a', + sortDirection: 'desc', + }; + component.tableId = 'tableA'; + component.tableSearch.settingsService.getStream = () => of(settings); + fixture.detectChanges(); - spyOn(component, 'onSettingsSaved'); - spyOn(component.tableSearch.settingsService, 'save').and.returnValue(of(null).pipe(delay(10))); + vi.spyOn(component, 'onSettingsSaved'); + vi.spyOn(component.tableSearch.settingsService, 'save').mockReturnValue(of(null).pipe(delay(10))); - const [saveButton] = fixture.debugElement.query(By.directive(MatCardActions)).queryAll(By.directive(MatButton)); + const [saveButton] = fixture.debugElement.query(By.directive(MatCardActions)).queryAll(By.directive(MatButton)); - saveButton.triggerEventHandler('click', null); + saveButton.triggerEventHandler('click', null); - expect(component.tableSearch.settingsService.save).toHaveBeenCalledWith('tableA', settings); + expect(component.tableSearch.settingsService.save).toHaveBeenCalledWith('tableA', settings); - tick(10); + await vi.advanceTimersByTimeAsync(10); - expect(component.onSettingsSaved).toHaveBeenCalled(); - })); + expect(component.onSettingsSaved).toHaveBeenCalled(); + } finally { + vi.useRealTimers(); + } + }); - it('should not loose custom setting properties', fakeAsync(() => { + it('should not loose custom setting properties', () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; @@ -103,13 +110,13 @@ describe('ZvTableSettingsComponent', () => { component.tableSearch.settingsService.getStream = () => of(settings); fixture.detectChanges(); - spyOn(component.tableSearch.settingsService, 'save').and.returnValue(of(null)); + vi.spyOn(component.tableSearch.settingsService, 'save').mockReturnValue(of(null)); const [saveButton] = fixture.debugElement.query(By.directive(MatCardActions)).queryAll(By.directive(MatButton)); saveButton.triggerEventHandler('click', null); expect(component.tableSearch.settingsService.save).toHaveBeenCalledWith('tableA', settings); - })); + }); }); describe('isolated', () => { @@ -123,14 +130,14 @@ describe('ZvTableSettingsComponent', () => { }); }); - it('should get settings from the service by tableId', fakeAsync(() => { + it('should get settings from the service by tableId', () => { const tableSetting: IZvTableSetting = { columnBlacklist: ['prop_b'], pageSize: 10, sortColumn: 'prop_a', sortDirection: 'desc', }; - spyOn(settingsService, 'getStream').and.returnValue(of(tableSetting)); + vi.spyOn(settingsService, 'getStream').mockReturnValue(of(tableSetting)); const fixture = TestBed.createComponent(ZvTableSettingsComponent); const component = fixture.componentInstance; @@ -145,10 +152,10 @@ describe('ZvTableSettingsComponent', () => { expect(asyncSettings).toEqual(tableSetting); expect(settingsService.getStream).toHaveBeenCalledWith('table.1', true); - })); + }); - it("should use default settings if service doesn't return settings", fakeAsync(() => { - spyOn(settingsService, 'getStream').and.returnValue(of(null)); + it("should use default settings if service doesn't return settings", () => { + vi.spyOn(settingsService, 'getStream').mockReturnValue(of(null)); const fixture = TestBed.createComponent(ZvTableSettingsComponent); const component = fixture.componentInstance; @@ -166,9 +173,9 @@ describe('ZvTableSettingsComponent', () => { sortColumn: null, sortDirection: 'asc', }); - })); + }); - it('columnVisible should return false for blacklisted columns', fakeAsync(() => { + it('columnVisible should return false for blacklisted columns', () => { const fixture = TestBed.createComponent(ZvTableSettingsComponent); const component = fixture.componentInstance; function createSettings(blacklist: string[]): IZvTableSetting { @@ -184,7 +191,7 @@ describe('ZvTableSettingsComponent', () => { expect(component.columnVisible(createSettings(['prop']), createColumnDef('prop'))).toEqual(false); expect(component.columnVisible(createSettings(['a']), createColumnDef('prop'))).toEqual(true); expect(component.columnVisible(createSettings([]), createColumnDef('prop'))).toEqual(true); - })); + }); describe('onSortChanged', () => { let component: ZvTableSettingsComponent; @@ -205,7 +212,7 @@ describe('ZvTableSettingsComponent', () => { return { sortColumn: sortColumn, sortDirection: sortDirection }; } - it('should remove sort column from blacklist', fakeAsync(() => { + it('should remove sort column from blacklist', () => { const settings = createSettings(['prop_1', 'prop_2'], 'prop', 'desc'); component.onSortChanged(createColumnDef('prop_2', 'desc'), settings); expect(settings as any).toEqual({ @@ -213,9 +220,9 @@ describe('ZvTableSettingsComponent', () => { sortColumn: 'prop_2', sortDirection: 'desc', }); - })); + }); - it('should set sortColumn and sortDirection', fakeAsync(() => { + it('should set sortColumn and sortDirection', () => { const settings = createSettings([], 'prop', 'desc'); component.onSortChanged(createColumnDef('prop_2', 'asc'), settings); expect(settings as any).toEqual({ @@ -223,10 +230,10 @@ describe('ZvTableSettingsComponent', () => { sortColumn: 'prop_2', sortDirection: 'asc', }); - })); + }); }); - it('onColumnVisibilityChange should toggle column in blacklist', fakeAsync(() => { + it('onColumnVisibilityChange should toggle column in blacklist', () => { const fixture = TestBed.createComponent(ZvTableSettingsComponent); const component = fixture.componentInstance; @@ -257,6 +264,6 @@ describe('ZvTableSettingsComponent', () => { event.checked = true; component.onColumnVisibilityChange(event, settings, columnDef); expect(settings.columnBlacklist).toEqual(['prop2']); - })); + }); }); }); diff --git a/projects/components/table/src/subcomponents/table-sort.component.spec.ts b/projects/components/table/src/subcomponents/table-sort.component.spec.ts index c939273a..e910a77e 100644 --- a/projects/components/table/src/subcomponents/table-sort.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-sort.component.spec.ts @@ -1,6 +1,6 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; -import { TestBed, waitForAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { MatMiniFabButton } from '@angular/material/button'; import { MatSelectHarness } from '@angular/material/select/testing'; import { By } from '@angular/platform-browser'; @@ -29,17 +29,18 @@ export class TestComponent { { prop: 'prop2', displayName: 'Sort Prop' }, ]; - @ViewChild(ZvTableSortComponent, { static: true }) tableSort: ZvTableSortComponent; + @ViewChild(ZvTableSortComponent, { static: true }) + tableSort: ZvTableSortComponent; public onSortChanged(_event: IZvTableSort) {} } describe('ZvTableSortComponent', () => { - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [TestComponent], }).compileComponents(); - })); + }); it('should select initial sort column', async () => { const fixture = TestBed.createComponent(TestComponent); @@ -57,7 +58,7 @@ describe('ZvTableSortComponent', () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSortChanged'); + vi.spyOn(component, 'onSortChanged'); component.sortColumn = 'prop'; component.sortDirection = 'asc'; @@ -100,7 +101,7 @@ describe('ZvTableSortComponent', () => { const fixture = TestBed.createComponent(TestComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - spyOn(component, 'onSortChanged'); + vi.spyOn(component, 'onSortChanged'); component.sortColumn = 'prop'; component.sortDirection = 'asc'; diff --git a/projects/components/table/src/table.component.spec.ts b/projects/components/table/src/table.component.spec.ts index ba35125d..f27df23a 100644 --- a/projects/components/table/src/table.component.spec.ts +++ b/projects/components/table/src/table.component.spec.ts @@ -2,8 +2,9 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { CommonModule } from '@angular/common'; -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injectable, LOCALE_ID, QueryList, ViewChild } from '@angular/core'; -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injectable, LOCALE_ID, QueryList, ViewChild, signal } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { IconType, MatIconHarness, MatIconTestingModule } from '@angular/material/icon/testing'; import { MatMenuItemHarness } from '@angular/material/menu/testing'; import { MatSortHarness } from '@angular/material/sort/testing'; @@ -16,7 +17,7 @@ import { map } from 'rxjs/operators'; import { MatPaginatorIntl } from '@angular/material/paginator'; import { ZvTableDataSource } from './data/table-data-source'; import { ZvTableColumn } from './directives/table.directives'; -import { ZvTableMemoryStateManager } from './helper/state-manager'; +import { ZvTableMemoryStateManager, ZvTableUrlStateManager } from './helper/state-manager'; import { IZvTableSortDefinition, ZvTableActionScope } from './models'; import { IZvTableSetting, ZvTableSettingsService } from './services/table-settings.service'; import { ZvTablePaginationComponent } from './subcomponents/table-pagination.component'; @@ -58,7 +59,10 @@ const route: ActivatedRoute = { if (prop === 'queryParamMap') { return obj.value; } - return null; + if (prop === 'routeConfig') { + return { name: undefined, component: undefined }; + } + return undefined; }, }), queryParamMap: queryParams$, @@ -77,17 +81,17 @@ function createColDef(data: { property?: string; header?: string; sortable?: boo template: ` @@ -117,7 +121,7 @@ function createColDef(data: { property?: string; header?: string; sortable?: boo
custom button section
- + item: {{ item.id }}
@@ -127,25 +131,27 @@ function createColDef(data: { property?: string; header?: string; sortable?: boo imports: [MatIconTestingModule, ZvTableModule], }) export class TestComponent { - public caption = 'title'; - public dataSource: ZvTableDataSource; - public tableId = 'tableId'; - public refreshable = true; - public filterable = true; - public showSettings = true; - public layout: 'card' | 'border' | 'flat' = 'card'; - public striped = true; - public sortDefinitions: IZvTableSortDefinition[] = [{ prop: '__customSort', displayName: 'Custom Sort' }]; - public preferSortDropdown = true; + public caption = signal('title'); + public dataSource = signal>(undefined); + public tableId = signal('tableId'); + public refreshable = signal(true); + public filterable = signal(true); + public showSettings = signal(true); + public layout = signal<'card' | 'border' | 'flat'>('card'); + public striped = signal(true); + public sortDefinitions = signal([{ prop: '__customSort', displayName: 'Custom Sort' }]); + public preferSortDropdown = signal(true); /** Karma doesn't recognize url changes from code. */ - public stateManager = new ZvTableMemoryStateManager(); + public stateManager = signal(new ZvTableMemoryStateManager()); - public expanded = false; - public showToggleColumn = true; + public expanded = signal(false); + public showToggleColumn = signal(true); - @ViewChild(ZvTable, { static: true }) table: ZvTable; - @ViewChild(ZvTablePaginationComponent, { static: true }) paginator: ZvTablePaginationComponent; + @ViewChild(ZvTable, { static: true }) + table: ZvTable; + @ViewChild(ZvTablePaginationComponent, { static: true }) + paginator: ZvTablePaginationComponent; public onPage(_event: unknown) {} public onListActionExecute(_selection: unknown[]) {} @@ -170,6 +176,8 @@ describe('ZvTable', () => { ], }); const table = TestBed.inject(ZvTable); + // Override default URL state manager to avoid router mock issues in Angular 21 + table.stateManager = new ZvTableMemoryStateManager(); table.tableId = 'tableid'; table.dataSource = new ZvTableDataSource(() => of([{ a: 'asdfg' }, { a: 'gasdf' }, { a: 'asdas' }, { a: '32424rw' }])); if (hooks) { @@ -182,12 +190,17 @@ describe('ZvTable', () => { beforeEach(() => { queryParams$.next(convertToParamMap({ other: 'value' })); + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); }); - it('should update table state from the settings service and the query params', fakeAsync(() => { + it('should update table state from the settings service and the query params', async () => { const table = createTableInstance(); settingsService.settings$.next({}); - spyOn(settingsService, 'getStream').and.callThrough(); + vi.spyOn(settingsService, 'getStream'); table.columnDefs = [createColDef({ property: 'prop1' }), createColDef({ property: 'prop2' })]; table.rowDetail = { showToggleColumn: true } as any; table.dataSource.listActions.push({ icon: 'add', label: 'Add', scope: ZvTableActionScope.list }); @@ -195,7 +208,7 @@ describe('ZvTable', () => { table.ngOnInit(); table.ngAfterContentInit(); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.pageSize).toEqual(15); expect(table.pageIndex).toEqual(0); @@ -213,7 +226,7 @@ describe('ZvTable', () => { sortDirection: 'desc', } as IZvTableSetting, }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.pageSize).toEqual(22); expect(table.pageIndex).toEqual(0); @@ -227,7 +240,7 @@ describe('ZvTable', () => { tableid: '1◬1◬asdf◬Column1◬asc', } as Params) ); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.pageSize).toEqual(1); expect(table.pageIndex).toEqual(1); @@ -238,35 +251,35 @@ describe('ZvTable', () => { table.rowDetail = { showToggleColumn: false } as any; queryParams$.next(convertToParamMap({ tableid: '1◬1◬asdf◬Column1◬desc' } as Params)); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.displayedColumns).toEqual(['select', 'prop1', 'options']); table.rowDetail = null; queryParams$.next(convertToParamMap({ tableid: '1◬2◬asdf◬Column1◬desc' } as Params)); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.displayedColumns).toEqual(['select', 'prop1', 'options']); table.dataSource.listActions.length = 0; queryParams$.next(convertToParamMap({ tableid: '1◬3◬asdf◬Column1◬desc' } as Params)); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.displayedColumns).toEqual(['prop1', 'options']); table.dataSource.rowActions.length = 0; table.showSettings = false; table.refreshable = false; queryParams$.next(convertToParamMap({ tableid: '1◬4◬asdf◬Column1◬desc' } as Params)); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.displayedColumns).toEqual(['prop1']); - })); + }); - it('should initialize page size options from the service', fakeAsync(() => { + it('should initialize page size options from the service', () => { const table = createTableInstance(); settingsService.pageSizeOptions = [3, 7, 9]; table.ngOnInit(); expect(table.pageSizeOptions).toBe(settingsService.pageSizeOptions); - })); + }); - it('should show right content depending on the datatable state', fakeAsync(() => { + it('should show right content depending on the datatable state', () => { const table = createTableInstance(); table.dataSource = { loading: false, error: null, visibleRows: [] } as any; @@ -283,9 +296,9 @@ describe('ZvTable', () => { expect(table.showNoEntriesText).toBe(false); expect(table.showError).toBe(true); expect(table.showLoading).toBe(false); - })); + }); - it('should only enable settings if all prerequisites are met', fakeAsync(() => { + it('should only enable settings if all prerequisites are met', () => { const table = createTableInstance(); table.tableId = 'test'; @@ -303,9 +316,9 @@ describe('ZvTable', () => { table.tableId = null; expect(table.settingsEnabled).toBe(false); - })); + }); - it('should only show list actions if there are any menu items', fakeAsync(() => { + it('should only show list actions if there are any menu items', () => { const table = createTableInstance(); table.tableId = 'test'; table.showSettings = true; @@ -320,9 +333,9 @@ describe('ZvTable', () => { table.refreshable = true; expect(table.showListActions).toBe(true); table.refreshable = false; - })); + }); - it('should merge sort definitions and only show sort dropdown when there are custom definitions when preferSortDropdown input is false', fakeAsync(() => { + it('should merge sort definitions and only show sort dropdown when there are custom definitions when preferSortDropdown input is false', () => { const table = createTableInstance(); table.preferSortDropdown = false; const customSortDef = { prop: 'custom', displayName: 'Custom' }; @@ -369,9 +382,9 @@ describe('ZvTable', () => { expect(table.useSortDropdown).toBe(false); expect(table.showDropdownSorting).toBe(false); expect(table.sortDefinitions).toEqual([]); - })); + }); - it('should always show sort dropdown when preferSortDropdown input is true and there are things to sort', fakeAsync(() => { + it('should always show sort dropdown when preferSortDropdown input is true and there are things to sort', () => { const table = createTableInstance(); table.preferSortDropdown = true; const customSortDef = { prop: 'custom', displayName: 'Custom' }; @@ -417,13 +430,15 @@ describe('ZvTable', () => { expect(table.useSortDropdown).toBe(true); expect(table.showDropdownSorting).toBe(false); expect(table.sortDefinitions).toEqual([]); - })); + }); it('requestUpdate should update query params without overriding deleting other query params', () => { queryParams$.next(convertToParamMap({ existingParam: '0815' })); - spyOn(router, 'navigate'); + const localRouter = { navigate: vi.fn() }; + const stateManager = new ZvTableUrlStateManager(localRouter as any, route); const table = createTableInstance(); + table.stateManager = stateManager; table.pageIndex = 3; table.pageSize = 12; table.filterText = 'Blubb'; @@ -438,38 +453,38 @@ describe('ZvTable', () => { requestUpdate: '12◬3◬Blubb◬col◬desc', }; - expect(router.navigate).toHaveBeenCalledWith([], { queryParams: expectedQueryParams, relativeTo: route }); + expect(localRouter.navigate).toHaveBeenCalledWith([], { queryParams: expectedQueryParams, relativeTo: route }); }); - it('should set locale on the data source', fakeAsync(() => { + it('should set locale on the data source', async () => { const initialDataSource = new ZvTableDataSource(() => of([]), 'client'); - spyOn(initialDataSource, 'updateData'); + vi.spyOn(initialDataSource, 'updateData'); const newDataSource = new ZvTableDataSource(() => of([]), 'client'); - spyOn(newDataSource, 'updateData'); + vi.spyOn(newDataSource, 'updateData'); const table = createTableInstance(); table.dataSource = initialDataSource; table.ngOnInit(); table.ngAfterContentInit(); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(initialDataSource.locale).toBe('de'); - })); + }); - it('should update state when sort changes', fakeAsync(() => { + it('should update state when sort changes', async () => { const table = createTableInstance(true); - spyOn(table as any, 'requestUpdate').and.callThrough(); + vi.spyOn(table as any, 'requestUpdate'); table.onSortChanged({ sortColumn: 'col', sortDirection: 'desc' }); expect((table as any).requestUpdate).toHaveBeenCalledTimes(1); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.sortColumn).toEqual('col'); expect(table.sortDirection).toEqual('desc'); - })); + }); - it('should update state when filter changes', fakeAsync(() => { + it('should update state when filter changes', async () => { const table = createTableInstance(true); - spyOn(table as any, 'requestUpdate').and.callThrough(); + vi.spyOn(table as any, 'requestUpdate'); // Set initial page to verify it gets reset table.pageIndex = 5; @@ -482,33 +497,35 @@ describe('ZvTable', () => { currentPage: 0, }); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.filterText).toEqual('test'); expect(table.pageIndex).toEqual(0); - })); + }); - it('should update state when page changes and emit output', fakeAsync(() => { + it('should update state when page changes and emit output', async () => { const table = createTableInstance(true); // eslint-disable-next-line @typescript-eslint/no-deprecated - spyOn(table.page, 'emit'); - spyOn(table as any, 'requestUpdate').and.callThrough(); + vi.spyOn(table.page, 'emit'); + vi.spyOn(table as any, 'requestUpdate'); table.onPage({ pageIndex: 5, pageSize: 3, length: 20, previousPageIndex: 4 }); expect((table as any).requestUpdate).toHaveBeenCalledTimes(1); // eslint-disable-next-line @typescript-eslint/no-deprecated expect(table.page.emit).toHaveBeenCalledTimes(1); - tick(1); + await vi.advanceTimersByTimeAsync(1); expect(table.pageIndex).toEqual(5); expect(table.pageSize).toEqual(3); - })); + }); - it('should delete own query params and flip to front when settings are saved', fakeAsync(() => { + it('should delete own query params and flip to front when settings are saved', async () => { queryParams$.next(convertToParamMap({ existingParam: '0815', tableId: '12◬3◬Blubb◬col◬desc' })); - spyOn(router, 'navigate'); + const localRouter = { navigate: vi.fn() }; + const stateManager = new ZvTableUrlStateManager(localRouter as any, route); const table = createTableInstance(); + table.stateManager = stateManager; table.tableId = 'tableId'; table.flipContainer = { showFront: () => {} } as any; - spyOn(table.flipContainer, 'showFront'); + vi.spyOn(table.flipContainer, 'showFront'); table.onSettingsSaved(); @@ -516,14 +533,14 @@ describe('ZvTable', () => { const expectedQueryParams = { existingParam: '0815', }; - expect(router.navigate).toHaveBeenCalledWith([], { queryParams: expectedQueryParams, relativeTo: route }); - tick(1); - })); + expect(localRouter.navigate).toHaveBeenCalledWith([], { queryParams: expectedQueryParams, relativeTo: route }); + await vi.advanceTimersByTimeAsync(1); + }); - it('should update view when view/content children change', fakeAsync(() => { - spyOn(cd, 'markForCheck'); + it('should update view when view/content children change', () => { + vi.spyOn(cd, 'markForCheck'); const table = createTableInstance(); - spyOn(table as any, 'updateTableState').and.callThrough(); + vi.spyOn(table as any, 'updateTableState'); table.customHeader = null; expect(cd.markForCheck).toHaveBeenCalledTimes(1); @@ -541,7 +558,7 @@ describe('ZvTable', () => { table.rowDetail = null; expect((table as any).updateTableState).toHaveBeenCalledTimes(2); expect(cd.markForCheck).toHaveBeenCalledTimes(5); - })); + }); }); describe('intgration', () => { @@ -558,7 +575,11 @@ describe('ZvTable', () => { component = fixture.componentInstance; expect(component).toBeDefined(); modifySettings?.(component.table._settingsService as TestSettingsService); - component.dataSource = tableDataSource; + component.dataSource.set(tableDataSource); + fixture.detectChanges(); + // Allow async data source subscriptions to settle + await new Promise((resolve) => setTimeout(resolve, 0)); + fixture.detectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); table = await loader.getHarness(ZvTableHarness); } @@ -639,7 +660,7 @@ describe('ZvTable', () => { (settingService) => { settingService.settingsEnabled = true; settingService.settings$.next({ - [component.tableId]: { + [component.tableId()]: { pageSize: 2, sortColumn: null, sortDirection: null, @@ -652,23 +673,27 @@ describe('ZvTable', () => { it('should bind caption', async () => { expect(await table.getCaption()).toEqual('title'); - component.caption = 'foo'; + component.caption.set('foo'); + fixture.detectChanges(); expect(await table.getCaption()).toEqual('foo'); }); it('should set layout', async () => { expect(await table.getIsLayout('card')).toBeTruthy(); - component.table.layout = 'border'; + component.layout.set('border'); + fixture.detectChanges(); expect(await table.getIsLayout('border')).toBeTruthy(); - component.table.layout = 'flat'; + component.layout.set('flat'); + fixture.detectChanges(); expect(await table.getIsLayout('flat')).toBeTruthy(); }); it('should set striped', async () => { expect(await table.getIsStriped()).toBeTruthy(); - component.striped = false; + component.striped.set(false); + fixture.detectChanges(); expect(await table.getIsStriped()).toBeFalsy(); }); @@ -732,7 +757,7 @@ describe('ZvTable', () => { const searchInput = await table.getSearchInput(); expect(await searchInput.getValue()).toEqual(''); - spyOn(component.table, 'onSearchChanged'); + vi.spyOn(component.table, 'onSearchChanged'); await searchInput.setValue('asdf'); expect(component.table.onSearchChanged).toHaveBeenCalledTimes(1); expect(component.table.onSearchChanged).toHaveBeenCalledWith('asdf'); @@ -747,7 +772,7 @@ describe('ZvTable', () => { }), (settingService) => { settingService.settings$.next({ - [component.tableId]: { + [component.tableId()]: { pageSize: 3, // This will create multiple pages sortColumn: null, sortDirection: null, @@ -783,7 +808,7 @@ describe('ZvTable', () => { const optionTexts = await Promise.all((await sortSelect.getOptions()).map(async (o) => await o.getText())); expect(optionTexts).toEqual(['', 'Custom Sort', 'id']); - spyOn(component.table, 'onSortChanged'); + vi.spyOn(component.table, 'onSortChanged'); await sortSelect.clickOptions({ text: 'id' }); expect(component.table.onSortChanged).toHaveBeenCalledWith({ sortColumn: 'id', @@ -801,8 +826,8 @@ describe('ZvTable', () => { }); it('should sort via header', async () => { - component.preferSortDropdown = false; - component.sortDefinitions = []; + component.preferSortDropdown.set(false); + component.sortDefinitions.set([]); fixture.detectChanges(); const sort = await loader.getHarness(MatSortHarness); @@ -812,7 +837,7 @@ describe('ZvTable', () => { const idSortHeader = (await sort.getSortHeaders({ label: 'id' }))[0]; - spyOn(component.table, 'onSortChanged'); + vi.spyOn(component.table, 'onSortChanged'); await idSortHeader.click(); let activeHeader = await sort.getActiveHeader(); expect(await activeHeader.getLabel()).toEqual('id'); @@ -849,13 +874,14 @@ describe('ZvTable', () => { const listActions = await listActionsMenu.getItems(); expect(listActions.length).toEqual(3); - spyOn(component.table.dataSource, 'updateData'); + vi.spyOn(component.table.dataSource, 'updateData'); await listActionsMenu.clickItem({ text: 'refresh Refresh list' }); expect(component.table.dataSource.updateData).toHaveBeenCalled(); }); it('should hide refresh button', async () => { - component.refreshable = false; + component.refreshable.set(false); + fixture.detectChanges(); const listActionsMenu = await table.getListActionsButton(); await listActionsMenu.open(); @@ -877,7 +903,8 @@ describe('ZvTable', () => { }); it('should hide settings button', async () => { - component.showSettings = false; + component.showSettings.set(false); + fixture.detectChanges(); const listActionsMenu = await table.getListActionsButton(); await listActionsMenu.open(); @@ -893,14 +920,14 @@ describe('ZvTable', () => { const listActionsMenu = await table.getListActionsButton(); await listActionsMenu.open(); - spyOn(component, 'onListActionExecute'); + vi.spyOn(component, 'onListActionExecute'); await listActionsMenu.clickItem({ text: 'check custom action' }); expect(component.onListActionExecute).toHaveBeenCalledWith([{ id: 1, str: 'item 1' }]); }); it('should call customRowAction', async () => { const actions = await table.getRowActions(0); - spyOn(component, 'onListActionExecute'); + vi.spyOn(component, 'onListActionExecute'); const actionsButtons = await actions.getActionButtons(); await actionsButtons[0].click(); expect(component.onListActionExecute).toHaveBeenCalledWith([{ id: 1, str: 'item 1' }]); @@ -1066,9 +1093,10 @@ describe('ZvTable', () => { }) ); - component.filterable = false; - component.refreshable = false; - component.showSettings = false; + component.filterable.set(false); + component.refreshable.set(false); + component.showSettings.set(false); + fixture.detectChanges(); }); it('routerlink should work', async () => { @@ -1107,7 +1135,7 @@ describe('ZvTable', () => { // List-Actions - 2. Level { - expect(await listActions[0].hasSubmenu()).toBeTrue(); + expect(await listActions[0].hasSubmenu()).toBe(true); const subListActionsMenu = await listActions[0].getSubmenu(); expect(subListActionsMenu).toBeTruthy(); await subListActionsMenu.open(); @@ -1119,7 +1147,7 @@ describe('ZvTable', () => { // List-Actions - 2. Level - partially hidden { - expect(await listActions[3].hasSubmenu()).toBeTrue(); + expect(await listActions[3].hasSubmenu()).toBe(true); const subListActionsMenu = await listActions[3].getSubmenu(); expect(subListActionsMenu).toBeTruthy(); await subListActionsMenu.open(); @@ -1144,7 +1172,7 @@ describe('ZvTable', () => { // Row-Actions - 2. Level { - expect(await rowActions[3].hasSubmenu()).toBeTrue(); + expect(await rowActions[3].hasSubmenu()).toBe(true); const subListActionsMenu = await rowActions[3].getSubmenu(); expect(subListActionsMenu).toBeTruthy(); await subListActionsMenu.open(); @@ -1166,7 +1194,7 @@ describe('ZvTable', () => { expect(listActions.length).toEqual(6); // List-Actions - 2. Level - expect(await listActions[2].hasSubmenu()).toBeTrue(); + expect(await listActions[2].hasSubmenu()).toBe(true); const subListActionsMenu = await listActions[2].getSubmenu(); expect(subListActionsMenu).toBeTruthy(); await subListActionsMenu.open(); @@ -1202,7 +1230,7 @@ describe('ZvTable', () => { } else { // getHarness() throws an error, if nothing was found const matIconHarnesses = await matMenuItemHarness.getAllHarnesses(MatIconHarness); - expect(matIconHarnesses).toHaveSize(0); + expect(matIconHarnesses).toHaveLength(0); } } }); diff --git a/projects/components/test-setup.ts b/projects/components/test-setup.ts new file mode 100644 index 00000000..889513c7 --- /dev/null +++ b/projects/components/test-setup.ts @@ -0,0 +1,17 @@ +import '@angular/localize/init'; + +// jsdom doesn't provide IntersectionObserver +if (typeof globalThis.IntersectionObserver === 'undefined') { + globalThis.IntersectionObserver = class IntersectionObserver { + constructor(_callback: IntersectionObserverCallback, _options?: IntersectionObserverInit) {} + observe() {} + unobserve() {} + disconnect() {} + takeRecords(): IntersectionObserverEntry[] { + return []; + } + readonly root: Element | null = null; + readonly rootMargin: string = ''; + readonly thresholds: readonly number[] = []; + } as any; +} diff --git a/projects/components/test.ts b/projects/components/test.ts deleted file mode 100644 index a5d56cf2..00000000 --- a/projects/components/test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import 'zone.js/testing'; -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting(), { - teardown: { destroyAfterEach: false }, -}); diff --git a/projects/components/tsconfig.spec.json b/projects/components/tsconfig.spec.json index d5c4d5f8..9991fd1b 100644 --- a/projects/components/tsconfig.spec.json +++ b/projects/components/tsconfig.spec.json @@ -2,11 +2,10 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "../../out-tsc/spec", - "types": ["jasmine", "node"], + "types": ["vitest/globals", "node", "@angular/localize"], // To much errors for now, but we should enable this in the future. "strictNullChecks": false }, - "files": ["test.ts", "polyfills-test.ts"], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/projects/components/utils/src/auto-form-array.spec.ts b/projects/components/utils/src/auto-form-array.spec.ts index 8147dbd7..226382d0 100644 --- a/projects/components/utils/src/auto-form-array.spec.ts +++ b/projects/components/utils/src/auto-form-array.spec.ts @@ -59,7 +59,7 @@ describe('AutoFormArray', () => { }); it('should adjust number of subforms when patchValue is called', () => { const array = new AutoFormArray(() => new FormControl('')); - spyOn(array, 'resizeTo').and.callThrough(); + vi.spyOn(array, 'resizeTo'); array.patchValue([0, 1, 2, 3]); @@ -69,7 +69,7 @@ describe('AutoFormArray', () => { }); it('should adjust number of subforms when reset is called', () => { const array = new AutoFormArray(() => new FormControl('')); - spyOn(array, 'resizeTo').and.callThrough(); + vi.spyOn(array, 'resizeTo'); array.reset([0, 1, 2, 3]); @@ -79,7 +79,7 @@ describe('AutoFormArray', () => { }); it('should NOT adjust number of subforms when setValue is called', () => { const array = new AutoFormArray(() => new FormControl('')); - spyOn(array, 'resizeTo').and.callThrough(); + vi.spyOn(array, 'resizeTo'); expect(() => array.setValue([0, 1, 2, 3])).toThrow(); expect(array.resizeTo).not.toHaveBeenCalled(); diff --git a/projects/components/utils/src/inject-destroy.spec.ts b/projects/components/utils/src/inject-destroy.spec.ts index 099bc05e..3127f824 100644 --- a/projects/components/utils/src/inject-destroy.spec.ts +++ b/projects/components/utils/src/inject-destroy.spec.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { vi } from 'vitest'; import { interval, takeUntil } from 'rxjs'; import { injectDestroy } from './inject-destroy'; @@ -22,23 +23,28 @@ describe(injectDestroy.name, () => { let fixture: ComponentFixture; beforeEach(() => { + vi.useFakeTimers(); fixture = TestBed.createComponent(TestComponent); component = fixture.componentInstance; }); - it('should handle async stuff', fakeAsync(() => { - component.ngOnInit(); + afterEach(() => { + vi.useRealTimers(); + }); + + it('should handle async stuff', async () => { + fixture.detectChanges(); expect(component.count).toBe(0); - tick(1000); + await vi.advanceTimersByTimeAsync(1000); expect(component.count).toBe(1); - tick(1000); + await vi.advanceTimersByTimeAsync(1000); expect(component.count).toBe(2); fixture.destroy(); // destroy the component here - tick(1000); + await vi.advanceTimersByTimeAsync(1000); expect(component.count).toBe(2); - })); + }); }); }); diff --git a/projects/components/view/src/view-data-source.spec.ts b/projects/components/view/src/view-data-source.spec.ts index d2c3e1ad..066bc1fb 100644 --- a/projects/components/view/src/view-data-source.spec.ts +++ b/projects/components/view/src/view-data-source.spec.ts @@ -1,4 +1,4 @@ -import { fakeAsync, tick } from '@angular/core/testing'; +import { vi } from 'vitest'; import { of, tap, throwError, timer } from 'rxjs'; import { ZvViewDataSource } from './view-data-source'; @@ -18,9 +18,9 @@ describe('ViewDataSource', () => { loadFn: () => of({}), }); - expect(vds.contentBlocked()).toBeFalse(); + expect(vds.contentBlocked()).toBe(false); vds.setViewBlocked(true); - expect(vds.contentBlocked()).toBeTrue(); + expect(vds.contentBlocked()).toBe(true); }); }); @@ -77,7 +77,7 @@ describe('ViewDataSource', () => { loadFn: () => throwError(() => new Error('oops')), }); vds.connect(); - expect(vds.contentVisible()).toBeFalse(); + expect(vds.contentVisible()).toBe(false); }); it('should return true if there is no error', () => { @@ -86,7 +86,7 @@ describe('ViewDataSource', () => { loadFn: () => of({}), }); vds.connect(); - expect(vds.contentVisible()).toBeTrue(); + expect(vds.contentVisible()).toBe(true); }); }); @@ -99,7 +99,7 @@ describe('ViewDataSource', () => { }); vds.connect(); expect(vds.exception()?.errorObject).toEqual(error); - expect(vds.exception()?.alignCenter).toBeTrue(); + expect(vds.exception()?.alignCenter).toBe(true); expect(vds.exception()?.icon).toBe('sentiment_very_dissatisfied'); expect(vds.result()).toBeNull(); }); @@ -126,27 +126,35 @@ describe('ViewDataSource', () => { loadFn = throwError(() => error); vds.updateData(); expect(vds.exception()?.errorObject).toEqual(error); - expect(vds.exception()?.alignCenter).toBeTrue(); + expect(vds.exception()?.alignCenter).toBe(true); expect(vds.exception()?.icon).toBe('sentiment_very_dissatisfied'); expect(vds.result()).toBeNull(); }); }); describe('disconnect', () => { - it('this just shows, that the timer is actually respected', fakeAsync(() => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('this just shows, that the timer is actually respected', async () => { let loadFnCalled = false; const vds = new ZvViewDataSource({ loadTrigger$: of({}), loadFn: () => timer(1000).pipe(tap(() => (loadFnCalled = true))), }); vds.connect(); - expect(loadFnCalled).toBeFalse(); - tick(1000); - expect(loadFnCalled).toBeTrue(); + expect(loadFnCalled).toBe(false); + await vi.advanceTimersByTimeAsync(1000); + expect(loadFnCalled).toBe(true); vds.disconnect(); - })); + }); - it('should cancel connectSub', fakeAsync(() => { + it('should cancel connectSub', async () => { let loadFnCalled; const vds = new ZvViewDataSource({ loadTrigger$: of({}), @@ -155,12 +163,12 @@ describe('ViewDataSource', () => { vds.connect(); expect(loadFnCalled).toBeUndefined(); vds.disconnect(); - tick(1000); + await vi.advanceTimersByTimeAsync(1000); expect(loadFnCalled).toBeUndefined(); expect(vds.result()).toBeNull(); - })); + }); - it('should cancel loadingSub', fakeAsync(() => { + it('should cancel loadingSub', async () => { let loadFnCalled; const vds = new ZvViewDataSource({ loadTrigger$: of({}), @@ -170,8 +178,8 @@ describe('ViewDataSource', () => { expect(loadFnCalled).toBeUndefined(); vds.updateData(); vds.disconnect(); - tick(1000); + await vi.advanceTimersByTimeAsync(1000); expect(loadFnCalled).toBeUndefined(); - })); + }); }); }); diff --git a/projects/components/view/src/view.component.spec.ts b/projects/components/view/src/view.component.spec.ts index cbd9a89a..a98b37e5 100644 --- a/projects/components/view/src/view.component.spec.ts +++ b/projects/components/view/src/view.component.spec.ts @@ -19,7 +19,7 @@ class TestViewDataSource implements IZvViewDataSource { @Component({ selector: 'zv-test-component', template: ` - +
content text
hight strech
@@ -29,8 +29,9 @@ class TestViewDataSource implements IZvViewDataSource { imports: [ZvView], }) export class TestDataSourceComponent { - public dataSource: TestViewDataSource; - @ViewChild(ZvView) formComponent: ZvView; + public dataSource = signal(undefined); + @ViewChild(ZvView) + formComponent: ZvView; } describe('ZvView', () => { @@ -45,6 +46,7 @@ describe('ZvView', () => { }).compileComponents(); fixture = TestBed.createComponent(TestDataSourceComponent); component = fixture.componentInstance; + fixture.detectChanges(); loader = TestbedHarnessEnvironment.loader(fixture); view = await loader.getHarness(ZvViewHarness); @@ -52,13 +54,15 @@ describe('ZvView', () => { it('should show error view, when exception property is not null', async () => { const dataSource = new TestViewDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); + fixture.detectChanges(); expect(await view.isErrorVisible()).toBe(false); dataSource.exception.set({ errorObject: null, }); + fixture.detectChanges(); expect(await view.isErrorVisible()).toBe(true); expect(await view.getErrorText()).toBe(''); @@ -66,6 +70,7 @@ describe('ZvView', () => { expect(await view.isErrorCentered()).toBe(false); dataSource.exception.update((val) => ({ ...val, errorObject: new Error('error1') })); + fixture.detectChanges(); expect(await view.isErrorVisible()).toBe(true); expect(await view.getErrorText()).toBe('error1'); @@ -73,43 +78,49 @@ describe('ZvView', () => { expect(await view.isErrorCentered()).toBe(false); dataSource.exception.update((val) => ({ ...val, alignCenter: true }) as IZvException); + fixture.detectChanges(); expect(await view.isErrorCentered()).toBe(true); dataSource.exception.update((val) => ({ ...val, icon: 'asdf-icon' }) as IZvException); + fixture.detectChanges(); expect(await view.getErrorIconName()).toBe('asdf-icon'); }); it('should block ui when contentBlocked is true', async () => { const dataSource = new TestViewDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); + fixture.detectChanges(); expect(await view.isContentBlocked()).toBe(false); dataSource.contentBlocked.set(true); + fixture.detectChanges(); expect(await view.isContentBlocked()).toBe(true); }); it('should hide content when contentVisible is false', async () => { const dataSource = new TestViewDataSource(); - component.dataSource = dataSource; + component.dataSource.set(dataSource); + fixture.detectChanges(); expect(await view.isContentVisible()).toBe(true); dataSource.contentVisible.set(false); + fixture.detectChanges(); expect(await view.isContentVisible()).toBe(false); }); - it("should call dataSource's connect() once per new dataSource", () => { + it("should call dataSource's connect() once per new dataSource", async () => { const ds1 = new TestViewDataSource(); - component.dataSource = ds1; - spyOn(ds1, 'connect').and.callThrough(); + vi.spyOn(ds1, 'connect'); + component.dataSource.set(ds1); fixture.detectChanges(); expect(ds1.connect).toHaveBeenCalledTimes(1); const ds2 = new TestViewDataSource(); - component.dataSource = ds2; - spyOn(ds1, 'disconnect').and.callThrough(); - spyOn(ds2, 'connect').and.callThrough(); + vi.spyOn(ds1, 'disconnect'); + vi.spyOn(ds2, 'connect'); + component.dataSource.set(ds2); fixture.detectChanges(); diff --git a/projects/zvoove-components-demo/karma.conf.js b/projects/zvoove-components-demo/karma.conf.js deleted file mode 100644 index f9a42ea0..00000000 --- a/projects/zvoove-components-demo/karma.conf.js +++ /dev/null @@ -1,38 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/zvoove-components-demo'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - }, - reporters: ['progress', 'kjhtml'], - customLaunchers: { - ChromeHeadlessNoSandbox: { - base: 'ChromeHeadless', - flags: ['--no-sandbox'], - }, - }, - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - }); -}; diff --git a/projects/zvoove-components-demo/src/test.ts b/projects/zvoove-components-demo/src/test.ts deleted file mode 100644 index 0d86d3e7..00000000 --- a/projects/zvoove-components-demo/src/test.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting(), { - teardown: { destroyAfterEach: false }, -}); diff --git a/projects/zvoove-components-demo/tsconfig.spec.json b/projects/zvoove-components-demo/tsconfig.spec.json index 8eec07d4..57b60842 100644 --- a/projects/zvoove-components-demo/tsconfig.spec.json +++ b/projects/zvoove-components-demo/tsconfig.spec.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "../../out-tsc/spec", - "types": ["jasmine", "node"] + "types": ["vitest/globals", "node"] }, - "files": ["src/test.ts", "src/polyfills.ts"], "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] } From 48aaedac55b098a764908e99f9c0869c0b84c816 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Wed, 25 Mar 2026 22:17:00 +0100 Subject: [PATCH 07/22] fix tests --- .gitignore | 4 + angular.json | 5 + package-lock.json | 259 ++++++++++++------ package.json | 1 + .../src/dialog-wrapper.component.spec.ts | 10 +- .../src/form-field.component.spec.ts | 9 +- .../form-field/src/form-field.component.ts | 6 +- .../form/src/form.component.spec.ts | 1 + .../components/form/src/form.component.ts | 11 +- .../select/src/select.component.spec.ts | 12 +- .../subcomponents/table-search.component.html | 10 +- .../subcomponents/table-search.component.ts | 8 +- .../table/src/table.component.spec.ts | 43 ++- projects/components/test-setup.ts | 2 +- 14 files changed, 260 insertions(+), 121 deletions(-) diff --git a/.gitignore b/.gitignore index 83240de6..8ce8d4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,10 @@ testem.log *.orig /debug.log +# Vitest +__screenshots__/ +.vitest-attachments/ + # System Files .DS_Store Thumbs.db diff --git a/angular.json b/angular.json index 895d7e90..7051fc03 100644 --- a/angular.json +++ b/angular.json @@ -117,6 +117,11 @@ "tsConfig": "projects/components/tsconfig.spec.json", "buildTarget": "components:build", "setupFiles": ["projects/components/test-setup.ts"] + }, + "configurations": { + "browser": { + "browsers": ["chromium"] + } } }, "lint": { diff --git a/package-lock.json b/package-lock.json index ff00c2f6..c09691d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", "@types/node": "^24.10.12", + "@vitest/browser-playwright": "^4.1.1", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^10.1.0", @@ -1207,6 +1208,13 @@ "node": ">=6.9.0" } }, + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, "node_modules/@bramus/specificity": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", @@ -2889,9 +2897,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2909,9 +2914,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2929,9 +2931,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2949,9 +2948,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2969,9 +2965,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2989,9 +2982,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3009,9 +2999,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3471,9 +3458,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3495,9 +3479,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3519,9 +3500,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3543,9 +3521,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3567,9 +3542,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3591,9 +3563,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3678,6 +3647,13 @@ "license": "MIT", "optional": true }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "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", @@ -3771,9 +3747,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3791,9 +3764,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3811,9 +3781,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3831,9 +3798,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4054,9 +4018,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4071,9 +4032,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4088,9 +4046,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4105,9 +4060,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4122,9 +4074,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4139,9 +4088,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4156,9 +4102,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4173,9 +4116,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4190,9 +4130,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4207,9 +4144,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4224,9 +4158,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4241,9 +4172,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4258,9 +4186,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4965,6 +4890,53 @@ "vite": "^6.0.0 || ^7.0.0" } }, + "node_modules/@vitest/browser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.1.tgz", + "integrity": "sha512-gjjrFC4+kPVK/fN9URDJWrssU5Gqh8Az8pKG/NSfQ2V+ky8b/y1BgBg0Ug13+hOGp5pzInonmGRPn7vOgSLgzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.1", + "@vitest/utils": "4.1.1", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.19.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.1" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.1.tgz", + "integrity": "sha512-dtVSBZZha2k/7P7EAXXrEAoxuIKl8Yv9f2Dk4GN/DGfmhf4DQvkvu+57okR2wq/gan1xppKjL/aBxK/kbYrbGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.1.1", + "@vitest/mocker": "4.1.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.1.1" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, "node_modules/@vitest/expect": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz", @@ -9378,6 +9350,66 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -10063,6 +10095,21 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/slice-ansi": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", @@ -10484,6 +10531,16 @@ "node": ">=0.6" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tough-cookie": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", @@ -11142,6 +11199,28 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xhr2": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", diff --git a/package.json b/package.json index 7c476ee6..22426587 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@eslint/js": "^10.0.1", "@types/express": "^5.0.6", "@types/node": "^24.10.12", + "@vitest/browser-playwright": "^4.1.1", "angular-eslint": "^21.3.1", "copyfiles": "^2.4.1", "eslint": "^10.1.0", diff --git a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts index 061608de..15444bec 100644 --- a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts +++ b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts @@ -85,7 +85,7 @@ export class ZvDialogWrapperTestDialog { cancelFn: () => this.cancelFunction(), }); - private _cancelFunctionCalled: number; + private _cancelFunctionCalled = 0; public actionFunction() { return of(); @@ -158,8 +158,10 @@ describe('DialogUnitTestComponent', () => { }); it('should call cancelFunction and then close on cancel click', async () => { - const cancelSpy = vi.spyOn(dialogRef.componentInstance, 'cancelFunction'); - const closeSpy = vi.spyOn(dialogRef.componentInstance.dataSource, 'close'); + const originalCancel = dialogRef.componentInstance.cancelFunction.bind(dialogRef.componentInstance); + const cancelSpy = vi.spyOn(dialogRef.componentInstance, 'cancelFunction').mockImplementation(originalCancel); + const originalClose = dialogRef.componentInstance.dataSource.close.bind(dialogRef.componentInstance.dataSource); + const closeSpy = vi.spyOn(dialogRef.componentInstance.dataSource, 'close').mockImplementation(originalClose); const btns = await dialogWrapper.getActionButtons({ text: 'Cancel' }); expect(btns.length).toEqual(1); @@ -169,7 +171,7 @@ describe('DialogUnitTestComponent', () => { expect(cancelSpy).toHaveBeenCalledTimes(1); expect(closeSpy).toHaveBeenCalledTimes(1); // Wait for dialog close animation to complete - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => setTimeout(resolve, 500)); fixture.detectChanges(); expect((await rootLoader.getAllHarnesses(ZvDialogWrapperHarness)).length).toEqual(0); }); diff --git a/projects/components/form-field/src/form-field.component.spec.ts b/projects/components/form-field/src/form-field.component.spec.ts index fb64e6fa..74505cd7 100644 --- a/projects/components/form-field/src/form-field.component.spec.ts +++ b/projects/components/form-field/src/form-field.component.spec.ts @@ -153,8 +153,7 @@ describe('ZvFormField', () => { const component = fixture.componentInstance; expect(component).toBeDefined(); - fixture.detectChanges(); - + // Set zvLabel before first detectChanges so it's picked up during initialization (component.formControl as any).zvLabel = 'service label'; fixture.detectChanges(); // Allow async label resolution to settle (multiple cycles for RxJS operators) @@ -187,9 +186,8 @@ describe('ZvFormField', () => { const fixture = TestBed.createComponent(TestFormComponent); const component = fixture.componentInstance; expect(component).toBeDefined(); - fixture.detectChanges(); - // Label calculated from the service + // Set zvLabel before first detectChanges so it's picked up during initialization (component.formControl as any).zvLabel = 'service label'; fixture.detectChanges(); await vi.advanceTimersByTimeAsync(0); @@ -202,9 +200,10 @@ describe('ZvFormField', () => { expect(fixture.debugElement.query(By.css('mat-label')).nativeElement.textContent.trim()).toBe('custom label'); // Label calculated from the service with delay - component.customLabel.set(null); (component.formControl as any).zvLabel = 'async label'; (TestBed.inject(ZvFormService) as TestZvFormService).labelDelay = 10; + // Setting customLabel to null removes the labelChild, which triggers updateLabel() + component.customLabel.set(null); fixture.detectChanges(); await vi.advanceTimersByTimeAsync(10); fixture.detectChanges(); diff --git a/projects/components/form-field/src/form-field.component.ts b/projects/components/form-field/src/form-field.component.ts index d68cfc5f..0c1491bb 100644 --- a/projects/components/form-field/src/form-field.component.ts +++ b/projects/components/form-field/src/form-field.component.ts @@ -248,11 +248,11 @@ export class ZvFormField implements OnChanges, AfterContentChecked, OnDestroy { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access const labelNode = this._elementRef.nativeElement.querySelectorAll('label')[0]; // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access - if (!labelNode.innerText.trim()) { + if (!labelNode.textContent.trim()) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - if (labelNode.childNodes.length === 1) { + if (labelNode.childNodes.length === 1 && labelNode.childNodes[0].nodeType === Node.TEXT_NODE) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - labelNode.childNodes.nodeValue = label; + labelNode.childNodes[0].nodeValue = label; } else { // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access labelNode.appendChild(document.createTextNode(label)); diff --git a/projects/components/form/src/form.component.spec.ts b/projects/components/form/src/form.component.spec.ts index 32e75680..783174e4 100644 --- a/projects/components/form/src/form.component.spec.ts +++ b/projects/components/form/src/form.component.spec.ts @@ -306,6 +306,7 @@ describe('ZvForm', () => { }); expect(getErrorContainer(fixture)).not.toBe(null); expect(observedEl).toBe(component.formComponent.errorCardWrapper.nativeElement); + component.formComponent.errorCardWrapper.nativeElement.scrollIntoView ??= () => {}; vi.spyOn(component.formComponent.errorCardWrapper.nativeElement, 'scrollIntoView'); opts.scrollToError(); diff --git a/projects/components/form/src/form.component.ts b/projects/components/form/src/form.component.ts index 3345d583..94e4066c 100644 --- a/projects/components/form/src/form.component.ts +++ b/projects/components/form/src/form.component.ts @@ -1,6 +1,7 @@ import { isPlatformServer } from '@angular/common'; import type { ElementRef } from '@angular/core'; import { + AfterViewChecked, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, @@ -36,7 +37,7 @@ export const dependencies = { encapsulation: ViewEncapsulation.None, imports: [ReactiveFormsModule, ZvBlockUi, MatCard, MatCardContent, MatIcon, MatProgressBar, ZvFormErrors, ZvButton, ZvErrorMessagePipe], }) -export class ZvForm implements AfterViewInit, OnDestroy { +export class ZvForm implements AfterViewInit, AfterViewChecked, OnDestroy { private readonly cd = inject(ChangeDetectorRef); @Input({ required: true }) public set dataSource(value: IZvFormDataSource) { @@ -119,6 +120,10 @@ export class ZvForm implements AfterViewInit, OnDestroy { this.activateDataSource(); } + public ngAfterViewChecked() { + this.updateErrorCardObserver(); + } + public ngOnDestroy() { if (this._errorCardObserver) { this._errorCardObserver.disconnect(); @@ -155,7 +160,7 @@ export class ZvForm implements AfterViewInit, OnDestroy { if (this.isServer) { return; } - if (!this._errorCardObserver && this._dataSource && this._viewReady) { + if (!this._errorCardObserver && this._dataSource && this._viewReady && this.errorCardWrapper) { const options = { root: null, // relative to document viewport rootMargin: '-100px', // margin around root. Values are similar to css property. Unitless values not allowed @@ -170,7 +175,7 @@ export class ZvForm implements AfterViewInit, OnDestroy { }, options); // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - this._errorCardObserver.observe(this.errorCardWrapper?.nativeElement); + this._errorCardObserver.observe(this.errorCardWrapper.nativeElement); } else if (this._errorCardObserver && !this._dataSource) { this._errorCardObserver.disconnect(); this._errorCardObserver = null; diff --git a/projects/components/select/src/select.component.spec.ts b/projects/components/select/src/select.component.spec.ts index 2c6b88ac..13d4028b 100644 --- a/projects/components/select/src/select.component.spec.ts +++ b/projects/components/select/src/select.component.spec.ts @@ -369,9 +369,10 @@ describe('ZvSelect', () => { const matFormField = await loader.getHarness(MatFormFieldHarness); - component.value.set(ITEMS.red); + component.value.set(ITEMS.red.value); component.clearable.set(true); + await flushMicrotasks(); await zvSelect.open(); expect(await zvSelect.isEmpty()).toBe(false); expect(await matFormField.isLabelFloating()).toBe(true); @@ -767,6 +768,8 @@ describe('ZvSelect', () => { { await selectSearch.setFilter('2'); + // Wait for search debounce (300ms default) + render + await new Promise((resolve) => setTimeout(resolve, 350)); const options1 = await zvSelect.getOptions({ text: '1' }); expect(await (await options1[0].host()).hasClass('zv-select__option--hidden')).toBe(true); // filter got applied @@ -789,6 +792,8 @@ describe('ZvSelect', () => { ); fixture.detectChanges(); await flushMicrotasks(); + // Wait for search debounce to apply filter to new dataSource + await new Promise((resolve) => setTimeout(resolve, 350)); fixture.detectChanges(); expect(TestZvSelectService.calledwith.length).toBe(2); expect(TestZvSelectService.calledwith[1].dataSource).toBe(component.dataSource()); @@ -844,6 +849,11 @@ describe('ZvSelect', () => { expect(await options[2].isSelected()).toBe(true); await options[1].click(); + // Wait for async datasource pipeline (debounceTime + sort trigger) to settle + await flushMicrotasks(); + fixture.detectChanges(); + await flushMicrotasks(); + fixture.detectChanges(); await zvSelect.open(); options = await zvSelect.getOptions(); diff --git a/projects/components/table/src/subcomponents/table-search.component.html b/projects/components/table/src/subcomponents/table-search.component.html index b2b54fdd..0b9ce98b 100644 --- a/projects/components/table/src/subcomponents/table-search.component.html +++ b/projects/components/table/src/subcomponents/table-search.component.html @@ -1,6 +1,14 @@ Search - + @if (searchText() || currentSearchText()) { - } - @case ('stroked') { - - } - @case ('raised') { - - } - @case ('icon') { - - } - @default { - - } +@if (type() === 'icon') { + +} @else { + } diff --git a/projects/components/button/src/button.component.ts b/projects/components/button/src/button.component.ts index 931bbd9a..afc0597e 100644 --- a/projects/components/button/src/button.component.ts +++ b/projects/components/button/src/button.component.ts @@ -1,21 +1,40 @@ import { NgTemplateOutlet } from '@angular/common'; -import { ChangeDetectionStrategy, Component, ElementRef, input, OnDestroy, output, ViewEncapsulation, inject } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; +import { + ChangeDetectionStrategy, + Component, + computed, + ElementRef, + inject, + input, + OnDestroy, + output, + ViewEncapsulation, +} from '@angular/core'; +import { MatButton, MatButtonAppearance, MatIconButton } from '@angular/material/button'; import { MatIcon } from '@angular/material/icon'; import { ZvButtonColors, ZvButtonTypes } from '@zvoove/components/core'; +const APPEARANCE_MAP: Record = { + default: '', + flat: 'filled', + stroked: 'outlined', + raised: 'elevated', + icon: '', +}; + /** Only use this component when you absolutely need to dynamically switch the type. Otherwise just use the material buttons directly */ @Component({ selector: 'zv-button', templateUrl: './button.component.html', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, - imports: [MatButtonModule, NgTemplateOutlet, MatIcon], + imports: [MatButton, MatIconButton, MatIcon, NgTemplateOutlet], }) export class ZvButton implements OnDestroy { private readonly elementRef = inject>(ElementRef); readonly type = input('default'); + readonly appearance = computed(() => APPEARANCE_MAP[this.type()]); readonly color = input(null); readonly icon = input(null); readonly dataCy = input(null); From 58fcaf21c3e2edf02e590e9907ecdf411aa8a339 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 09:28:38 +0100 Subject: [PATCH 12/22] SKILL.md --- .agents/skills/angular-developer/SKILL.md | 129 +++ .../references/angular-animations.md | 160 ++++ .../references/angular-aria.md | 410 ++++++++ .../angular-developer/references/cli.md | 86 ++ .../references/component-harnesses.md | 59 ++ .../references/component-styling.md | 91 ++ .../references/components.md | 117 +++ .../references/creating-services.md | 97 ++ .../references/data-resolvers.md | 69 ++ .../references/define-routes.md | 67 ++ .../references/defining-providers.md | 72 ++ .../references/di-fundamentals.md | 120 +++ .../references/e2e-testing.md | 66 ++ .../angular-developer/references/effects.md | 83 ++ .../references/hierarchical-injectors.md | 43 + .../references/host-elements.md | 80 ++ .../references/injection-context.md | 63 ++ .../angular-developer/references/inputs.md | 101 ++ .../references/linked-signal.md | 59 ++ .../references/loading-strategies.md | 61 ++ .../angular-developer/references/mcp.md | 108 +++ .../references/navigate-to-routes.md | 69 ++ .../angular-developer/references/outputs.md | 86 ++ .../references/reactive-forms.md | 122 +++ .../references/rendering-strategies.md | 44 + .../angular-developer/references/resource.md | 77 ++ .../references/route-animations.md | 56 ++ .../references/route-guards.md | 52 + .../references/router-lifecycle.md | 45 + .../references/router-testing.md | 87 ++ .../references/show-routes-with-outlets.md | 68 ++ .../references/signal-forms.md | 897 ++++++++++++++++++ .../references/signals-overview.md | 94 ++ .../references/tailwind-css.md | 69 ++ .../references/template-driven-forms.md | 114 +++ .../references/testing-fundamentals.md | 75 ++ .claude/skills/angular-developer | 1 + skills-lock.json | 10 + 38 files changed, 4107 insertions(+) create mode 100644 .agents/skills/angular-developer/SKILL.md create mode 100644 .agents/skills/angular-developer/references/angular-animations.md create mode 100644 .agents/skills/angular-developer/references/angular-aria.md create mode 100644 .agents/skills/angular-developer/references/cli.md create mode 100644 .agents/skills/angular-developer/references/component-harnesses.md create mode 100644 .agents/skills/angular-developer/references/component-styling.md create mode 100644 .agents/skills/angular-developer/references/components.md create mode 100644 .agents/skills/angular-developer/references/creating-services.md create mode 100644 .agents/skills/angular-developer/references/data-resolvers.md create mode 100644 .agents/skills/angular-developer/references/define-routes.md create mode 100644 .agents/skills/angular-developer/references/defining-providers.md create mode 100644 .agents/skills/angular-developer/references/di-fundamentals.md create mode 100644 .agents/skills/angular-developer/references/e2e-testing.md create mode 100644 .agents/skills/angular-developer/references/effects.md create mode 100644 .agents/skills/angular-developer/references/hierarchical-injectors.md create mode 100644 .agents/skills/angular-developer/references/host-elements.md create mode 100644 .agents/skills/angular-developer/references/injection-context.md create mode 100644 .agents/skills/angular-developer/references/inputs.md create mode 100644 .agents/skills/angular-developer/references/linked-signal.md create mode 100644 .agents/skills/angular-developer/references/loading-strategies.md create mode 100644 .agents/skills/angular-developer/references/mcp.md create mode 100644 .agents/skills/angular-developer/references/navigate-to-routes.md create mode 100644 .agents/skills/angular-developer/references/outputs.md create mode 100644 .agents/skills/angular-developer/references/reactive-forms.md create mode 100644 .agents/skills/angular-developer/references/rendering-strategies.md create mode 100644 .agents/skills/angular-developer/references/resource.md create mode 100644 .agents/skills/angular-developer/references/route-animations.md create mode 100644 .agents/skills/angular-developer/references/route-guards.md create mode 100644 .agents/skills/angular-developer/references/router-lifecycle.md create mode 100644 .agents/skills/angular-developer/references/router-testing.md create mode 100644 .agents/skills/angular-developer/references/show-routes-with-outlets.md create mode 100644 .agents/skills/angular-developer/references/signal-forms.md create mode 100644 .agents/skills/angular-developer/references/signals-overview.md create mode 100644 .agents/skills/angular-developer/references/tailwind-css.md create mode 100644 .agents/skills/angular-developer/references/template-driven-forms.md create mode 100644 .agents/skills/angular-developer/references/testing-fundamentals.md create mode 120000 .claude/skills/angular-developer create mode 100644 skills-lock.json diff --git a/.agents/skills/angular-developer/SKILL.md b/.agents/skills/angular-developer/SKILL.md new file mode 100644 index 00000000..ef735c27 --- /dev/null +++ b/.agents/skills/angular-developer/SKILL.md @@ -0,0 +1,129 @@ +--- +name: angular-developer +description: Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling. +license: MIT +metadata: + author: Copyright 2026 Google LLC + version: '1.0' +--- + +# Angular Developer Guidelines + +1. Always analyze the project's Angular version before providing guidance, as best practices and available features can vary significantly between versions. If creating a new project with Angular CLI, do not specify a version unless prompted by the user. + +2. When generating code, follow Angular's style guide and best practices for maintainability and performance. Use the Angular CLI for scaffolding components, services, directives, pipes, and routes to ensure consistency. + +3. Once you finish generating code, run `ng build` to ensure there are no build errors. If there are errors, analyze the error messages and fix them before proceeding. Do not skip this step, as it is critical for ensuring the generated code is correct and functional. + +## Creating New Projects + +If no guidelines are provided by the user, here are same default rules to follow when creating a new Angular project: + +1. Use the latest stable version of Angular unless the user specifies otherwise. +2. Use Signals Forms for form management in new projects (available in Angular v21 and newer) [Find out more](references/signal-forms.md). + +**Execution Rules for `ng new`:** +When asked to create a new Angular project, you must determine the correct execution command by following these strict steps: + +**Step 1: Check for an explicit user version.** + +- **IF** the user requests a specific version (e.g., Angular 15), bypass local installations and strictly use `npx`. +- **Command:** `npx @angular/cli@ new ` + +**Step 2: Check for an existing Angular installation.** + +- **IF** no specific version is requested, run `ng version` in the terminal to check if the Angular CLI is already installed on the system. +- **IF** the command succeeds and returns an installed version, use the local/global installation directly. +- **Command:** `ng new ` + +**Step 3: Fallback to Latest.** + +- **IF** no specific version is requested AND the `ng version` command fails (indicating no Angular installation exists), you must use `npx` to fetch the latest version. +- **Command:** `npx @angular/cli@latest new ` + +## Components + +When working with Angular components, consult the following references based on the task: + +- **Fundamentals**: Anatomy, metadata, core concepts, and template control flow (@if, @for, @switch). Read [components.md](references/components.md) +- **Inputs**: Signal-based inputs, transforms, and model inputs. Read [inputs.md](references/inputs.md) +- **Outputs**: Signal-based outputs and custom event best practices. Read [outputs.md](references/outputs.md) +- **Host Elements**: Host bindings and attribute injection. Read [host-elements.md](references/host-elements.md) + +If you require deeper documentation not found in the references above, read the documentation at `https://angular.dev/guide/components`. + +## Reactivity and Data Management + +When managing state and data reactivity, use Angular Signals and consult the following references: + +- **Signals Overview**: Core signal concepts (`signal`, `computed`), reactive contexts, and `untracked`. Read [signals-overview.md](references/signals-overview.md) +- **Dependent State (`linkedSignal`)**: Creating writable state linked to source signals. Read [linked-signal.md](references/linked-signal.md) +- **Async Reactivity (`resource`)**: Fetching asynchronous data directly into signal state. Read [resource.md](references/resource.md) +- **Side Effects (`effect`)**: Logging, third-party DOM manipulation (`afterRenderEffect`), and when NOT to use effects. Read [effects.md](references/effects.md) + +## Forms + +In most cases for new apps, **prefer signal forms**. When making a forms decision, analyze the project and consider the following guidelines: + +- if the application is using v21 or newer and this is a new form, **prefer signal forms**. + -For older applications or when working with existing forms, use the appropriate form type that matches the applications current form strategy. + +- **Signal Forms**: Use signals for form state management. Read [signal-forms.md](references/signal-forms.md) +- **Template-driven forms**: Use for simple forms. Read [template-driven-forms.md](references/template-driven-forms.md) +- **Reactive forms**: Use for complex forms. Read [reactive-forms.md](references/reactive-forms.md) + +## Dependency Injection + +When implementing dependency injection in Angular, follow these guidelines: + +- **Fundamentals**: Overview of Dependency Injection, services, and the `inject()` function. Read [di-fundamentals.md](references/di-fundamentals.md) +- **Creating and Using Services**: Creating services, the `providedIn: 'root'` option, and injecting into components or other services. Read [creating-services.md](references/creating-services.md) +- **Defining Dependency Providers**: Automatic vs manual provision, `InjectionToken`, `useClass`, `useValue`, `useFactory`, and scopes. Read [defining-providers.md](references/defining-providers.md) +- **Injection Context**: Where `inject()` is allowed, `runInInjectionContext`, and `assertInInjectionContext`. Read [injection-context.md](references/injection-context.md) +- **Hierarchical Injectors**: The `EnvironmentInjector` vs `ElementInjector`, resolution rules, modifiers (`optional`, `skipSelf`), and `providers` vs `viewProviders`. Read [hierarchical-injectors.md](references/hierarchical-injectors.md) + +## Angular Aria + +When building accessible custom components for any of the following patterns: Accordion, Listbox, Combobox, Menu, Tabs, Toolbar, Tree, Grid, consult the following reference: + +- **Angular Aria Components**: Building headless, accessible components (Accordion, Listbox, Combobox, Menu, Tabs, Toolbar, Tree, Grid) and styling ARIA attributes. Read [angular-aria.md](references/angular-aria.md) + +## Routing + +When implementing navigation in Angular, consult the following references: + +- **Define Routes**: URL paths, static vs dynamic segments, wildcards, and redirects. Read [define-routes.md](references/define-routes.md) +- **Route Loading Strategies**: Eager vs lazy loading, and context-aware loading. Read [loading-strategies.md](references/loading-strategies.md) +- **Show Routes with Outlets**: Using ``, nested outlets, and named outlets. Read [show-routes-with-outlets.md](references/show-routes-with-outlets.md) +- **Navigate to Routes**: Declarative navigation with `RouterLink` and programmatic navigation with `Router`. Read [navigate-to-routes.md](references/navigate-to-routes.md) +- **Control Route Access with Guards**: Implementing `CanActivate`, `CanMatch`, and other guards for security. Read [route-guards.md](references/route-guards.md) +- **Data Resolvers**: Pre-fetching data before route activation with `ResolveFn`. Read [data-resolvers.md](references/data-resolvers.md) +- **Router Lifecycle and Events**: Chronological order of navigation events and debugging. Read [router-lifecycle.md](references/router-lifecycle.md) +- **Rendering Strategies**: CSR, SSG (Prerendering), and SSR with hydration. Read [rendering-strategies.md](references/rendering-strategies.md) +- **Route Transition Animations**: Enabling and customizing the View Transitions API. Read [route-animations.md](references/route-animations.md) + +If you require deeper documentation or more context, visit the [official Angular Routing guide](https://angular.dev/guide/routing). + +## Styling and Animations + +When implementing styling and animations in Angular, consult the following references: + +- **Using Tailwind CSS with Angular**: Integrating Tailwind CSS into Angular projects. Read [tailwind-css.md](references/tailwind-css.md) +- **Angular Animations**: Using native CSS (recommended) or the legacy DSL for dynamic effects. Read [angular-animations.md](references/angular-animations.md) +- **Styling components**: Best practices for component styles and encapsulation. Read [component-styling.md](references/component-styling.md) + +## Testing + +When writing or updating tests, consult the following references based on the task: + +- **Fundamentals**: Best practices for unit testing (Vitest), async patterns, and `TestBed`. Read [testing-fundamentals.md](references/testing-fundamentals.md) +- **Component Harnesses**: Standard patterns for robust component interaction. Read [component-harnesses.md](references/component-harnesses.md) +- **Router Testing**: Using `RouterTestingHarness` for reliable navigation tests. Read [router-testing.md](references/router-testing.md) +- **End-to-End (E2E) Testing**: Best practices for E2E tests with Cypress. Read [e2e-testing.md](references/e2e-testing.md) + +## Tooling + +When working with Angular tooling, consult the following references: + +- **Angular CLI**: Creating applications, generating code (components, routes, services), serving, and building. Read [cli.md](references/cli.md) +- **Angular MCP Server**: Available tools, configuration, and experimental features. Read [mcp.md](references/mcp.md) diff --git a/.agents/skills/angular-developer/references/angular-animations.md b/.agents/skills/angular-developer/references/angular-animations.md new file mode 100644 index 00000000..c96c4d9c --- /dev/null +++ b/.agents/skills/angular-developer/references/angular-animations.md @@ -0,0 +1,160 @@ +# Angular Animations + +When animating elements in Angular, **first analyze the project's Angular version** in `package.json`. +For modern applications (**Angular v20.2 and above**), prefer using native CSS with `animate.enter` and `animate.leave`. For older applications, you may need to use the deprecated `@angular/animations` package. + +## 1. Native CSS Animations (v20.2+ Recommended) + +Modern Angular provides `animate.enter` and `animate.leave` to animate elements as they enter or leave the DOM. They apply CSS classes at the appropriate times. + +### `animate.enter` and `animate.leave` + +Use these directly on elements to apply CSS classes during the enter or leave phase. Angular automatically removes the enter classes when the animation completes. For `animate.leave`, Angular waits for the animation to finish before removing the element from the DOM. + +`animate.enter` example: + +```html +@if (isShown()) { +
+

The box is entering.

+
+} +``` + +```css +/* Ensure you have a starting style if using transitions instead of keyframes */ +.enter-container { + border: 1px solid #dddddd; + margin-top: 1em; + padding: 20px; + font-weight: bold; + font-size: 20px; +} +.enter-container p { + margin: 0; +} +.enter-animation { + animation: slide-fade 1s; +} +@keyframes slide-fade { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +``` + +_Note: `animate.leave` may be added to child elements being removed._ + +### Event Bindings and Third-party Libraries + +You can bind to `(animate.enter)` and `(animate.leave)` to call functions or use JS libraries like GSAP. + +```html +@if(show()) { +
...
+} +``` + +```ts +import { AnimationCallbackEvent } from '@angular/core'; + +onLeave(event: AnimationCallbackEvent) { + // Custom animation logic here + // CRITICAL: You MUST call animationComplete() when done so Angular removes the element! + event.animationComplete(); +} +``` + +## 2. Advanced CSS Animations + +CSS offers robust tools for advanced animation sequences. + +### Animating State and Styles + +Toggle CSS classes on elements using property binding to trigger transitions. + +```html +
...
+``` + +```css +div { + transition: height 0.3s ease-out; + height: 100px; +} +div.open { + height: 200px; +} +``` + +### Animating Auto Height + +You can use `css-grid` to animate to auto height. + +```css +.container { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.3s; +} +.container.open { + grid-template-rows: 1fr; +} +.container > div { + overflow: hidden; +} +``` + +### Staggering and Parallel Animations + +- **Staggering**: Use `animation-delay` or `transition-delay` with different values for items in a list. +- **Parallel**: Apply multiple animations in the `animation` shorthand (e.g., `animation: rotate 3s, fade-in 2s;`). + +### Programmatic Control + +Retrieve animations directly using standard Web APIs: + +```ts +const animations = element.getAnimations(); +animations.forEach((anim) => anim.pause()); +``` + +## 3. Legacy Animations DSL (Deprecated) + +For older projects (pre v20.2 or where `@angular/animations` is already heavily used), you use the component metadata DSL. + +**Important:** Do not mix legacy animations and `animate.enter`/`leave` in the same component. + +### Setup + +```ts +bootstrapApplication(App, { + providers: [provideAnimationsAsync()], +}); +``` + +### Defining Transitions + +```ts +import {signal} from '@angular/core'; +import {trigger, state, style, animate, transition} from '@angular/animations'; + +@Component({ + animations: [ + trigger('openClose', [ + state('open', style({opacity: 1})), + state('closed', style({opacity: 0})), + transition('open <=> closed', [animate('0.5s')]), + ]), + ], + template: `
...
`, +}) +export class OpenClose { + isOpen = signal(true); +} +``` diff --git a/.agents/skills/angular-developer/references/angular-aria.md b/.agents/skills/angular-developer/references/angular-aria.md new file mode 100644 index 00000000..2dd0cf45 --- /dev/null +++ b/.agents/skills/angular-developer/references/angular-aria.md @@ -0,0 +1,410 @@ +# Angular Aria + +Angular Aria (`@angular/aria`) is a collection of headless, accessible directives that implement common WAI-ARIA patterns. These directives handle keyboard interactions, ARIA attributes, focus management, and screen reader support. + +**As an AI Agent, your role is to provide the HTML structure and CSS styling**, while the directives handle the complex accessibility logic. + +## Styling Headless Components + +Because Angular Aria components are headless, they do not come with default styles. You **must** use CSS to style different states based on the ARIA attributes or structural classes the directives automatically apply. + +Common ARIA attributes to target in CSS: + +- `[aria-expanded="true"]` / `[aria-expanded="false"]` +- `[aria-selected="true"]` +- `[aria-disabled="true"]` +- `[aria-current="page"]` (for navigation) + +--- + +**CRITICAL**: Before using this package, it must be installed via the package manager. Confirm that it has been installed in the project. Use `npm install @angular/aria` to install if necessary. + +## 1. Accordion + +Organizes related content into expandable/collapsible sections. + +**Usage:** The Accordion is a layout component designed to organize content into logical groups that users can expand one at a time to reduce scrolling on content-heavy pages. Use it for FAQs, long forms, or progressive disclosure of information, but avoid it for primary navigation or scenarios where users must view multiple sections of content simultaneously. + +**Imports:** `import { AccordionContent, AccordionGroup, AccordionPanel, AccordionTrigger } from '@angular/aria/accordion';` + +**Directives:** `ngAccordionGroup`, `ngAccordionTrigger`, `ngAccordionPanel`, `ngAccordionContent` (for lazy loading). + +```ts +@Component({ + selector: 'app-cmp', + imports: [AccordionContent, AccordionGroup, AccordionPanel, AccordionTrigger], + template: `...`, + styles: [], +}) +export class App { + protected readonly title = signal('angular-app'); +} +``` + +```html +
+
+ +
+ +

Lazy loaded content here.

+
+
+
+
+``` + +**Styling Strategy:** +Target the `[aria-expanded]` attribute on the trigger to rotate icons, and style the panel visibility. + +```css +.accordion-header[aria-expanded='true'] .icon { + transform: rotate(180deg); +} + +/* The panel directive handles DOM removal, but you can style the transition */ +.accordion-panel { + padding: 1rem; + border-top: 1px solid #ccc; +} +``` + +--- + +## 2. Listbox + +A foundational directive for displaying a list of options. Used for visible selection lists (not dropdowns). + +**Usage:** Visible selectable lists (single or multi-select). + +**Imports:** `import {Listbox, Option} from '@angular/aria/listbox';` + +**Directives:** `ngListbox`, `ngOption`. + +```ts +@Component({ + selector: 'app-cmp', + imports: [Listbox, Option], + template: `...`, + styles: [], +}) +export class App { + protected readonly title = signal('angular-app'); +} +``` + +```html + +
    +
  • Apple
  • +
  • Banana
  • +
+``` + +**Styling Strategy:** +Target `[aria-selected="true"]` for selected state and `:focus-visible` or `[data-active]` for the focused item (Angular Aria uses roving tabindex or activedescendant). + +```css +.option { + padding: 8px; + cursor: pointer; +} +.option[aria-selected='true'] { + background: #e0f7fa; + font-weight: bold; +} +/* Focus state managed by aria */ +.option:focus-visible { + outline: 2px solid blue; +} +``` + +--- + +## 3. Combobox, Select, and Multiselect + +These patterns combine `ngCombobox` with a popup containing an `ngListbox`. + +- **Combobox**: Text input + popup (used for Autocomplete). +- **Select**: Readonly Combobox + single-select Listbox. +- **Multiselect**: Readonly Combobox + multi-select Listbox. + +**Usage:** The Combobox is a low-level primitive directive that synchronizes a text input with a popup, serving as the foundational logic for autocomplete, select, and multiselect patterns. Use it specifically for building custom filtering, unique selection requirements, or specialized input-to-popup coordination that deviates from standard, documented components. + +**Imports:** + +``` + import {Combobox, ComboboxInput, ComboboxPopupContainer} from '@angular/aria/combobox'; + import {Listbox, Option} from '@angular/aria/listbox'; +``` + +**Directives:** `ngCombobox`, `ngComboboxInput`, `ngComboboxPopupContainer`, `ngListbox`, `ngOption`. + +```html + +
+ + + + + +
+``` + +**Styling Strategy:** +Style the popup container to look like a dropdown floating above content (often paired with CDK Overlay). + +```css +.select-trigger { + width: 200px; + padding: 8px; + text-align: left; +} +.dropdown-menu { + list-style: none; + padding: 0; + margin: 0; + border: 1px solid #ccc; + background: white; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} +``` + +--- + +## 4. Menu and Menubar + +For actions, commands, and context menus (not for form selection). + +**Usage:** The Menubar is a high-level navigation pattern designed for building desktop-style application command bars (e.g., File, Edit, View) that stay persistent across an interface. It is best utilized for organizing complex commands into logical top-level categories with full horizontal keyboard support, but it should be avoided for simple standalone action lists or mobile-first layouts where horizontal space is constrained. + +**Imports:** `import {MenuBar, Menu, MenuContent, MenuItem} from '@angular/aria/menu';` + +**Directives:** `ngMenuBar`, `ngMenu`, `ngMenuItem`, `ngMenuTrigger`. + +```html + + + + +``` + +**Styling Strategy:** +Use flexbox for the menubar. Hide/show submenus based on the trigger's state. + +```css +.menubar { + display: flex; + gap: 10px; + list-style: none; + padding: 0; +} +.menu { + background: white; + border: 1px solid #ccc; + padding: 5px 0; +} +.menu li { + padding: 5px 15px; + cursor: pointer; +} +``` + +--- + +## 5. Tabs + +Layered content sections where only one panel is visible. + +**Usage:** The Tabs component is used to organize related content into distinct, navigable sections, allowing users to switch between categories or views without leaving the page. It is ideal for settings panels, multi-topic documentation, or dashboards, but should be avoided for sequential workflows (steppers) or when navigation involves more than 7–8 sections. + +**Imports:** `import {Tab, Tabs, TabList, TabPanel, TabContent} from '@angular/aria/tabs';` + +**Directives:** `ngTabs`, `ngTabList`, `ngTab`, `ngTabPanel`, `ngTabContent`. + +```html +
+
    +
  • Profile
  • +
  • Security
  • +
+ +
+ Profile Settings +
+
+ Security Settings +
+
+``` + +**Styling Strategy:** +Target `[aria-selected="true"]` on the tab buttons. + +```css +.tab-list { + display: flex; + border-bottom: 2px solid #ccc; + list-style: none; + padding: 0; +} +.tab-btn { + padding: 10px 20px; + cursor: pointer; + border-bottom: 2px solid transparent; +} +.tab-btn[aria-selected='true'] { + border-bottom-color: blue; + font-weight: bold; +} +.tab-panel { + padding: 20px; +} +``` + +--- + +## 6. Toolbar + +Groups related controls (like text formatting). + +**Usage:** The Toolbar is an organizational component designed to group frequently accessed, related controls into a single logical container. It is best used to enhance keyboard efficiency (via arrow-key navigation) and visual structure for workflows requiring repeated actions, such as text formatting or media controls. + +**Imports:** `import {Toolbar, ToolbarWidget, ToolbarWidgetGroup} from '@angular/aria/toolbar';` + +**Directives:** `ngToolbar`, `ngToolbarWidget`, `ngToolbarWidgetGroup`. + +```html +
+
+ + +
+
+``` + +**Styling Strategy:** +Target `[aria-pressed="true"]` (for toggle buttons) or `[aria-checked="true"]` (for radio groups) within the toolbar. + +```css +.toolbar { + display: flex; + gap: 5px; + padding: 8px; + background: #f5f5f5; +} +.tool-btn { + padding: 5px 10px; + border: 1px solid #ccc; +} +.tool-btn[aria-pressed='true'], +.tool-btn[aria-checked='true'] { + background: #ddd; +} +``` + +--- + +## 7. Tree + +Displays hierarchical data (file systems, nested nav). + +**Usage:** The Tree component is designed for navigating and displaying deeply nested, hierarchical data structures like file systems, organization charts, or complex site architectures. It should be used specifically for multi-level relationships where users need to expand or collapse branches, but it should be avoided for flat lists, data tables, or simple selection menus. + +**Imports:** `import {Tree, TreeItem, TreeItemGroup} from '@angular/aria/tree';` + +**Directives:** `ngTree`, `ngTreeItem`, `ngTreeGroup`. + +```html +
    +
  • + Documents +
      +
    • Resume.pdf
    • +
    +
  • +
+``` + +**Styling Strategy:** +Target `[aria-expanded]` to show/hide children or rotate chevron icons. Use `padding-left` on nested groups to show hierarchy. + +```css +.tree, +.tree-group { + list-style: none; + padding-left: 20px; +} +.tree-label::before { + content: '▶ '; + display: inline-block; + transition: transform 0.2s; +} +li[aria-expanded='true'] > .tree-label::before { + transform: rotate(90deg); +} +``` + +## 8. Grid + +A two-dimensional interactive collection of cells enabling navigation via arrow keys. + +**Usage:** Data tables, calendars, spreadsheets, and layout patterns for interactive elements. +**Directives:** `ngGrid`, `ngGridRow`, `ngGridCell`, `ngGridCellWidget`. + +```html + + + + + + + + + +
NameStatus
Project A + +
+``` + +**Styling Strategy:** +Target `[aria-selected="true"]` for selected cells and `:focus-visible` for the active cell (roving tabindex) or `[aria-activedescendant]` on the container. + +```css +.grid-table { + border-collapse: collapse; +} +[ngGridCell] { + padding: 8px; + border: 1px solid #ddd; +} +[ngGridCell][aria-selected='true'] { + background: #e3f2fd; +} +/* Focus state managed by roving tabindex */ +[ngGridCell]:focus-visible { + outline: 2px solid #2196f3; + outline-offset: -2px; +} +``` + +## General Rules for Agents + +1. **Never use native HTML elements like ` + +
+ +
+ +
+ @for (alias of aliases.controls; track $index) { + + } +
+ + + +``` + +## Accessing Controls + +Use getters for easy access to controls, especially for `FormArray`. + +```ts +get aliases() { + return this.profileForm.get('aliases') as FormArray; +} + +addAlias() { + this.aliases.push(this.fb.control('')); +} +``` + +## Updating Values + +- `patchValue()`: Updates only the specified properties. Fails silently on structural mismatches. +- `setValue()`: Replaces the entire model. Strictly enforces the form structure. + +```ts +updateProfile() { + this.profileForm.patchValue({ + firstName: 'Nancy', + address: { street: '123 Drew Street' } + }); +} +``` + +## Unified Change Events + +Modern Angular (v18+) provides a single `events` observable on all controls to track value, status, pristine, touched, reset, and submit events. + +```ts +import {ValueChangeEvent, StatusChangeEvent} from '@angular/forms'; + +this.profileForm.events.subscribe((event) => { + if (event instanceof ValueChangeEvent) { + console.log('New value:', event.value); + } +}); +``` + +## Manual State Management + +- `markAsTouched()` / `markAllAsTouched()`: Useful for showing validation errors on submit. +- `markAsDirty()` / `markAsPristine()`: Tracks if the value has been modified. +- `updateValueAndValidity()`: Manually triggers recalculation of value and status. +- Options `{ emitEvent: false }` or `{ onlySelf: true }` can be passed to most methods to control propagation. diff --git a/.agents/skills/angular-developer/references/rendering-strategies.md b/.agents/skills/angular-developer/references/rendering-strategies.md new file mode 100644 index 00000000..3b426002 --- /dev/null +++ b/.agents/skills/angular-developer/references/rendering-strategies.md @@ -0,0 +1,44 @@ +# Rendering Strategies + +Angular supports multiple rendering strategies to optimize for SEO, performance, and interactivity. + +## 1. Client-Side Rendering (CSR) + +**Default Strategy.** Content is rendered entirely in the browser. + +- **Use case**: Interactive dashboards, internal tools. +- **Pros**: Simplest to configure, low server cost. +- **Cons**: Poor SEO, slower initial content visibility (must wait for JS). + +## 2. Static Site Generation (SSG / Prerendering) + +Content is pre-rendered into static HTML files at **build time**. + +- **Use case**: Marketing pages, blogs, documentation. +- **Pros**: Fastest initial load, excellent SEO, CDN-friendly. +- **Cons**: Requires rebuild for content updates, not for user-specific data. + +## 3. Server-Side Rendering (SSR) + +Content is rendered on the server for the **initial request**. Subsequent navigations happen client-side (SPA style). + +- **Use case**: E-commerce product pages, news sites, personalized dynamic content. +- **Pros**: Excellent SEO, fast initial content visibility. +- **Cons**: Requires a server (Node.js), higher server cost/latency. + +## Hydration + +Hydration is the process of making server-rendered HTML interactive in the browser. + +- **Full Hydration**: The entire app becomes interactive at once. +- **Incremental Hydration**: (Advanced) Parts become interactive as needed using `@defer` blocks. +- **Event Replay**: Captures and replays user events that happened before hydration finished. + +## Decision Matrix + +| Requirement | Strategy | +| :------------------------------ | :------------------- | +| **SEO + Static Content** | SSG | +| **SEO + Dynamic Content** | SSR | +| **No SEO + High Interactivity** | CSR | +| **Mixed** | Hybrid (Route-based) | diff --git a/.agents/skills/angular-developer/references/resource.md b/.agents/skills/angular-developer/references/resource.md new file mode 100644 index 00000000..e356ea51 --- /dev/null +++ b/.agents/skills/angular-developer/references/resource.md @@ -0,0 +1,77 @@ +# Async Reactivity with `resource` + +> [!IMPORTANT] +> The `resource` API is currently experimental in Angular. + +A `Resource` incorporates asynchronous data fetching into Angular's signal-based reactivity. It executes an async loader function whenever its dependencies change, exposing the status and result as synchronous signals. + +## Basic Usage + +The `resource` function accepts an options object with two main properties: + +1. `params`: A reactive computation (like `computed`). When signals read here change, the resource re-fetches. +2. `loader`: An async function that fetches data based on the parameters. + +```ts +import { Component, resource, signal, computed } from '@angular/core'; + +@Component({...}) +export class UserProfile { + userId = signal('123'); + + userResource = resource({ + // Reactively tracking userId + params: () => ({ id: this.userId() }), + + // Executes whenever params change + loader: async ({ params, abortSignal }) => { + const response = await fetch(`/api/users/${params.id}`, { signal: abortSignal }); + if (!response.ok) throw new Error('Network error'); + return response.json(); + } + }); + + // Use the resource value in computed signals + userName = computed(() => { + if (this.userResource.hasValue()) { + return this.userResource.value()?.name; + } else { + return 'Loading...'; + } + }); +} +``` + +## Aborting Requests + +If the `params` signal changes while a previous loader is still running, the `Resource` will attempt to abort the outstanding request using the provided `abortSignal`. **Always pass `abortSignal` to your `fetch` calls.** + +## Reloading Data + +You can imperatively force the resource to re-run the loader without the params changing by calling `.reload()`. + +```ts +this.userResource.reload(); +``` + +## Resource Status Signals + +The `Resource` object provides several signals to read its current state: + +- `value()`: The resolved data, or `undefined`. +- `hasValue()`: Type-guard boolean. `true` if a value exists. +- `isLoading()`: Boolean indicating if the loader is currently running. +- `error()`: The error thrown by the loader, or `undefined`. +- `status()`: A string constant representing the exact state (`'idle'`, `'loading'`, `'resolved'`, `'error'`, `'reloading'`, `'local'`). + +## Local Mutation + +You can optimistically update the resource's value directly. This changes the status to `'local'`. + +```ts +this.userResource.value.set({name: 'Optimistic Update'}); +``` + +## Reactive Data Fetching with `httpResource` + +If you are using Angular's `HttpClient`, prefer using `httpResource`. It is a specialized wrapper that leverages the Angular HTTP stack (including interceptors) while providing the same signal-based resource API. diff --git a/.agents/skills/angular-developer/references/route-animations.md b/.agents/skills/angular-developer/references/route-animations.md new file mode 100644 index 00000000..56cebbed --- /dev/null +++ b/.agents/skills/angular-developer/references/route-animations.md @@ -0,0 +1,56 @@ +# Route Transition Animations + +Angular Router supports the browser's **View Transitions API** for smooth visual transitions between routes. + +## Enabling View Transitions + +Add `withViewTransitions()` to your router configuration. + +```ts +provideRouter(routes, withViewTransitions()); +``` + +This is a **progressive enhancement**. In browsers that don't support the API, the router will still work but without the transition animation. + +## How it Works + +1. Browser takes a screenshot of the old state. +2. Router updates the DOM (activates new component). +3. Browser takes a screenshot of the new state. +4. Browser animates between the two states. + +## Customizing with CSS + +Transitions are customized in **global CSS files** (not component-scoped CSS). + +Use the `::view-transition-old()` and `::view-transition-new()` pseudo-elements. + +```css +/* Example: Cross-fade + Slide */ +::view-transition-old(root) { + animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out; +} +::view-transition-new(root) { + animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in; +} +``` + +## Advanced Control + +Use `onViewTransitionCreated` to skip transitions or customize behavior based on the navigation context. + +```ts +withViewTransitions({ + onViewTransitionCreated: ({transition, from, to}) => { + // Skip animation for specific routes + if (to.url === '/no-animation') { + transition.skipTransition(); + } + }, +}); +``` + +## Best Practices + +- **Global Styles**: Always define transition animations in `styles.css` to avoid view encapsulation issues. +- **View Transition Names**: Assign unique `view-transition-name` to elements that should transition smoothly across routes (e.g., a header image). diff --git a/.agents/skills/angular-developer/references/route-guards.md b/.agents/skills/angular-developer/references/route-guards.md new file mode 100644 index 00000000..9169d543 --- /dev/null +++ b/.agents/skills/angular-developer/references/route-guards.md @@ -0,0 +1,52 @@ +# Route Guards + +Route guards control whether a user can navigate to or leave a route. + +## Types of Guards + +- **`CanActivate`**: Can the user access this route? (e.g., Auth check). +- **`CanActivateChild`**: Can the user access children of this route? +- **`CanDeactivate`**: Can the user leave this route? (e.g., Unsaved changes). +- **`CanMatch`**: Should this route even be considered for matching? (e.g., Feature flags). If it returns `false`, the router continues checking other routes. + +## Creating a Guard + +Guards are typically functional since Angular 15. + +```ts +export const authGuard: CanActivateFn = (route, state) => { + const authService = inject(AuthService); + const router = inject(Router); + + if (authService.isLoggedIn()) { + return true; + } + + // Redirect to login + return router.parseUrl('/login'); +}; +``` + +## Applying Guards + +Add them to the route configuration as an array. They execute in order. + +```ts +{ + path: 'admin', + component: Admin, + canActivate: [authGuard], + canActivateChild: [adminChildGuard], + canDeactivate: [unsavedChangesGuard] +} +``` + +## Return Values + +- `boolean`: `true` to allow, `false` to block. +- `UrlTree` or `RedirectCommand`: Redirect to a different route. +- `Observable` or `Promise`: Resolves to the above types. + +## Security Note + +**Client-side guards are NOT a substitute for server-side security.** Always verify permissions on the server. diff --git a/.agents/skills/angular-developer/references/router-lifecycle.md b/.agents/skills/angular-developer/references/router-lifecycle.md new file mode 100644 index 00000000..be9aeb6e --- /dev/null +++ b/.agents/skills/angular-developer/references/router-lifecycle.md @@ -0,0 +1,45 @@ +# Router Lifecycle and Events + +Angular Router emits events through the `Router.events` observable, allowing you to track the navigation lifecycle from start to finish. + +## Common Router Events (Chronological) + +1. **`NavigationStart`**: Navigation begins. +2. **`RoutesRecognized`**: Router matches the URL to a route. +3. **`GuardsCheckStart` / `End`**: Evaluation of `canActivate`, `canMatch`, etc. +4. **`ResolveStart` / `End`**: Data resolution phase (fetching data via resolvers). +5. **`NavigationEnd`**: Navigation completed successfully. +6. **`NavigationCancel`**: Navigation canceled (e.g., guard returned `false`). +7. **`NavigationError`**: Navigation failed (e.g., error in resolver). + +## Subscribing to Events + +Inject the `Router` and filter the `events` observable. + +```ts +import {Router, NavigationStart, NavigationEnd} from '@angular/router'; + +export class MyService { + private router = inject(Router); + + constructor() { + this.router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe((event) => { + console.log('Navigated to:', event.url); + }); + } +} +``` + +## Debugging + +Enable detailed console logging of all routing events during application bootstrap. + +```ts +provideRouter(routes, withDebugTracing()); +``` + +## Common Use Cases + +- **Loading Indicators**: Show a spinner when `NavigationStart` fires and hide it on `NavigationEnd`/`Cancel`/`Error`. +- **Analytics**: Track page views by listening for `NavigationEnd`. +- **Scroll Management**: Respond to `Scroll` events for custom scroll behavior. diff --git a/.agents/skills/angular-developer/references/router-testing.md b/.agents/skills/angular-developer/references/router-testing.md new file mode 100644 index 00000000..fc18d9ca --- /dev/null +++ b/.agents/skills/angular-developer/references/router-testing.md @@ -0,0 +1,87 @@ +# Testing with the RouterTestingHarness + +When testing components that involve routing, it is crucial **not to mock the Router or related services**. Instead, use the `RouterTestingHarness`, which provides a robust and reliable way to test routing logic in an environment that closely mirrors a real application. + +Using the harness ensures you are testing the actual router configuration, guards, and resolvers, leading to more meaningful tests. + +## Setting Up for Router Testing + +The `RouterTestingHarness` is the primary tool for testing routing scenarios. You also need to provide your test routes using the `provideRouter` function in your `TestBed` configuration. + +### Example Setup + +```ts +import {TestBed} from '@angular/core/testing'; +import {provideRouter} from '@angular/router'; +import {RouterTestingHarness} from '@angular/router/testing'; +import {Dashboard} from './dashboard.component'; +import {HeroDetail} from './hero-detail.component'; + +describe('Dashboard Component Routing', () => { + let harness: RouterTestingHarness; + + beforeEach(async () => { + // 1. Configure TestBed with test routes + await TestBed.configureTestingModule({ + providers: [ + // Use provideRouter with your test-specific routes + provideRouter([ + {path: '', component: Dashboard}, + {path: 'heroes/:id', component: HeroDetail}, + ]), + ], + }).compileComponents(); + + // 2. Create the RouterTestingHarness + harness = await RouterTestingHarness.create(); + }); +}); +``` + +### Key Concepts + +1. **`provideRouter([...])`**: Provide a test-specific routing configuration. This should include the routes necessary for the component-under-test to function correctly. +2. **`RouterTestingHarness.create()`**: Asynchronously creates and initializes the harness and performs an initial navigation to the root URL (`/`). + +## Writing Router Tests + +Once the harness is created, you can use it to drive navigation and make assertions on the state of the router and the activated components. + +### Example: Testing Navigation + +```ts +it('should navigate to a hero detail when a hero is selected', async () => { + // 1. Navigate to the initial component and get its instance + const dashboard = await harness.navigateByUrl('/', Dashboard); + + // Suppose the dashboard has a method to select a hero + const heroToSelect = {id: 42, name: 'Test Hero'}; + dashboard.selectHero(heroToSelect); + + // Wait for stability after the action that triggers navigation + await harness.fixture.whenStable(); + + // 2. Assert on the URL + expect(harness.router.url).toEqual('/heroes/42'); + + // 3. Get the activated component after navigation + const heroDetail = await harness.getHarness(HeroDetail); + + // 4. Assert on the state of the new component + expect(await heroDetail.componentInstance.hero.name).toBe('Test Hero'); +}); + +it('should get the activated component directly', async () => { + // Navigate and get the component instance in one step + const dashboardInstance = await harness.navigateByUrl('/', Dashboard); + + expect(dashboardInstance).toBeInstanceOf(Dashboard); +}); +``` + +### Best Practices + +- **Navigate with the Harness:** Always use `harness.navigateByUrl()` to simulate navigation. This method returns a promise that resolves with the instance of the activated component. +- **Access the Router State:** Use `harness.router` to access the live router instance and assert on its state (e.g., `harness.router.url`). +- **Get Activated Components:** Use `harness.getHarness(ComponentType)` to get an instance of a component harness for the currently activated routed component, or `harness.routeDebugElement` to get the `DebugElement`. +- **Wait for Stability:** After performing an action that causes navigation, always `await harness.fixture.whenStable()` to ensure the routing is complete before making assertions. diff --git a/.agents/skills/angular-developer/references/show-routes-with-outlets.md b/.agents/skills/angular-developer/references/show-routes-with-outlets.md new file mode 100644 index 00000000..af43f014 --- /dev/null +++ b/.agents/skills/angular-developer/references/show-routes-with-outlets.md @@ -0,0 +1,68 @@ +# Show Routes with Outlets + +The `RouterOutlet` directive is a placeholder where Angular renders the component for the current URL. + +## Basic Usage + +Include `` in your template. Angular inserts the routed component as a sibling immediately following the outlet. + +```html + + + +``` + +## Nested Outlets + +Child routes require their own `` within the parent component's template. + +```ts +// Parent component template +

Settings

+ +``` + +## Named Outlets (Secondary Routes) + +Pages can have multiple outlets. Assign a `name` to an outlet to target it specifically. The default name is `'primary'`. + +```html + + + + +``` + +Define the `outlet` in the route config: + +```ts +{ + path: 'chat', + component: Chat, + outlet: 'sidebar' +} +``` + +## Outlet Lifecycle Events + +`RouterOutlet` emits events when components are changed: + +- `activate`: New component instantiated. +- `deactivate`: Component destroyed. +- `attach` / `detach`: Used with `RouteReuseStrategy`. + +```html + +``` + +## Passing Data via `routerOutletData` + +You can pass contextual data to the routed component using the `routerOutletData` input. The component accesses this via the `ROUTER_OUTLET_DATA` injection token as a signal. + +```ts +// In Parent + + +// In Routed Component +outletData = inject(ROUTER_OUTLET_DATA) as Signal<{ theme: string }>; +``` diff --git a/.agents/skills/angular-developer/references/signal-forms.md b/.agents/skills/angular-developer/references/signal-forms.md new file mode 100644 index 00000000..992fab10 --- /dev/null +++ b/.agents/skills/angular-developer/references/signal-forms.md @@ -0,0 +1,897 @@ +# Signal Forms + +Signal Forms are the recommended approach for handling forms in modern Angular applications (v21+). They provide a reactive, type-safe, and model-driven way to manage form state using Angular Signals. + +**CRITICAL**: You MUST use Angular's new Signal Forms API for all form-related functionality. Do NOT use null as a value or type of any fields. + +## Imports + +You can import the following from `@angular/forms/signals`: + +```ts +import { + form, + FormField, + submit, + // Rules for field state + disabled, + hidden, + readonly, + debounce, + // Schema helpers + applyWhen, + applyEach, + schema, + // Custom validation + validate, + validateHttp, + validateStandardSchema, + // Metadata + metadata, +} from '@angular/forms/signals'; +``` + +## Creating a Form + +Use the `form()` function with a Signal model. The structure of the form is derived directly from the model. + +```ts +import {Component, signal} from '@angular/core'; +import {form, FormField} from '@angular/forms/signals'; + +@Component({ + // ... + imports: [FormField], +}) +export class Example { + // 1. Define your model with initial values (avoid undefined) + userModel = signal({ + name: '', // CRITICAL: NEVER use null or undefined as initial values + email: '', + age: 0, // Use 0 for numbers, NOT null + address: { + street: '', + city: '', + }, + hobbies: [] as string[], // Use [] for arrays, NOT null + }); + + // WRONG - DO NOT DO THIS: + // badModel = signal({ + // name: null, // ERROR: use '' instead + // age: null, // ERROR: use 0 instead + // items: null // ERROR: use [] instead + // }); + + // 2. Create the form + userForm = form(this.userModel); +} +``` + +## Validation + +Import validators from `@angular/forms/signals`. + +```ts +import {required, email, min, max, minLength, maxLength, pattern} from '@angular/forms/signals'; +``` + +Use them in the schema function passed to `form()`: + +```ts +userForm = form(this.userModel, (schemaPath) => { + // Required + required(schemaPath.name, {message: 'Name is required'}); + + // Conditional required. + required(schemaPath.name, { + when({valueOf}) { + return valueOf(schemaPath.age) > 10; + }, + }); + // when is only available for required + // Do NOT do this: pattern(p.name, /xxx/, {when /* ERROR */) + + // Email + email(schemaPath.email, {message: 'Invalid email'}); + + // Min/Max for numbers + min(schemaPath.age, 18); + max(schemaPath.age, 100); + + // MinLength/MaxLength for strings/arrays + minLength(schemaPath.password, 8); + maxLength(schemaPath.description, 500); + + // Pattern (Regex) + pattern(schemaPath.zipCode, /^\d{5}$/); +}); +``` + +## FieldState vs FormField: The Parental Requirement + +It's important to understand the difference between **FormField** (the structure) and **FieldState** (the actual data/signals). + +**RULE**: You must **CALL** a field as a function to access its state signals (valid, touched, dirty, hidden, etc.). + +```ts +// f is a FormField (structural) +const f = form(signal({cat: {name: 'pirojok-the-cat', age: 5}})); + +f.cat.name; // FormField: You can't get flags from here! +f.cat.name.touched(); // ERROR: touched() does not exist on FormField + +f.cat.name(); // FieldState: Calling it gives you access to signals +f.cat.name().touched(); // VALID: Accessing the signal +f.cat().name.touched(); // ERROR: f.cat() is state, it doesn't have children! +``` + +Similarly in a template: + +```html + +@if (bookingForm.hotelDetails.hidden()) { ... } + + +@if (bookingForm.hotelDetails().hidden()) { ... } +``` + +## Disabled / Readonly / Hidden + +Control field status using rules in the schema. + +```ts +import {disabled, readonly, hidden} from '@angular/forms/signals'; + +userForm = form(this.userModel, (schemaPath) => { + // Conditionally disabled + disabled(schemaPath.password, ({valueOf}) => !valueOf(schemaPath.createAccount)); + + // Conditionally hidden (does NOT remove from model, just marks as hidden) + hidden(schemaPath.shippingAddress, ({valueOf}) => valueOf(schemaPath.sameAsBilling)); + + // Readonly + readonly(schemaPath.username); +}); +``` + +## Binding + +Import `FormField` and use the `[formField]` directive. + +```ts +import {FormField} from '@angular/forms/signals'; +``` + +All props on state, such as `disabled`, `hidden`, `readonly` and `name` are bound automatically. +Do _NOT_ bind the `name` field. + +**CRITICAL: FORBIDDEN ATTRIBUTES** +When using `[formField]`, you MUST NOT set the following attributes in the template (either static or bound): + +- `min`, `max` (Use validators in the schema instead) +- `value`, `[value]`, `[attr.value]` (Already handled by `[formField]`) +- `[attr.min]`, `[attr.max]` +- `[disabled]`, `[readonly]` (Already handled by `[formField]`) + +Do NOT do this: `` or ``. + +```html + + + + + + + + + + + +``` + +## Reactive Forms + +**Do NOT import** `FormControl`, `FormGroup`, `FormArray`, or `FormBuilder` from `@angular/forms`. Signal Forms replace these concepts entirely. +Signal forms does NOT have a builder. + +## Accessing State + +Each field in the form is a function that returns its state. + +```ts +// Access the field by calling it +const emailState = this.userForm.email(); + +// Value (WritableSignal) +const value = this.userForm().value(); + +// Validation State (Signals) +const isValid = this.userForm().valid(); +const isInvalid = this.userForm().invalid(); +const errors = this.userForm().errors(); // Array of errors +const isPending = this.userForm().pending(); // Async validation pending + +// Interaction State (Signals) +const isTouched = this.userForm().touched(); +const isDirty = this.userForm().dirty(); + +// Availability State (Signals) +const isDisabled = this.userForm().disabled(); +const isHidden = this.userForm().hidden(); +const isReadonly = this.userForm().readonly(); +``` + +IMPORTANT!: Make sure to call the field to get it state. + +```ts +form().invalid() +form.field().dirty() +form.field.subfield().touched() +form.a.b.c.d().value() +form.address.ssn().pending() +form().reset() + +// The only exception is length: +form.children.length +form.length // NOTE: no parenthesis! +form.client.addresses.length // No "()" + +@for (income of form.addresses; track $index) {/**/} +``` + +## Submitting + +Use the `submit()` function. It automatically marks all fields as touched before running the action. + +**CRITICAL**: The callback to `submit()` MUST be `async` and MUST return a Promise. + +```ts +import { submit } from '@angular/forms/signals'; + +// CORRECT - async callback +onSubmit() { + submit(this.userForm, async () => { + // This only runs if the form is valid + await this.apiService.save(this.userModel()); + console.log('Saved!'); + }); +} + +// WRONG - missing async keyword +onSubmit() { + submit(this.userForm, () => { // ERROR: must be async + console.log('Saved!'); + }); +} +``` + +## Handling Errors + +`field().errors()` returns the errors array of ValidationError: + +```ts +interface ValidationError { + readonly kind: string; + readonly message?: string; +} +``` + +Do _NOT_ return null from validators. +When there are no errors, return undefined + +### Context + +Functions passed to rules like `validate()`, `disabled()`, `applyWhen` take a context object. It is **CRITICAL** to understand its structure: + +```ts +validate( + schemaPath.username, + ({ + value, // Signal: Writable current value of the field + fieldTree, // FieldTree: Sub-fields (if it's a group/array) + state, // FieldState: Access flags like state.valid(), state.dirty() + valueOf, // (path) => T: Read values of OTHER fields (tracking dependencies), e.g. valueOf(schemaPath.password) + stateOf, // (path) => FieldState: Access state (valid/dirty) of OTHER fields, e.g. stateOf(schemaPath.password).valid() + pathKeys, // Signal: Path from root to this field + }) => { + // WRONG: if (touched()) ... (touched is not in context) + // RIGHT: if (state.touched()) ... + + if (value() === 'admin') { + return {kind: 'reserved', message: 'Username admin is reserved'}; + } + }, +); +``` + +### IMPORTANT: Paths are NOT Signals + +Inside the `form()` callback, `schemaPath` and its children (e.g., `schemaPath.user.name`) are **NOT** signals and are **NOT** callable. + +```ts +// WRONG - This will throw an error: +applyWhen(p.ssn, () => p.ssn().touched(), (ssnField) => { ... }); + +// RIGHT - Use stateOf() to get the state of a path: +applyWhen(p.ssn, ({ stateOf }) => stateOf(p.ssn).touched(), (ssnField) => { ... }); + +// RIGHT - Use valueOf() to get the value of a path: +applyWhen(p.ssn, ({ valueOf }) => valueOf(p.ssn) !== '', (ssnField) => { ... }); +``` + +### Multiple Items + +- Use `applyEach` for applying rules per item. +- **CRITICAL**: `applyEach` callback takes ONLY ONE argument (the item path), NOT two: + +```ts +// CORRECT - single argument +applyEach(s.items, (item) => { + required(item.name); +}); + +// WRONG - do NOT pass index +applyEach(s.items, (item, index) => { + // ERROR: callback takes 1 argument + required(item.name); +}); +``` + +- In the template use `@for` to iterate over the items. +- To remove an item from an array, just remove appropriate item from the array in the data. +- **`select` binding**: You CAN bind to `` (string[]) | Use checkboxes for array fields | +| **readonly attribute** | `` | Use `readonly()` rule in schema | +| **min/max attributes** | `` | Use `min()` and `max()` rules in schema | +| **value binding** | `` | Do NOT use `[value]` with `[formField]` | +| **when option** | `pattern(p.x, /.../, {when: ...})` | `when` only works with `required()` | +| **Submit callback** | `submit(form, () => { ... })` | `submit(form, async () => { ... })` | +| **Async params** | `params: s.field` | `params: ({ value }) => value()` | +| **Async onError** | Omitting `onError` | `onError` is REQUIRED in `validateAsync` | +| **resource() API** | `request: signal` | `params: signal` | +| **applyEach args** | `applyEach(s.items, (item, index) => ...)` | `applyEach(s.items, (item) => ...)` | +| **Nested @for** | `$parent.$index` | Use `let outerIndex = $index` | +| **FormState import** | `import { FormState }` | `FormState` does not exist, use `FieldState` | +| **Null in model** | `signal({ name: null })` | `signal({ name: '' })` or `signal({ age: 0 })` | +| **Validate syntax** | `validate(s.field, { value } => ...)` | `validate(s.field, ({ value }) => ...)` | +| **Checkbox Array** | `[formField]="form.tags"` (string[]) | Checkboxes ONLY bind to `boolean` | + +## Big Form Example + +### `src/app/app.ts` + +```ts +import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; +import { + form, + FormField, + submit, + required, + email, + min, + hidden, + applyEach, + validate, +} from '@angular/forms/signals'; + +@Component({ + selector: 'app-root', + standalone: true, + imports: [FormField], + templateUrl: './app.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class App { + model = signal({ + personalInfo: { + firstName: '', + lastName: '', + email: '', + age: 0, + }, + tripDetails: { + destination: 'Mars', + launchDate: '', + }, + package: { + tier: 'economy', + extras: [] as string[], + }, + companions: [] as Array<{name: string; relation: string}>, + }); + + bookingForm = form(this.model, (s) => { + required(s.personalInfo.firstName, {message: 'First name is required'}); + required(s.personalInfo.lastName, {message: 'Last name is required'}); + required(s.personalInfo.email, {message: 'Email is required'}); + email(s.personalInfo.email, {message: 'Invalid email address'}); + required(s.personalInfo.age, {message: 'Age is required'}); + min(s.personalInfo.age, 18, {message: 'Must be at least 18'}); + + required(s.tripDetails.destination); + required(s.tripDetails.launchDate); + validate(s.tripDetails.launchDate, ({value}) => { + const date = new Date(value()); + if (isNaN(date.getTime())) return undefined; + const today = new Date(); + if (date < today) { + return {kind: 'pastData', message: 'Launch date must be in the future'}; + } + return undefined; + }); + + // valueOf is used to access values of other fields in rules + hidden(s.package.extras, ({valueOf}) => valueOf(s.package.tier) === 'economy'); + + applyEach(s.companions, (companion) => { + required(companion.name, {message: 'Companion name required'}); + required(companion.relation, {message: 'Relation required'}); + }); + }); + + addCompanion() { + this.model.update((m) => ({ + ...m, + companions: [...m.companions, {name: '', relation: ''}], + })); + } + + removeCompanion(index: number) { + this.model.update((m) => ({ + ...m, + companions: m.companions.filter((_, i) => i !== index), + })); + } + + onSubmit() { + // CRITICAL: submit callback MUST be async + submit(this.bookingForm, async () => { + console.log('Booking Confirmed:', this.model()); + // If you need to do async work: + // await this.apiService.save(this.model()); + }); + } +} +``` + +### `src/app/app.html` + +```html +
+

Interstellar Booking

+ +
+

Personal Info

+ + + + + + + + +
+ +
+

Trip Details

+ + + + +
+ +
+

Package

+ + + + + + @if (!bookingForm.package.extras().hidden()) { +
+

Extras

+ + +
+ } +
+ +
+

Companions

+ + + @for (companion of bookingForm.companions; track $index) { +
+ + @if (companion.name().touched() && companion.name().errors().length) { + {{ companion.name().errors()[0].message }} + } + + + @if (companion.relation().touched() && companion.relation().errors().length) { + {{ companion.relation().errors()[0].message }} + } + + +
+ } +
+ + +
+``` + +## Recovering from Build Errors + +If you encounter build errors, here are the most common fixes: + +### `Property 'value' does not exist on type 'FieldTree'` + +**Problem**: Accessing `.value()` directly on a field without calling it first. + +```ts +// WRONG +const val = this.form.field.value(); +// RIGHT +const val = this.form.field().value(); +``` + +### `Property 'set' does not exist on type 'FieldTree'` + +**Problem**: Trying to set values on the form tree. Signal Forms are model-driven. + +```ts +// WRONG +this.form.address.street.set('Main St'); +// RIGHT - update the model signal instead +this.model.update((m) => ({...m, address: {...m.address, street: 'Main St'}})); +``` + +### `Type 'string[]' is not assignable to type 'string'` + +**Problem**: Binding `[formField]` to an array field with a single-value ` + ... + + + + +``` + +### `NG8022: Setting the 'readonly/min/max/value' attribute is not allowed` + +**Problem**: Conflict between HTML attributes and `[formField]` directive. + +```html + + + + + +min(s.age, 18); max(s.age, 99); // Then just: + +``` + +### `TS2322: Type 'string[]' is not assignable to type 'boolean'` + +**Problem**: Binding a checkbox to an array field instead of a boolean field. + +```html + + + + + + + +model = signal({ hasWifi: false, hasGym: false }); + +``` + +### `'when' does not exist in type` for pattern/email/min/max + +**Problem**: Using `when` option with validators other than `required`. + +```ts +// WRONG - when only works with required +pattern(s.ssn, /^\d{3}-\d{2}-\d{4}$/, {when: isJoint}); + +// RIGHT - use applyWhen for conditional non-required validators +applyWhen(s.ssn, isJoint, (ssnPath) => { + pattern(ssnPath, /^\d{3}-\d{2}-\d{4}$/); +}); +``` + +### `Expected 3 arguments, but got 2` for applyWhen + +**Problem**: Missing the path argument in `applyWhen`. + +```ts +// WRONG +applyWhen(isJoint, () => { ... }); + +// RIGHT - applyWhen(path, condition, schemaFn) +applyWhen(s.spouse, ({valueOf}) => valueOf(s.status) === 'joint', (spousePath) => { + required(spousePath.name); +}); +``` + +### `Module has no exported member 'FormState'` + +**Problem**: Importing a non-existent type. + +```ts +// WRONG +import {FormState} from '@angular/forms/signals'; + +// FormState does not exist. If you need type access, the form +// instance provides all necessary state through field().valid(), etc. +``` + +### `No pipe found with name 'number'` / `'json'` / `'date'` + +**Problem**: Using pipes in templates. + +```html + +{{ totalPrice() | number:'1.2-2' }} + + +totalPriceFormatted = computed(() => this.totalPrice().toFixed(2)); + +{{ totalPriceFormatted() }} +``` + +### `$parent.$index` in nested @for loops + +**Problem**: Angular doesn't have `$parent`. + +```html + +@for (item of items; track $index) { @for (sub of item.subs; track $index) { + +} } + + +@for (item of items; track $index; let outerIdx = $index) { @for (sub of item.subs; track $index) { + +} } +``` diff --git a/.agents/skills/angular-developer/references/signals-overview.md b/.agents/skills/angular-developer/references/signals-overview.md new file mode 100644 index 00000000..07fb6ed9 --- /dev/null +++ b/.agents/skills/angular-developer/references/signals-overview.md @@ -0,0 +1,94 @@ +# Angular Signals Overview + +Signals are the foundation of reactivity in modern Angular applications. A **signal** is a wrapper around a value that notifies interested consumers when that value changes. + +## Writable Signals (`signal`) + +Use `signal()` to create state that can be directly updated. + +```ts +import {signal} from '@angular/core'; + +// Create a writable signal +const count = signal(0); + +// Read the value (always requires calling the getter function) +console.log(count()); + +// Update the value directly +count.set(3); + +// Update based on the previous value +count.update((value) => value + 1); +``` + +### Exposing as Readonly + +When exposing state from a service, it is a best practice to expose a readonly version to prevent external mutation. + +```ts +private readonly _count = signal(0); +// Consumers can read this, but cannot call .set() or .update() +readonly count = this._count.asReadonly(); +``` + +## Computed Signals (`computed`) + +Use `computed()` to create read-only signals that derive their value from other signals. + +- **Lazily Evaluated**: The derivation function doesn't run until the computed signal is read. +- **Memoized**: The result is cached. It only recalculates when one of the signals it depends on changes. +- **Dynamic Dependencies**: Only the signals _actually read_ during the derivation are tracked. + +```ts +import {signal, computed} from '@angular/core'; + +const count = signal(0); +const doubleCount = computed(() => count() * 2); + +// doubleCount automatically updates when count changes. +``` + +## Reactive Contexts + +A **reactive context** is a runtime state where Angular monitors signal reads to establish a dependency. + +Angular automatically enters a reactive context when evaluating: + +- `computed` signals +- `effect` callbacks +- `linkedSignal` computations +- Component templates + +### Untracked Reads (`untracked`) + +If you need to read a signal inside a reactive context _without_ creating a dependency (so that the context doesn't re-run when the signal changes), use `untracked()`. + +```ts +import {effect, untracked} from '@angular/core'; + +effect(() => { + // This effect only runs when currentUser changes. + // It does NOT run when counter changes, even though counter is read here. + console.log(`User: ${currentUser()}, Count: ${untracked(counter)}`); +}); +``` + +### Async Operations in Reactive Contexts + +The reactive context is only active for **synchronous** code. Signal reads after an `await` will not be tracked. **Always read signals before asynchronous boundaries.** + +```ts +// ❌ INCORRECT: theme() is not tracked because it is read after await +effect(async () => { + const data = await fetchUserData(); + console.log(theme()); +}); + +// ✅ CORRECT: Read the signal before the await +effect(async () => { + const currentTheme = theme(); + const data = await fetchUserData(); + console.log(currentTheme); +}); +``` diff --git a/.agents/skills/angular-developer/references/tailwind-css.md b/.agents/skills/angular-developer/references/tailwind-css.md new file mode 100644 index 00000000..9139fcdc --- /dev/null +++ b/.agents/skills/angular-developer/references/tailwind-css.md @@ -0,0 +1,69 @@ +# Using Tailwind CSS with Angular + +Tailwind CSS is a utility-first CSS framework that integrates seamlessly with Angular. + +**CRITICAL AGENT GUIDANCE: ALWAYS focus on Tailwind CSS v4 practices. DO NOT revert to old Tailwind v3 patterns (like creating `tailwind.config.js` with `@tailwind` directives) as this will break the application build. Modern Angular projects use Tailwind v4.** + +## Automated Setup (Recommended) + +The easiest way to add Tailwind CSS to an Angular project is via the Angular CLI: + +```shell +ng add tailwindcss +``` + +This will automatically: + +1. Install `tailwindcss` and peer dependencies. +2. Configure the project to use Tailwind CSS. +3. Add the proper import to your global styles. + +## Manual Setup (Tailwind v4) + +If setting up manually, use the following Tailwind v4 pattern: + +### 1. Install Dependencies + +Install Tailwind CSS and PostCSS: + +```shell +npm install tailwindcss @tailwindcss/postcss postcss +``` + +### 2. Configure PostCSS + +Create a `.postcssrc.json` file in the project root: + +```json +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} +``` + +_(Do NOT create a `tailwind.config.js` file! Configuration in v4 is handled through CSS variables)._ + +### 3. Import Tailwind CSS + +In your global styles file (e.g., `src/styles.css`), add the standard v4 import: + +```css +@import 'tailwindcss'; +``` + +_(If using SCSS, use `@use 'tailwindcss';` instead)._ + +### 4. Use Utility Classes + +You can now use Tailwind classes directly in your component templates: + +```html +

Hello world!

+``` + +## Summary for AI Agents + +- **Do not use `@tailwind base; @tailwind components; @tailwind utilities;`**. Use `@import 'tailwindcss';`. +- **Do not create `tailwind.config.js`**. Configuration is managed directly in CSS via theme variables or using PostCSS configurations. +- Stick strictly to v4 syntax and workflows. diff --git a/.agents/skills/angular-developer/references/template-driven-forms.md b/.agents/skills/angular-developer/references/template-driven-forms.md new file mode 100644 index 00000000..1907eeb9 --- /dev/null +++ b/.agents/skills/angular-developer/references/template-driven-forms.md @@ -0,0 +1,114 @@ +# Template-Driven Forms + +Template-driven forms use two-way data binding (`[(ngModel)]`) to update the data model in the component as changes are made in the template and vice versa. They are ideal for simple forms and use directives in the HTML template to manage form state and validation. + +## Core Directives + +Template-driven forms rely on the `FormsModule` which provides these key directives: + +- `NgModel`: Reconciles value changes in the form element with the data model (`[(ngModel)]`). +- `NgForm`: Automatically creates a top-level `FormGroup` bound to the `
` tag. +- `NgModelGroup`: Creates a nested `FormGroup` bound to a DOM element. + +## Setup + +First, import `FormsModule` into your component or module. + +```ts +import {Component} from '@angular/core'; +import {FormsModule} from '@angular/forms'; + +@Component({ + selector: 'app-user-form', + imports: [FormsModule], + templateUrl: './user-form.component.html', +}) +export class UserForm { + user = {name: '', role: 'Guest'}; + + onSubmit() { + console.log('Form submitted!', this.user); + } +} +``` + +## Building the Form Template + +### Two-Way Binding with `[(ngModel)]` + +Use `[(ngModel)]` on input elements. **Every element using `[(ngModel)]` MUST have a `name` attribute.** Angular uses the `name` attribute to register the control with the parent `NgForm`. + +```html + + +
+ + +
+ + +
+ + +
+ + + +
+``` + +## Form and Control State + +Angular automatically applies CSS classes to controls and forms based on their state: + +| State | Class if True | Class if False | +| :------------- | :-------------------------------- | :------------- | +| Visited | `ng-touched` | `ng-untouched` | +| Value Changed | `ng-dirty` | `ng-pristine` | +| Value is Valid | `ng-valid` | `ng-invalid` | +| Form Submitted | `ng-submitted` (on `
` only) | - | + +You can use these classes to provide visual feedback in your CSS: + +```css +.ng-valid[required], +.ng-valid.required { + border-left: 5px solid #42a948; /* green */ +} +.ng-invalid:not(form) { + border-left: 5px solid #a94442; /* red */ +} +``` + +## Validation and Error Messages + +To display error messages conditionally, export the `ngModel` directive to a template reference variable (e.g., `#nameCtrl="ngModel"`). + +```html + + + +@if (nameCtrl.invalid && (nameCtrl.dirty || nameCtrl.touched)) { +
+ @if (nameCtrl.errors?.['required']) { +
Name is required.
+ } +
+} +``` + +## Submitting the Form + +1. Use the `(ngSubmit)` event on the `` element. +2. Bind the submit button's disabled state to the overall form validity using the `NgForm` template reference variable (e.g., `[disabled]="!userForm.form.valid"`). + +## Resetting the Form + +To programmatically reset the form to its pristine state (clearing values and validation flags), use the `reset()` method on the `NgForm` instance. + +```html + +``` diff --git a/.agents/skills/angular-developer/references/testing-fundamentals.md b/.agents/skills/angular-developer/references/testing-fundamentals.md new file mode 100644 index 00000000..0e095306 --- /dev/null +++ b/.agents/skills/angular-developer/references/testing-fundamentals.md @@ -0,0 +1,75 @@ +# Testing Fundamentals + +This guide covers the fundamental principles and practices for writing unit tests in this repository, which uses Vitest as the test runner. + +## Core Philosophy: Zoneless & Async-First + +This project follows a modern, zoneless testing approach. State changes schedule updates asynchronously, and tests must account for this. + +**Do NOT** use `fixture.detectChanges()` to manually trigger updates. +**ALWAYS** use the "Act, Wait, Assert" pattern: + +1. **Act:** Update state or perform an action (e.g., set a component input, click a button). +2. **Wait:** Use `await fixture.whenStable()` to allow the framework to process the scheduled update and render the changes. +3. **Assert:** Verify the outcome. + +### Basic Test Structure Example + +```ts +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {MyComponent} from './my.component'; + +describe('MyComponent', () => { + let component: MyComponent; + let fixture: ComponentFixture; + let h1: HTMLElement; + + beforeEach(async () => { + // 1. Configure the test module + await TestBed.configureTestingModule({ + imports: [MyComponent], + }).compileComponents(); + + // 2. Create the component fixture + fixture = TestBed.createComponent(MyComponent); + component = fixture.componentInstance; + h1 = fixture.nativeElement.querySelector('h1'); + }); + + it('should display the default title', async () => { + // ACT: (Implicit) Component is created with default state. + // WAIT for initial data binding. + await fixture.whenStable(); + // ASSERT the initial state. + expect(h1.textContent).toContain('Default Title'); + }); + + it('should display a different title after a change', async () => { + // ACT: Change the component's title property. + component.title.set('New Test Title'); + + // WAIT for the asynchronous update to complete. + await fixture.whenStable(); + + // ASSERT the DOM has been updated. + expect(h1.textContent).toContain('New Test Title'); + }); +}); +``` + +## TestBed and ComponentFixture + +- **`TestBed`**: The primary utility for creating a test-specific Angular module. Use `TestBed.configureTestingModule({...})` in your `beforeEach` to declare components, provide services, and set up imports needed for your test. +- **`ComponentFixture`**: A handle on the created component instance and its environment. + - `fixture.componentInstance`: Access the component's class instance. + - `fixture.nativeElement`: Access the component's root DOM element. + - `fixture.debugElement`: An Angular-specific wrapper around the `nativeElement` that provides safer, platform-agnostic ways to query the DOM (e.g., `debugElement.query(By.css('p'))`). + +## Custom Utilities + +To keep tests fast and avoid long waits, this project provides custom utilities: + +- **`useAutoTick()`**: (from `packages/private/testing/src/utils.ts`) Fast-forwards time via a mock clock to avoid real waits. +- **`await timeout(ms)`**: (from `packages/private/testing/src/utils.ts`) Use for cases where a specific real-time delay is unavoidable. + +Always prefer `useAutoTick()` to keep tests efficient. diff --git a/.claude/skills/angular-developer b/.claude/skills/angular-developer new file mode 120000 index 00000000..f6e9d2af --- /dev/null +++ b/.claude/skills/angular-developer @@ -0,0 +1 @@ +../../.agents/skills/angular-developer \ No newline at end of file diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 00000000..72095ffc --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "skills": { + "angular-developer": { + "source": "angular/skills", + "sourceType": "github", + "computedHash": "f56a327a305b605a7ba24243a4b6b69cf1a8dc96f21ce630c9a9ac64a873689d" + } + } +} From a8b9c6a721a5d3a176896b30b8b77e2f90820d4d Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 10:56:44 +0100 Subject: [PATCH 13/22] fixes --- .claude/settings.local.json | 10 ---------- .gitignore | 3 +++ angular.json | 17 +++++++++-------- .../block-ui/src/block-ui.component.spec.ts | 13 +++++++------ .../src/dialog-wrapper.component.spec.ts | 1 - projects/components/tsconfig.spec.json | 3 ++- 6 files changed, 21 insertions(+), 26 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 44adfa84..00000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(npx vitest:*)", - "Bash(node_modules/.bin/vitest run:*)", - "Bash(export PATH=\"$HOME/.nvm/versions/node/v24.14.1/bin:$PATH\")", - "Bash(npx ng:*)" - ] - } -} diff --git a/.gitignore b/.gitignore index 8ce8d4a8..7282aed8 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,9 @@ testem.log __screenshots__/ .vitest-attachments/ +# Claude Code +.claude/settings.local.json + # System Files .DS_Store Thumbs.db diff --git a/angular.json b/angular.json index f0e593b4..be9d63d8 100644 --- a/angular.json +++ b/angular.json @@ -59,9 +59,10 @@ "maximumWarning": "6kb" } ] - } + }, + "development": {} }, - "defaultConfiguration": "" + "defaultConfiguration": "development" }, "serve": { "builder": "@angular/build:dev-server", @@ -81,9 +82,6 @@ "buildTarget": "zvoove-components-demo:build" } }, - "test": { - "builder": "@angular/build:unit-test" - }, "lint": { "builder": "@angular-eslint/builder:lint", "options": { @@ -108,8 +106,10 @@ "configurations": { "production": { "tsConfig": "projects/components/tsconfig.lib.prod.json" - } - } + }, + "development": {} + }, + "defaultConfiguration": "development" }, "test": { "builder": "@angular/build:unit-test", @@ -122,7 +122,8 @@ "browser": { "browsers": ["chromium"] } - } + }, + "defaultConfiguration": "browser" }, "lint": { "builder": "@angular-eslint/builder:lint", diff --git a/projects/components/block-ui/src/block-ui.component.spec.ts b/projects/components/block-ui/src/block-ui.component.spec.ts index 629e4665..6641b1d2 100644 --- a/projects/components/block-ui/src/block-ui.component.spec.ts +++ b/projects/components/block-ui/src/block-ui.component.spec.ts @@ -13,13 +13,12 @@ import { ZvBlockUiHarness } from './testing/block-ui.harness';
test text
`, - // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection - changeDetection: ChangeDetectionStrategy.Eager, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ZvBlockUi], }) export class TestComponent { - public blocked = signal(false); - public spinnerText = signal(''); + public readonly blocked = signal(false); + public readonly spinnerText = signal(''); } describe('ZvBlockUi', () => { @@ -63,11 +62,13 @@ describe('ZvBlockUi', () => { it('should display spinner when blocked', async () => { component.blocked.set(true); fixture.detectChanges(); + const div = await blockui.getContentDiv(); + const minDimension = Math.min(await div!.getProperty('offsetWidth'), await div!.getProperty('offsetHeight')); + const expectedDiameter = Math.max(Math.min(minDimension, 100), 20); expect(await blockui.isBlocked()).toBe(true); expect(await blockui.getSpinnerText()).toBe(null); - // In jsdom, rendered dimensions are always 0, so check the component's calculated diameter instead - expect(fixture.debugElement.children[0].componentInstance.spinnerDiameter()).toBe(20); + expect(await blockui.getSpinnerDiameter()).toBe(expectedDiameter); expect(await blockui.isClickthrough()).toBe(false); }); diff --git a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts index 15444bec..ba57eaf8 100644 --- a/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts +++ b/projects/components/dialog-wrapper/src/dialog-wrapper.component.spec.ts @@ -102,7 +102,6 @@ export class ZvDialogWrapperTestDialog { template: ``, // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection changeDetection: ChangeDetectionStrategy.Eager, - imports: [ZvDialogWrapper], }) export class ZvDialogWrapperTestComponent { public readonly dialog = inject(MatDialog); diff --git a/projects/components/tsconfig.spec.json b/projects/components/tsconfig.spec.json index 9991fd1b..bed39cae 100644 --- a/projects/components/tsconfig.spec.json +++ b/projects/components/tsconfig.spec.json @@ -7,5 +7,6 @@ // To much errors for now, but we should enable this in the future. "strictNullChecks": false }, - "include": ["**/*.spec.ts", "**/*.d.ts"] + "include": ["**/*.spec.ts", "**/*.d.ts"], + "files": ["test-setup.ts"] } From a1f8ba2d4620ef314b4db6ad956252cfb65c6cfc Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 10:58:31 +0100 Subject: [PATCH 14/22] fixes --- projects/components/test-setup.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/components/test-setup.ts b/projects/components/test-setup.ts index fdde97a2..f6bd4886 100644 --- a/projects/components/test-setup.ts +++ b/projects/components/test-setup.ts @@ -2,6 +2,7 @@ import '@angular/localize/init'; // Polyfill IntersectionObserver for jsdom (not needed in browser mode) if (typeof globalThis.IntersectionObserver === 'undefined') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment globalThis.IntersectionObserver = class IntersectionObserver { constructor(_callback: IntersectionObserverCallback, _options?: IntersectionObserverInit) {} observe() {} From 9cb884ec9207da10ea01b37f39d14619a0bc5320 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:12:33 +0100 Subject: [PATCH 15/22] remove old schematic --- .../rename-prosoft-to-zvoove/index.ts | 603 ------------------ .../rename-prosoft-to-zvoove/index_spec.ts | 16 - .../rename-prosoft-to-zvoove/schema.json | 5 - .../tests/base_spec.ts | 53 -- .../tests/block-ui_spec.ts | 90 --- .../tests/card_spec.ts | 194 ------ .../tests/dialog-wrapper_spec.ts | 222 ------- .../tests/flip-container_spec.ts | 122 ---- .../tests/form-errors_spec.ts | 120 ---- .../tests/form-field_spec.ts | 164 ----- .../tests/form_spec.ts | 186 ------ .../tests/header_spec.ts | 136 ---- .../tests/number-input_spec.ts | 166 ----- .../tests/savebar_spec.ts | 164 ----- .../tests/select_spec.ts | 184 ------ .../tests/slider_spec.ts | 166 ----- .../tests/table_spec.ts | 338 ---------- .../tests/view_spec.ts | 120 ---- 18 files changed, 3049 deletions(-) delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/index.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/index_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/schema.json delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/base_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/block-ui_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/card_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/dialog-wrapper_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/flip-container_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/form-errors_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/form-field_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/form_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/header_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/number-input_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/savebar_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/select_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/slider_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/table_spec.ts delete mode 100644 projects/components/schematics/rename-prosoft-to-zvoove/tests/view_spec.ts diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/index.ts b/projects/components/schematics/rename-prosoft-to-zvoove/index.ts deleted file mode 100644 index a2cdc104..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/index.ts +++ /dev/null @@ -1,603 +0,0 @@ -import { DirEntry, FileEntry, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; - -const touchedFiles: string[] = []; - -export default (): Rule => (tree: Tree, context: SchematicContext) => { - const title = 'components: replace [prosoft] with [zvoove]'; - context.logger.info(`"${title}" started...`); - traverseDirectory(tree.root, tree, context); - if (touchedFiles.length) { - context.logger.info(`Modified files: ${touchedFiles.join(', ')}`); - } else { - context.logger.info('No modifications required.'); - } - context.logger.info(`"${title}" finished.`); - return tree; -}; - -function traverseDirectory(directory: DirEntry, tree: Tree, _context: SchematicContext) { - const dirPath = directory.path; - if (dirPath.endsWith('/dist') || dirPath.endsWith('/node_modules')) { - // Skip these directories - return; - } - for (const subDir of directory.subdirs) { - traverseDirectory(directory.dir(subDir), tree, _context); - } - - for (const fileName of directory.subfiles.filter((subFile) => subFile.endsWith('.html'))) { - const file = directory.file(fileName); - if (file) { - updateHtmlFile(file, tree, _context); - } - } - - for (const fileName of directory.subfiles.filter((subFile) => subFile.endsWith('.css') || subFile.endsWith('.scss'))) { - const file = directory.file(fileName); - if (file) { - updateCssFile(file, tree, _context); - } - } - - for (const fileName of directory.subfiles.filter((subFile) => subFile.endsWith('.ts'))) { - const file = directory.file(fileName); - if (file) { - updateTsFile(file, tree, _context); - } - } -} -function updateCssFile(file: FileEntry, tree: Tree, _context: SchematicContext) { - let content = file.content.toString(); - - if (content.indexOf('--ps-') !== -1) { - content = content.replace(/--ps-/g, '--zv-'); - } - if (content.indexOf('ps-block-ui') !== -1) { - content = content.replace(/ps-block-ui/g, 'zv-block-ui'); - } - if (content.indexOf('ps-card') !== -1) { - content = content.replace(/ps-card/g, 'zv-card'); - } - if (content.indexOf('ps-dialog-wrapper') !== -1) { - content = content.replace(/ps-dialog-wrapper/g, 'zv-dialog-wrapper'); - } - if (content.indexOf('ps-flip-container') !== -1) { - content = content.replace(/ps-flip-container/g, 'zv-flip-container'); - } - if (content.indexOf('ps-form') !== -1) { - content = content.replace(/ps-form/g, 'zv-form'); - } - if (content.indexOf('ps-header') !== -1) { - content = content.replace(/ps-header/g, 'zv-header'); - } - if (content.indexOf('ps-number-input') !== -1) { - content = content.replace(/ps-number-input/g, 'zv-number-input'); - } - if (content.indexOf('ps-savebar') !== -1) { - content = content.replace(/ps-savebar/g, 'zv-savebar'); - } - if (content.indexOf('ps-select') !== -1) { - content = content.replace(/ps-select/g, 'zv-select'); - } - if (content.indexOf('ps-slider') !== -1) { - content = content.replace(/ps-slider/g, 'zv-slider'); - } - if (content.indexOf('ps-table') !== -1) { - content = content.replace(/ps-table/g, 'zv-table'); - } - if (content.indexOf('ps-view') !== -1) { - content = content.replace(/ps-view/g, 'zv-view'); - } - - tree.overwrite(file.path, content); - touchedFiles.push(file.path); -} - -function updateHtmlFile(file: FileEntry, tree: Tree, _context: SchematicContext) { - let content = file.content.toString(); - - if (content.indexOf('ps-block-ui') !== -1) { - content = content.replace(/ps-block-ui/g, 'zv-block-ui'); - } - - if (content.indexOf('ps-card') !== -1) { - content = content.replace(/ps-card/g, 'zv-card'); - } - if (content.indexOf('psCardTopButtonSection') !== -1) { - content = content.replace(/psCardTopButtonSection/g, 'zvCardTopButtonSection'); - } - if (content.indexOf('psCardFooterSection') !== -1) { - content = content.replace(/psCardFooterSection/g, 'zvCardFooterSection'); - } - if (content.indexOf('psCardCaptionSection') !== -1) { - content = content.replace(/psCardCaptionSection/g, 'zvCardCaptionSection'); - } - if (content.indexOf('psCardDescriptionSection') !== -1) { - content = content.replace(/psCardDescriptionSection/g, 'zvCardDescriptionSection'); - } - if (content.indexOf('psCardActionsSection') !== -1) { - content = content.replace(/psCardActionsSection/g, 'zvCardActionsSection'); - } - - if (content.indexOf('ps-dialog-wrapper') !== -1) { - content = content.replace(/ps-dialog-wrapper/g, 'zv-dialog-wrapper'); - } - - if (content.indexOf('ps-flip-container') !== -1) { - content = content.replace(/ps-flip-container/g, 'zv-flip-container'); - } - if (content.indexOf('psFlipContainerFront') !== -1) { - content = content.replace(/psFlipContainerFront/g, 'zvFlipContainerFront'); - } - if (content.indexOf('psFlipContainerBack') !== -1) { - content = content.replace(/psFlipContainerBack/g, 'zvFlipContainerBack'); - } - - if (content.indexOf('ps-form') !== -1) { - content = content.replace(/ps-form/g, 'zv-form'); - } - if (content.indexOf('psFormSavebarButtons') !== -1) { - content = content.replace(/psFormSavebarButtons/g, 'zvFormSavebarButtons'); - } - - if (content.indexOf('ps-header') !== -1) { - content = content.replace(/ps-header/g, 'zv-header'); - } - if (content.indexOf('psHeaderTopButtonSection') !== -1) { - content = content.replace(/psHeaderTopButtonSection/g, 'zvHeaderTopButtonSection'); - } - if (content.indexOf('psHeaderCaptionSection') !== -1) { - content = content.replace(/psHeaderCaptionSection/g, 'zvHeaderCaptionSection'); - } - if (content.indexOf('psHeaderDescriptionSection') !== -1) { - content = content.replace(/psHeaderDescriptionSection/g, 'zvHeaderDescriptionSection'); - } - - if (content.indexOf('ps-number-input') !== -1) { - content = content.replace(/ps-number-input/g, 'zv-number-input'); - } - - if (content.indexOf('ps-savebar') !== -1) { - content = content.replace(/ps-savebar/g, 'zv-savebar'); - } - if (content.indexOf('psSavebarRightContent') !== -1) { - content = content.replace(/psSavebarRightContent/g, 'zvSavebarRightContent'); - } - - if (content.indexOf('ps-select') !== -1) { - content = content.replace(/ps-select/g, 'zv-select'); - } - if (content.indexOf('psSelectOptionTemplate') !== -1) { - content = content.replace(/psSelectOptionTemplate/g, 'zvSelectOptionTemplate'); - } - if (content.indexOf('psSelectTriggerTemplate') !== -1) { - content = content.replace(/psSelectTriggerTemplate/g, 'zvSelectTriggerTemplate'); - } - - if (content.indexOf('ps-slider') !== -1) { - content = content.replace(/ps-slider/g, 'zv-slider'); - } - - if (content.indexOf('ps-table') !== -1) { - content = content.replace(/ps-table/g, 'zv-table'); - } - if (content.indexOf('psTableActionsToRender') !== -1) { - content = content.replace(/psTableActionsToRender/g, 'zvTableActionsToRender'); - } - if (content.indexOf('psTableActionType') !== -1) { - content = content.replace(/psTableActionType/g, 'zvTableActionType'); - } - if (content.indexOf('psTableColumnTemplate') !== -1) { - content = content.replace(/psTableColumnTemplate/g, 'zvTableColumnTemplate'); - } - if (content.indexOf('psTableColumnHeaderTemplate') !== -1) { - content = content.replace(/psTableColumnHeaderTemplate/g, 'zvTableColumnHeaderTemplate'); - } - if (content.indexOf('psTableTopButtonSection') !== -1) { - content = content.replace(/psTableTopButtonSection/g, 'zvTableTopButtonSection'); - } - if (content.indexOf('psTableListActions') !== -1) { - content = content.replace(/psTableListActions/g, 'zvTableListActions'); - } - if (content.indexOf('psTableRowActions') !== -1) { - content = content.replace(/psTableRowActions/g, 'zvTableRowActions'); - } - if (content.indexOf('psTableCustomHeader') !== -1) { - content = content.replace(/psTableCustomHeader/g, 'zvTableCustomHeader'); - } - if (content.indexOf('psTableCustomSettings') !== -1) { - content = content.replace(/psTableCustomSettings/g, 'zvTableCustomSettings'); - } - if (content.indexOf('psTableRowDetailTemplate') !== -1) { - content = content.replace(/psTableRowDetailTemplate/g, 'zvTableRowDetailTemplate'); - } - - if (content.indexOf('ps-view') !== -1) { - content = content.replace(/ps-view/g, 'zv-view'); - } - - if (content.indexOf('psErrorMessage') !== -1) { - content = content.replace(/psErrorMessage/g, 'zvErrorMessage'); - } - if (content.indexOf('psTableActionsToRender') !== -1) { - content = content.replace(/psTableActionsToRender/g, 'zvTableActionsToRender'); - } - if (content.indexOf('psTableActionType') !== -1) { - content = content.replace(/psTableActionType/g, 'zvTableActionType'); - } - - if (content.indexOf('--ps-') !== -1) { - content = content.replace(/--ps-/g, '--zv-'); - } - tree.overwrite(file.path, content); - touchedFiles.push(file.path); -} - -function updateTsFile(file: FileEntry, tree: Tree, _context: SchematicContext) { - let content = file.content.toString(); - const containsComponent = content.match(/@Component\(\{[\r\n\W\w]*/); - if (containsComponent) { - let component = containsComponent[0]; - content = content.replace(/@Component\(\{[\r\n\W\w]*/, ''); - if (component.indexOf('ps-block-ui') !== -1) { - component = component.replace(/ps-block-ui/g, 'zv-block-ui'); - } - if (component.indexOf('ps-card') !== -1) { - component = component.replace(/ps-card/g, 'zv-card'); - } - if (component.indexOf('ps-dialog-wrapper') !== -1) { - component = component.replace(/ps-dialog-wrapper/g, 'zv-dialog-wrapper'); - } - if (component.indexOf('ps-flip-container') !== -1) { - component = component.replace(/ps-flip-container/g, 'zv-flip-container'); - } - if (component.indexOf('ps-form') !== -1) { - component = component.replace(/ps-form/g, 'zv-form'); - } - if (component.indexOf('ps-header') !== -1) { - component = component.replace(/ps-header/g, 'zv-header'); - } - if (component.indexOf('ps-number-input') !== -1) { - component = component.replace(/ps-number-input/g, 'zv-number-input'); - } - if (component.indexOf('ps-savebar') !== -1) { - component = component.replace(/ps-savebar/g, 'zv-savebar'); - } - if (component.indexOf('ps-select') !== -1) { - component = component.replace(/ps-select/g, 'zv-select'); - } - if (component.indexOf('ps-slider') !== -1) { - component = component.replace(/ps-slider/g, 'zv-slider'); - } - if (component.indexOf('ps-table') !== -1) { - component = component.replace(/ps-table/g, 'zv-table'); - } - if (component.indexOf('ps-view') !== -1) { - component = component.replace(/ps-view/g, 'zv-view'); - } - - if (content.indexOf('psErrorMessage') !== -1) { - content = content.replace(/psErrorMessage/g, 'zvErrorMessage'); - } - if (content.indexOf('psTableActionsToRender') !== -1) { - content = content.replace(/psTableActionsToRender/g, 'zvTableActionsToRender'); - } - if (content.indexOf('psTableActionType') !== -1) { - content = content.replace(/psTableActionType/g, 'zvTableActionType'); - } - content += component; - } - if (content.indexOf('--ps-') !== -1) { - content = content.replace(/--ps-/g, '--zv-'); - } - - if (content.indexOf('IPsFormButton') !== -1) { - content = content.replace(/IPsFormButton/g, 'IZvButton'); - } - if (content.indexOf('IPsFormException') !== -1) { - content = content.replace(/IPsFormException/g, 'IZvException'); - } - - if (content.indexOf('@prosoft/components/savebar') !== -1) { - content = content.replace(/@prosoft\/components\/savebar/g, '@zvoove/components/form'); - } - if (content.indexOf('@prosoft/components') !== -1) { - content = content.replace(/@prosoft\/components/g, '@zvoove/components'); - } - - if (content.indexOf('PsBlockUiComponent') !== -1) { - content = content.replace(/PsBlockUiComponent/g, 'ZvBlockUiComponent'); - } - if (content.indexOf('PsBlockUiModule') !== -1) { - content = content.replace(/PsBlockUiModule/g, 'ZvBlockUiModule'); - } - - if (content.indexOf('PsCardComponent') !== -1) { - content = content.replace(/PsCardComponent/g, 'ZvCardComponent'); - } - if (content.indexOf('PsCardModule') !== -1) { - content = content.replace(/PsCardModule/g, 'ZvCardModule'); - } - if (content.indexOf('PsCardTopButtonSectionDirective') !== -1) { - content = content.replace(/PsCardTopButtonSectionDirective/g, 'ZvCardTopButtonSectionDirective'); - } - if (content.indexOf('PsCardCaptionSectionDirective') !== -1) { - content = content.replace(/PsCardCaptionSectionDirective/g, 'ZvCardCaptionSectionDirective'); - } - if (content.indexOf('PsCardDescriptionSectionDirective') !== -1) { - content = content.replace(/PsCardDescriptionSectionDirective/g, 'ZvCardDescriptionSectionDirective'); - } - if (content.indexOf('PsCardFooterSectionDirective') !== -1) { - content = content.replace(/PsCardFooterSectionDirective/g, 'ZvCardFooterSectionDirective'); - } - if (content.indexOf('PsCardActionsSectionDirective') !== -1) { - content = content.replace(/PsCardActionsSectionDirective/g, 'ZvCardActionsSectionDirective'); - } - - if (content.indexOf('IPsButton') !== -1) { - content = content.replace(/IPsButton/g, 'IZvButton'); - } - if (content.indexOf('PsErrorMessagePipe') !== -1) { - content = content.replace(/PsErrorMessagePipe/g, 'ZvErrorMessagePipe'); - } - if (content.indexOf('IPsException') !== -1) { - content = content.replace(/IPsException/g, 'IZvException'); - } - if (content.indexOf('PsExceptionMessageExtractor') !== -1) { - content = content.replace(/PsExceptionMessageExtractor/g, 'ZvExceptionMessageExtractor'); - } - if (content.indexOf('IPsSavebarIntlTexts') !== -1) { - content = content.replace(/IPsSavebarIntlTexts/g, 'IZvSavebarIntlTexts'); - } - if (content.indexOf('IPsTableIntlTexts') !== -1) { - content = content.replace(/IPsTableIntlTexts/g, 'IZvTableIntlTexts'); - } - if (content.indexOf('PsIntlKeys') !== -1) { - content = content.replace(/PsIntlKeys/g, 'ZvIntlKeys'); - } - if (content.indexOf('PsIntlService') !== -1) { - content = content.replace(/PsIntlService/g, 'ZvIntlService'); - } - if (content.indexOf('psErrorMessage') !== -1) { - content = content.replace(/psErrorMessage/g, 'zvErrorMessage'); - } - - if (content.indexOf('PsDialogWrapperComponent') !== -1) { - content = content.replace(/PsDialogWrapperComponent/g, 'ZvDialogWrapperComponent'); - } - if (content.indexOf('IPsDialogWrapperDataSource') !== -1) { - content = content.replace(/IPsDialogWrapperDataSource/g, 'IZvDialogWrapperDataSource'); - } - if (content.indexOf('PsDialogWrapperModule') !== -1) { - content = content.replace(/PsDialogWrapperModule/g, 'ZvDialogWrapperModule'); - } - - if (content.indexOf('PsFlipContainerModule') !== -1) { - content = content.replace(/PsFlipContainerModule/g, 'ZvFlipContainerModule'); - } - if (content.indexOf('PsFlipContainerComponent') !== -1) { - content = content.replace(/PsFlipContainerComponent/g, 'ZvFlipContainerComponent'); - } - - if (content.indexOf('PsFormComponent') !== -1) { - content = content.replace(/PsFormComponent/g, 'ZvFormComponent'); - } - if (content.indexOf('PsFormModule') !== -1) { - content = content.replace(/PsFormModule/g, 'ZvFormModule'); - } - if (content.indexOf('IPsFormDataSource') !== -1) { - content = content.replace(/IPsFormDataSource/g, 'IZvFormDataSource'); - } - if (content.indexOf('IPsFormButton') !== -1) { - content = content.replace(/IPsFormButton/g, 'IZvFormButton'); - } - if (content.indexOf('IPsFormException') !== -1) { - content = content.replace(/IPsFormException/g, 'IZvFormException'); - } - if (content.indexOf('PsFormBaseModule') !== -1) { - content = content.replace(/PsFormBaseModule/g, 'ZvFormBaseModule'); - } - if (content.indexOf('PsFormService') !== -1) { - content = content.replace(/PsFormService/g, 'ZvFormService'); - } - if (content.indexOf('IPsFormError') !== -1) { - content = content.replace(/IPsFormError/g, 'IZvFormError'); - } - if (content.indexOf('PsFormErrorsComponent') !== -1) { - content = content.replace(/PsFormErrorsComponent/g, 'ZvFormErrorsComponent'); - } - if (content.indexOf('PsFormErrorsModule') !== -1) { - content = content.replace(/PsFormErrorsModule/g, 'ZvFormErrorsModule'); - } - - if (content.indexOf('PsFormFieldComponent') !== -1) { - content = content.replace(/PsFormFieldComponent/g, 'ZvFormFieldComponent'); - } - if (content.indexOf('PsFormFieldModule') !== -1) { - content = content.replace(/PsFormFieldModule/g, 'ZvFormFieldModule'); - } - if (content.indexOf('PsFormFieldSubscriptType') !== -1) { - content = content.replace(/PsFormFieldSubscriptType/g, 'ZvFormFieldSubscriptType'); - } - if (content.indexOf('PS_FORM_FIELD_CONFIG') !== -1) { - content = content.replace(/PS_FORM_FIELD_CONFIG/g, 'ZV_FORM_FIELD_CONFIG'); - } - if (content.indexOf('PsFormFieldConfig') !== -1) { - content = content.replace(/PsFormFieldConfig/g, 'ZvFormFieldConfig'); - } - - if (content.indexOf('PsHeaderComponent') !== -1) { - content = content.replace(/PsHeaderComponent/g, 'ZvHeaderComponent'); - } - if (content.indexOf('PsHeaderModule') !== -1) { - content = content.replace(/PsHeaderModule/g, 'ZvHeaderModule'); - } - if (content.indexOf('PsHeaderCaptionSectionDirective') !== -1) { - content = content.replace(/PsHeaderCaptionSectionDirective/g, 'ZvHeaderCaptionSectionDirective'); - } - if (content.indexOf('PsHeaderDescriptionSectionDirective') !== -1) { - content = content.replace(/PsHeaderDescriptionSectionDirective/g, 'ZvHeaderDescriptionSectionDirective'); - } - if (content.indexOf('PsHeaderTopButtonSectionDirective') !== -1) { - content = content.replace(/PsHeaderTopButtonSectionDirective/g, 'ZvHeaderTopButtonSectionDirective'); - } - - if (content.indexOf('PsNumberInputComponent') !== -1) { - content = content.replace(/PsNumberInputComponent/g, 'ZvNumberInputComponent'); - } - if (content.indexOf('PsNumberInputModule') !== -1) { - content = content.replace(/PsNumberInputModule/g, 'ZvNumberInputModule'); - } - - if (content.indexOf('PsSavebarRightContentDirective') !== -1) { - content = content.replace(/PsSavebarRightContentDirective/g, 'ZvSavebarRightContentDirective'); - } - if (content.indexOf('PsSavebarComponent') !== -1) { - content = content.replace(/PsSavebarComponent/g, 'ZvSavebarComponent'); - } - if (content.indexOf('PsSavebarModule') !== -1) { - content = content.replace(/PsSavebarModule/g, 'ZvSavebarModule'); - } - if (content.indexOf('IPsSavebarMode') !== -1) { - content = content.replace(/IPsSavebarMode/g, 'IZvSavebarMode'); - } - - if (content.indexOf('PsSelectComponent') !== -1) { - content = content.replace(/PsSelectComponent/g, 'ZvSelectComponent'); - } - if (content.indexOf('PsSelectItem') !== -1) { - content = content.replace(/PsSelectItem/g, 'ZvSelectItem'); - } - if (content.indexOf('PsSelectModule') !== -1) { - content = content.replace(/PsSelectModule/g, 'ZvSelectModule'); - } - if (content.indexOf('PsSelectService') !== -1) { - content = content.replace(/PsSelectService/g, 'ZvSelectService'); - } - if (content.indexOf('PsSelectLoadTrigger') !== -1) { - content = content.replace(/PsSelectLoadTrigger/g, 'ZvSelectLoadTrigger'); - } - if (content.indexOf('PsSelectSortBy') !== -1) { - content = content.replace(/PsSelectSortBy/g, 'ZvSelectSortBy'); - } - if (content.indexOf('isPsSelectOptionsData') !== -1) { - content = content.replace(/isPsSelectOptionsData/g, 'isZvSelectOptionsData'); - } - if (content.indexOf('PsSelectData') !== -1) { - content = content.replace(/PsSelectData/g, 'ZvSelectData'); - } - if (content.indexOf('PsSelectOptionTemplateDirective') !== -1) { - content = content.replace(/PsSelectOptionTemplateDirective/g, 'ZvSelectOptionTemplateDirective'); - } - if (content.indexOf('PsSelectTriggerTemplateDirective') !== -1) { - content = content.replace(/PsSelectTriggerTemplateDirective/g, 'ZvSelectTriggerTemplateDirective'); - } - - if (content.indexOf('PsSliderComponent') !== -1) { - content = content.replace(/PsSliderComponent/g, 'ZvSliderComponent'); - } - if (content.indexOf('PsSliderModule') !== -1) { - content = content.replace(/PsSliderModule/g, 'ZvSliderModule'); - } - - if (content.indexOf('IPsTableIntlTexts') !== -1) { - content = content.replace(/IPsTableIntlTexts/g, 'IZvTableIntlTexts'); - } - if (content.indexOf('IPsTableFilterResult') !== -1) { - content = content.replace(/IPsTableFilterResult/g, 'IZvTableFilterResult'); - } - if (content.indexOf('PsTableDataSource') !== -1) { - content = content.replace(/PsTableDataSource/g, 'ZvTableDataSource'); - } - if (content.indexOf('PsTableColumnDirective') !== -1) { - content = content.replace(/PsTableColumnDirective/g, 'ZvTableColumnDirective'); - } - if (content.indexOf('PsTableColumnHeaderTemplateDirective') !== -1) { - content = content.replace(/PsTableColumnHeaderTemplateDirective/g, 'ZvTableColumnHeaderTemplateDirective'); - } - if (content.indexOf('PsTableColumnTemplateDirective') !== -1) { - content = content.replace(/PsTableColumnTemplateDirective/g, 'ZvTableColumnTemplateDirective'); - } - if (content.indexOf('PsTableCustomHeaderDirective') !== -1) { - content = content.replace(/PsTableCustomHeaderDirective/g, 'ZvTableCustomHeaderDirective'); - } - if (content.indexOf('PsTableCustomSettingsDirective') !== -1) { - content = content.replace(/PsTableCustomSettingsDirective/g, 'ZvTableCustomSettingsDirective'); - } - if (content.indexOf('PsTableListActionsDirective') !== -1) { - content = content.replace(/PsTableListActionsDirective/g, 'ZvTableListActionsDirective'); - } - if (content.indexOf('PsTableRowActionsDirective') !== -1) { - content = content.replace(/PsTableRowActionsDirective/g, 'ZvTableRowActionsDirective'); - } - if (content.indexOf('PsTableRowDetailDirective') !== -1) { - content = content.replace(/PsTableRowDetailDirective/g, 'ZvTableRowDetailDirective'); - } - if (content.indexOf('PsTableRowDetailTemplateDirective') !== -1) { - content = content.replace(/PsTableRowDetailTemplateDirective/g, 'ZvTableRowDetailTemplateDirective'); - } - if (content.indexOf('PsTableTopButtonSectionDirective') !== -1) { - content = content.replace(/PsTableTopButtonSectionDirective/g, 'ZvTableTopButtonSectionDirective'); - } - if (content.indexOf('PsTableMemoryStateManager') !== -1) { - content = content.replace(/PsTableMemoryStateManager/g, 'ZvTableMemoryStateManager'); - } - if (content.indexOf('PsTableStateManager') !== -1) { - content = content.replace(/PsTableStateManager/g, 'ZvTableStateManager'); - } - if (content.indexOf('PsTableUrlStateManager') !== -1) { - content = content.replace(/PsTableUrlStateManager/g, 'ZvTableUrlStateManager'); - } - if (content.indexOf('IExtendedPsTableUpdateDataInfo') !== -1) { - content = content.replace(/IExtendedPsTableUpdateDataInfo/g, 'IExtendedZvTableUpdateDataInfo'); - } - if (content.indexOf('IPsTableAction') !== -1) { - content = content.replace(/IPsTableAction/g, 'IZvTableAction'); - } - if (content.indexOf('PsTableMode') !== -1) { - content = content.replace(/PsTableMode/g, 'ZvTableMode'); - } - if (content.indexOf('IPsTableSortDefinition') !== -1) { - content = content.replace(/IPsTableSortDefinition/g, 'IZvTableSortDefinition'); - } - if (content.indexOf('IPsTableUpdateDataInfo') !== -1) { - content = content.replace(/IPsTableUpdateDataInfo/g, 'IZvTableUpdateDataInfo'); - } - if (content.indexOf('PsTableActionScope') !== -1) { - content = content.replace(/PsTableActionScope/g, 'ZvTableActionScope'); - } - if (content.indexOf('IPsTableSetting') !== -1) { - content = content.replace(/IPsTableSetting/g, 'IZvTableSetting'); - } - if (content.indexOf('PsTableSettingsService') !== -1) { - content = content.replace(/PsTableSettingsService/g, 'ZvTableSettingsService'); - } - if (content.indexOf('PsTableComponent') !== -1) { - content = content.replace(/PsTableComponent/g, 'ZvTableComponent'); - } - if (content.indexOf('PsTableModule') !== -1) { - content = content.replace(/PsTableModule/g, 'ZvTableModule'); - } - if (content.indexOf('PsTableActionsComponent') !== -1) { - content = content.replace(/PsTableActionsComponent/g, 'ZvTableActionsComponent'); - } - if (content.indexOf('PsTableActionsToRenderPipe') !== -1) { - content = content.replace(/PsTableActionsToRenderPipe/g, 'ZvTableActionsToRenderPipe'); - } - if (content.indexOf('PsTableActionTypePipe') !== -1) { - content = content.replace(/PsTableActionTypePipe/g, 'ZvTableActionTypePipe'); - } - - if (content.indexOf('IPsViewDataSource') !== -1) { - content = content.replace(/IPsViewDataSource/g, 'IZvViewDataSource'); - } - if (content.indexOf('PsViewComponent') !== -1) { - content = content.replace(/PsViewComponent/g, 'ZvViewComponent'); - } - if (content.indexOf('PsViewModule') !== -1) { - content = content.replace(/PsViewModule/g, 'ZvViewModule'); - } - - tree.overwrite(file.path, content); - touchedFiles.push(file.path); -} diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/index_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/index_spec.ts deleted file mode 100644 index b059f5b3..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/index_spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -require('./tests/base_spec'); -require('./tests/block-ui_spec'); -require('./tests/card_spec'); -require('./tests/dialog-wrapper_spec'); -require('./tests/flip-container_spec'); -require('./tests/form_spec'); -require('./tests/form-errors_spec'); -require('./tests/form-field_spec'); -require('./tests/header_spec'); -require('./tests/number-input_spec'); -require('./tests/savebar_spec'); -require('./tests/select_spec'); -require('./tests/slider_spec'); -require('./tests/table_spec'); -require('./tests/view_spec'); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/schema.json b/projects/components/schematics/rename-prosoft-to-zvoove/schema.json deleted file mode 100644 index b4fb00a4..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "id": "RenameProsoftToZvoove", - "title": "Components - Rename prosoft to zvoove and ps to zv" -} diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/base_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/base_spec.ts deleted file mode 100644 index a52782ae..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/base_spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const testHtmlContent = ``; -const testTsContent = ` -import { RouterModule } from '@angular/router'; - -@NgModule({ - imports: [ - RouterModule.forChild([ - { - path: '', - component: DemoComponent, - }, - ]), - ], - declarations: [DemoComponent], - providers: [], -}) -export class DemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should work with empty tree', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = await runner.runSchematic('ng-add', {}, Tree.empty()); - expect(tree.files).toEqual([]); - }); - - it('should skip dist and node_modules folders', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/dist/dist.component.html', testHtmlContent); - tree.create('/some-folder/node_modules/node.component.ts', testTsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - validateHtmlFile(resultTree.get('/dist/dist.component.html')); - validateTsFile(resultTree.get('/some-folder/node_modules/node.component.ts')); - }); - - function validateHtmlFile(file: FileEntry | null) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(testHtmlContent); - } - } - function validateTsFile(file: FileEntry | null) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(testTsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/block-ui_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/block-ui_spec.ts deleted file mode 100644 index ae30a5d6..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/block-ui_spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - -`; - -const htmlModifiedContent = ` - -`; - -const tsContent = ` -import { PsBlockUiModule } from '@prosoft/components/block-ui'; -import { RouterModule } from '@angular/router'; -import { BlockUiDemoComponent } from './block-ui-demo.component'; - -@NgModule({ - imports: [ - PsBlockUiModule, - RouterModule.forChild([ - { - path: '', - component: BlockUiDemoComponent, - }, - ]), - ], - declarations: [BlockUiDemoComponent], - providers: [], -}) -export class BlockUiDemoModule {} -`; - -const tsModifiedContent = ` -import { ZvBlockUiModule } from '@zvoove/components/block-ui'; -import { RouterModule } from '@angular/router'; -import { BlockUiDemoComponent } from './block-ui-demo.component'; - -@NgModule({ - imports: [ - ZvBlockUiModule, - RouterModule.forChild([ - { - path: '', - component: BlockUiDemoComponent, - }, - ]), - ], - declarations: [BlockUiDemoComponent], - providers: [], -}) -export class BlockUiDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/card_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/card_spec.ts deleted file mode 100644 index d81ce276..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/card_spec.ts +++ /dev/null @@ -1,194 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - -

Card with actions

-
- - You can also set a custom description - - - - - - -
-

Content goes here

-
- -
- - -
-
- This is some footer: someValue -
-`; - -const htmlModifiedContent = ` - - -

Card with actions

-
- - You can also set a custom description - - - - - - -
-

Content goes here

-
- -
- - -
-
- This is some footer: someValue -
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; -import { PsCardComponent } from './card.component'; -import { - PsCardActionsSectionDirective, - PsCardCaptionSectionDirective, - PsCardDescriptionSectionDirective, - PsCardFooterSectionDirective, - PsCardTopButtonSectionDirective, -} from './card.directives'; - -@NgModule({ - imports: [CommonModule, MatCardModule], - exports: [ - PsCardComponent, - PsCardTopButtonSectionDirective, - PsCardFooterSectionDirective, - PsCardCaptionSectionDirective, - PsCardDescriptionSectionDirective, - PsCardActionsSectionDirective, - ], - declarations: [ - PsCardComponent, - PsCardTopButtonSectionDirective, - PsCardFooterSectionDirective, - PsCardCaptionSectionDirective, - PsCardDescriptionSectionDirective, - PsCardActionsSectionDirective, - ], -}) -export class PsCardModule {} -@Component({ - selector: 'app-firma-create', - template: \` - - - - - \`, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; -import { ZvCardComponent } from './card.component'; -import { - ZvCardActionsSectionDirective, - ZvCardCaptionSectionDirective, - ZvCardDescriptionSectionDirective, - ZvCardFooterSectionDirective, - ZvCardTopButtonSectionDirective, -} from './card.directives'; - -@NgModule({ - imports: [CommonModule, MatCardModule], - exports: [ - ZvCardComponent, - ZvCardTopButtonSectionDirective, - ZvCardFooterSectionDirective, - ZvCardCaptionSectionDirective, - ZvCardDescriptionSectionDirective, - ZvCardActionsSectionDirective, - ], - declarations: [ - ZvCardComponent, - ZvCardTopButtonSectionDirective, - ZvCardFooterSectionDirective, - ZvCardCaptionSectionDirective, - ZvCardDescriptionSectionDirective, - ZvCardActionsSectionDirective, - ], -}) -export class ZvCardModule {} -@Component({ - selector: 'app-firma-create', - template: \` - - - - - \`, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/dialog-wrapper_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/dialog-wrapper_spec.ts deleted file mode 100644 index 629130be..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/dialog-wrapper_spec.ts +++ /dev/null @@ -1,222 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - -
-
Action function called: {{ actionFunctionCalled }}
- - -
-
-`; - -const htmlModifiedContent = ` - -
-
Action function called: {{ actionFunctionCalled }}
- - -
-
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { RouterModule } from '@angular/router'; -import { PsDialogWrapperModule } from '@prosoft/components/dialog-wrapper'; -import { DialogWrapperDemoComponent, DialogWrapperDemoDialog } from './dialog-wrapper-demo.component'; - -@NgModule({ - imports: [ - CommonModule, - RouterModule.forChild([ - { - path: '', - component: DialogWrapperDemoComponent, - }, - ]), - MatButtonModule, - PsDialogWrapperModule, - ], - declarations: [DialogWrapperDemoComponent, DialogWrapperDemoDialog], -}) -export class DialogWrapperDemoModule {} - -import { IPsButton, IPsException } from '@prosoft/components/core'; -import { IPsDialogWrapperDataSource } from '@prosoft/components/dialog-wrapper'; - -export class DemoDialogWrapperDataSource implements IPsDialogWrapperDataSource { - dialogTitle = this.options.dialogTitle; - buttons: IPsButton[] = [ - { - label: 'Ok', - type: 'raised', - color: 'primary', - disabled: () => false, - click: () => this.confirm(), - }, - { - label: 'Cancel', - type: 'stroked', - color: null, - disabled: () => false, - click: () => this.close(), - }, - ]; - contentVisible = true; - contentBlocked = false; - exception: IPsException; - - public somethingChanged$ = new Subject(); - - constructor(private options: IDemoDialogWrapperDataSourceOptions) {} - - connect(): Observable { - return this.somethingChanged$; - } - - disconnect(): void {} - - confirm() { - return this.options.actionFn(); - } - - close() { - this.options.cancelFn(); - } -} - -public toggleError() { - if (!this.dataSource.exception) { - this.dataSource.exception = { - errorObject: { message: 'I am an evil error' }, - } as IPsException; - } else { - this.dataSource.exception = null; - } - - this.dataSource.somethingChanged$.next(); -} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { RouterModule } from '@angular/router'; -import { ZvDialogWrapperModule } from '@zvoove/components/dialog-wrapper'; -import { DialogWrapperDemoComponent, DialogWrapperDemoDialog } from './dialog-wrapper-demo.component'; - -@NgModule({ - imports: [ - CommonModule, - RouterModule.forChild([ - { - path: '', - component: DialogWrapperDemoComponent, - }, - ]), - MatButtonModule, - ZvDialogWrapperModule, - ], - declarations: [DialogWrapperDemoComponent, DialogWrapperDemoDialog], -}) -export class DialogWrapperDemoModule {} - -import { IZvButton, IZvException } from '@zvoove/components/core'; -import { IZvDialogWrapperDataSource } from '@zvoove/components/dialog-wrapper'; - -export class DemoDialogWrapperDataSource implements IZvDialogWrapperDataSource { - dialogTitle = this.options.dialogTitle; - buttons: IZvButton[] = [ - { - label: 'Ok', - type: 'raised', - color: 'primary', - disabled: () => false, - click: () => this.confirm(), - }, - { - label: 'Cancel', - type: 'stroked', - color: null, - disabled: () => false, - click: () => this.close(), - }, - ]; - contentVisible = true; - contentBlocked = false; - exception: IZvException; - - public somethingChanged$ = new Subject(); - - constructor(private options: IDemoDialogWrapperDataSourceOptions) {} - - connect(): Observable { - return this.somethingChanged$; - } - - disconnect(): void {} - - confirm() { - return this.options.actionFn(); - } - - close() { - this.options.cancelFn(); - } -} - -public toggleError() { - if (!this.dataSource.exception) { - this.dataSource.exception = { - errorObject: { message: 'I am an evil error' }, - } as IZvException; - } else { - this.dataSource.exception = null; - } - - this.dataSource.somethingChanged$.next(); -} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/flip-container_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/flip-container_spec.ts deleted file mode 100644 index af660546..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/flip-container_spec.ts +++ /dev/null @@ -1,122 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - -
- Front - -
-
- Back -
-
-`; - -const htmlModifiedContent = ` - -
- Front - -
-
- Back -
-
-`; - -const tsContent = ` -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { PsFlipContainerModule } from '@prosoft/components/flip-container'; -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FlipContainerDemoComponent } from './flip-container-demo.component'; - -@NgModule({ - declarations: [FlipContainerDemoComponent], - imports: [ - FormsModule, - MatCheckboxModule, - MatInputModule, - PsFlipContainerModule, - RouterModule.forChild([ - { - path: '', - component: FlipContainerDemoComponent, - }, - ]), - ], - providers: [], -}) -export class FlipContainerDemoModule {} -`; - -const tsModifiedContent = ` -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { ZvFlipContainerModule } from '@zvoove/components/flip-container'; -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FlipContainerDemoComponent } from './flip-container-demo.component'; - -@NgModule({ - declarations: [FlipContainerDemoComponent], - imports: [ - FormsModule, - MatCheckboxModule, - MatInputModule, - ZvFlipContainerModule, - RouterModule.forChild([ - { - path: '', - component: FlipContainerDemoComponent, - }, - ]), - ], - providers: [], -}) -export class FlipContainerDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-errors_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-errors_spec.ts deleted file mode 100644 index 12ff73d3..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-errors_spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` -

Form Errors Demo

- -
- - -
- -Errors: - -`; - -const htmlModifiedContent = ` -

Form Errors Demo

- -
- - -
- -Errors: - -`; - -const tsContent = ` -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { PsFormBaseModule } from '@prosoft/components/form-base'; -import { PsFormErrorsModule } from '@prosoft/components/form-errors'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FormErrorsDemoComponent } from './form-errors-demo.component'; - -@NgModule({ - declarations: [FormErrorsDemoComponent], - imports: [ - ReactiveFormsModule, - PsFormBaseModule.forRoot(DemoPsFormsService), - PsFormErrorsModule, - RouterModule.forChild([ - { - path: '', - component: FormErrorsDemoComponent, - }, - ]), - ], - providers: [], -}) -export class FormErrorsDemoModule {} -`; - -const tsModifiedContent = ` -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { ZvFormBaseModule } from '@zvoove/components/form-base'; -import { ZvFormErrorsModule } from '@zvoove/components/form-errors'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FormErrorsDemoComponent } from './form-errors-demo.component'; - -@NgModule({ - declarations: [FormErrorsDemoComponent], - imports: [ - ReactiveFormsModule, - ZvFormBaseModule.forRoot(DemoPsFormsService), - ZvFormErrorsModule, - RouterModule.forChild([ - { - path: '', - component: FormErrorsDemoComponent, - }, - ]), - ], - providers: [], -}) -export class FormErrorsDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-field_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-field_spec.ts deleted file mode 100644 index 5b9ee68f..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form-field_spec.ts +++ /dev/null @@ -1,164 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - Standard - - -`; - -const htmlModifiedContent = ` - - Standard - - -`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { Injectable, NgModule } from '@angular/core'; -import { FormControl, FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSliderModule } from '@angular/material/slider'; -import { RouterModule } from '@angular/router'; -import { PsFormBaseModule } from '@prosoft/components/form-base'; -import { PsFormFieldModule } from '@prosoft/components/form-field'; -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { FormFieldDemoComponent, ReferenceColumnComponent } from './form-field-demo.component'; - -@Injectable() -export class CustomErrorStateMatcher implements ErrorStateMatcher { - public isErrorState(control: FormControl | null, _: FormGroupDirective | NgForm | null): boolean { - return !!(control && control.invalid); - } -} - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - PsFormBaseModule.forRoot(DemoPsFormsService), - PsFormFieldModule, - RouterModule.forChild([ - { - path: '', - component: FormFieldDemoComponent, - }, - ]), - MatButtonModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatCheckboxModule, - MatRadioModule, - MatSliderModule, - ], - declarations: [FormFieldDemoComponent, ReferenceColumnComponent], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class FormFieldDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { Injectable, NgModule } from '@angular/core'; -import { FormControl, FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSliderModule } from '@angular/material/slider'; -import { RouterModule } from '@angular/router'; -import { ZvFormBaseModule } from '@zvoove/components/form-base'; -import { ZvFormFieldModule } from '@zvoove/components/form-field'; -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { FormFieldDemoComponent, ReferenceColumnComponent } from './form-field-demo.component'; - -@Injectable() -export class CustomErrorStateMatcher implements ErrorStateMatcher { - public isErrorState(control: FormControl | null, _: FormGroupDirective | NgForm | null): boolean { - return !!(control && control.invalid); - } -} - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - ZvFormBaseModule.forRoot(DemoPsFormsService), - ZvFormFieldModule, - RouterModule.forChild([ - { - path: '', - component: FormFieldDemoComponent, - }, - ]), - MatButtonModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatCheckboxModule, - MatRadioModule, - MatSliderModule, - ], - declarations: [FormFieldDemoComponent, ReferenceColumnComponent], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class FormFieldDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/form_spec.ts deleted file mode 100644 index 4ac2e42c..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/form_spec.ts +++ /dev/null @@ -1,186 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - - - - Input 1 - - - - Input 2 - - - - - dummy card - - - - - -`; - -const htmlModifiedContent = ` - - -
- - Input 1 - - - - Input 2 - - -
-
- dummy card - - - - -
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { PsFormModule } from '@prosoft/components/form'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FormDataSourceDemoComponent } from './form-data-source-demo.component'; -import { FormDemoComponent } from './form-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - PsFormModule, - RouterModule.forChild([ - { - path: '', - component: FormDemoComponent, - }, - ]), - MatInputModule, - MatFormFieldModule, - MatCardModule, - MatCheckboxModule, - MatSelectModule, - MatButtonModule, - ], - declarations: [FormDemoComponent, FormDataSourceDemoComponent], -}) -export class PsCardModule {} -@Component({ - selector: 'app-firma-create', - template: \` - - - - - \`, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { ZvFormModule } from '@zvoove/components/form'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { FormDataSourceDemoComponent } from './form-data-source-demo.component'; -import { FormDemoComponent } from './form-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - ZvFormModule, - RouterModule.forChild([ - { - path: '', - component: FormDemoComponent, - }, - ]), - MatInputModule, - MatFormFieldModule, - MatCardModule, - MatCheckboxModule, - MatSelectModule, - MatButtonModule, - ], - declarations: [FormDemoComponent, FormDataSourceDemoComponent], -}) -export class ZvCardModule {} -@Component({ - selector: 'app-firma-create', - template: \` - - - - - \`, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/header_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/header_spec.ts deleted file mode 100644 index 15704f53..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/header_spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - - - - - Caption - - - Description - - -`; - -const htmlModifiedContent = ` - - - - - - Caption - - - Description - - -`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTabsModule } from '@angular/material/tabs'; -import { RouterModule } from '@angular/router'; -import { PsHeaderModule } from '@prosoft/components/header'; -import { HeaderDemoComponent } from './header-demo.component'; - -@NgModule({ - imports: [ - CommonModule, - RouterModule.forChild([ - { - path: '', - component: HeaderDemoComponent, - }, - ]), - PsHeaderModule, - MatCardModule, - MatTabsModule, - MatButtonModule, - MatIconModule, - ], - declarations: [HeaderDemoComponent], -}) -export class HeaderDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTabsModule } from '@angular/material/tabs'; -import { RouterModule } from '@angular/router'; -import { ZvHeaderModule } from '@zvoove/components/header'; -import { HeaderDemoComponent } from './header-demo.component'; - -@NgModule({ - imports: [ - CommonModule, - RouterModule.forChild([ - { - path: '', - component: HeaderDemoComponent, - }, - ]), - ZvHeaderModule, - MatCardModule, - MatTabsModule, - MatButtonModule, - MatIconModule, - ], - declarations: [HeaderDemoComponent], -}) -export class HeaderDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/number-input_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/number-input_spec.ts deleted file mode 100644 index 4f1bc5e6..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/number-input_spec.ts +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - value - - -`; - -const htmlModifiedContent = ` - - value - - -`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { PsFormBaseModule } from '@prosoft/components/form-base'; -import { PsFormFieldModule } from '@prosoft/components/form-field'; -import { PsNumberInputModule } from '@prosoft/components/number-input'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { NumberInputDemoComponent } from './number-input-demo.component'; - -@NgModule({ - imports: [ - RouterModule.forChild([ - { - path: '', - component: NumberInputDemoComponent, - }, - ]), - CommonModule, - FormsModule, - ReactiveFormsModule, - - PsNumberInputModule, - - PsFormBaseModule.forRoot(DemoPsFormsService), - PsFormFieldModule, - MatCardModule, - MatButtonModule, - MatCheckboxModule, - MatInputModule, - ], - declarations: [NumberInputDemoComponent], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class NumberInputDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { ZvFormBaseModule } from '@zvoove/components/form-base'; -import { ZvFormFieldModule } from '@zvoove/components/form-field'; -import { ZvNumberInputModule } from '@zvoove/components/number-input'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { NumberInputDemoComponent } from './number-input-demo.component'; - -@NgModule({ - imports: [ - RouterModule.forChild([ - { - path: '', - component: NumberInputDemoComponent, - }, - ]), - CommonModule, - FormsModule, - ReactiveFormsModule, - - ZvNumberInputModule, - - ZvFormBaseModule.forRoot(DemoPsFormsService), - ZvFormFieldModule, - MatCardModule, - MatButtonModule, - MatCheckboxModule, - MatInputModule, - ], - declarations: [NumberInputDemoComponent], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class NumberInputDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/savebar_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/savebar_spec.ts deleted file mode 100644 index 41294921..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/savebar_spec.ts +++ /dev/null @@ -1,164 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - -
- - Input 1 - - -
- - Input 2 - - -
-
- - - -
-`; - -const htmlModifiedContent = ` - - -
- - Input 1 - - -
- - Input 2 - - -
-
- - - -
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { PsFormBaseModule } from '@prosoft/components/form-base'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { SavebarDemoComponent } from './savebar-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - PsFormBaseModule.forRoot(DemoPsFormsService), - PsSavebarModule, - RouterModule.forChild([ - { - path: '', - component: SavebarDemoComponent, - }, - ]), - MatInputModule, - MatFormFieldModule, - MatCardModule, - ], - declarations: [SavebarDemoComponent], - providers: [], -}) -export class SavebarDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { ZvFormBaseModule } from '@zvoove/components/form-base'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { SavebarDemoComponent } from './savebar-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - ReactiveFormsModule, - CommonModule, - ZvFormBaseModule.forRoot(DemoPsFormsService), - ZvSavebarModule, - RouterModule.forChild([ - { - path: '', - component: SavebarDemoComponent, - }, - ]), - MatInputModule, - MatFormFieldModule, - MatCardModule, - ], - declarations: [SavebarDemoComponent], - providers: [], -}) -export class SavebarDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/select_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/select_spec.ts deleted file mode 100644 index c445cc36..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/select_spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - - color: {{ item.viewValue }} - - -
color:
- {{ item.label }} -
-
-`; - -const htmlModifiedContent = ` - - - color: {{ item.viewValue }} - - -
color:
- {{ item.label }} -
-
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { RouterModule } from '@angular/router'; -import { DefaultPsSelectService, PsSelectModule } from '@prosoft/components/select'; - -import { SelectWithCustomSelectServiceComponent } from './demos/select-with-custom-select-service.component'; -import { SelectWithCustomTemplateComponent } from './demos/select-with-custom-template.component'; -import { SelectWithEndlessLoadingDataSourceComponent } from './demos/select-with-endless-loading-datasource.component'; -import { SelectWithErrorInDataSourceComponent } from './demos/select-with-error-in-datasource.component'; -import { SelectWithErrorStateMatcherComponent } from './demos/select-with-error-state-matcher.component'; -import { SelectWithEventsOnlyComponent } from './demos/select-with-events-only.component'; -import { SelectWithMultiselectComponent } from './demos/select-with-multiselect.component'; -import { SelectWithNgModelComponent } from './demos/select-with-ng-model.component'; -import { SelectWithOtherLoadTriggerComponent } from './demos/select-with-other-load-trigger.component'; -import { SelectWithSelectedItemNotInDataSourceComponent } from './demos/select-with-selected-item-not-in-datasource.component'; -import { SelectDemoComponent } from './select-demo.component'; - -@NgModule({ - declarations: [ - SelectDemoComponent, - SelectWithNgModelComponent, - SelectWithEventsOnlyComponent, - SelectWithSelectedItemNotInDataSourceComponent, - SelectWithEndlessLoadingDataSourceComponent, - SelectWithErrorInDataSourceComponent, - SelectWithOtherLoadTriggerComponent, - SelectWithMultiselectComponent, - SelectWithCustomSelectServiceComponent, - SelectWithCustomTemplateComponent, - SelectWithErrorStateMatcherComponent, - ], - imports: [ - FormsModule, - ReactiveFormsModule, - PsSelectModule.forRoot(DefaultPsSelectService), - CommonModule, - MatFormFieldModule, - MatRadioModule, - MatCheckboxModule, - MatCardModule, - MatInputModule, - RouterModule.forChild([ - { - path: '', - component: SelectDemoComponent, - }, - ]), - ], - providers: [], -}) -export class SelectDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { RouterModule } from '@angular/router'; -import { DefaultZvSelectService, ZvSelectModule } from '@zvoove/components/select'; - -import { SelectWithCustomSelectServiceComponent } from './demos/select-with-custom-select-service.component'; -import { SelectWithCustomTemplateComponent } from './demos/select-with-custom-template.component'; -import { SelectWithEndlessLoadingDataSourceComponent } from './demos/select-with-endless-loading-datasource.component'; -import { SelectWithErrorInDataSourceComponent } from './demos/select-with-error-in-datasource.component'; -import { SelectWithErrorStateMatcherComponent } from './demos/select-with-error-state-matcher.component'; -import { SelectWithEventsOnlyComponent } from './demos/select-with-events-only.component'; -import { SelectWithMultiselectComponent } from './demos/select-with-multiselect.component'; -import { SelectWithNgModelComponent } from './demos/select-with-ng-model.component'; -import { SelectWithOtherLoadTriggerComponent } from './demos/select-with-other-load-trigger.component'; -import { SelectWithSelectedItemNotInDataSourceComponent } from './demos/select-with-selected-item-not-in-datasource.component'; -import { SelectDemoComponent } from './select-demo.component'; - -@NgModule({ - declarations: [ - SelectDemoComponent, - SelectWithNgModelComponent, - SelectWithEventsOnlyComponent, - SelectWithSelectedItemNotInDataSourceComponent, - SelectWithEndlessLoadingDataSourceComponent, - SelectWithErrorInDataSourceComponent, - SelectWithOtherLoadTriggerComponent, - SelectWithMultiselectComponent, - SelectWithCustomSelectServiceComponent, - SelectWithCustomTemplateComponent, - SelectWithErrorStateMatcherComponent, - ], - imports: [ - FormsModule, - ReactiveFormsModule, - ZvSelectModule.forRoot(DefaultZvSelectService), - CommonModule, - MatFormFieldModule, - MatRadioModule, - MatCheckboxModule, - MatCardModule, - MatInputModule, - RouterModule.forChild([ - { - path: '', - component: SelectDemoComponent, - }, - ]), - ], - providers: [], -}) -export class SelectDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/slider_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/slider_spec.ts deleted file mode 100644 index ea9a9895..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/slider_spec.ts +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - -`; - -const htmlModifiedContent = ` - -`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { Injectable, NgModule } from '@angular/core'; -import { FormControl, FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { PsFormBaseModule } from '@prosoft/components/form-base'; -import { PsFormFieldModule } from '@prosoft/components/form-field'; -import { PsSliderModule } from '@prosoft/components/slider'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { SliderDemoComponent } from './slider-demo.component'; - -@Injectable() -export class CustomErrorStateMatcher implements ErrorStateMatcher { - public isErrorState(control: FormControl | null, _: FormGroupDirective | NgForm | null): boolean { - return !!(control && control.invalid); - } -} - -@NgModule({ - declarations: [SliderDemoComponent], - imports: [ - PsFormBaseModule.forRoot(DemoPsFormsService), - CommonModule, - PsFormFieldModule, - PsSliderModule, - FormsModule, - ReactiveFormsModule, - MatCheckboxModule, - MatSelectModule, - MatInputModule, - MatButtonModule, - RouterModule.forChild([ - { - path: '', - component: SliderDemoComponent, - }, - ]), - ], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class SliderDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { Injectable, NgModule } from '@angular/core'; -import { FormControl, FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { ZvFormBaseModule } from '@zvoove/components/form-base'; -import { ZvFormFieldModule } from '@zvoove/components/form-field'; -import { ZvSliderModule } from '@zvoove/components/slider'; - -import { DemoPsFormsService } from '../common/demo-ps-form-service'; -import { InvalidErrorStateMatcher } from '../common/invalid-error-state-matcher'; -import { SliderDemoComponent } from './slider-demo.component'; - -@Injectable() -export class CustomErrorStateMatcher implements ErrorStateMatcher { - public isErrorState(control: FormControl | null, _: FormGroupDirective | NgForm | null): boolean { - return !!(control && control.invalid); - } -} - -@NgModule({ - declarations: [SliderDemoComponent], - imports: [ - ZvFormBaseModule.forRoot(DemoPsFormsService), - CommonModule, - ZvFormFieldModule, - ZvSliderModule, - FormsModule, - ReactiveFormsModule, - MatCheckboxModule, - MatSelectModule, - MatInputModule, - MatButtonModule, - RouterModule.forChild([ - { - path: '', - component: SliderDemoComponent, - }, - ]), - ], - providers: [{ provide: ErrorStateMatcher, useClass: InvalidErrorStateMatcher }], -}) -export class SliderDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/table_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/table_spec.ts deleted file mode 100644 index 6113e55a..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/table_spec.ts +++ /dev/null @@ -1,338 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - - - - - - - date - - - - - {{ item.date | date: 'yyyy-MM-dd HH:mm:ss' }} - - - - - - - - - - - expanded: {{ expanded }} - - - -
custom header
-
- - -
custom settings
-
- - -
custom button section
-
- - - - - - - - - - - - - - - - item: {{ item.id }} expanded: {{ expanded }} - - -
-`; - -const htmlModifiedContent = ` - - - - - - - - date - - - - - {{ item.date | date: 'yyyy-MM-dd HH:mm:ss' }} - - - - - - - - - - - expanded: {{ expanded }} - - - -
custom header
-
- - -
custom settings
-
- - -
custom button section
-
- - - - - - - - - - - - - - - - item: {{ item.id }} expanded: {{ expanded }} - - -
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule, Injectable } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { PsIntlService, PsIntlServiceEn } from '@prosoft/components/core'; -import { IPsTableSetting, PsTableModule, PsTableSettingsService } from '@prosoft/components/table'; -import { BehaviorSubject, Observable, of } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { TableDemoComponent } from './table-demo.component'; - -@Injectable() -export class DemoPsTableSettingsService extends PsTableSettingsService { - private settings$ = new BehaviorSubject<{ [id: string]: IPsTableSetting }>({}); - constructor() { - super(); - this.settingsEnabled = true; - } - - public override getStream(tableId: string): Observable { - return this.settings$.pipe(map((settings) => settings[tableId])); - } - public override save(tableId: string, settings: IPsTableSetting): Observable { - this.settings$.next({ [tableId]: settings }); - return of(null); - } -} - -@NgModule({ - declarations: [TableDemoComponent], - imports: [ - CommonModule, - FormsModule, - MatCardModule, - MatCheckboxModule, - MatInputModule, - MatSelectModule, - PsTableModule, - MatFormFieldModule, - RouterModule.forChild([ - { - path: '', - component: TableDemoComponent, - }, - ]), - ], - providers: [ - { provide: PsIntlService, useClass: PsIntlServiceEn }, - { provide: PsTableSettingsService, useClass: DemoPsTableSettingsService }, - ], -}) -export class TableDemoModule {} - -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule, Injectable } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { ZvIntlService, ZvIntlServiceEn } from '@zvoove/components/core'; -import { IZvTableSetting, ZvTableModule, ZvTableSettingsService } from '@zvoove/components/table'; -import { BehaviorSubject, Observable, of } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { TableDemoComponent } from './table-demo.component'; - -@Injectable() -export class DemoZvTableSettingsService extends ZvTableSettingsService { - private settings$ = new BehaviorSubject<{ [id: string]: IZvTableSetting }>({}); - constructor() { - super(); - this.settingsEnabled = true; - } - - public override getStream(tableId: string): Observable { - return this.settings$.pipe(map((settings) => settings[tableId])); - } - public override save(tableId: string, settings: IZvTableSetting): Observable { - this.settings$.next({ [tableId]: settings }); - return of(null); - } -} - -@NgModule({ - declarations: [TableDemoComponent], - imports: [ - CommonModule, - FormsModule, - MatCardModule, - MatCheckboxModule, - MatInputModule, - MatSelectModule, - ZvTableModule, - MatFormFieldModule, - RouterModule.forChild([ - { - path: '', - component: TableDemoComponent, - }, - ]), - ], - providers: [ - { provide: ZvIntlService, useClass: ZvIntlServiceEn }, - { provide: ZvTableSettingsService, useClass: DemoZvTableSettingsService }, - ], -}) -export class TableDemoModule {} - -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); diff --git a/projects/components/schematics/rename-prosoft-to-zvoove/tests/view_spec.ts b/projects/components/schematics/rename-prosoft-to-zvoove/tests/view_spec.ts deleted file mode 100644 index ceb7acee..00000000 --- a/projects/components/schematics/rename-prosoft-to-zvoove/tests/view_spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import { Tree, FileEntry } from '@angular-devkit/schematics'; -import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; - -const htmlContent = ` - - -
{{ item | json }}
-
- dummy card -
-`; - -const htmlModifiedContent = ` - - -
{{ item | json }}
-
- dummy card -
-`; - -const tsContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { RouterModule } from '@angular/router'; -import { PsViewModule } from '@prosoft/components/view'; -import { ViewDemoComponent } from './view-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - CommonModule, - RouterModule.forChild([ - { - path: '', - component: ViewDemoComponent, - }, - ]), - MatCardModule, - MatCheckboxModule, - MatButtonModule, - PsViewModule, - ], - declarations: [ViewDemoComponent], -}) -export class ViewDemoModule {} -`; - -const tsModifiedContent = ` -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { RouterModule } from '@angular/router'; -import { ZvViewModule } from '@zvoove/components/view'; -import { ViewDemoComponent } from './view-demo.component'; - -@NgModule({ - imports: [ - FormsModule, - CommonModule, - RouterModule.forChild([ - { - path: '', - component: ViewDemoComponent, - }, - ]), - MatCardModule, - MatCheckboxModule, - MatButtonModule, - ZvViewModule, - ], - declarations: [ViewDemoComponent], -}) -export class ViewDemoModule {} -`; - -describe('rename-prosoft-to-zvoove', () => { - it('should rename the dom element and directives in html files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.component.html', htmlContent); - tree.create('/multiple/sub/folders/test.component.html', htmlContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.component.html', '/multiple/sub/folders/test.component.html']); - validateHtmlFile(resultTree.get('/app.component.html'), true); - validateHtmlFile(resultTree.get('/multiple/sub/folders/test.component.html'), true); - }); - - it('should rename the imports in .ts files', async () => { - const runner = new SchematicTestRunner('test', require.resolve('../../migrations.json')); - const tree = Tree.empty(); - tree.create('/app.module.ts', tsContent); - tree.create('/multiple/sub/folders/test.module.ts', tsContent); - const resultTree = await runner.runSchematic('ng-add', {}, tree); - expect(resultTree.files).toEqual(['/app.module.ts', '/multiple/sub/folders/test.module.ts']); - validateTsFile(resultTree.get('/app.module.ts'), true); - validateTsFile(resultTree.get('/multiple/sub/folders/test.module.ts'), true); - }); - - function validateHtmlFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? htmlModifiedContent : htmlContent); - } - } - function validateTsFile(file: FileEntry | null, changed: boolean) { - expect(file).toBeDefined(); - if (file) { - expect(file.content.toString()).toEqual(changed ? tsModifiedContent : tsContent); - } - } -}); From 11ffd0a8228bc389dc39d4ef4dd210babebd58e1 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:31:22 +0100 Subject: [PATCH 16/22] fixes --- projects/components/table/src/table.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/components/table/src/table.component.spec.ts b/projects/components/table/src/table.component.spec.ts index d07a4d03..fae3a5b4 100644 --- a/projects/components/table/src/table.component.spec.ts +++ b/projects/components/table/src/table.component.spec.ts @@ -212,7 +212,7 @@ describe('ZvTable', () => { it('should update table state from the settings service and the query params', async () => { const table = createTableInstance(); - table.stateManager = new ZvTableUrlStateManager(router as any, route); + table.stateManager = new ZvTableUrlStateManager(router, route); settingsService.settings$.next({}); vi.spyOn(settingsService, 'getStream'); table.columnDefs = [createColDef({ property: 'prop1' }), createColDef({ property: 'prop2' })]; From cb2aad4044d6faf04f5a227442830e27e87fd20c Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:46:55 +0100 Subject: [PATCH 17/22] fixes --- package-lock.json | 904 ++++++++---------- package.json | 1 - .../default-select-data-source.spec.ts | 1 - .../table/src/data/table-data-source.spec.ts | 5 - 4 files changed, 382 insertions(+), 529 deletions(-) diff --git a/package-lock.json b/package-lock.json index c09691d8..5df26c8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,6 @@ "copyfiles": "^2.4.1", "eslint": "^10.1.0", "husky": "^9.1.7", - "jasmine": "^6.1.0", "jsdom": "^29.0.1", "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", @@ -276,13 +275,13 @@ } }, "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==", + "version": "0.2102.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.4.tgz", + "integrity": "sha512-GlmXHICxxGCZgkH8KM5ASkzftxhYygGQ3IKIG//987erh8kDa4m+ku20Dc08xVvv7Wf4WeFjFZULIjokiT43Gg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.3", + "@angular-devkit/core": "21.2.4", "rxjs": "7.8.2" }, "bin": { @@ -295,9 +294,9 @@ } }, "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==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.4.tgz", + "integrity": "sha512-U3Mln7x8gRi2GlxlrXefEOHcCgbkRvMll98SD7JYf7FJLXrqoEmuR6w2gsfbN9meYvw9geoicWWkkAmVE/8K+Q==", "license": "MIT", "dependencies": { "ajv": "8.18.0", @@ -322,12 +321,12 @@ } }, "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==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.4.tgz", + "integrity": "sha512-LkmpNrjcbGmm61YzDzli3m7VYv2h/8mLmXPZBtAmjXjpJWgbsls7KOTF3cjln7Pd4eYmF/dXMR0oThENwga5iA==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.3", + "@angular-devkit/core": "21.2.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.3.0", @@ -449,14 +448,14 @@ } }, "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==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.4.tgz", + "integrity": "sha512-H/3qBfITqCipFFntUj961YbjlJsXjFI1Td7KZWF+WbcPVW11AgS2+CouE5aqdt4Gx7QZOM5HiBe+f7Ub1dgxAg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.3", + "@angular-devkit/architect": "0.2102.4", "@babel/core": "7.29.0", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -479,7 +478,7 @@ "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", - "undici": "7.22.0", + "undici": "7.24.4", "vite": "7.3.1", "watchpack": "2.5.1" }, @@ -499,7 +498,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.3", + "@angular/ssr": "^21.2.4", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -549,9 +548,9 @@ } }, "node_modules/@angular/cdk": { - "version": "21.2.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.3.tgz", - "integrity": "sha512-7t+UhfbSpIUG9uUyL4b8nI/HyYyrbgAvDwBT8kH4D7If0WiFQhUoottAM0+WZ7Uy+F4nx322K6TOomz/fZJOoQ==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.4.tgz", + "integrity": "sha512-Zv+q9Z/wVWTt0ckuO3gnU7PbpCLTr1tKPEsofLGGzDufA5/85aBLn2UiLcjlY6wQ+V3EMqANhGo/8XJgvBEYFA==", "license": "MIT", "dependencies": { "parse5": "^8.0.0", @@ -565,19 +564,19 @@ } }, "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==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.4.tgz", + "integrity": "sha512-s2hm3Zu+U1or2CZtHHEPsUbpnkBiOsZlF959H2TMgCKWGlUXzxDm8Hi1Ifvk1+cRm6XFi2b7wjuj91XuBoimtw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.3", - "@angular-devkit/core": "21.2.3", - "@angular-devkit/schematics": "21.2.3", + "@angular-devkit/architect": "0.2102.4", + "@angular-devkit/core": "21.2.4", + "@angular-devkit/schematics": "21.2.4", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.2.3", + "@schematics/angular": "21.2.4", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.48.1", "ini": "6.0.0", @@ -600,9 +599,9 @@ } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.6.tgz", + "integrity": "sha512-2FcpZ1h6AZ4JwCIlnpHCYrbRTGQTOj/RFXkuX/qw7K6cFmJGfWFMmr++xWtHZEvUddfbR9hqDo+v1mkqEKE/Kw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -611,14 +610,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.5", + "@angular/core": "21.2.6", "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.6.tgz", + "integrity": "sha512-shGkb/aAIPbG8oSYkVJ0msGlRdDVcJBVaUVx2KenMltifQjfLn5N8DFMAzOR6haaA3XeugFExxKqmvySjrVq+A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -628,9 +627,9 @@ } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.6.tgz", + "integrity": "sha512-CiPmat4+D+hWXMTAY++09WeII/5D0r6iTjdLdaTq8tlo0uJcrOlazib4CpA94kJ2CRdzfhmC1H+ttwBI1xIlTg==", "dev": true, "license": "MIT", "dependencies": { @@ -651,7 +650,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.5", + "@angular/compiler": "21.2.6", "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { @@ -661,9 +660,9 @@ } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.6.tgz", + "integrity": "sha512-svgK5DhFlQlS+sMybXftn08rHHRiDGY/uIKT5LZUaKgyffnkPb8uClpMIW0NzANtU8qs8pwgDZFoJw85Ia3oqQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -672,7 +671,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.5", + "@angular/compiler": "21.2.6", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -686,9 +685,9 @@ } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.6.tgz", + "integrity": "sha512-i8BoWxBAm0g2xOMcQ8wTdj07gqMPIFYIyefCOo0ezcGj5XhYjd+C2UrYnKsup0aMZqqEAO1l2aZbmfHx9xLheQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -698,16 +697,16 @@ "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", + "@angular/common": "21.2.6", + "@angular/core": "21.2.6", + "@angular/platform-browser": "21.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "21.2.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.2.5.tgz", - "integrity": "sha512-GnGcKMrR/gchWnqew1B6DEtI7Fgl3wDNC3QA4KnkzaD/+yTrCz1Osb+MRGm2Zj/oGOonLNxbHJ/yNxuozYv2NA==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.2.6.tgz", + "integrity": "sha512-ui2Zf/h736Kf/jwyXHN2OBQC9fEzGUCz5fJr72sEe4nqa6aTiCL0FfkTarHDLKEYPNr8M+ZX/icgo3j9yztJhQ==", "dev": true, "license": "MIT", "engines": { @@ -715,9 +714,9 @@ } }, "node_modules/@angular/localize": { - "version": "21.2.5", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-21.2.5.tgz", - "integrity": "sha512-L/Aa+wMONTM3tvHczwHLYwKwgFhjXwU+TDYJFswu1/nFJ2epb0yNrJzgi9dHXDAMdihJy8920dZr9BI6J/OZ5A==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-21.2.6.tgz", + "integrity": "sha512-+nScGHruNCUiGz9nbNyFLO0Wg5dGZt+PBH/9wvzCxe1A+VhyiRSNCTD9hjcjsjtK3WPTRPd+Vo1s2URn+fgD4A==", "dev": true, "license": "MIT", "dependencies": { @@ -735,20 +734,20 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.5", - "@angular/compiler-cli": "21.2.5" + "@angular/compiler": "21.2.6", + "@angular/compiler-cli": "21.2.6" } }, "node_modules/@angular/material": { - "version": "21.2.3", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.3.tgz", - "integrity": "sha512-mqmqhHRKIJwSKaYUtb9hH6/oHmozgqv/pYQMvMa3Fd5iipV0VxXN2GdNl3WE9LV9FJhHDBMitNU0hdE0uCM1nQ==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.4.tgz", + "integrity": "sha512-YzkPjgZezdsDeAhSm3zix2h+ohApwaRUMG8ea/75XR1eSkT1n3N7qZaHC8HDkhPYApk8a951RDxsTiiAidnGqg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": "21.2.3", + "@angular/cdk": "21.2.4", "@angular/common": "^21.0.0 || ^22.0.0", "@angular/core": "^21.0.0 || ^22.0.0", "@angular/forms": "^21.0.0 || ^22.0.0", @@ -757,9 +756,9 @@ } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.6.tgz", + "integrity": "sha512-LW1vPXVHvy71LBahn+fSzPlWQl25kJIdcXq+ptG7HsMVgbPQ3/vvkKXAHYaRdppLGCFL+v+3dQGHYLNLiYL9qg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -768,9 +767,9 @@ "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" + "@angular/animations": "21.2.6", + "@angular/common": "21.2.6", + "@angular/core": "21.2.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -779,9 +778,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.5.tgz", - "integrity": "sha512-0yDogezPC4OaqkvL/3Pa5mBodOCCUnO4CTOxC+fPy7L+dRhQfVEwtOsN9XkZv5eMGemGeCcNKdchSuYsVkCA2g==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.6.tgz", + "integrity": "sha512-6a+zA9jM70b1kH3fSfAJIEVmkE3qB3oIXw7otWkv1nEhOJtNO0mM0dTUuO70C3GhnV9tmpLXa2him56C2LhVig==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -790,16 +789,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.5", - "@angular/compiler": "21.2.5", - "@angular/core": "21.2.5", - "@angular/platform-browser": "21.2.5" + "@angular/common": "21.2.6", + "@angular/compiler": "21.2.6", + "@angular/core": "21.2.6", + "@angular/platform-browser": "21.2.6" } }, "node_modules/@angular/platform-server": { - "version": "21.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.2.5.tgz", - "integrity": "sha512-fZBxgffh/fD986Ub4EfjZvIVRqwNnF4DFWjcFwPgU8INBjcMEUh5dR/D/nnlBx0EsZSMCd6FbigT8lIrx3lsHQ==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.2.6.tgz", + "integrity": "sha512-IatXqKzRRT8H1UolijS3Lv3SgthH5w3qHe5ZpQADYi9NIaIvtVMnDH3kIxWGhepjMtvUz235J3E6FrPer6mNZA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0", @@ -809,17 +808,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.5", - "@angular/compiler": "21.2.5", - "@angular/core": "21.2.5", - "@angular/platform-browser": "21.2.5", + "@angular/common": "21.2.6", + "@angular/compiler": "21.2.6", + "@angular/core": "21.2.6", + "@angular/platform-browser": "21.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "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==", + "version": "21.2.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.6.tgz", + "integrity": "sha512-0ajhkKYeOqHQEEH88+Q0HrheR3helwTvdTqD/0gTaapCe+HOoC+SYwmzzsYP2zwAxBNQEg4JHOGKQ30X9/gwgw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -828,16 +827,16 @@ "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", + "@angular/common": "21.2.6", + "@angular/core": "21.2.6", + "@angular/platform-browser": "21.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/ssr": { - "version": "21.2.3", - "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-21.2.3.tgz", - "integrity": "sha512-vyBIZMoEA1QOghE0Q8Co1gVyxKaaG1eGUigOjnksRLrkOU9uB1ARaCBFFmnIMtFFMbrvVzhsl6Ojzm4RjKkKdA==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-21.2.4.tgz", + "integrity": "sha512-KFr8RkgRgagRiQ08cTwgxxl4ervMSVwq6Fbhj5H95NAxLzcZVV4ooMOzdJ8tYQ+fhQn7if5K5Y1TUz8ANBmqSg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2457,13 +2456,6 @@ "node": ">=8" } }, - "node_modules/@jasminejs/reporters": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jasminejs/reporters/-/reporters-1.0.0.tgz", - "integrity": "sha512-rM3GG4vx2H1Gp5kYCTr9aKlOEJFd43pzpiMAiy5b1+FUc2ub4e6bS6yCi/WQNDzAa5MVp9++dwcoEtcIfoEnhA==", - "dev": true, - "license": "MIT" - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2897,6 +2889,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2914,6 +2909,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2931,6 +2929,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2948,6 +2949,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2965,6 +2969,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2982,6 +2989,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2999,6 +3009,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3458,6 +3471,9 @@ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3479,6 +3495,9 @@ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3500,6 +3519,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3521,6 +3543,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3542,6 +3567,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3563,6 +3591,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3747,6 +3778,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3764,6 +3798,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3781,6 +3818,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3798,6 +3838,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3926,6 +3969,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "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", @@ -4018,6 +4068,9 @@ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4032,6 +4085,9 @@ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4046,6 +4102,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4060,6 +4119,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4074,6 +4136,9 @@ "loong64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4088,6 +4153,9 @@ "loong64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4102,6 +4170,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4116,6 +4187,9 @@ "ppc64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4130,6 +4204,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4144,6 +4221,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4158,6 +4238,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4172,6 +4255,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4186,6 +4272,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4297,14 +4386,14 @@ } }, "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==", + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.4.tgz", + "integrity": "sha512-1I6KI2NEUg9Or0xhaxxKYaqfrF4yo9f3VcnFjPC3niBdno1PWJ23KwRjOxLtG2zEkqK9PsAMBzBRyJp0kdz8SA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.3", - "@angular-devkit/schematics": "21.2.3", + "@angular-devkit/core": "21.2.4", + "@angular-devkit/schematics": "21.2.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -4982,16 +5071,6 @@ } } }, - "node_modules/@vitest/mocker/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/@vitest/pretty-format": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz", @@ -5253,13 +5332,28 @@ } }, "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==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "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": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/arg": { @@ -5557,6 +5651,18 @@ "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==", + "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", @@ -5659,32 +5765,6 @@ "node": ">=20" } }, - "node_modules/cliui/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/cliui/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/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -5703,22 +5783,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/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/cliui/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -5737,6 +5801,26 @@ "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", @@ -5851,6 +5935,16 @@ "copyup": "copyfiles" } }, + "node_modules/copyfiles/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/copyfiles/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5897,26 +5991,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/copyfiles/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/copyfiles/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/copyfiles/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5962,6 +6036,19 @@ "node": ">=8" } }, + "node_modules/copyfiles/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/copyfiles/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6265,9 +6352,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.323", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.323.tgz", - "integrity": "sha512-oQm+FxbazvN2WICCbvJgj3IYPKV8awip57+W5VP+Aatk4kFU4pDYCPHZOX22Z27zpw8uttBehEqgK+VTJAYrVw==", + "version": "1.5.325", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.325.tgz", + "integrity": "sha512-PwfIw7WQSt3xX7yOf5OE/unLzsK9CaN2f/FvV3WjPR1Knoc1T9vePRVV4W1EM301JzzysK51K7FNKcusCr0zYA==", "dev": true, "license": "ISC" }, @@ -6655,11 +6742,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -6680,6 +6770,13 @@ "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", @@ -7601,46 +7698,6 @@ "node": ">=10" } }, - "node_modules/jasmine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-6.1.0.tgz", - "integrity": "sha512-WPphPqEMY0uBRMjuhRHoVoxQNvJuxIMqz0yIcJ3k3oYxBedeGoH60/NXNgasxnx2FvfXrq5/r+2wssJ7WE8ABw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jasminejs/reporters": "^1.0.0", - "glob": "^10.2.2 || ^11.0.3 || ^12.0.0 || ^13.0.0", - "jasmine-core": "~6.1.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/jasmine-core": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.1.0.tgz", - "integrity": "sha512-p/tjBw58O6vxKIWMlrU+yys8lqR3+l3UrqwNTT7wpj+dQ7N4etQekFM8joI+cWzPDYqZf54kN+hLC1+s5TvZvg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jasmine/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/jose": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", @@ -7710,9 +7767,9 @@ } }, "node_modules/jsdom/node_modules/undici": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", - "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.6.tgz", + "integrity": "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==", "dev": true, "license": "MIT", "engines": { @@ -7834,69 +7891,29 @@ "source-map": "~0.6.0" } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/less/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": "MIT", + "license": "BSD-3-Clause", "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/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", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" } }, "node_modules/lint-staged": { @@ -7941,39 +7958,6 @@ "node": ">=20.0.0" } }, - "node_modules/listr2/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/listr2/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/listr2/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/listr2/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -7992,22 +7976,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/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/listr2/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -8107,32 +8075,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/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/log-update/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/log-update/node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -8168,22 +8110,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/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/log-update/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -8221,6 +8147,32 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -8289,6 +8241,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -8384,38 +8350,18 @@ } }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.6.tgz", + "integrity": "sha512-7Uf5gMJZ2kTkFisE3toGxT991s+cg+vMh42nbZGM2bNxfYVpkpqRudf1QrcOy72a3PwcL4JYqL+4NY7t0Hdd0A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "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", @@ -9026,18 +8972,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ordered-binary": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", @@ -9551,6 +9485,16 @@ "license": "MIT", "optional": true }, + "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", @@ -10127,19 +10071,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/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/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -10327,19 +10258,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { + "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==", @@ -10354,19 +10273,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10567,16 +10473,6 @@ "node": ">=20" } }, - "node_modules/tr46/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/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -10721,9 +10617,9 @@ } }, "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "dev": true, "license": "MIT", "engines": { @@ -10797,16 +10693,6 @@ "punycode": "^2.1.0" } }, - "node_modules/uri-js/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/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11125,6 +11011,16 @@ "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", @@ -11141,26 +11037,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -11193,6 +11069,19 @@ "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", @@ -11318,19 +11207,6 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/yargs/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/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -11349,22 +11225,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/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/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 22426587..1f5c1846 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "copyfiles": "^2.4.1", "eslint": "^10.1.0", "husky": "^9.1.7", - "jasmine": "^6.1.0", "jsdom": "^29.0.1", "lint-staged": "^16.4.0", "ng-packagr": "^21.2.1", diff --git a/projects/components/select/src/defaults/default-select-data-source.spec.ts b/projects/components/select/src/defaults/default-select-data-source.spec.ts index 421bc5f2..4023a52f 100644 --- a/projects/components/select/src/defaults/default-select-data-source.spec.ts +++ b/projects/components/select/src/defaults/default-select-data-source.spec.ts @@ -568,7 +568,6 @@ describe('DefaultZvSelectDataSource', () => { if (sortCompare) { dataSource.sortCompare = sortCompare; } - // eslint-disable-next-line jasmine/no-unsafe-spy vi.spyOn(dataSource, 'sortCompare'); dataSource.selectedValuesChanged([item3Label2Selected.value, item5Label6Selected.value, item6Label5Selected.value]); diff --git a/projects/components/table/src/data/table-data-source.spec.ts b/projects/components/table/src/data/table-data-source.spec.ts index 00b72112..35325f73 100644 --- a/projects/components/table/src/data/table-data-source.spec.ts +++ b/projects/components/table/src/data/table-data-source.spec.ts @@ -424,23 +424,18 @@ describe('ZvTableDataSource', () => { const sortedDataDesc = dataSource.sortData(data, { sortColumn: 'prop', sortDirection: 'desc' }); expect(sortedDataDesc).toEqual(descExpectedData.map((x) => ({ prop: x }))); } - // eslint-disable-next-line jasmine/missing-expect it('should sort strings', () => { sortAssert(['b', 'a', 'c'], ['a', 'b', 'c'], ['c', 'b', 'a']); }); - // eslint-disable-next-line jasmine/missing-expect it('should sort numbers', () => { sortAssert([2, 1, 3], [1, 2, 3], [3, 2, 1]); }); - // eslint-disable-next-line jasmine/missing-expect it('should sort string numbers', () => { sortAssert(['2', '10', '3'], ['2', '3', '10'], ['10', '3', '2']); }); - // eslint-disable-next-line jasmine/missing-expect it('should sort booleans', () => { sortAssert([true, false, true], [false, true, true], [true, true, false]); }); - // eslint-disable-next-line jasmine/missing-expect it('should sort dates', () => { const now = new Date(); const future = new Date(); From 4fcc9db45db18626bbb5cd253f720b11bb8b8069 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:17:20 +0100 Subject: [PATCH 18/22] fixes --- projects/components/core/src/time/native-time-adapter.spec.ts | 1 - projects/components/form-base/src/form.service.spec.ts | 3 --- 2 files changed, 4 deletions(-) diff --git a/projects/components/core/src/time/native-time-adapter.spec.ts b/projects/components/core/src/time/native-time-adapter.spec.ts index db467ca1..9f164075 100644 --- a/projects/components/core/src/time/native-time-adapter.spec.ts +++ b/projects/components/core/src/time/native-time-adapter.spec.ts @@ -147,7 +147,6 @@ describe('ZvNativeTimeAdapter', () => { assertValidTime(adapter.deserialize(adapter.invalid()), false); }); - // eslint-disable-next-line jasmine/missing-expect it('should create an invalid Time', () => { assertValidTime(adapter.invalid(), false); }); diff --git a/projects/components/form-base/src/form.service.spec.ts b/projects/components/form-base/src/form.service.spec.ts index 59d67fc0..6642700c 100644 --- a/projects/components/form-base/src/form.service.spec.ts +++ b/projects/components/form-base/src/form.service.spec.ts @@ -145,7 +145,6 @@ describe('BaseZvFormService', () => { vi.useRealTimers(); }); - // eslint-disable-next-line jasmine/missing-expect it('should return errors in the right order (group)', async () => validateGetFormErrors(true, [ 'array.0.nested1:required', @@ -156,11 +155,9 @@ describe('BaseZvFormService', () => { ':pattern', ])); - // eslint-disable-next-line jasmine/missing-expect it('shouldnt return control errors if includeControls is false', async () => validateGetFormErrors(false, ['array.0:pattern', 'array:maxlength', ':pattern'])); - // eslint-disable-next-line jasmine/missing-expect it('should fall back to options.includeControlsDefault if includeControls is null', async () => { service.options.includeControlsDefault = false; await validateGetFormErrors(null, ['array.0:pattern', 'array:maxlength', ':pattern']); From 59d2a4d2c7f3ee57bc23d02aa68a7b638a7767f2 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:19:12 +0100 Subject: [PATCH 19/22] fixes --- .../card/src/card.component.spec.ts | 14 +++++----- .../src/date-time-input.component.spec.ts | 12 ++++---- .../src/form-field.component.spec.ts | 12 ++++---- .../form/src/form.component.spec.ts | 2 +- .../header/src/header.component.spec.ts | 10 +++---- .../select/src/select.component.spec.ts | 28 +++++++++---------- .../components/select/src/select.component.ts | 2 +- .../table-header.component.spec.ts | 8 +++--- .../table-pagination.component.spec.ts | 8 +++--- .../table-row-actions.component.spec.ts | 10 +++---- .../table-search.component.spec.ts | 2 +- .../table/src/table.component.spec.ts | 26 ++++++++--------- .../view/src/view.component.spec.ts | 2 +- 13 files changed, 68 insertions(+), 68 deletions(-) diff --git a/projects/components/card/src/card.component.spec.ts b/projects/components/card/src/card.component.spec.ts index c2991576..e240fb21 100644 --- a/projects/components/card/src/card.component.spec.ts +++ b/projects/components/card/src/card.component.spec.ts @@ -45,13 +45,13 @@ import { ZvCardHarness } from './testing/card.harness'; imports: [ZvCardModule], }) export class TestDataSourceComponent { - public caption = signal(undefined); - public description = signal(undefined); - public addTopButton = signal(false); - public addCardActionButton = signal(false); - public addCaptionTemplate = signal(false); - public addDescriptionTemplate = signal(false); - public addFooterTemplate = signal(false); + public readonly caption = signal(undefined); + public readonly description = signal(undefined); + public readonly addTopButton = signal(false); + public readonly addCardActionButton = signal(false); + public readonly addCaptionTemplate = signal(false); + public readonly addDescriptionTemplate = signal(false); + public readonly addFooterTemplate = signal(false); @ViewChild(ZvCard) headerComponent: ZvCard; } diff --git a/projects/components/date-time-input/src/date-time-input.component.spec.ts b/projects/components/date-time-input/src/date-time-input.component.spec.ts index 93e51f0a..e15f495b 100644 --- a/projects/components/date-time-input/src/date-time-input.component.spec.ts +++ b/projects/components/date-time-input/src/date-time-input.component.spec.ts @@ -714,8 +714,8 @@ function isValidDate(date: unknown) { export class ValueTestComponent { @ViewChild(ZvDateTimeInput) dateTimeInputCmp!: ZvDateTimeInput; - disabled = signal(false); - value = signal(null); + readonly disabled = signal(false); + readonly value = signal(null); } @Component({ @@ -745,10 +745,10 @@ export class InputsTestComponent { dateTimeInputCmp!: ZvDateTimeInput; @ViewChild('dateInput', { read: NgModel }) ngModel: NgModel; - disabled = signal(false); - value = signal(null); - required = signal(false); - errorStateMatcher = signal(null); + readonly disabled = signal(false); + readonly value = signal(null); + readonly required = signal(false); + readonly errorStateMatcher = signal(null); } @Component({ diff --git a/projects/components/form-field/src/form-field.component.spec.ts b/projects/components/form-field/src/form-field.component.spec.ts index 74505cd7..15936212 100644 --- a/projects/components/form-field/src/form-field.component.spec.ts +++ b/projects/components/form-field/src/form-field.component.spec.ts @@ -83,7 +83,7 @@ export class TestNoFormComponent { export class TestNgModelComponent { public readonly cd = inject(ChangeDetectorRef); - value = signal(null); + readonly value = signal(null); readonly formField = viewChild(ZvFormField); } @@ -106,11 +106,11 @@ export class TestFormComponent { public readonly cd = inject(ChangeDetectorRef); formControl = new FormControl('', [Validators.pattern('pattern'), Validators.minLength(5)]); - customLabel = signal(null); - hint = signal(null); - subscriptType = signal(null); - hintToggle = signal(false); - required = signal(false); + readonly customLabel = signal(null); + readonly hint = signal(null); + readonly subscriptType = signal(null); + readonly hintToggle = signal(false); + readonly required = signal(false); readonly formField = viewChild(ZvFormField); } diff --git a/projects/components/form/src/form.component.spec.ts b/projects/components/form/src/form.component.spec.ts index 783174e4..9d2a48a6 100644 --- a/projects/components/form/src/form.component.spec.ts +++ b/projects/components/form/src/form.component.spec.ts @@ -51,7 +51,7 @@ class TestZvFormService extends BaseZvFormService { imports: [ZvForm], }) export class TestDataSourceComponent { - public dataSource = signal(undefined); + public readonly dataSource = signal(undefined); @ViewChild(ZvForm) formComponent: ZvForm; } diff --git a/projects/components/header/src/header.component.spec.ts b/projects/components/header/src/header.component.spec.ts index 52c300cb..0649d6c9 100644 --- a/projects/components/header/src/header.component.spec.ts +++ b/projects/components/header/src/header.component.spec.ts @@ -32,11 +32,11 @@ import { ZvHeaderHarness } from './testing/header.harness'; imports: [ZvHeaderModule, MatButtonModule], }) export class TestDataSourceComponent { - public caption = signal(undefined); - public description = signal(undefined); - public addButtons = signal(false); - public addCaptionTemplate = signal(false); - public addDescriptionTemplate = signal(false); + public readonly caption = signal(undefined); + public readonly description = signal(undefined); + public readonly addButtons = signal(false); + public readonly addCaptionTemplate = signal(false); + public readonly addDescriptionTemplate = signal(false); @ViewChild(ZvHeader) headerComponent: ZvHeader; } diff --git a/projects/components/select/src/select.component.spec.ts b/projects/components/select/src/select.component.spec.ts index 13d4028b..f2ecb057 100644 --- a/projects/components/select/src/select.component.spec.ts +++ b/projects/components/select/src/select.component.spec.ts @@ -144,15 +144,15 @@ function createZvSelect(options?: { dataSource?: ZvSelectDataSource; service?: Z imports: [FormsModule, ReactiveFormsModule, ZvSelect], }) export class TestComponent implements OnDestroy { - dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); + readonly dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); control = new FormControl(null, [Validators.required]); form = new FormGroup({ select: this.control, }); emittedValues: any[] = []; - errorStateMatcher = signal(null); - panelClass = signal>({}); - clearable = signal(true); + readonly errorStateMatcher = signal(null); + readonly panelClass = signal>({}); + readonly clearable = signal(true); @ViewChild(ZvSelect, { static: true }) select: ZvSelect; @@ -203,11 +203,11 @@ const ITEMS = { export class TestMultipleComponent { public readonly cd = inject(ChangeDetectorRef); - showToggleAll = signal(true); - dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); - value = signal(null); - selectedLabel = signal(true); - customTemplate = signal(false); + readonly showToggleAll = signal(true); + readonly dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); + readonly value = signal(null); + readonly selectedLabel = signal(true); + readonly customTemplate = signal(false); @ViewChild(ZvSelect, { static: true }) select: ZvSelect; @@ -222,7 +222,7 @@ export class TestMultipleComponent { }) export class TestValueComponent { public items = [ITEMS.red, ITEMS.green, ITEMS.blue]; - public value = signal(null); + public readonly value = signal(null); } @Component({ @@ -245,7 +245,7 @@ export class TestValueComponent { }) export class TestCustomTemplateComponent { public items = [ITEMS.red, ITEMS.green, ITEMS.blue]; - public value = signal(null); + public readonly value = signal(null); } @Component({ @@ -261,9 +261,9 @@ export class TestCustomTemplateComponent { imports: [ZvSelect, ZvFormField, MatLabel, FormsModule], }) export class TestWithFormFieldComponent { - public dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); - public value = signal(null); - public clearable = signal(false); + public readonly dataSource = signal([ITEMS.red, ITEMS.green, ITEMS.blue]); + public readonly value = signal(null); + public readonly clearable = signal(false); } @Injectable({ providedIn: 'root' }) diff --git a/projects/components/select/src/select.component.ts b/projects/components/select/src/select.component.ts index 00213318..6feb9c8c 100644 --- a/projects/components/select/src/select.component.ts +++ b/projects/components/select/src/select.component.ts @@ -316,7 +316,7 @@ export class ZvSelect implements ControlValueAccessor, MatFormField this._onInitCalled = true; // before oninit ngControl.control isn't set, but it is needed for datasource creation - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + this._switchDataSource(this._dataSourceInput); this.filterCtrl.valueChanges diff --git a/projects/components/table/src/subcomponents/table-header.component.spec.ts b/projects/components/table/src/subcomponents/table-header.component.spec.ts index 8d63893c..c928247e 100644 --- a/projects/components/table/src/subcomponents/table-header.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-header.component.spec.ts @@ -18,10 +18,10 @@ import { ZvTableHeaderComponent } from './table-header.component'; imports: [ZvTableHeaderComponent], }) export class TestComponent { - public caption = signal('caption'); - public showSorting = signal(true); - public filterable = signal(true); - public topButtonSection = signal | null>(null); + public readonly caption = signal('caption'); + public readonly showSorting = signal(true); + public readonly filterable = signal(true); + public readonly topButtonSection = signal | null>(null); @ViewChild(ZvTableHeaderComponent, { static: true }) cmp: ZvTableHeaderComponent; diff --git a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts index 8fcc71a8..41ef290c 100644 --- a/projects/components/table/src/subcomponents/table-pagination.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-pagination.component.spec.ts @@ -24,11 +24,11 @@ import { ZvTablePaginationComponent } from './table-pagination.component'; imports: [ZvTablePaginationComponent], }) class PaginationTestComponent { - public pageSize = signal(5); - public dataLength = signal(15); - public pageIndex = signal(0); + public readonly pageSize = signal(5); + public readonly dataLength = signal(15); + public readonly pageIndex = signal(0); public pageSizeOptions: number[] = [5, 10, 25]; - public pageDebounce = signal(undefined); + public readonly pageDebounce = signal(undefined); @ViewChild(ZvTablePaginationComponent) public pagination: ZvTablePaginationComponent; diff --git a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts index c5018c1b..95eb4041 100644 --- a/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-row-actions.component.spec.ts @@ -24,12 +24,12 @@ import { MatButtonHarness } from '@angular/material/button/testing'; imports: [ZvTableRowActionsComponent], }) export class TestComponent { - public actions = signal[]>([]); - public loadActionsFn = signal<(data: any, actions: IZvTableAction[]) => Observable[]>>(null); - public openMenuFn = + public readonly actions = signal[]>([]); + public readonly loadActionsFn = signal<(data: any, actions: IZvTableAction[]) => Observable[]>>(null); + public readonly openMenuFn = signal<(data: any, actions: IZvTableAction[]) => Observable[]> | IZvTableAction[] | null>(null); - public item = signal({}); - public moreMenuThreshold = signal(2); + public readonly item = signal({}); + public readonly moreMenuThreshold = signal(2); @ViewChild(ZvTableRowActionsComponent, { static: true }) comp: ZvTableRowActionsComponent; diff --git a/projects/components/table/src/subcomponents/table-search.component.spec.ts b/projects/components/table/src/subcomponents/table-search.component.spec.ts index 741f1e59..125bade6 100644 --- a/projects/components/table/src/subcomponents/table-search.component.spec.ts +++ b/projects/components/table/src/subcomponents/table-search.component.spec.ts @@ -14,7 +14,7 @@ import { ZvTableSearchComponent } from './table-search.component'; imports: [ZvTableSearchComponent], }) export class TestComponent { - public searchText = signal('search text'); + public readonly searchText = signal('search text'); @ViewChild(ZvTableSearchComponent, { static: true }) tableSearch: ZvTableSearchComponent; diff --git a/projects/components/table/src/table.component.spec.ts b/projects/components/table/src/table.component.spec.ts index fae3a5b4..5d628a99 100644 --- a/projects/components/table/src/table.component.spec.ts +++ b/projects/components/table/src/table.component.spec.ts @@ -144,22 +144,22 @@ function createColDef(data: { property?: string; header?: string; sortable?: boo imports: [MatIconTestingModule, ZvTableModule], }) export class TestComponent { - public caption = signal('title'); - public dataSource = signal>(undefined); - public tableId = signal('tableId'); - public refreshable = signal(true); - public filterable = signal(true); - public showSettings = signal(true); - public layout = signal<'card' | 'border' | 'flat'>('card'); - public striped = signal(true); - public sortDefinitions = signal([{ prop: '__customSort', displayName: 'Custom Sort' }]); - public preferSortDropdown = signal(true); + public readonly caption = signal('title'); + public readonly dataSource = signal>(undefined); + public readonly tableId = signal('tableId'); + public readonly refreshable = signal(true); + public readonly filterable = signal(true); + public readonly showSettings = signal(true); + public readonly layout = signal<'card' | 'border' | 'flat'>('card'); + public readonly striped = signal(true); + public readonly sortDefinitions = signal([{ prop: '__customSort', displayName: 'Custom Sort' }]); + public readonly preferSortDropdown = signal(true); /** Karma doesn't recognize url changes from code. */ - public stateManager = signal(new ZvTableMemoryStateManager()); + public readonly stateManager = signal(new ZvTableMemoryStateManager()); - public expanded = signal(false); - public showToggleColumn = signal(true); + public readonly expanded = signal(false); + public readonly showToggleColumn = signal(true); @ViewChild(ZvTable, { static: true }) table: ZvTable; diff --git a/projects/components/view/src/view.component.spec.ts b/projects/components/view/src/view.component.spec.ts index a98b37e5..75aee57a 100644 --- a/projects/components/view/src/view.component.spec.ts +++ b/projects/components/view/src/view.component.spec.ts @@ -29,7 +29,7 @@ class TestViewDataSource implements IZvViewDataSource { imports: [ZvView], }) export class TestDataSourceComponent { - public dataSource = signal(undefined); + public readonly dataSource = signal(undefined); @ViewChild(ZvView) formComponent: ZvView; } From f8b937242ad8310758442d22b2f900e6f05ff19c Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:01:49 +0100 Subject: [PATCH 20/22] fixes --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index eec65845..de8b29cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,7 @@ FROM docker.io/library/node:25.6-alpine AS prepare RUN apk add chromium ENV CHROME_BIN=/usr/bin/chromium-browser +ENV CI=true FROM prepare AS build WORKDIR /app/src From cb05705350ea95e7b350b5a918eff662fd4cd91b Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:11:28 +0100 Subject: [PATCH 21/22] fixes --- package.json | 2 +- projects/components/schematics/setup.spec.ts | 5 +++++ projects/components/tsconfig.schematics.json | 2 +- vitest.config.schematics.ts | 8 ++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 projects/components/schematics/setup.spec.ts create mode 100644 vitest.config.schematics.ts diff --git a/package.json b/package.json index 1f5c1846..884faed7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build:components-schematics": "tsc -p projects/components/tsconfig.schematics.json", "test": "ng test", "test:components": "ng test components --watch=false --no-progress", - "test:schematics": "npm run build:components-schematics && jasmine dist/components/schematics/**/*_spec.js", + "test:schematics": "npm run build:components-schematics && vitest run --config vitest.config.schematics.ts", "lint": "ng lint", "commit": "git-cz", "release:test": "ng lint components && ng test components --watch=false", diff --git a/projects/components/schematics/setup.spec.ts b/projects/components/schematics/setup.spec.ts new file mode 100644 index 00000000..dddf1250 --- /dev/null +++ b/projects/components/schematics/setup.spec.ts @@ -0,0 +1,5 @@ +describe('schematics setup', () => { + it('should run tests', () => { + expect(true).toBe(true); + }); +}); diff --git a/projects/components/tsconfig.schematics.json b/projects/components/tsconfig.schematics.json index fff40894..fb0897b8 100644 --- a/projects/components/tsconfig.schematics.json +++ b/projects/components/tsconfig.schematics.json @@ -18,7 +18,7 @@ "sourceMap": true, "strictNullChecks": true, "target": "es6", - "types": ["jasmine", "node"] + "types": ["vitest/globals", "node"] }, "include": ["schematics/**/*"], "exclude": ["schematics/*/files/**/*"] diff --git a/vitest.config.schematics.ts b/vitest.config.schematics.ts new file mode 100644 index 00000000..8d4ba1fe --- /dev/null +++ b/vitest.config.schematics.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['dist/components/schematics/**/*.spec.js'], + globals: true, + }, +}); From a2465b286c45aba8821534496bdc8c3e6e3233d7 Mon Sep 17 00:00:00 2001 From: saithis <1547453+saithis@users.noreply.github.com> Date: Thu, 26 Mar 2026 13:32:44 +0100 Subject: [PATCH 22/22] oops --- projects/components/schematics/migrations.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/projects/components/schematics/migrations.json b/projects/components/schematics/migrations.json index 6c1df5c9..00b46c7a 100644 --- a/projects/components/schematics/migrations.json +++ b/projects/components/schematics/migrations.json @@ -1,10 +1,4 @@ { "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", - "schematics": { - "ng-add": { - "version": "14.0.0", - "description": "Replace all prosoft occurences with zvoove and change the prefix to zv", - "factory": "./rename-prosoft-to-zvoove/index" - } - } + "schematics": {} }