diff --git a/API/FamilyTreeAPI/FamilyTreeAPI.csproj b/API/FamilyTreeAPI/FamilyTreeAPI.csproj index 223c758..2514b8c 100644 --- a/API/FamilyTreeAPI/FamilyTreeAPI.csproj +++ b/API/FamilyTreeAPI/FamilyTreeAPI.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable Linux @@ -16,23 +16,23 @@ - - + + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - + diff --git a/API/FamilyTreeAPI/Repository/PersonPhotoRepository.cs b/API/FamilyTreeAPI/Repository/PersonPhotoRepository.cs index 5945de0..1f054d4 100644 --- a/API/FamilyTreeAPI/Repository/PersonPhotoRepository.cs +++ b/API/FamilyTreeAPI/Repository/PersonPhotoRepository.cs @@ -72,6 +72,7 @@ namespace FamilyTreeAPI.Repository } _context.PersonPhotos.Add(model); await _context.SaveChangesAsync(); + result = model.Id; statuscode = 1; diff --git a/UI/package-lock.json b/UI/package-lock.json index e5503af..5405efb 100644 --- a/UI/package-lock.json +++ b/UI/package-lock.json @@ -31,8 +31,8 @@ "xlsx": "^0.18.5" }, "devDependencies": { - "@angular/build": "^21.0.2", - "@angular/cli": "^21.0.2", + "@angular/build": "^21.2.7", + "@angular/cli": "^21.2.7", "@angular/compiler-cli": "^21.0.0", "@types/file-saver": "^2.0.7", "jsdom": "^27.1.0", @@ -48,57 +48,57 @@ "license": "MIT" }, "node_modules/@algolia/abtesting": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.1.tgz", - "integrity": "sha512-wV/gNRkzb7sI9vs1OneG129hwe3Q5zPj7zigz3Ps7M5Lpo2hSorrOnXNodHEOV+yXE/ks4Pd+G3CDFIjFTWhMQ==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.40.1.tgz", - "integrity": "sha512-cxKNATPY5t+Mv8XAVTI57altkaPH+DZi4uMrnexPxPHODMljhGYY+GDZyHwv9a+8CbZHcY372OkxXrDMZA4Lnw==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.40.1.tgz", - "integrity": "sha512-XP008aMffJCRGAY8/70t+hyEyvqqV7YKm502VPu0+Ji30oefrTn2al7LXkITz7CK6I4eYXWRhN6NaIUi65F1OA==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.40.1.tgz", - "integrity": "sha512-gWfQuQUBtzUboJv/apVGZMoxSaB0M4Imwl1c9Ap+HpCW7V0KhjBddqF2QQt5tJZCOFsfNIgBbZDGsEPaeKUosw==", + "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": { @@ -106,151 +106,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.40.1.tgz", - "integrity": "sha512-RTLjST/t+lsLMouQ4zeLJq2Ss+UNkLGyNVu+yWHanx6kQ3LT5jv8UvPwyht9s7R6jCPnlSI77WnL80J32ZuyJg==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.40.1.tgz", - "integrity": "sha512-2FEK6bUomBzEYkTKzD0iRs7Ljtjb45rKK/VSkyHqeJnG+77qx557IeSO0qVFE3SfzapNcoytTofnZum0BQ6r3Q==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.40.1.tgz", - "integrity": "sha512-Nju4NtxAvXjrV2hHZNLKVJLXjOlW6jAXHef/CwNzk1b2qIrCWDO589ELi5ZHH1uiWYoYyBXDQTtHmhaOVVoyXg==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.40.1.tgz", - "integrity": "sha512-Mw6pAUF121MfngQtcUb5quZVqMC68pSYYjCRZkSITC085S3zdk+h/g7i6FxnVdbSU6OztxikSDMh1r7Z+4iPlA==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.40.1.tgz", - "integrity": "sha512-z+BPlhs45VURKJIxsR99NNBWpUEEqIgwt10v/fATlNxc4UlXvALdOsWzaFfe89/lbP5Bu4+mbO59nqBC87ZM/g==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.40.1.tgz", - "integrity": "sha512-VJMUMbO0wD8Rd2VVV/nlFtLJsOAQvjnVNGkMkspFiFhpBA7s/xJOb+fJvvqwKFUjbKTUA7DjiSi1ljSMYBasXg==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.40.1.tgz", - "integrity": "sha512-ehvJLadKVwTp9Scg9NfzVSlBKH34KoWOQNTaN8i1Ac64AnO6iH2apJVSP6GOxssaghZ/s8mFQsDH3QIZoluFHA==", + "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.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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.40.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.40.1.tgz", - "integrity": "sha512-PbidVsPurUSQIr6X9/7s34mgOMdJnn0i6p+N6Ab+lsNhY5eiu+S33kZEpZwkITYBCIbhzDLOvb7xZD3gDi+USA==", + "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.40.1" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.40.1.tgz", - "integrity": "sha512-ThZ5j6uOZCF11fMw9IBkhigjOYdXGXQpj6h4k+T9UkZrF2RlKcPynFzDeRgaLdpYk8Yn3/MnFbwUmib7yxj5Lw==", + "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.40.1" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.40.1.tgz", - "integrity": "sha512-H1gYPojO6krWHnUXu/T44DrEun/Wl95PJzMXRcM/szstNQczSbwq6wIFJPI9nyE95tarZfUNU3rgorT+wZ6iCQ==", + "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.40.1" + "@algolia/client-common": "5.48.1" }, "engines": { "node": ">= 14.0.0" @@ -283,32 +283,35 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2100.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2100.2.tgz", - "integrity": "sha512-zSMF82F2wb6b6mvqmDFQyGiKaeFGcgfpXAg7M+ihlJF+GG47H3pNEUzO8+Be5GPoAtpSv0VVoXBwURU2SOnV/Q==", + "version": "0.2102.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.7.tgz", + "integrity": "sha512-4K/5hln9iaPEt3F/NyYqncNLvYpzSjRslEkHl2xIgZwQsIFHEvhnDRBYj2/oatURQhBqO/Yu15z/icVOYLxuTg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.0.2", + "@angular-devkit/core": "21.2.7", "rxjs": "7.8.2" }, + "bin": { + "architect": "bin/cli.js" + }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/core": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.2.tgz", - "integrity": "sha512-ePttMRRua9kv7df6fu2i5jTVJr5bzqwrKBBEtdXnWqOrYLUnU0G6XIpyGYVM6SyqpTwkTPlVsXZo5e8Lq356tg==", + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.7.tgz", + "integrity": "sha512-DONYY5u4IENO2qpd23mODaE4JI2EIohWV1kuJnsU9HIcm5wN714QB2z9WY/s4gLfUiAMIUu/8lpnW/0kOQZAnQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.17.1", + "ajv": "8.18.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", + "picomatch": "4.0.4", "rxjs": "7.8.2", "source-map": "0.7.6" }, @@ -318,7 +321,7 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^4.0.0" + "chokidar": "^5.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -327,16 +330,16 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.0.2.tgz", - "integrity": "sha512-mFKWTI56D5VmqyIonEK6myIdlGVJpxtxLW44uB1/jiVj7vUSnJCRFHSPH8syaIJ4/Y1B/T4kPTYCx/KEwnO/Ng==", + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.7.tgz", + "integrity": "sha512-LYAjjUI1qM7pR/sd0yYt8OLA6ljOOXjcfzV40I5XQNmhAxq90YYS5xwMcixOmWX+z5zvCYGvPXvJGWjzio6SUg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.0.2", + "@angular-devkit/core": "21.2.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.19", - "ora": "9.0.0", + "magic-string": "0.30.21", + "ora": "9.3.0", "rxjs": "7.8.2" }, "engines": { @@ -345,40 +348,68 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.7.tgz", + "integrity": "sha512-DONYY5u4IENO2qpd23mODaE4JI2EIohWV1kuJnsU9HIcm5wN714QB2z9WY/s4gLfUiAMIUu/8lpnW/0kOQZAnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "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/build": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.0.2.tgz", - "integrity": "sha512-5ZW4GZxAUXV7Vin+c42wKf6HhkYsexeUSb45K+f6aQVxLAwCEegJWwfQ6bReDw1ANDzXIA1Osh4zcsgOQ58EDw==", + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.7.tgz", + "integrity": "sha512-FpSkFqpsJtdN1cROekVYkmeV1QepdP+/d7fyYQEuNmlOlyqXSDh9qJmy4iL9VNbAU0rk+vFCtYM86rO7Pt9cSw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2100.2", - "@babel/core": "7.28.4", + "@angular-devkit/architect": "0.2102.7", + "@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.19", - "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.5", + "@inquirer/confirm": "5.1.21", + "@vitejs/plugin-basic-ssl": "2.1.4", + "beasties": "0.4.1", "browserslist": "^4.26.0", - "esbuild": "0.26.0", + "esbuild": "0.27.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "listr2": "9.0.5", - "magic-string": "0.30.19", + "magic-string": "0.30.21", "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.0", - "picomatch": "4.0.3", - "piscina": "5.1.3", - "rolldown": "1.0.0-beta.47", - "sass": "1.93.2", - "semver": "7.7.3", + "picomatch": "4.0.4", + "piscina": "5.1.4", + "rolldown": "1.0.0-rc.4", + "sass": "1.97.3", + "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", - "undici": "7.16.0", - "vite": "7.2.2", - "watchpack": "2.4.4" + "undici": "7.24.4", + "vite": "7.3.2", + "watchpack": "2.5.1" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -386,7 +417,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.4.3" + "lmdb": "3.5.1" }, "peerDependencies": { "@angular/compiler": "^21.0.0", @@ -396,7 +427,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.0.2", + "@angular/ssr": "^21.2.7", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -445,6 +476,54 @@ } } }, + "node_modules/@angular/build/node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/build/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/@angular/cdk": { "version": "21.0.2", "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.0.2.tgz", @@ -462,31 +541,30 @@ } }, "node_modules/@angular/cli": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.0.2.tgz", - "integrity": "sha512-SkyI0ZchUF0ZVBXSZDF4s4hMZs8AazLlI2PlpHSt+QXM+UX+1hhAp8F50WYOdOf1a+93VUzstI9um1CQgMHz2Q==", + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.7.tgz", + "integrity": "sha512-N/wj8fFRB718efIFYpwnYfy+MecZREZXsUNMTVndFLH6T0jCheb9PVetR6jsyZp6h46USNPOmJYJ/9255lME+Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2100.2", - "@angular-devkit/core": "21.0.2", - "@angular-devkit/schematics": "21.0.2", - "@inquirer/prompts": "7.9.0", + "@angular-devkit/architect": "0.2102.7", + "@angular-devkit/core": "21.2.7", + "@angular-devkit/schematics": "21.2.7", + "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.24.0", - "@schematics/angular": "21.0.2", + "@modelcontextprotocol/sdk": "1.26.0", + "@schematics/angular": "21.2.7", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.40.1", - "ini": "5.0.0", + "algoliasearch": "5.48.1", + "ini": "6.0.0", "jsonc-parser": "3.3.1", "listr2": "9.0.5", - "npm-package-arg": "13.0.1", - "pacote": "21.0.3", + "npm-package-arg": "13.0.2", + "pacote": "21.3.1", "parse5-html-rewriting-stream": "8.0.0", - "resolve": "1.22.11", - "semver": "7.7.3", + "semver": "7.7.4", "yargs": "18.0.0", - "zod": "4.1.13" + "zod": "4.3.6" }, "bin": { "ng": "bin/ng.js" @@ -497,6 +575,34 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.7.tgz", + "integrity": "sha512-DONYY5u4IENO2qpd23mODaE4JI2EIohWV1kuJnsU9HIcm5wN714QB2z9WY/s4gLfUiAMIUu/8lpnW/0kOQZAnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "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/common": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.0.3.tgz", @@ -698,13 +804,13 @@ "license": "MIT" }, "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" }, @@ -713,9 +819,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": { @@ -771,14 +877,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "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.5", - "@babel/types": "^7.28.5", + "@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" @@ -801,13 +907,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", @@ -838,29 +944,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" @@ -913,27 +1019,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" @@ -943,33 +1049,33 @@ } }, "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": { @@ -977,9 +1083,9 @@ } }, "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": { @@ -1160,9 +1266,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.26.0.tgz", - "integrity": "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA==", + "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" ], @@ -1177,9 +1283,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.26.0.tgz", - "integrity": "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA==", + "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" ], @@ -1194,9 +1300,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.26.0.tgz", - "integrity": "sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ==", + "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" ], @@ -1211,9 +1317,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.26.0.tgz", - "integrity": "sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A==", + "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" ], @@ -1228,9 +1334,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.26.0.tgz", - "integrity": "sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ==", + "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" ], @@ -1245,9 +1351,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.26.0.tgz", - "integrity": "sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw==", + "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" ], @@ -1262,9 +1368,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.26.0.tgz", - "integrity": "sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -1279,9 +1385,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.26.0.tgz", - "integrity": "sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -1296,9 +1402,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.26.0.tgz", - "integrity": "sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ==", + "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" ], @@ -1313,9 +1419,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.26.0.tgz", - "integrity": "sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ==", + "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" ], @@ -1330,9 +1436,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.26.0.tgz", - "integrity": "sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw==", + "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" ], @@ -1347,9 +1453,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.26.0.tgz", - "integrity": "sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg==", + "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" ], @@ -1364,9 +1470,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.26.0.tgz", - "integrity": "sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA==", + "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" ], @@ -1381,9 +1487,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.26.0.tgz", - "integrity": "sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg==", + "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" ], @@ -1398,9 +1504,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.26.0.tgz", - "integrity": "sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -1415,9 +1521,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.26.0.tgz", - "integrity": "sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -1432,9 +1538,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.26.0.tgz", - "integrity": "sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA==", + "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" ], @@ -1449,9 +1555,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.26.0.tgz", - "integrity": "sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw==", + "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" ], @@ -1466,9 +1572,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.26.0.tgz", - "integrity": "sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA==", + "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" ], @@ -1483,9 +1589,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.26.0.tgz", - "integrity": "sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw==", + "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" ], @@ -1500,9 +1606,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.26.0.tgz", - "integrity": "sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg==", + "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" ], @@ -1517,9 +1623,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.26.0.tgz", - "integrity": "sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw==", + "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" ], @@ -1534,9 +1640,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.26.0.tgz", - "integrity": "sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw==", + "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" ], @@ -1551,9 +1657,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.26.0.tgz", - "integrity": "sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA==", + "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" ], @@ -1568,9 +1674,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.26.0.tgz", - "integrity": "sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw==", + "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" ], @@ -1585,9 +1691,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.26.0.tgz", - "integrity": "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A==", + "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" ], @@ -1601,6 +1707,37 @@ "node": ">=18" } }, + "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.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", @@ -1637,14 +1774,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.19", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", - "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1832,22 +1969,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", - "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.3.0", - "@inquirer/confirm": "^5.1.19", - "@inquirer/editor": "^4.2.21", - "@inquirer/expand": "^4.0.21", - "@inquirer/input": "^4.2.5", - "@inquirer/number": "^3.0.21", - "@inquirer/password": "^4.0.21", - "@inquirer/rawlist": "^4.1.9", - "@inquirer/search": "^3.2.0", - "@inquirer/select": "^4.4.0" + "@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" @@ -1951,29 +2088,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/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -2060,9 +2174,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.3.tgz", - "integrity": "sha512-zR6Y45VNtW5s+A+4AyhrJk0VJKhXdkLhrySCpCu7PSdnakebsOzNxf58p5Xoq66vOSuueGAxlqDAF49HwdrSTQ==", + "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" ], @@ -2074,9 +2188,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.3.tgz", - "integrity": "sha512-nfGm5pQksBGfaj9uMbjC0YyQreny/Pl7mIDtHtw6g7WQuCgeLullr9FNRsYyKplaEJBPrCVpEjpAznxTBIrXBw==", + "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" ], @@ -2088,9 +2202,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.3.tgz", - "integrity": "sha512-Kjqomp7i0rgSbYSUmv9JnXpS55zYT/YcW3Bdf9oqOTjcH0/8tFAP8MLhu/i9V2pMKIURDZk63Ww49DTK0T3c/Q==", + "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" ], @@ -2102,9 +2216,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.3.tgz", - "integrity": "sha512-uX9eaPqWb740wg5D3TCvU/js23lSRSKT7lJrrQ8IuEG/VLgpPlxO3lHDywU44yFYdGS7pElBn6ioKFKhvALZlw==", + "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" ], @@ -2116,9 +2230,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.3.tgz", - "integrity": "sha512-7/8l20D55CfwdMupkc3fNxNJdn4bHsti2X0cp6PwiXlLeSFvAfWs5kCCx+2Cyje4l4GtN//LtKWjTru/9hDJQg==", + "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" ], @@ -2130,9 +2244,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.3.tgz", - "integrity": "sha512-yWVR0e5Gl35EGJBsAuqPOdjtUYuN8CcTLKrqpQFoM+KsMadViVCulhKNhkcjSGJB88Am5bRPjMro4MBB9FS23Q==", + "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" ], @@ -2144,9 +2258,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.3.tgz", - "integrity": "sha512-1JdBkcO0Vrua4LUgr4jAe4FUyluwCeq/pDkBrlaVjX3/BBWP1TzVjCL+TibWNQtPAL1BITXPAhlK5Ru4FBd/hg==", + "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" ], @@ -2158,12 +2272,13 @@ ] }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.0.tgz", - "integrity": "sha512-D8h5KXY2vHFW8zTuxn2vuZGN0HGrQ5No6LkHwlEA9trVgNdPL3TF1dSqKA7Dny6BbBYKSW/rOBDXdC8KJAjUCg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", + "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", "dev": true, "license": "MIT", "dependencies": { + "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -2171,13 +2286,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" @@ -2603,15 +2720,21 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", - "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "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" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@ngrx/effects": { @@ -2673,9 +2796,9 @@ } }, "node_modules/@npmcli/agent/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.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -2696,18 +2819,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" }, @@ -2715,67 +2838,34 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/git/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/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.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "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" @@ -2785,20 +2875,20 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, "license": "ISC", "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/node-gyp": { @@ -2812,9 +2902,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": { @@ -2824,59 +2914,49 @@ "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/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": "8.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", - "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "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": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "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": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "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" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/redact": { @@ -2890,9 +2970,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": { @@ -2900,66 +2980,16 @@ "@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" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@npmcli/run-script/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/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" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@oxc-project/types": { - "version": "0.96.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.96.0.tgz", - "integrity": "sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==", + "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": { @@ -3350,9 +3380,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.47.tgz", - "integrity": "sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==", + "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" ], @@ -3367,9 +3397,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.47.tgz", - "integrity": "sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==", + "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" ], @@ -3384,9 +3414,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.47.tgz", - "integrity": "sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==", + "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" ], @@ -3401,9 +3431,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.47.tgz", - "integrity": "sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==", + "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" ], @@ -3418,9 +3448,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.47.tgz", - "integrity": "sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==", + "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" ], @@ -3435,9 +3465,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.47.tgz", - "integrity": "sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==", + "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" ], @@ -3452,9 +3482,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.47.tgz", - "integrity": "sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==", + "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" ], @@ -3469,9 +3499,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.47.tgz", - "integrity": "sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==", + "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" ], @@ -3486,9 +3516,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.47.tgz", - "integrity": "sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==", + "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" ], @@ -3503,9 +3533,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.47.tgz", - "integrity": "sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==", + "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" ], @@ -3520,9 +3550,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.47.tgz", - "integrity": "sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==", + "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" ], @@ -3530,16 +3560,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" + "@napi-rs/wasm-runtime": "^1.1.1" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.47.tgz", - "integrity": "sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==", + "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" ], @@ -3553,27 +3583,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-win32-ia32-msvc": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.47.tgz", - "integrity": "sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==", - "cpu": [ - "ia32" - ], - "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-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.47.tgz", - "integrity": "sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==", + "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" ], @@ -3588,9 +3601,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", - "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==", + "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" }, @@ -3903,14 +3916,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.0.2.tgz", - "integrity": "sha512-JzFHwSNmagzmfBJVSfoJc2i4TqmlXv0iyrVke3vP2b+/CqOBhuDLQSkkdiC+8zI0qJFzgDHn2RlCd0WaIwLfiw==", + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.7.tgz", + "integrity": "sha512-aqEj3RyBtmH+41HZvrbfrpCo0e+0NzwyQyNSC/wLDShVqoidBtPbEdHU1FZ4+ni41da7rI3F12gUuAHws27kMA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.0.2", - "@angular-devkit/schematics": "21.0.2", + "@angular-devkit/core": "21.2.7", + "@angular-devkit/schematics": "21.2.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -3919,6 +3932,34 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "21.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.7.tgz", + "integrity": "sha512-DONYY5u4IENO2qpd23mODaE4JI2EIohWV1kuJnsU9HIcm5wN714QB2z9WY/s4gLfUiAMIUu/8lpnW/0kOQZAnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "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/@sigstore/bundle": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", @@ -3933,9 +3974,9 @@ } }, "node_modules/@sigstore/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.0.0.tgz", - "integrity": "sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==", + "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": { @@ -3943,9 +3984,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", - "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", + "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3953,46 +3994,46 @@ } }, "node_modules/@sigstore/sign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.0.1.tgz", - "integrity": "sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==", + "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.0.0", + "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.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/tuf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.0.tgz", - "integrity": "sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", + "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" + "tuf-js": "^4.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/verify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.0.0.tgz", - "integrity": "sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -4020,15 +4061,6 @@ "tailwindcss": "4.1.17" } }, - "node_modules/@tailwindcss/node/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==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@tailwindcss/oxide": { "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", @@ -4281,35 +4313,19 @@ } }, "node_modules/@tufjs/models": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", - "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "minimatch": "^10.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "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", @@ -4353,9 +4369,9 @@ "license": "MIT" }, "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": { @@ -4410,16 +4426,6 @@ } } }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/pretty-format": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", @@ -4462,16 +4468,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/spy": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", @@ -4547,9 +4543,9 @@ } }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -4582,26 +4578,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.40.1.tgz", - "integrity": "sha512-iUNxcXUNg9085TJx0HJLjqtDE0r1RZ0GOGrt8KNQqQT5ugu8lZsHuMUYW/e0lHhq6xBvmktU9Bw4CXP9VQeKrg==", + "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.6.1", - "@algolia/client-abtesting": "5.40.1", - "@algolia/client-analytics": "5.40.1", - "@algolia/client-common": "5.40.1", - "@algolia/client-insights": "5.40.1", - "@algolia/client-personalization": "5.40.1", - "@algolia/client-query-suggestions": "5.40.1", - "@algolia/client-search": "5.40.1", - "@algolia/ingestion": "1.40.1", - "@algolia/monitoring": "1.40.1", - "@algolia/recommend": "5.40.1", - "@algolia/requester-browser-xhr": "5.40.1", - "@algolia/requester-fetch": "5.40.1", - "@algolia/requester-node-http": "5.40.1" + "@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" @@ -4660,11 +4656,14 @@ } }, "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==", + "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" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { "version": "2.9.5", @@ -4677,9 +4676,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": { @@ -4690,10 +4689,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/bidi-js": { @@ -4707,9 +4707,9 @@ } }, "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==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "dev": true, "license": "MIT", "dependencies": { @@ -4719,7 +4719,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", + "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -4739,13 +4739,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "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": { @@ -4814,9 +4817,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": { @@ -4829,36 +4832,22 @@ "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/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.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, - "node_modules/cacache/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "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", @@ -4997,9 +4986,9 @@ } }, "node_modules/cli-spinners": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", - "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", "engines": { @@ -5124,9 +5113,9 @@ "license": "MIT" }, "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, "license": "MIT", "engines": { @@ -5175,9 +5164,9 @@ } }, "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": { @@ -5186,6 +5175,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/crc-32": { @@ -5437,31 +5430,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/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -5559,9 +5527,9 @@ } }, "node_modules/esbuild": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.26.0.tgz", - "integrity": "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q==", + "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", @@ -5572,32 +5540,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.26.0", - "@esbuild/android-arm": "0.26.0", - "@esbuild/android-arm64": "0.26.0", - "@esbuild/android-x64": "0.26.0", - "@esbuild/darwin-arm64": "0.26.0", - "@esbuild/darwin-x64": "0.26.0", - "@esbuild/freebsd-arm64": "0.26.0", - "@esbuild/freebsd-x64": "0.26.0", - "@esbuild/linux-arm": "0.26.0", - "@esbuild/linux-arm64": "0.26.0", - "@esbuild/linux-ia32": "0.26.0", - "@esbuild/linux-loong64": "0.26.0", - "@esbuild/linux-mips64el": "0.26.0", - "@esbuild/linux-ppc64": "0.26.0", - "@esbuild/linux-riscv64": "0.26.0", - "@esbuild/linux-s390x": "0.26.0", - "@esbuild/linux-x64": "0.26.0", - "@esbuild/netbsd-arm64": "0.26.0", - "@esbuild/netbsd-x64": "0.26.0", - "@esbuild/openbsd-arm64": "0.26.0", - "@esbuild/openbsd-x64": "0.26.0", - "@esbuild/openharmony-arm64": "0.26.0", - "@esbuild/sunos-x64": "0.26.0", - "@esbuild/win32-arm64": "0.26.0", - "@esbuild/win32-ia32": "0.26.0", - "@esbuild/win32-x64": "0.26.0" + "@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": { @@ -5729,11 +5697,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.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz", + "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==", "dev": true, "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, "engines": { "node": ">= 16" }, @@ -5968,18 +5939,18 @@ } }, "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" @@ -6037,6 +6008,16 @@ "node": ">= 0.4" } }, + "node_modules/hono": { + "version": "4.12.14", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", + "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/hosted-git-info": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", @@ -6051,9 +6032,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.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -6074,9 +6055,9 @@ } }, "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", @@ -6089,14 +6070,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": { @@ -6163,9 +6144,9 @@ } }, "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": { @@ -6199,16 +6180,6 @@ "dev": true, "license": "MIT" }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -6217,13 +6188,13 @@ "license": "ISC" }, "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/ip-address": { @@ -6246,22 +6217,6 @@ "node": ">= 0.10" } }, - "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", @@ -6398,9 +6353,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": { @@ -6484,6 +6439,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6818,14 +6780,15 @@ } }, "node_modules/lmdb": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.3.tgz", - "integrity": "sha512-GWV1kVi6uhrXWqe+3NXWO73OYe8fto6q8JMo0HOpk1vf8nEyFWgo4CSNJpIFzsOxOrysVUlcO48qRbQfmKd1gA==", + "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", @@ -6836,13 +6799,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.3", - "@lmdb/lmdb-darwin-x64": "3.4.3", - "@lmdb/lmdb-linux-arm": "3.4.3", - "@lmdb/lmdb-linux-arm64": "3.4.3", - "@lmdb/lmdb-linux-x64": "3.4.3", - "@lmdb/lmdb-win32-arm64": "3.4.3", - "@lmdb/lmdb-win32-x64": "3.4.3" + "@lmdb/lmdb-darwin-arm64": "3.5.1", + "@lmdb/lmdb-darwin-x64": "3.5.1", + "@lmdb/lmdb-linux-arm": "3.5.1", + "@lmdb/lmdb-linux-arm64": "3.5.1", + "@lmdb/lmdb-linux-x64": "3.5.1", + "@lmdb/lmdb-win32-arm64": "3.5.1", + "@lmdb/lmdb-win32-x64": "3.5.1" } }, "node_modules/log-symbols": { @@ -6929,23 +6892,24 @@ } }, "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, + "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.5" } }, "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", @@ -6954,36 +6918,12 @@ "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "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/make-fetch-happen/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "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", @@ -7094,27 +7034,27 @@ } }, "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.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "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": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7133,29 +7073,29 @@ } }, "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-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^3.0.0" }, @@ -7217,38 +7157,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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.1.2" }, "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "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", @@ -7289,9 +7209,9 @@ "license": "MIT" }, "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, @@ -7369,9 +7289,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.1.0.tgz", - "integrity": "sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", + "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7382,7 +7302,7 @@ "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.5.2", + "tar": "^7.5.4", "tinyglobby": "^0.2.12", "which": "^6.0.0" }, @@ -7410,33 +7330,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==", + "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_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==", - "dev": true, - "license": "ISC", - "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" @@ -7469,16 +7379,16 @@ } }, "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-install-checks": { @@ -7495,35 +7405,35 @@ } }, "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-package-arg": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.1.tgz", - "integrity": "sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==", + "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": { @@ -7534,16 +7444,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", @@ -7560,16 +7460,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/npm-registry-fetch": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", @@ -7590,16 +7480,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", @@ -7687,9 +7567,9 @@ } }, "node_modules/ora": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", - "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "dev": true, "license": "MIT", "dependencies": { @@ -7699,9 +7579,8 @@ "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", - "stdin-discarder": "^0.2.2", - "string-width": "^8.1.0", - "strip-ansi": "^7.1.2" + "stdin-discarder": "^0.3.1", + "string-width": "^8.1.0" }, "engines": { "node": ">=20" @@ -7711,9 +7590,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 @@ -7732,16 +7611,16 @@ } }, "node_modules/pacote": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.3.tgz", - "integrity": "sha512-itdFlanxO0nmQv4ORsvA9K1wv40IPfB9OmWqfaJWvoJ30VKyHsqNgDVeG+TVhI7Gk7XW8slUy7cA9r6dF5qohw==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.3.1.tgz", + "integrity": "sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", @@ -7750,10 +7629,10 @@ "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "sigstore": "^4.0.0", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { @@ -7848,17 +7727,10 @@ "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": "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": { @@ -7866,16 +7738,16 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/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.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7883,9 +7755,9 @@ } }, "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==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, "license": "MIT", "funding": { @@ -7907,9 +7779,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -7920,9 +7792,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": { @@ -7977,6 +7849,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/primeicons": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", @@ -8006,13 +7905,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/promise-retry": { @@ -8054,9 +7953,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8126,27 +8025,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "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/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -8182,14 +8060,14 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.47.tgz", - "integrity": "sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==", + "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.96.0", - "@rolldown/pluginutils": "1.0.0-beta.47" + "@oxc-project/types": "=0.113.0", + "@rolldown/pluginutils": "1.0.0-rc.4" }, "bin": { "rolldown": "bin/cli.mjs" @@ -8198,20 +8076,19 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-beta.47", - "@rolldown/binding-darwin-arm64": "1.0.0-beta.47", - "@rolldown/binding-darwin-x64": "1.0.0-beta.47", - "@rolldown/binding-freebsd-x64": "1.0.0-beta.47", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.47", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.47", - "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.47", - "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.47", - "@rolldown/binding-linux-x64-musl": "1.0.0-beta.47", - "@rolldown/binding-openharmony-arm64": "1.0.0-beta.47", - "@rolldown/binding-wasm32-wasi": "1.0.0-beta.47", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.47", - "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.47", - "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.47" + "@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": { @@ -8290,9 +8167,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "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": { @@ -8324,9 +8201,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": { @@ -8337,32 +8214,36 @@ } }, "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==", "dev": true, "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -8373,6 +8254,10 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -8426,14 +8311,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -8502,18 +8387,18 @@ } }, "node_modules/sigstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.0.0.tgz", - "integrity": "sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.0.0", - "@sigstore/tuf": "^4.0.0", - "@sigstore/verify": "^3.0.0" + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -8617,17 +8502,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", @@ -8636,9 +8510,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": { @@ -8647,9 +8521,9 @@ } }, "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" }, @@ -8666,16 +8540,16 @@ } }, "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/stackback": { @@ -8703,9 +8577,9 @@ "license": "MIT" }, "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.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "dev": true, "license": "MIT", "engines": { @@ -8748,19 +8622,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -8797,9 +8658,9 @@ } }, "node_modules/tar": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", - "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "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": { @@ -8944,15 +8805,15 @@ "license": "0BSD" }, "node_modules/tuf-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.0.0.tgz", - "integrity": "sha512-Lq7ieeGvXDXwpoSmOSgLWVdsGGV9J4a77oDTAPe/Ltrqnnm/ETaRlBAQTH5JatEh8KXuE6sddf9qAv1Q2282Hg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/models": "4.0.0", - "debug": "^4.4.1", - "make-fetch-happen": "^15.0.0" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -8988,41 +8849,15 @@ } }, "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "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": { "node": ">=20.18.1" } }, - "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/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9064,25 +8899,14 @@ "browserslist": ">= 4.21.0" } }, - "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": { @@ -9096,13 +8920,13 @@ } }, "node_modules/vite": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", - "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "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", @@ -9170,490 +8994,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, "node_modules/vitest": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", @@ -9732,16 +9072,6 @@ } } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -9756,9 +9086,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": { @@ -10131,9 +9461,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": { @@ -10141,13 +9471,13 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", "dev": true, "license": "ISC", "peerDependencies": { - "zod": "^3.25 || ^4" + "zod": "^3.25.28 || ^4" } } } diff --git a/UI/package.json b/UI/package.json index 02b8212..fd729b2 100644 --- a/UI/package.json +++ b/UI/package.json @@ -46,8 +46,8 @@ "xlsx": "^0.18.5" }, "devDependencies": { - "@angular/build": "^21.0.2", - "@angular/cli": "^21.0.2", + "@angular/build": "^21.2.7", + "@angular/cli": "^21.2.7", "@angular/compiler-cli": "^21.0.0", "@types/file-saver": "^2.0.7", "jsdom": "^27.1.0", diff --git a/UI/src.rar b/UI/src.rar deleted file mode 100644 index 2fe2df1..0000000 Binary files a/UI/src.rar and /dev/null differ diff --git a/UI/src/app/app.config.ts b/UI/src/app/app.config.ts index c1e8d36..d2ec900 100644 --- a/UI/src/app/app.config.ts +++ b/UI/src/app/app.config.ts @@ -44,7 +44,9 @@ export const appConfig: ApplicationConfig = { ] }; - +/* +$) ng build --base-href "/familytreeui/" -c production +*/ /* diff --git a/UI/src/app/attachphoto/add.photo.html b/UI/src/app/attachphoto/add.photo.html index 867802f..03c60d5 100644 --- a/UI/src/app/attachphoto/add.photo.html +++ b/UI/src/app/attachphoto/add.photo.html @@ -10,7 +10,7 @@
@if (files) { - } -
- - - - -
{{error}}
-
- - - - - \ No newline at end of file diff --git a/myshare/UI/src/app/login/login.ts b/myshare/UI/src/app/login/login.ts deleted file mode 100644 index 5b0d6e2..0000000 --- a/myshare/UI/src/app/login/login.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Component, OnDestroy, OnInit, inject } from '@angular/core'; -import { Router, ActivatedRoute, RouterModule } from '@angular/router'; -import { FormBuilder, Validators, FormGroup } from '@angular/forms'; -import { first } from 'rxjs/operators'; - -import { AuthenticationService } from '../user-services'; - -import { ConfirmationService } from 'primeng/api'; -import { Subject, Subscription } from 'rxjs'; -import { CommonModule } from '@angular/common'; -import { CardModule } from 'primeng/card'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; - -import { Utils } from '../shares'; -@Component({ - templateUrl: './login.html', - styleUrl: './login.css', - selector: 'login', - imports: [FormsModule, ReactiveFormsModule, ButtonModule, InputTextModule, - RouterModule, CommonModule, CardModule], - -}) -export class Login implements OnInit, OnDestroy { - loginForm: FormGroup; - confirmationService = inject(ConfirmationService); - route = inject(ActivatedRoute); - router = inject(Router); - authenticationService = inject(AuthenticationService); - formBuilder = inject(FormBuilder); - loading = false; - homeUrl = "/person"; - submitted = false; - isChange = true; // disable use false//true for not disable. make sure it true is disable button. - subChanged$ = new Subject(); - // get return url from route parameters or default to '/' - returnUrl = this.route.snapshot.queryParams['returnUrl'] || this.homeUrl; - error = ''; - private subscription: Subscription = new Subscription(); - - constructor() { - - this.loginForm = this.formBuilder.group({ - username: ['kham.vilaythong@gmail.com', Validators.required], - password: ['password', Validators.required], - - }); - } - - ngOnInit() { - // reset login status - this.loading = false; - this.subscription.add(this.loginForm.valueChanges.subscribe((x: any) => this.isChange = false)); - this.subscription.add(this.subChanged$.subscribe(x => this.isChange = x)); - - } - - updateData($event: Event) { - console.log("onChange click", $event); - } - - // convenience getter for easy access to form fields - get f() { return this.loginForm.value; } - get isFieldsChange() { - const chan = this.isChange || !this.loginForm.valid; // this disable so need true valid = true not - //console.log(this.msg + 'is fields change', chan); - return chan; - } - onSubmit() { - - //this.playAudio(); - - // stop here if form is invalid - if (this.loginForm.invalid) { - return; - } - const fvalue = this.loginForm.value; - this.loading = true; - this.error = ""; - let username = ""; - let password = ""; - if (fvalue.username != null) - username = fvalue.username; - if (fvalue.password != null) - password = fvalue.password; - this.authenticationService.login(username, password) - .pipe(first()) - .subscribe({ - next: (x: any) => { - this.loading = false; - console.log("login result ", x.data, this.returnUrl); - if (x.statusCode == 1) { - // if (x.data.role == 1) { - // this.homeService.reportDate = Utils.getLastMonth(); - // this.router.navigate(['/addkpi/' + x.data.id + '/' + x.data.measureId], { queryParams: { returnUrl: '/login' } }); - - // } - // else if (x.data.role == 3) { - // this.homeService.reportDate = Utils.getLastMonth(); - // this.router.navigate(['/approval/' + x.data.id], { queryParams: { returnUrl: '/login' } }); - - //} - // else - this.router.navigate([this.homeUrl]); - } - else { - this.loginForm.patchValue({ password: '' }); - // alert("Invalid Username or Password. Please try again."); - console.error("error in login", x); - this.confirmationService.confirm({ - message: 'Error in Login: Invalid username or password. May be your password is expired', - header: 'Error Login', - icon: 'pi pi-info-circle', - rejectVisible: false, - acceptLabel: 'OK', - - }); - } - }, - error: er => { - console.log("error in login", er); - this.error = er.message; - this.loading = false; - } - }); - - } - - ngOnDestroy(): void { - this.subscription.unsubscribe(); - this.loading = false; - } - -} diff --git a/myshare/UI/src/app/models/code.ts b/myshare/UI/src/app/models/code.ts deleted file mode 100644 index 48e8e84..0000000 --- a/myshare/UI/src/app/models/code.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Code { - id:number; - name:string; - status?:string; - active?:boolean; -} diff --git a/myshare/UI/src/app/models/configureUrl.ts b/myshare/UI/src/app/models/configureUrl.ts deleted file mode 100644 index bf08d34..0000000 --- a/myshare/UI/src/app/models/configureUrl.ts +++ /dev/null @@ -1,17 +0,0 @@ -export enum ConfigureUrl -{ - //baseUrl = "http://localhost:61744", - loginApiUrl = "api/Users/Login", - searchStaffUrl = "api/Users/SearchADStaff", - staffUrl = "api/Staff", - personUrl = "api/Person", - staffWorkUrl = "api/StaffWork", - jobUrl ="api/Job", - clientUrl ="api/Client", - relationShipUrl ="api/RelationShip", - logoutUrl ="api/Users/Logout", - adminUserUrl = "api/Staff", - lookupUrl = "api/Lookup", - FileUploadUrl = "api/FileUpload", - -} \ No newline at end of file diff --git a/myshare/UI/src/app/models/enum.ts b/myshare/UI/src/app/models/enum.ts deleted file mode 100644 index e41d06c..0000000 --- a/myshare/UI/src/app/models/enum.ts +++ /dev/null @@ -1,37 +0,0 @@ -export const MIMEType = { - png: 'image/png', - jpg: 'image/jpg', - jpeg: 'image/jpeg', - gif: 'image/gif', - txt: 'text/plain', - pdf: 'application/pdf' -}; - - -//for status of object 0 no change, 1 changed , -1 is deleted. -export enum mState { - Delete = -1, - NoChange = 0, - Modified = 1, - New =2, -}; - -export enum userRole { - Normal = 1, - Admin = 2, - ServiceManager =3, - Accounting = 4, - WorkShop = 5, - -}; - -export enum enumReqStatus { - Canel = -1, - Decline = -2, - NewRequest = 0, - Allocate = 1, - Arrival = 2, - Completed = 3, - OnHold = 4, - OffHold = 5 -}; diff --git a/myshare/UI/src/app/models/index.ts b/myshare/UI/src/app/models/index.ts deleted file mode 100644 index 68ef389..0000000 --- a/myshare/UI/src/app/models/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './code'; -export * from './configureUrl'; -export * from './user'; -export * from './resultmodel'; -export * from './enum'; -export * from './lookup'; -export * from './staff'; -export * from './person'; -export * from './job'; -export * from './relationship'; \ No newline at end of file diff --git a/myshare/UI/src/app/models/job.ts b/myshare/UI/src/app/models/job.ts deleted file mode 100644 index 8c7ab87..0000000 --- a/myshare/UI/src/app/models/job.ts +++ /dev/null @@ -1,12 +0,0 @@ - -export interface JobSearch { - code:string; - description:string; -} -export interface Job { - id:number; - code:string|null|undefined; - description:string |null|undefined; - active:boolean |null|undefined; - -} diff --git a/myshare/UI/src/app/models/lookup.ts b/myshare/UI/src/app/models/lookup.ts deleted file mode 100644 index 88a1d28..0000000 --- a/myshare/UI/src/app/models/lookup.ts +++ /dev/null @@ -1,16 +0,0 @@ -// using for priority and infectionType -export interface Lookup { - id:number; - codeId:string; - description:string; - -} - -export interface LookupEdit { - id:number; - codeId:string; - description:string; - active:boolean; - type:string; - -} \ No newline at end of file diff --git a/myshare/UI/src/app/models/mydetail.ts b/myshare/UI/src/app/models/mydetail.ts deleted file mode 100644 index 2b5dcbc..0000000 --- a/myshare/UI/src/app/models/mydetail.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface MyDetail{ - id:number, - login:string, - firstname:string, - surname:string, - jobTitle:string, -} \ No newline at end of file diff --git a/myshare/UI/src/app/models/person.ts b/myshare/UI/src/app/models/person.ts deleted file mode 100644 index 67163c2..0000000 --- a/myshare/UI/src/app/models/person.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { RelationShip } from "./relationship"; - -export interface FamilySearch { - email:string|null; - phone:string |null; - clientname:string |null; -} - -export interface Person { - - id: number; - title?:string| null| undefined; - firstName: string | null|undefined; - lastName: string | null|undefined; - email: string | null|undefined; - phone: string | null|undefined; - address?: string | null|undefined; - alive: boolean | null|undefined; - dob? : string | null|undefined; - fatherId?: number| null|undefined; - motherId?: number| null|undefined; - image?: string|null|undefined; - sex?: string|null|undefined; - fatherName?:string |null; - motherName?:string |null; - relationShips?: RelationShip[]; -} - -export interface PersonContainer -{ - person: Person; - formData?:FormData; - -} - diff --git a/myshare/UI/src/app/models/relationship.ts b/myshare/UI/src/app/models/relationship.ts deleted file mode 100644 index f3a9c7b..0000000 --- a/myshare/UI/src/app/models/relationship.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { mState } from "./enum"; - -export interface RelationShip { - id: number; - relatePersonId: number; - personId: number; - state: mState; -} -//relationship id this relatePersonId person has relation with other person -// also other person has also has relation with you. look in two way -// person id = 1 has to relation id = 90 -// that means when you edit person 90 their relation ship also be there. -// so personid = 1 and relation id = 90 we need to show other way around. -//example first name = Smith has partner Jennifer -// when we edit Jennifer it should show Smith as her partner too. - -export interface RelationShipView { - id: number; - relatePersonId:number; - personId : number; - pfirstName: string |null |undefined; - plastName: string |null |undefined; - sex:string |null |undefined; - state: mState; - - -} \ No newline at end of file diff --git a/myshare/UI/src/app/models/resultmodel.ts b/myshare/UI/src/app/models/resultmodel.ts deleted file mode 100644 index 1ea43e3..0000000 --- a/myshare/UI/src/app/models/resultmodel.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ResultModel { - data: T; - message: string; - statusCode:number; -} \ No newline at end of file diff --git a/myshare/UI/src/app/models/staff.ts b/myshare/UI/src/app/models/staff.ts deleted file mode 100644 index bb8d8cd..0000000 --- a/myshare/UI/src/app/models/staff.ts +++ /dev/null @@ -1,39 +0,0 @@ -export interface StaffView { - id:number, - email:string, - firstname:string, - lastname:string, - active:boolean, -} - -export interface ResetPassword{ - id:number; - password:string; -} - -export interface Staff { - id:number, - email:string, - firstname:string, - lastname:string, - phone:string, - type:number; - active:boolean; - roleType: number; - password?:string, -} - -export interface StaffSearch { - email:string; - firstName:string; - lastName:string; -} - -//this use for new user only. -export interface AdminUserNew { - loginId:number; - user: Staff;// first get userid from this table and - - -} - diff --git a/myshare/UI/src/app/models/user.ts b/myshare/UI/src/app/models/user.ts deleted file mode 100644 index 3242e25..0000000 --- a/myshare/UI/src/app/models/user.ts +++ /dev/null @@ -1,36 +0,0 @@ -export class User { - id: number = 0; - username: string = ''; - role: number = -1; - firstName: string = ''; - lastName: string = ''; - email:string = ''; - token:string =''; - position: string =''; - department: string = ''; - managerEmail:string =''; - phone:string=''; - -} - -export interface UserAD -{ - id: number, - firstName: string, - lastName: string, - email: string, - username: string, - department: string, - position: string, - role: number, - phone:string, - managerEmail:string - } - -export class SecAccessLevel { - accessName:string=''; - request:number=0; - report:number=0; - admin:number=0; - allocation:number=0; -} diff --git a/myshare/UI/src/app/mythem.ts b/myshare/UI/src/app/mythem.ts deleted file mode 100644 index 884d922..0000000 --- a/myshare/UI/src/app/mythem.ts +++ /dev/null @@ -1,71 +0,0 @@ - - -//mypreset.ts -import { definePreset } from '@primeuix/themes'; -import Aura from '@primeuix/themes/aura'; -import { primitive } from '@primeuix/themes/aura/base'; - -const MyPreset = definePreset(Aura, { - semantic: { - colorScheme: { - primitive: { - cyan: { - 50: '{cyan.50}', - 100: '{cyan.100}', - 200: '{cyan.200}', - 300: '{cyan.300}', - 400: '{cyan.400}', - 500: '{cyan.500}', - } - - }, - primary: { - 50: '{zinc.50}', - 100: '{zinc.100}', - 200: '{zinc.200}', - 300: '{zinc.300}', - 400: '{zinc.400}', - 500: '{zinc.500}', - 600: '{zinc.600}', - 700: '{zinc.700}', - 800: '{zinc.800}', - 900: '{zinc.900}', - 950: '{zinc.950}' - }, - light: { - surface: { - 0: '#ffffff', - 50: '{zinc.50}', - 100: '{zinc.100}', - 200: '{zinc.200}', - 300: '{zinc.300}', - 400: '{zinc.400}', - 500: '{zinc.500}', - 600: '{zinc.600}', - 700: '{zinc.700}', - 800: '{zinc.800}', - 900: '{zinc.900}', - 950: '{zinc.950}' - } - }, - dark: { - surface: { - 0: '#ffffff', - 50: '{slate.50}', - 100: '{slate.100}', - 200: '{slate.200}', - 300: '{slate.300}', - 400: '{slate.400}', - 500: '{slate.500}', - 600: '{slate.600}', - 700: '{slate.700}', - 800: '{slate.800}', - 900: '{slate.900}', - 950: '{slate.950}' - } - } - } - } -}); - -export default MyPreset; diff --git a/myshare/UI/src/app/person/family.orga.css b/myshare/UI/src/app/person/family.orga.css deleted file mode 100644 index 3db3368..0000000 --- a/myshare/UI/src/app/person/family.orga.css +++ /dev/null @@ -1,12 +0,0 @@ -table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} -td.mat-column-edit, .mat-column-delete { - width: 35px; - padding-right: 2px; -} diff --git a/myshare/UI/src/app/person/family.orga.html b/myshare/UI/src/app/person/family.orga.html deleted file mode 100644 index 5bd8736..0000000 --- a/myshare/UI/src/app/person/family.orga.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Family Tree

-
- -
- - - -
- -
{{ node.label }}
-
{{ node.data }}
-
-
-
-
-
- -
-
- diff --git a/myshare/UI/src/app/person/family.orga.ts b/myshare/UI/src/app/person/family.orga.ts deleted file mode 100644 index 1cef064..0000000 --- a/myshare/UI/src/app/person/family.orga.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { Component, OnInit, OnDestroy, inject, ChangeDetectorRef, signal} from '@angular/core'; - -import { StaffView ,StaffSearch, Person, RelationShip } from '../models'; -import { OrganizationChartModule } from 'primeng/organizationchart'; - -import { take } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { PersonService } from './person.service'; -import { TableModule } from 'primeng/table'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; -import { TreeNode } from 'primeng/api'; -import { InputTextModule } from 'primeng/inputtext'; -import { DialogService, DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; -import { PersonEdit } from './person.edit'; -import { MessageService } from 'primeng/api'; -import { TreeModule, TreeNodeDoubleClickEvent, TreeNodeSelectEvent } from 'primeng/tree'; -import { Utils } from '../shares'; - -@Component({ - selector: 'family-orga', - templateUrl: './family.orga.html', - imports:[TableModule,FormsModule,TreeModule, OrganizationChartModule,CommonModule,ButtonModule,InputTextModule], - styleUrls: ['./family.orga.css'], - providers: [DialogService] -}) -export class FamilyOrga implements OnInit, OnDestroy{ - - private subscription:Subscription = new Subscription(); - person!: Person; - selectedNode!: TreeNode; - selectedNodes!: TreeNode[]; - private cd = inject(ChangeDetectorRef); - familyTree = signal([]); - relations: RelationShip[] =[]; - _id = -10; - loading = false; - familyList:Person[] = []; - msg ="[Person organise component]"; - private messageService = inject(MessageService); - public ref = inject(DynamicDialogRef); - public config = inject(DynamicDialogConfig); - /* - private store: Store - */ - private personService = inject(PersonService); - public dialogService = inject(DialogService); - - ngOnInit(): void - { - const id = this.config.data.id; - this.familyList = this.config.data.familyList; - const item = this.familyList.find(x => x.id == id); - if (item != undefined) - this.person = item; - this.loadPersonFamilyTree(id); - //this.populateTree(); - - } - populateTree() : void { - const data: TreeNode[] = [ - { - expanded: true, - type: 'person', - styleClass: 'bg-indigo-500 text-white', - data: { - image: 'https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png', - name: 'Amy Elsner', - title: 'CEO' - }, - children: [ - { - expanded: true, - type: 'person', - styleClass: 'bg-purple-500 text-white', - data: { - image: 'https://primefaces.org/cdn/primeng/images/demo/avatar/annafali.png', - name: 'Anna Fali', - title: 'CMO' - }, - children: [ - { - label: 'Sales', - styleClass: 'bg-purple-500 text-white', - style: ' border-radius: 12px' - }, - { - label: 'Marketing', - styleClass: 'bg-purple-500 text-white', - style: ' border-radius: 12px' - } - ] - }, - { - expanded: true, - type: 'person', - styleClass: 'bg-teal-500 text-white', - data: { - image: 'https://primefaces.org/cdn/primeng/images/demo/avatar/stephenshaw.png', - name: 'Stephen Shaw', - title: 'CTO' - }, - children: [ - { - label: 'Development', - styleClass: 'bg-teal-500 text-white' - }, - { - label: 'UI/UX Design', - styleClass: 'bg-teal-500 text-white' - } - ] - } - ] - } - ]; - this.familyTree.set(data); - } - loadPersonFamilyTree(id: number): void { - const relationShip$ = this.personService.loadPersonFamily(id); - this.subscription.add(relationShip$.subscribe( - { - next: x => { - if (x.statusCode == 1) - { - let tree : TreeNode[] =[]; - tree.push(x.data); - this.familyTree.set(tree); - console.log("load person family", this.familyTree()); - - } - }, - error: e => { - console.error("error load loadPersonFamily by personId", id); - this.messageService.add({severity:'error', summary: 'error load loadPersonFamily by personId', detail: e.message}); - } - } - )); - } - - nodeSelect(event: TreeNodeSelectEvent) { - // this.messageService.add({ severity: 'info', summary: 'Node Selected', detail: event.node.label }); - } -nodeDoubleSelect(event:TreeNodeDoubleClickEvent) : void { - // console.log("double click node", event.node.key); - const id = event.node.key; - this.edit(Number(id)); -} - - getName(id:number): string - { - let result =""; - const item = this.familyList.find(x => x.id == id); - if (item) - result = item.lastName + " " + item.firstName; - return result; - } - updateParent(list:Person[]):void { - let i = 0; - let item:Person; - for (i = 0; i< list.length; i++) - { - item = list[i]; - if (item.fatherId && item.fatherId > 0) - { - item.fatherName = this.getName(item.fatherId); - } - } - } - - newFamily():void { - //console.log("add new employee"); - this.personService.parentList = this.familyList; - // this.router.navigate( ['/family/new'], { queryParams: {returnUrl:'/family' } }); - this.showEdit(this._id--); - } - edit(id: number) : void { - //console.log("edit family", id); - this.personService.parentList = this.familyList; - // this.router.navigate( ['/family/'+id], { queryParams: {returnUrl:'/family' } }); - this.showEdit(id); - } - showEdit(id:number) { - const ref = this.dialogService.open(PersonEdit, { - data: { - id, - familyList: this.familyList, - }, - header: 'Family', - width: '80%', - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - this.messageService.add({severity:'success', summary: 'Save Family', detail: item.firstName!}); - //update the current list - this.updateList(item); - } - }); - - } - updateList(item: Person) :void { - const idx = this.familyList.findIndex( x => x.id == item.id); - if (item.fatherId && item.fatherId > 0) - item.fatherName = this.getName(item.fatherId); - if (item.motherId && item.motherId > 0) - item.motherName = this.getName(item.motherId); - if (idx < 0) - { - - const olist = [... this.familyList, item]; - this.familyList = olist; - } - else - { - const oitem = this.familyList[idx]; - oitem.firstName = item.firstName; - oitem.lastName = item.lastName; - oitem.address = item.address; - oitem.alive = item.alive; - oitem.dob = item.dob; - oitem.email = item.email; - oitem.fatherId = item.fatherId; - oitem.motherId = item.motherId; - oitem.motherName = item.motherName; - oitem.fatherName = item.fatherName; - - } - } - deleteItem(id: number): void { - this.personService.deletePerson(id) - .pipe(take(1)) - .subscribe({ next: result => { - console.log(this.msg + " deleteItem success", result); - - const nlist = this.familyList.filter(d => d.id !== id); - this.familyList = nlist; - }, - error: e => console.error(e) - }); - //console.log(this.msg + "click button to delete"); - } - close() :void { - this.ref.close(null); - } - - ngOnDestroy() { - this.subscription.unsubscribe(); - } -} - diff --git a/myshare/UI/src/app/person/family.tree.css b/myshare/UI/src/app/person/family.tree.css deleted file mode 100644 index 3db3368..0000000 --- a/myshare/UI/src/app/person/family.tree.css +++ /dev/null @@ -1,12 +0,0 @@ -table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} -td.mat-column-edit, .mat-column-delete { - width: 35px; - padding-right: 2px; -} diff --git a/myshare/UI/src/app/person/family.tree.html b/myshare/UI/src/app/person/family.tree.html deleted file mode 100644 index 905b0be..0000000 --- a/myshare/UI/src/app/person/family.tree.html +++ /dev/null @@ -1,35 +0,0 @@ -
-

Family Tree by Person has Father

-
-
-
-
- - -
-
- -
-
-
-
-
- - -
- diff --git a/myshare/UI/src/app/person/family.tree.ts b/myshare/UI/src/app/person/family.tree.ts deleted file mode 100644 index 1d5bdcf..0000000 --- a/myshare/UI/src/app/person/family.tree.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { Component, OnInit, OnDestroy, inject, ChangeDetectorRef, signal} from '@angular/core'; - -import { StaffView ,StaffSearch, Person } from '../models'; -import { OrganizationChartModule } from 'primeng/organizationchart'; - -import { take } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { Router } from '@angular/router'; -import { PersonService } from './person.service'; -import { AuthenticationService } from '../user-services'; -import { TableModule } from 'primeng/table'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; -import { TreeNode } from 'primeng/api'; -import { InputTextModule } from 'primeng/inputtext'; -import { DialogService } from 'primeng/dynamicdialog'; -import { PersonEdit } from './person.edit'; -import { MessageService } from 'primeng/api'; -import { CheckboxModule } from 'primeng/checkbox'; -import { TreeModule, TreeNodeDoubleClickEvent, TreeNodeSelectEvent } from 'primeng/tree'; -import { Utils } from '../shares'; - -@Component({ - selector: 'family-tree', - templateUrl: './family.tree.html', - imports:[TableModule,FormsModule,TreeModule,CheckboxModule, - OrganizationChartModule,CommonModule, - FormsModule, - ButtonModule,InputTextModule], - styleUrls: ['./family.tree.css'], - providers: [DialogService] -}) -export class FamilyTree implements OnInit, OnDestroy{ - isFather = signal(true); - private subscription:Subscription = new Subscription(); - firstname = ''; - selectedNode!: TreeNode; - private cd = inject(ChangeDetectorRef); - familyTree: TreeNode[] = []; - email = ''; - lastname = ''; - _id = -10; - loading = false; - familyList:Person[] = []; - msg ="[Person tree component]"; - private messageService = inject(MessageService); - /* - private store: Store - */ - constructor( - public dialogService: DialogService, - private personService: PersonService, - private authenticationService: AuthenticationService, - private router: Router - ) {} - getSearchCiteria(): StaffSearch { - let criteria:StaffSearch = { - email: this.email, - firstName: this.firstname, - lastName: this.lastname, - }; - - return criteria; - - } - canSearch():boolean { - let result = false; - result = this.email !== ""; - result = result || this.lastname !== ""; - result = result || this.firstname !== ""; - return result; - } - ngOnInit(): void - { - this.authenticationService.isHome = false; - this.authenticationService.isReport = false; - const prev = this.personService.searchCriteria; - let goload = true; - this.load(); - - } - getActive(active:boolean):string { - let result = 'false-icon pi-times-circle'; - if (active) - result = 'true-icon pi-check-circle'; - return result; - } - load():void { - let father = this.isFather(); - this.loading = true; - //const criteria = this.getSearchCiteria(); - // this.personService.searchCriteria = criteria; - this.subscription.add( - this.personService.loadPersonFamilyTree(father, !father).subscribe( - { - next: x => { - if (x.statusCode == 1) - { - this.familyTree = x.data; - this.loading = false; - this.cd.detectChanges(); - console.log("the family tree", this.familyTree); - } - }, - - error: e => { - const message = e || e.message; - // this.toastr.error(message); - this.loading = false; - console.log("error ", e); - } - }) - ); - } - - nodeSelect(event: TreeNodeSelectEvent) { - // this.messageService.add({ severity: 'info', summary: 'Node Selected', detail: event.node.label }); - } -nodeDoubleSelect(event:TreeNodeDoubleClickEvent) : void { - // console.log("double click node", event.node.key); - const id = event.node.key; - this.edit(Number(id)); -} - - getName(id:number): string - { - let result =""; - const item = this.familyList.find(x => x.id == id); - if (item) - result = item.lastName + " " + item.firstName; - return result; - } - updateParent(list:Person[]):void { - let i = 0; - let item:Person; - for (i = 0; i< list.length; i++) - { - item = list[i]; - if (item.fatherId && item.fatherId > 0) - { - item.fatherName = this.getName(item.fatherId); - } - } - } - - newFamily():void { - //console.log("add new employee"); - this.personService.parentList = this.familyList; - // this.router.navigate( ['/family/new'], { queryParams: {returnUrl:'/family' } }); - this.showEdit(this._id--); - } - edit(id: number) : void { - //console.log("edit family", id); - this.personService.parentList = this.familyList; - // this.router.navigate( ['/family/'+id], { queryParams: {returnUrl:'/family' } }); - this.showEdit(id); - } - showEdit(id:number) { - const ref = this.dialogService.open(PersonEdit, { - data: { - id, - familyList: this.familyList, - }, - header: 'Family', - width: '80%', - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - this.messageService.add({severity:'success', summary: 'Save Family', detail: item.firstName!}); - //update the current list - this.updateList(item); - } - }); - - } - updateList(item: Person) :void { - const idx = this.familyList.findIndex( x => x.id == item.id); - if (item.fatherId && item.fatherId > 0) - item.fatherName = this.getName(item.fatherId); - if (item.motherId && item.motherId > 0) - item.motherName = this.getName(item.motherId); - if (idx < 0) - { - - const olist = [... this.familyList, item]; - this.familyList = olist; - } - else - { - const oitem = this.familyList[idx]; - oitem.firstName = item.firstName; - oitem.lastName = item.lastName; - oitem.address = item.address; - oitem.alive = item.alive; - oitem.dob = item.dob; - oitem.email = item.email; - oitem.fatherId = item.fatherId; - oitem.motherId = item.motherId; - oitem.motherName = item.motherName; - oitem.fatherName = item.fatherName; - - } - } - deleteItem(id: number): void { - this.personService.deletePerson(id) - .pipe(take(1)) - .subscribe({ next: result => { - console.log(this.msg + " deleteItem success", result); - - const nlist = this.familyList.filter(d => d.id !== id); - this.familyList = nlist; - }, - error: e => console.error(e) - }); - //console.log(this.msg + "click button to delete"); - } - - ngOnDestroy() { - this.subscription.unsubscribe(); - } -} - diff --git a/myshare/UI/src/app/person/familylist.css b/myshare/UI/src/app/person/familylist.css deleted file mode 100644 index 3db3368..0000000 --- a/myshare/UI/src/app/person/familylist.css +++ /dev/null @@ -1,12 +0,0 @@ -table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} -td.mat-column-edit, .mat-column-delete { - width: 35px; - padding-right: 2px; -} diff --git a/myshare/UI/src/app/person/familylist.html b/myshare/UI/src/app/person/familylist.html deleted file mode 100644 index 75319aa..0000000 --- a/myshare/UI/src/app/person/familylist.html +++ /dev/null @@ -1,86 +0,0 @@ -
-

Person List

-
-
-
-
- - -
-
- - -
-
- - -
-
- - - -
-
-
-
-
- - -
- - - - - - - -
-
- - - - Last Name - - First Name - - Sex - Father - - Mother - - - Edit - - - - - {{user.lastName}} - {{user.firstName}} - {{user.sex}} - {{user.fatherName}} - {{user.motherName}} - - - - - - - - -
- -
- diff --git a/myshare/UI/src/app/person/familylist.ts b/myshare/UI/src/app/person/familylist.ts deleted file mode 100644 index 1904477..0000000 --- a/myshare/UI/src/app/person/familylist.ts +++ /dev/null @@ -1,352 +0,0 @@ -import { Component, OnInit, OnDestroy, inject, ChangeDetectorRef, signal, ViewChild} from '@angular/core'; - -import { StaffView ,StaffSearch, Person } from '../models'; - - -import { take } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { Router } from '@angular/router'; -import { PersonService } from './person.service'; -import { AuthenticationService } from '../user-services'; -import { Table, TableModule } from 'primeng/table'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; -import { DialogService } from 'primeng/dynamicdialog'; -import { PersonEdit } from './person.edit'; -import { ConfirmationService, MenuItem, MessageService } from 'primeng/api'; -import { IconFieldModule } from 'primeng/iconfield'; -import { InputIconModule } from 'primeng/inputicon'; -import { Menu, MenuModule } from 'primeng/menu'; -import { FamilyOrga } from './family.orga'; - -import { saveAs } from 'file-saver'; -import * as XLSX from 'xlsx'; - -@Component({ - selector: 'family-list', - templateUrl: './familylist.html', - imports:[TableModule,FormsModule,CommonModule,ButtonModule,MenuModule, - InputTextModule,IconFieldModule,InputIconModule], - styleUrls: ['./familylist.css'], - providers: [DialogService] -}) -export class FamilyList implements OnInit, OnDestroy{ - - private subscription:Subscription = new Subscription(); - //private cd = inject(ChangeDetectorRef); - items: MenuItem[] | undefined; - selectedPerson!: Person; - firstname = ''; - email = ''; - lastname = ''; - _id = -10; - selectId = -1; - loading = false; - familyList = signal([]); - msg ="[Person component]"; - @ViewChild(Table) dt2!: Table; - @ViewChild('rowmenu') popMenu?: Menu; - private messageService = inject(MessageService); - public dialogService= inject( DialogService); - private personService= inject( PersonService); - private confirmationService = inject(ConfirmationService); - private cdr = inject(ChangeDetectorRef); - private authenticationService= inject( AuthenticationService); - private router= inject( Router); - - getSearchCiteria(): StaffSearch { - let criteria:StaffSearch = { - email: this.email, - firstName: this.firstname, - lastName: this.lastname, - }; - console.log("get search citeria", criteria); - return criteria; - - } - initMenu(): void { - this.items = [ - { - label: 'Edit', - icon: 'pi pi-pencil', - command: () => { - this.edit(this.selectId); - } - }, - { - label: 'Delete', - icon: 'pi pi-times', - command: () => { - this.delete(this.selectId); - } - }, - { - label: 'Show Family', - icon: 'pi pi-sitemap', - command: () => { - this.showChildren(this.selectId); - } - } - - ]; - } - exportExport() : void { - this.ExcelExport(this.familyList(), 'family_export'); - } - - ExcelExport(data: any, fileName:string) :void - { - const worksheet = XLSX.utils.json_to_sheet(data); - const workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); - const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); - const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }); - saveAs(blob, `${fileName}.xlsx`); - } - - actionClick(id: number, event:Event): void { - // console.log("action edit "+ id); - this.selectId = id; - this.popMenu!.toggle(event); - } - showChildren(id: number): void { - console.log("show children of id", id); - this.showOrganise(id); - -} - handleInput(event: Event) { - const value = (event.target as HTMLInputElement).value; - this.dt2.filterGlobal(value, 'contains'); - } - canSearch():boolean { - let result = false; - result = this.email !== ""; - result = result || this.lastname !== ""; - result = result || this.firstname !== ""; - return result; - } - onMenuShow(): void { - console.log("this is show", this.selectedPerson); - } - - ngOnInit(): void - { - this.initMenu(); - this.authenticationService.isHome = false; - this.authenticationService.isReport = false; - const prev = this.personService.searchCriteria; - let goload = true; - if (prev.lastName !== '') - { - this.lastname = prev.lastName; - goload = true; - } - if (prev.firstName !== '') - { - this.firstname = prev.firstName; - goload = true; - } - if (prev.email !== '') - { - this.email = prev.email; - goload = true; - } - if (goload) - { - this.search(); - } - } - getActive(active:boolean):string { - let result = 'false-icon pi-times-circle'; - if (active) - result = 'true-icon pi-check-circle'; - return result; - } - search():void { - const canSearch = true; // this.canSearch(); - if (canSearch) - { - this.loading = true; - const criteria = this.getSearchCiteria(); - this.personService.searchCriteria = criteria; - this.subscription.add( - this.personService.searchPersons(criteria).subscribe( { - next: result => { - // console.log(this.msg + "search load Data", result); - const familyList = result.data; - this.familyList.set(familyList); - this.updateParent( this.familyList()); - //this.familyList.set(familyList); - - console.log("the person from load", this.familyList()); - this.loading = false; - this.cdr.detectChanges(); - }, - error: e => { - const message = e || e.message; - // this.toastr.error(message); - this.loading = false; - console.log("error ", e); - } - }) - ); - } - } - getName(id:number): string - { - let result =""; - const item = this.familyList().find(x => x.id == id); - if (item) - result = item.lastName + " " + item.firstName; - return result; - } - updateParent(list:Person[]):void { - let i = 0; - let item:Person; - for (i = 0; i< list.length; i++) - { - item = list[i]; - if (item.fatherId && item.fatherId > 0) - { - item.fatherName = this.getName(item.fatherId); - } - if (item.motherId && item.motherId > 0) - { - item.motherName = this.getName(item.motherId); - } - } - } - - delete(id: number): void { - this.confirmationService.confirm({ - - message: 'Do you want to delete this record?', - header: 'Confirmation Delete', - icon: 'pi pi-info-circle', - rejectLabel: 'Cancel', - rejectButtonProps: { - label: 'Cancel', - severity: 'secondary', - outlined: true, - }, - acceptButtonProps: { - label: 'Delete', - severity: 'danger', - }, - - accept: () => { - this.deleteItem(id); - } - }); - } - - deleteItem(id: number): void { - this.personService.deletePerson(id) - .pipe(take(1)) - .subscribe({ next: result => { - console.log(this.msg + " deleteItem success", result); - - const nlist = this.familyList().filter(d => d.id !== id); - this.familyList.set(nlist); - this.cdr.detectChanges(); - }, - error: e => console.error(e) - }); - //console.log(this.msg + "click button to delete"); - } - - newFamily():void { - //console.log("add new employee"); - this.personService.parentList = this.familyList(); - // this.router.navigate( ['/family/new'], { queryParams: {returnUrl:'/family' } }); - this.showEdit(this._id--); - } - edit(id: number) : void { - //console.log("edit family", id); - this.personService.parentList = this.familyList(); - // this.router.navigate( ['/family/'+id], { queryParams: {returnUrl:'/family' } }); - this.showEdit(id); - } - showEdit(id:number) { - const ref = this.dialogService.open(PersonEdit, { - data: { - id, - familyList: this.familyList(), - }, - header: 'Person', - width: '80%', - draggable: true, - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - // this.messageService.add({severity:'success', summary: 'Save Family', detail: item.firstName!}); - //update the current list - this.updateList(item); - } - }); - } - - showOrganise(id:number) { - const ref = this.dialogService.open(FamilyOrga, { - data: { - id, - familyList: this.familyList(), - }, - header: 'Children', - width: '80%', - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - // this.messageService.add({severity:'success', summary: 'Save Family', detail: item.firstName!}); - //update the current list - //this.updateList(item); - } - }); - } - - updateList(item: Person) :void { - const list = this.familyList(); - const idx = list.findIndex( x => x.id === item.id); - if (item.fatherId && item.fatherId > 0) - item.fatherName = this.getName(item.fatherId); - if (item.motherId && item.motherId > 0) - item.motherName = this.getName(item.motherId); - if (idx < 0) - { - const olist = [... list, item]; - this.familyList.set(olist); - } - else - { - - const oitem = list[idx]; - oitem.firstName = item.firstName; - oitem.lastName = item.lastName; - oitem.address = item.address; - oitem.alive = item.alive; - oitem.dob = item.dob; - oitem.sex = item.sex; - oitem.email = item.email; - oitem.fatherId = item.fatherId; - oitem.motherId = item.motherId; - oitem.fatherName = item.fatherName; - oitem.motherName = item.motherName; - this.familyList.set(list); - } - this.cdr.markForCheck(); - } - - - ngOnDestroy() { - this.subscription.unsubscribe(); - } -} - diff --git a/myshare/UI/src/app/person/index.ts b/myshare/UI/src/app/person/index.ts deleted file mode 100644 index 0455764..0000000 --- a/myshare/UI/src/app/person/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './familylist'; -export * from './person.edit'; -export * from './family.tree'; -export * from './person.service'; - diff --git a/myshare/UI/src/app/person/person.edit.css b/myshare/UI/src/app/person/person.edit.css deleted file mode 100644 index 139597f..0000000 --- a/myshare/UI/src/app/person/person.edit.css +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/myshare/UI/src/app/person/person.edit.html b/myshare/UI/src/app/person/person.edit.html deleted file mode 100644 index f3d9c78..0000000 --- a/myshare/UI/src/app/person/person.edit.html +++ /dev/null @@ -1,119 +0,0 @@ -
- -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
- - -
-
-
- -
-
-
- @if (adminuserForm.value.image != "" && adminuserForm.value.image != null) - { -
- - - -
- } - @else - { -
- -
- - -
-
- } -
-
-
-
- -
- - - - First Name - Last Name - Sex - Action - - - - - {{ user.pfirstName }} - {{ user.plastName }} - {{ user.sex }} - - - - - - -
-
- -
- - -
-
- -
\ No newline at end of file diff --git a/myshare/UI/src/app/person/person.edit.ts b/myshare/UI/src/app/person/person.edit.ts deleted file mode 100644 index e646013..0000000 --- a/myshare/UI/src/app/person/person.edit.ts +++ /dev/null @@ -1,585 +0,0 @@ -import { ChangeDetectorRef, Component, inject, OnDestroy, OnInit, signal, ViewChild } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import {DialogService, DynamicDialogRef} from 'primeng/dynamicdialog'; -import {DynamicDialogConfig} from 'primeng/dynamicdialog'; -import { FormControl, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms'; -import { Subject, Subscription} from 'rxjs'; -import { ConfirmationService, MessageService } from 'primeng/api'; -import { DatePickerModule } from 'primeng/datepicker'; -import { Code, RelationShipView, Person, mState, RelationShip} from '../models'; -import { AppSettingService, LookupService, Utils } from '../shares'; -import { PersonService } from './person.service'; -import { ButtonModule } from 'primeng/button'; -import { SelectModule } from 'primeng/select'; -import { CheckboxModule } from 'primeng/checkbox'; -import { InputTextModule } from 'primeng/inputtext'; -import moment from 'moment'; -import { HttpEvent } from '@angular/common/http'; -import { TableModule } from 'primeng/table'; -import { Pickperson } from '../pickperson/pickperson'; -import { ImageDisplayComponent } from '../pickperson/image.display'; -import { TooltipModule } from 'primeng/tooltip'; - -export interface FileUploadEvent { - originalEvent: HttpEvent; - files: File[]; -}; -export interface FileUploadHandlerEvent { - files: File[]; -}; - -@Component({ -templateUrl: 'person.edit.html', -selector: 'person-edit', -imports:[ButtonModule,TableModule,ReactiveFormsModule,TooltipModule, - SelectModule,CheckboxModule, InputTextModule,DatePickerModule], -styleUrls: ['person.edit.css'], -providers: [DialogService] - -}) -export class PersonEdit implements OnInit, OnDestroy { - editRef: DynamicDialogRef | undefined; - returnUrl =''; - loginUser =''; - hostsite =''; - _error =''; - _id= -1; - _partnerId = -1; - fatherList: Code[] =[]; - motherList: Code[] =[]; - sexList:Code[] =[]; - familyList: Person[] =[]; - file: File | null = null; - fileName = ''; - isNew = false; - validationPoints?: Code[]; - partners = signal([]); - deletePartner: RelationShipView[] =[]; - msg="[Family Edit Component] "; - private formBuilder = inject(UntypedFormBuilder); - private personService = inject(PersonService); - private messageService = inject(MessageService); - private confirmationService = inject(ConfirmationService); - //for focus input -// @ViewChild('mystaffid') mystaffNo!: MatInput; - isChange = true; // disable use false//true for not disable. make sure it true is disable button. - private subscription:Subscription = new Subscription(); - subChanged$ = new Subject(); - adminuserForm = this.formBuilder.group({ - id: [0], //Validators.required - email: [''], //Validators.required - firstname: ['',Validators.required], //Validators.required - lastname: ['',Validators.required], //Validators.required - phone: [''], //Validators.required - address: [''], - sex:['M',Validators.required], - image: [''], - dob: new FormControl(null), - alive: [false], //Validators.required - fatherId:[0], - motherId:[0] - - - - }); -constructor( private cdr: ChangeDetectorRef,public dialogService: DialogService, - public ref: DynamicDialogRef, public config: DynamicDialogConfig, - - private router: Router, private route: ActivatedRoute, - private appSetting: AppSettingService, - ) { - this.hostsite = this.appSetting.appSetting.attachment; - } - loadParentList( list: Person[], selfId: number): void { - this.familyList = list; - let i = 0; - let item: Code; - let family: Person; - //const list = this.familyService.parentList; - for (i = 0; i < list.length; i++) - { - family= list[i]; - if (family.id != selfId) - { - item = { id: family.id, - name: family.firstName! + " " + family.lastName!, - status: family.lastName!, - active: family.alive! - - }; - if (family.sex == 'F') - this.motherList.push(item); - else - this.fatherList.push(item); - - } - } - - - } - -getClassForRequire(prev:string,name:string){ - const notok = !this.adminuserForm.controls[name].valid && - this.adminuserForm.controls[name].touched; - let str =prev; - if (notok) - str += " ng-invalid ng-dirty"; - return str; -} - -onFileSelected(event: any) { - - const file: File = event.target.files[0]; - - if (file) { - this.file = file; - //this.messageService.add({ severity: 'info', summary: 'Success', detail: 'File Uploaded!' }); - this.adminuserForm.patchValue({ image: this.file.name }); - this.fileName = file.name; - this.subChanged$.next(false); - } - } - -deleteFile(): void { - this.confirmationService.confirm({ - - message: 'Are you sure that you want to delete image?', - header: 'Confirmation', - closable: true, - closeOnEscape: true, - icon: 'pi pi-exclamation-triangle', - rejectButtonProps: { - label: 'Cancel', - severity: 'secondary', - outlined: true, - }, - acceptButtonProps: { - label: 'Delete', - }, - accept: () => { - this.doDeleteFile(); - }, - - }); -} - -doDeleteFile(): void { - const fileName = this.adminuserForm.value.image; - const familyId = this.adminuserForm.value.id; - const data = { fileName, familyId }; - const delete$ = this.personService.deleteUploadFile(data); - this.subscription.add(delete$.subscribe( - { - next: x => { - if (x.statusCode == 1) { - { - this.adminuserForm.patchValue({ image: "" }); - this.cdr.detectChanges(); - this.messageService.add({ severity: 'success', summary: 'Delete image all ok', detail: 'file: ' + fileName }); - } - } - else { - this.messageService.add({ severity: 'error', summary: 'Error delete upload file', detail: 'Fail to delete upload file: ' + x.message }); - } - }, - error: e => { - this.messageService.add({ severity: 'error', summary: 'Error delete upload file', detail: 'Fail to delete upload file: ' + e }); - } - } - )); - - - } - -getFileToSave(file: File): FormData { - - //const familyId = this.adminuserForm.value.id!; - const formData = new FormData(); - formData.append("file", file); - return formData; - } - // formData.append("familyId", familyId.toString()); - // console.log("upload file", familyId, file); -saveFile(formData: FormData) -{ - const upload$ = this.personService.uploadFile(formData); - this.subscription.add(upload$.subscribe( - { - next: x => { - if (x.statusCode == 1) { - const filename = x.data; - //this.messageService.add({ severity: 'info', summary: 'Success', detail: 'File Uploaded to server API: ' + x.data }); - this.adminuserForm.patchValue({ image: filename }); - this.cdr.detectChanges(); - } - else - this.messageService.add({ severity: 'error', summary: 'Error upload file', detail: 'Fail to upload file: ' + x.message }); - }, - error: e => - this.messageService.add({ severity: 'error', summary: 'Error upload file', detail: 'Fail to upload file: ' }) - - } - )); -} - -populateSex(): void { - let item: Code; - item = { - id:1, - name:"Female", - status:'F' - }; - this.sexList.push(item); - item = { - id:2, - name:"Male", - status:'M' - }; - this.sexList.push(item); -} - -ngOnInit():void { - this.populateSex(); - const id = this.config.data.id; - console.log("family edit", this.config); - this.loadParentList(this.config.data.familyList, id); - //this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; -// const id = Number(this.route.snapshot.paramMap.get('id')); - // now load thing up - const user = Utils.getCurrentUser(); -// console.log(this.msg + "current login user ", user); - if (user.username === '') - alert("you are not login."); - else - this.loginUser = user.firstName; - this._id = id; - //console.log(this.msg + " " + id ); - this.subscription.add(this.adminuserForm.valueChanges.subscribe(x => this.isChange = false)); - this.subscription.add(this.subChanged$.subscribe(x => this.isChange = x)); - if (id > 0) - { - this.isNew = false; - this.subscription.add( - this.personService.loadPersonById(id).subscribe({ - next: x => this.assignValue(x.data), - error: e => console.log(e) - }) - ); - } - else - { - this.isNew = true; - } - -} - -// this for disable submit button -get isFieldsChange() { - const chan = this.isChange || !this.adminuserForm.valid; // this disable so need true valid = true not - console.log(this.msg + 'is fields change', chan); - return chan; -} - -doViewImage(imageName:string): void { - const ref = this.dialogService.open(ImageDisplayComponent, { - data: { - imageName, - }, - - header: 'View Image', - draggable: true, - width: '70%', - modal:true, - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - this.messageService.add({severity:'success', summary: 'Select', detail: item.firstName!}); - //update the current list - - } - }); -} - -assignValue(item:Person): void { - this._id = item.id; - this.fileName = item.image!; - if (item.relationShips) - this.populatePartner(item.relationShips, item.id); - this.adminuserForm.patchValue({ - id: item.id, - email: item.email, - firstname: item.firstName, - lastname: item.lastName, - alive: item.alive, - phone: item.phone, - address: item.address, - fatherId: item.fatherId, - motherId: item.motherId, - sex: item.sex, - image: item.image - }); - const dob = item.dob; - if (dob) - { - this.adminuserForm.patchValue({ - dob: moment(dob).toDate() - }); - } - // disable use false//true for not disable. - this.subChanged$.next(true); - } - - // convenience getter for easy access in form fields - get f() { return this.adminuserForm.controls;} - validate(adminuser:Person): boolean { - let result = true; - console.log("validate", adminuser); - if (!adminuser.firstName) - { - this._error = 'firstname is blank or empty'; - result = false; - } - else if (adminuser.lastName == '') - { - this._error = 'lastname is blank or empty'; - result = false; - } - return result; - } - - getPartnerForSave(): RelationShip[] { - let rlist: RelationShip[]= []; - let i =0; - let vitem: RelationShipView; - let item: RelationShip; - for (i = 0; i < this.deletePartner.length; i++) - { - vitem = this.deletePartner[i]; - item = { - id: vitem.id, - personId: vitem.personId, - state: mState.Delete, - relatePersonId: vitem.relatePersonId - }; - rlist.push(item); - console.log("get partner for save delete list ", vitem); - } - console.log("get partner for save before loop this.partners ", i); - for (i = 0; i < this.partners().length; i++) - { - vitem = this.partners()[i]; - if (vitem.state == mState.New || vitem.state == mState.Modified) - { - item = { - id: vitem.id, - personId: vitem.personId, - state: vitem.state, - relatePersonId: vitem.relatePersonId - }; - rlist.push(item); - } - console.log("get partner for save in partner list ", vitem); - } - - - return rlist; - } - - async onSubmit(e:Event): Promise { - e.preventDefault(); - // if form valid then go save - //make sure - const okToSave = this.adminuserForm.valid; - if (okToSave) - { - let adminuserValue = this.adminuserForm.value; - - let item:Person = { - id: adminuserValue.id, - email: adminuserValue.email, - firstName: adminuserValue.firstname, - lastName: adminuserValue.lastname, - alive: adminuserValue.alive, - phone: adminuserValue.phone, - address: adminuserValue.address, - image:adminuserValue.image, - fatherId: adminuserValue.fatherId, - motherId: adminuserValue.motherId, - sex: adminuserValue.sex - }; - - if (adminuserValue.dob) - { - item.dob = moment(adminuserValue.dob).format("YYYY-MM-DD"); - } - - this._error =''; - const allOK = this.validate(item); - if (allOK) - { - let container:any = { - person: item - }; - if (this.file != null) - { - container.formData = await Utils.toBase64(this.file); - container.fileName = this.file.name; - console.log('image as base64 ', container); - } - container.person.relationShips = this.getPartnerForSave(); - this.subscription.add ( - this.personService.savePerson(container).subscribe({ - next: x => { - if (x.statusCode >= 1) - { - item.id = x.data; - // this.messageService.add({severity:'success', summary: 'Save user', detail: item.firstName + " " + item.lastName }); - //this.router.navigate([this.returnUrl]); - console.log("the person after save", item); - this.ref.close(item); - } - else - { - this.messageService.add({severity:'error', summary: 'Error', detail: x.message }); - } - }, - error: e => { - const message = e.message; - this.messageService.add({severity:'error', summary: 'Error', detail: message }); - console.error("error ", e); - } - }) - ); - } - else - this.messageService.add({severity:'error', summary: 'Error', detail: this._error }); - } -} -getFamilyById(id: number): Person | undefined { - let result:Person |undefined; - result = this.familyList.find(x => x.id == id); - return result; -} -populatePartner(list: RelationShip[], personId: number): void { - let item: RelationShip; - let vitem: RelationShipView; - let vlist: RelationShipView[] =[]; - let i = 0; - let family:Person|undefined; - for (i = 0; i < list.length; i++) - { - item = list[i]; - if (item.relatePersonId != personId) - { - family = this.getFamilyById(item.relatePersonId); - } - else - { - - family = this.getFamilyById(item.personId); - } - if (family) - { - vitem = { - id: item.id, - personId: item.personId, - relatePersonId: item.relatePersonId, - pfirstName: family.firstName, - plastName: family.lastName, - sex: family.sex, - state:mState.NoChange - }; - vlist.push(vitem); - } - } - if (vlist.length > 0) - this.partners.set(vlist); -} - - -addPartner(): void { - const title = "Partner"; - this.showPickPerson(title, (sfamily: Person) => { - let item: RelationShipView = { - id: this._partnerId--, - state: mState.New, - personId: this._id, - relatePersonId: sfamily.id, - pfirstName: sfamily.firstName, - plastName: sfamily.lastName, - sex: sfamily.sex, - }; - const fm = this.partners(); - fm.push(item); - this.partners.set(fm); - this.subChanged$.next(false); - console.log("after put in partners list", this.partners()); - }); -} - -onDeletePartner(item:RelationShipView): void { - this.confirmationService.confirm({ - - message: 'Are you sure that you want to delete partner?', - header: 'Confirmation', - closable: true, - closeOnEscape: true, - icon: 'pi pi-exclamation-triangle', - rejectButtonProps: { - label: 'Cancel', - severity: 'secondary', - outlined: true, - }, - acceptButtonProps: { - label: 'Delete', - }, - accept: () => { - this.doDeletePartner(item); - }, - - }); -} - -doDeletePartner(item:RelationShipView): void { - if (item.id > 0) - { - this.deletePartner.push(item); - } - const dlist = this.partners().filter(x => x.id != item.id); - this.partners.set(dlist); - console.log("after delete partners list", this.partners()); - this.subChanged$.next(false); -} - -showPickPerson(title:string, callback:(id: Person) => void) :void { - const ref = this.dialogService.open(Pickperson, { - data: { - familyList: this.familyList, - }, - header: title, - width: '80%', - draggable: true, - maximizable: true - }); - - ref.onClose.subscribe((item: Person) => { - if (item) { - //console.log("after close ward edit", item); - this.messageService.add({severity:'success', summary: 'Select', detail: item.firstName!}); - //update the current list - callback(item); - } - }); -} - -cancel(e:Event):void { - e.preventDefault(); - this.ref.close(null); - } -ngOnDestroy() { - this.subscription.unsubscribe(); -} -} diff --git a/myshare/UI/src/app/person/person.service.ts b/myshare/UI/src/app/person/person.service.ts deleted file mode 100644 index 1bd4ba4..0000000 --- a/myshare/UI/src/app/person/person.service.ts +++ /dev/null @@ -1,92 +0,0 @@ - -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Staff,StaffSearch, StaffView, ResultModel,ConfigureUrl,ResetPassword, Person, PersonContainer, RelationShip } from '../models'; -import { AppSettingService } from '../shares'; -import { TreeNode } from 'primeng/api'; - -@Injectable({ providedIn: 'root' }) -export class PersonService { - public searchCriteria: StaffSearch; - public parentList: Person[] =[]; - constructor(private http: HttpClient, - - private appSetting :AppSettingService - ) { - this.searchCriteria = { - email:'', - firstName: '', - lastName:'' - }; - - } - searchPersons(criteria: StaffSearch): Observable> { - let config = { headers : { 'Content-Type': 'application/json' } }; - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl + "/SearchPerson"; - return this.http.post>(baseUrl, criteria, config); - } - - loadPersonById(id:number): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl; - /* - const params = new HttpParams().set("id", ""+id); - const headers = new HttpHeaders().set('Content-Type', 'application/json'); - const options = { - headers: headers, - params: params - }; - */ - - return this.http.get>(baseUrl + "/GetById/" + id); - } - loadPersonFamily(id: number): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl; - return this.http.get>(baseUrl + "/GetByPersonFamily/" + id); - } - - loadPersonFamilyTree(useFather: boolean, useMother: boolean): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl; - const data = {useFather,useMother}; - return this.http.post>(baseUrl + "/GetFamilyTreeBy", data); - } - - loadChildrenById(fatherId:number, motherId: number): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl; - const data = {fatherId,motherId}; - - return this.http.post>(baseUrl + "/GetChildress/" ,data); - } - loadRelationshipById(personId:number): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.relationShipUrl; - return this.http.get>(baseUrl + "/GetByPersonId/" +personId); - } - savePerson(data:PersonContainer): Observable> { //insert Adminuser - let config = { headers : { 'Content-Type': 'application/json' } }; - console.log("save family", data); - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl +"/SavePerson"; - return this.http.post>(baseUrl, data, config); - } - - deletePerson(id:number): Observable>{ - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.personUrl; - const data = {id}; - return this.http.post>(baseUrl + "/DeleteById" ,data); - } - uploadFile(data: any): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/" + ConfigureUrl.personUrl + "/UploadImage"; - return this.http.post>(baseUrl, data); - } - downloadFile(imageName: string): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/" + ConfigureUrl.FileUploadUrl + "/DownloadFile"; - const data = { - fileName: imageName - }; - return this.http.post>(baseUrl, data); - } - deleteUploadFile(data: any): Observable> { - //data ={filename}; - const baseUrl = this.appSetting.appSetting.baseUrl + "/" + ConfigureUrl.personUrl + "/DeleteUploadFile"; - return this.http.post>(baseUrl, data); - } -} diff --git a/myshare/UI/src/app/pickperson/image.display.css b/myshare/UI/src/app/pickperson/image.display.css deleted file mode 100644 index e69de29..0000000 diff --git a/myshare/UI/src/app/pickperson/image.display.html b/myshare/UI/src/app/pickperson/image.display.html deleted file mode 100644 index 2888bbe..0000000 --- a/myshare/UI/src/app/pickperson/image.display.html +++ /dev/null @@ -1,6 +0,0 @@ -Person Image -
- - -
\ No newline at end of file diff --git a/myshare/UI/src/app/pickperson/image.display.ts b/myshare/UI/src/app/pickperson/image.display.ts deleted file mode 100644 index fc8f6de..0000000 --- a/myshare/UI/src/app/pickperson/image.display.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Component, inject, OnDestroy, OnInit, signal } from '@angular/core'; -import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; -import { AppSettingService } from '../shares'; -import { PersonService } from '../person'; -import { Subscription } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; -import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; - -@Component({ - selector: 'app-image-display', - imports:[CommonModule, ButtonModule], - templateUrl: './image.display.html', - styleUrls: ['./image.display.css'] -}) -export class ImageDisplayComponent implements OnInit, OnDestroy { - //base64ImageString: string = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='; // Example Base64 (a tiny red dot PNG) - //imageDataUrl: SafeResourceUrl ={}; - imageDataUrl = signal(""); - private personService = inject(PersonService); - private sanitizer = inject(DomSanitizer); - //private route = inject(ActivatedRoute); - public ref = inject(DynamicDialogRef); - public config = inject(DynamicDialogConfig); - private subscription:Subscription = new Subscription(); - - ngOnInit(): void { - - const imageName = this.config.data.imageName; - this.loadImage(imageName); - - } - loadImage(fileName: string| null): void { - const download = this.personService.downloadFile(fileName!); - this.subscription.add(download.subscribe({ - next: x => { - if (x.statusCode == 1) - { - this.display(x.data); - console.log("this is show image" , this.imageDataUrl(), x); - } - else - { - console.log("error in download in api ", x.message); - } - }, - error: e => console.error("error in download image", e) - })); - } - display(baseImage: string): void - { - const changeUrl = (this.sanitizer.bypassSecurityTrustResourceUrl(baseImage) as any).changingThisBreaksApplicationSecurity; - console.log('this is bypassSecurityTrustResourceUrl', changeUrl); - const fullDataUri = `data:image/png;base64,${changeUrl}`; - this.imageDataUrl.set(fullDataUri); - } - ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - close() :void { - this.ref.close(null); - } -} \ No newline at end of file diff --git a/myshare/UI/src/app/pickperson/pickperson.css b/myshare/UI/src/app/pickperson/pickperson.css deleted file mode 100644 index e69de29..0000000 diff --git a/myshare/UI/src/app/pickperson/pickperson.html b/myshare/UI/src/app/pickperson/pickperson.html deleted file mode 100644 index d56bbb3..0000000 --- a/myshare/UI/src/app/pickperson/pickperson.html +++ /dev/null @@ -1,47 +0,0 @@ -
- - -
- - - - - - -
-
- - - Last Name - - First Name - - Sex - - - - - - - {{user.lastName}} - {{user.firstName}} - {{user.sex}} - - - -
-
- - -
-
- diff --git a/myshare/UI/src/app/pickperson/pickperson.ts b/myshare/UI/src/app/pickperson/pickperson.ts deleted file mode 100644 index 3b5753d..0000000 --- a/myshare/UI/src/app/pickperson/pickperson.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, OnDestroy, OnInit, signal, ViewChild } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Table, TableModule } from 'primeng/table'; -import { Person } from '../models'; -import { IconFieldModule } from 'primeng/iconfield'; -import { InputIconModule } from 'primeng/inputicon'; -import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; - -@Component({ - selector: 'app-pickperson', - imports: [TableModule, ButtonModule,CommonModule, InputTextModule, FormsModule,IconFieldModule,InputIconModule], - templateUrl: './pickperson.html', - styleUrl: './pickperson.css' -}) -export class Pickperson implements OnInit, OnDestroy{ - @ViewChild(Table) dt2!: Table; - constructor(public ref: DynamicDialogRef, public config: DynamicDialogConfig) - { - - } - loading = false; - familyList = signal([]); - selectedPerson!: Person; - handleInput(event: Event) { - const value = (event.target as HTMLInputElement).value; - this.dt2.filterGlobal(value, 'contains'); - } - - edit(id: number): void { - - } - cancel(e:Event):void { - e.preventDefault(); - this.ref.close(null); - } - select(e:Event):void { - e.preventDefault(); - this.ref.close(this.selectedPerson); - } - - ngOnDestroy(): void { - - } - ngOnInit(): void { - console.log("pick person the familyList", this.config); - this.familyList.set(this.config.data.familyList); - - } - -} diff --git a/myshare/UI/src/app/route-guard/auth.guard.ts b/myshare/UI/src/app/route-guard/auth.guard.ts deleted file mode 100644 index fd14db4..0000000 --- a/myshare/UI/src/app/route-guard/auth.guard.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Utils } from '../shares'; -import {AuthenticationService} from '../user-services/authentication.service'; -@Injectable({ providedIn: 'root' }) -export class AuthGuard { - msg ="[AuthGuard] "; - constructor(private router: Router, - private authService :AuthenticationService ) { } - - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - const roleAllowed = route.data['roleAllowed']; - const user = Utils.getCurrentUser(); - const userRole = Utils.getUserRole(user); - let hasLoggedIn = Utils.getIsAuth(); - //console.log(this.msg + " the userlogin ", user, hasLoggedIn); - if (hasLoggedIn) { - - if (roleAllowed != undefined) - { - //it number toString - // console.log("[auth-guard] ther roleAllow ", roleAllowed); - // console.log("[auth-guard] before roleAllow ", roleAllowed,userRole); - if (roleAllowed.indexOf(userRole.toString()) != -1) { - // console.log("[auth-guard] pass roleAllow ", roleAllowed,userRole); - return true; - } - else { - this.authService.logout(); - this.router.navigate(['/login']); - return false; - } - } - else //if no role define just return hasLoggedIn - { - return hasLoggedIn; - } - } - else - { - // this.authService.logout(); - this.router.navigate(['/login']); - return false; - } - - // not logged in so redirect to login page with the return url - //this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } }); - this.authService.logout(); - return false; - } - -} diff --git a/myshare/UI/src/app/route-guard/index.ts b/myshare/UI/src/app/route-guard/index.ts deleted file mode 100644 index b41e34a..0000000 --- a/myshare/UI/src/app/route-guard/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './auth.guard'; diff --git a/myshare/UI/src/app/shares/CommonUtilities.ts b/myshare/UI/src/app/shares/CommonUtilities.ts deleted file mode 100644 index 46f5788..0000000 --- a/myshare/UI/src/app/shares/CommonUtilities.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { FormControl, FormGroup } from '@angular/forms'; - -export class CommonUtilities { - /** Display the blob */ - static displayFileInNewTab(response:any, defaultFileName:string) { - const contentType = response.headers.get('content-type'); - const blob = new Blob([response.body], { type: contentType }); - const fileName = this.getFileName(response,defaultFileName); - const nav = (window.navigator as any); - if (nav.msSaveOrOpenBlob) { - nav.msSaveOrOpenBlob(blob, fileName); - } else { - const data = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = data; - link.target = '_blank'; - link.click(); - } - } - /*** Download the blob ***/ - static downloadFile(response:any, defaultFileName:string) { - const contentType = response.headers.get('content-type'); - const blob = new Blob([response.body], { type: contentType }); - const fileName = this.getFileName(response,defaultFileName); - const nav = (window.navigator as any); - if (typeof nav.msSaveBlob === 'function') - { - console.log("download the report saveblob"); - nav.msSaveBlob(blob, fileName); - console.log("download the report saveblob done"); - } - else { - const link = document.createElement('a'); - link.href = window.URL.createObjectURL(blob); - console.log("no msSaveBlob download the report saveblob done"); - //link.download? = fileName; - link.download = fileName; - link.click(); - } - } - /** Get the attachment file name */ - static getFileName(response:any, defaultFileName:string) { - const contentDis = response.headers.get('content-disposition'); - let fileName =defaultFileName; - if (contentDis && contentDis.indexOf('attachment') !== -1) { - const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; - const matches = filenameRegex.exec(contentDis); - if (matches != null && matches[1]) { - fileName = matches[1].replace(/['"]/g, ''); - } - } - return fileName; - } -} \ No newline at end of file diff --git a/myshare/UI/src/app/shares/appsetting.ts b/myshare/UI/src/app/shares/appsetting.ts deleted file mode 100644 index aecf15d..0000000 --- a/myshare/UI/src/app/shares/appsetting.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { firstValueFrom, Observable } from 'rxjs'; -export function initializeApp_old(appInitService: AppSettingService) { - return (): Promise => { - return appInitService.loadAppSetting_p(); - } - -}; -export function initializeApp() { - return (): Promise => { - return inject(AppSettingService).loadAppSetting_p(); - } - // return () => inject(AppSettingService).loadAppSetting(); -}; - -@Injectable({ providedIn: 'root' }) -export class AppSettingService { - private _appsetting: any; - constructor(private http: HttpClient - ) { } - - public loadAppSetting_p(): Promise { - const source$ = this.http.get("config/appsetting.json") - const rs$ = firstValueFrom(source$) - .then(x => { - this._appsetting = x; - console.log("[AppSettingService] assign", x); - }); - return rs$; - } - public loadAppSetting(): Observable { - const source$ = this.http.get("config/appsetting.json") - return source$; - } - set appSetting(value: any) { - this._appsetting = value; - } - get appSetting(): any { - return this._appsetting; - } - -} -/* angular 19 new one in app.config.ts - provideAppInitializer(initializeApp()), - -/* module put this -to use it -in app.module.ts -add -1) - providers: [ - { provide : APP_INITIALIZER, multi : true, deps : [AppSettingService], - useFactory: initializeApp - }, - ] - -2) -other this one work too. -providers: [ -{ - provide : APP_INITIALIZER, - multi : true, - deps : [AppSettingService], - useFactory : (appConfigService : AppSettingService) => () => appConfigService.loadAppSetting() -} -] - -to use it calling something like this -export class TestComponent { - public test1ServiceUrl: string; - - constructor(public configService: AppConfigService) { - this.test1ServiceUrl = this.configService.appSetting.test1ServiceUrl; - } -} -*/ \ No newline at end of file diff --git a/myshare/UI/src/app/shares/error.interceptor.ts b/myshare/UI/src/app/shares/error.interceptor.ts deleted file mode 100644 index 5379593..0000000 --- a/myshare/UI/src/app/shares/error.interceptor.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Injectable, inject } from '@angular/core'; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpInterceptorFn, HttpHandlerFn } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import { AuthenticationService } from '../user-services'; -//import { ToastrService } from 'ngx-toastr'; -import { NavigationExtras, Router } from '@angular/router'; -/* -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - //private authenticationService: AuthenticationService; - constructor( - private router: Router, - // private toastr: ToastrService, - ) { } - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - // console.log("I am intercept to catch error status = 401...", request); - return next.handle(request).pipe(catchError(err => { - /* no use yet - if (err) { - switch(err.status) { - case 400: - if (err.error.errors) { - const modalStateErrors = []; - for (const key in err.error.errors) { - if (err.error.errors[key]) { - modalStateErrors.push(err.error.errors[key]); - } - } - throw modalStateErrors; - } else { - this.toastr.error(err.statusText, err.status); - } - break; - case 401: - this.toastr.error(err.statusText, err.status); - break; - case 404: - this.router.navigateByUrl('/not-found'); - break; - case 500: - const navigationExtras: NavigationExtras = {state:{error:err.error}}; - this.router.navigateByUrl('/server-error', navigationExtras); - break; - default: - this.toastr.error('Something unexpected went wrong'); - console.log("this error interceptor",err); - break; - } - } - */ -/* - if (err.status === 401) { - // auto logout if 401 response returned from api Unauthorized - // this.authenticationService.logout(); - //location.reload(); - const error = err.error.message || err.statusText; - console.log("After I Get Error status = 401...", error, err); - return throwError(error); - } - else { - console.log("I Get Error .", err); - return throwError(err); - } - })) -} -} - -*/ -//new one -//https://blog.ninja-squad.com/2022/11/09/angular-http-in-standalone-applications/ -//////////////// -export const ErrorInterceptor: HttpInterceptorFn = (req: HttpRequest, next: HttpHandlerFn): Observable> => { - const authenticationService = inject(AuthenticationService); - - // logger.log(`Request is on its way to ${req.url}`); - return next(req).pipe(catchError(err => { - if (err.status === 401) { - // auto logout if 401 response returned from api Unauthorized - // this.authenticationService.logout(); - //location.reload(); - const error = err.error.message || err.statusText; - // console.log("After I Get Error status = 401...", error, err); - return throwError(() => error); - } - else { - console.log("I Get Error .", err); - return throwError(() => err); - } - - })); -} - -//////////////// - diff --git a/myshare/UI/src/app/shares/httpfile.service.ts b/myshare/UI/src/app/shares/httpfile.service.ts deleted file mode 100644 index aa32074..0000000 --- a/myshare/UI/src/app/shares/httpfile.service.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; -import { ConfigureUrl } from '../models'; -import { AppSettingService } from './appsetting'; - - -@Injectable({ - providedIn: 'root' -}) -export class HttpUtility { - private baseApiUrl: string = ""; - constructor(private http: HttpClient, - private appSetting :AppSettingService, - private router: Router) { - } - /** - * getFile - * @param url - */ - public getFileAsText(url: string): Observable { - return this.http - .get(this.getApiUrl(url), { responseType: 'blob' as 'text' }) - .pipe(catchError(e => this.handleError(e))); - } - /** - * getFile - * @param url - */ - public getFile(url: string): Observable { - return this.http - .get(this.getApiUrl(url), { responseType: 'blob' as 'json' }) - .pipe(catchError(e => this.handleError(e))); - } - - /** - * handleError - * @param response - */ - private handleError(errorResponse: HttpErrorResponse) { - // in a real world app, we may send the server to some remote logging infrastructure - // instead of just logging it to the console - return throwError(errorResponse); - } - //get excel file zip file etc .. - /* - allowedToDisplay = [ - this.mimeConstant.png, - this.mimeConstant.jpeg, - this.mimeConstant.jpg, - this.mimeConstant.gif, - this.mimeConstant.txt, - this.mimeConstant.pdf - ]; - */ - /* how to use it - this.http.getFileResponse(`Person/GetPhoto?recordId=${personId}`).pipe( - catchError(err => { - this.snackBar.error(err || this.constants.error_Getting_photo); - return EMPTY; - }), - finalize(() => { - this.spinner.hide(); - })).subscribe(response => { - if (response) { - if (isDownload) { - CommonUtilities.downloadFile(response); - } else { - if (response.body && response.body.type) { - if (this.allowedToDisplay.includes(response.body.type)) { - CommonUtilities.displayFileInNewTab(response); - } else { - this.temporaryFile = response; - this.downloadWarning = true; - } - } - } - } - }); - */ - public getFileResponse(url: string, data?: any): Observable { - if (data) { - return this.http.post(this.getApiUrl(url), - data, - { responseType: 'blob', observe: 'response' }) - .pipe(catchError(e => this.handleError(e))); - - } - return this.http - .get(this.getApiUrl(url), { responseType: 'blob', observe: 'response' }) - .pipe(catchError(e => this.handleError(e))); - } - - public getFileAsPDF(url: string, data: any): Observable { - let updateURL; - if (data) { - updateURL = url + data; - } else { - updateURL = url; - } - return this.http - .get(this.getApiUrl(updateURL), { responseType: 'blob' as 'text', observe: 'response' }) - .pipe(catchError(e => this.handleError(e))); - } - /** - * getApiUrl - * @param url - */ - private getApiUrl(url:string) { - const baseUrl = this.appSetting.appSetting.baseUrl; - return baseUrl + "/"+ url; - } -} \ No newline at end of file diff --git a/myshare/UI/src/app/shares/index.ts b/myshare/UI/src/app/shares/index.ts deleted file mode 100644 index 31c1fea..0000000 --- a/myshare/UI/src/app/shares/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './utils'; -export {initializeApp, AppSettingService} from './appsetting'; -export * from './error.interceptor'; -export * from './jwt.interceptor'; -export * from './lookup.service'; -export * from './httpfile.service'; -export * from './CommonUtilities'; -export * from './timeinput'; \ No newline at end of file diff --git a/myshare/UI/src/app/shares/inputtext.txt b/myshare/UI/src/app/shares/inputtext.txt deleted file mode 100644 index 0415954..0000000 --- a/myshare/UI/src/app/shares/inputtext.txt +++ /dev/null @@ -1,1554 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { - AfterContentInit, - booleanAttribute, - ChangeDetectionStrategy, - Component, - ContentChild, - ContentChildren, - ElementRef, - EventEmitter, - forwardRef, - HostBinding, - inject, - Injector, - Input, - NgModule, - numberAttribute, - OnChanges, - OnInit, - Output, - QueryList, - SimpleChanges, - TemplateRef, - ViewChild, - ViewEncapsulation -} from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms'; -import { getSelection } from '@primeuix/utils'; -import { PrimeTemplate, SharedModule } from 'primeng/api'; -import { AutoFocus } from 'primeng/autofocus'; -import { BaseComponent } from 'primeng/basecomponent'; -import { AngleDownIcon, AngleUpIcon, TimesIcon } from 'primeng/icons'; -import { InputText } from 'primeng/inputtext'; -import { Nullable } from 'primeng/ts-helpers'; -import { InputNumberInputEvent } from './inputnumber.interface'; -import { InputNumberStyle } from './style/inputnumberstyle'; - -export const INPUTNUMBER_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => InputNumber), - multi: true -}; -/** - * InputNumber is an input component to provide numerical input. - * @group Components - */ -@Component({ - selector: 'p-inputNumber, p-inputnumber, p-input-number', - standalone: true, - imports: [CommonModule, InputText, AutoFocus, TimesIcon, AngleUpIcon, AngleDownIcon, SharedModule], - template: ` - - - - - - - - - - - - - - - `, - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [INPUTNUMBER_VALUE_ACCESSOR, InputNumberStyle], - encapsulation: ViewEncapsulation.None, - host: { - '[attr.data-pc-name]': "'inputnumber'", - '[attr.data-pc-section]': "'root'", - '[class]': 'hostClass' - } -}) -export class InputNumber extends BaseComponent implements OnInit, AfterContentInit, OnChanges, ControlValueAccessor { - /** - * Displays spinner buttons. - * @group Props - */ - @Input({ transform: booleanAttribute }) showButtons: boolean = false; - /** - * Whether to format the value. - * @group Props - */ - @Input({ transform: booleanAttribute }) format: boolean = true; - /** - * Layout of the buttons, valid values are "stacked" (default), "horizontal" and "vertical". - * @group Props - */ - @Input() buttonLayout: string = 'stacked'; - /** - * Identifier of the focus input to match a label defined for the component. - * @group Props - */ - @Input() inputId: string | undefined; - /** - * Style class of the component. - * @group Props - */ - @Input() styleClass: string | undefined; - /** - * Inline style of the component. - * @group Props - */ - @Input() style: { [klass: string]: any } | null | undefined; - /** - * Advisory information to display on input. - * @group Props - */ - @Input() placeholder: string | undefined; - /** - * Defines the size of the component. - * @group Props - */ - @Input() size: 'large' | 'small'; - /** - * Maximum number of character allows in the input field. - * @group Props - */ - @Input({ transform: numberAttribute }) maxlength: number | undefined; - /** - * Specifies tab order of the element. - * @group Props - */ - @Input({ transform: numberAttribute }) tabindex: number | undefined; - /** - * Title text of the input text. - * @group Props - */ - @Input() title: string | undefined; - /** - * Specifies one or more IDs in the DOM that labels the input field. - * @group Props - */ - @Input() ariaLabelledBy: string | undefined; - /** - * Specifies one or more IDs in the DOM that describes the input field. - * @group Props - */ - @Input() ariaDescribedBy: string | undefined; - /** - * Used to define a string that labels the input element. - * @group Props - */ - @Input() ariaLabel: string | undefined; - /** - * Used to indicate that user input is required on an element before a form can be submitted. - * @group Props - */ - @Input({ transform: booleanAttribute }) ariaRequired: boolean | undefined; - /** - * Name of the input field. - * @group Props - */ - @Input() name: string | undefined; - /** - * Indicates that whether the input field is required. - * @group Props - */ - @Input({ transform: booleanAttribute }) required: boolean | undefined; - /** - * Used to define a string that autocomplete attribute the current element. - * @group Props - */ - @Input() autocomplete: string | undefined; - /** - * Mininum boundary value. - * @group Props - */ - @Input({ transform: numberAttribute }) min: number | undefined; - /** - * Maximum boundary value. - * @group Props - */ - @Input({ transform: numberAttribute }) max: number | undefined; - /** - * Style class of the increment button. - * @group Props - */ - @Input() incrementButtonClass: string | undefined; - /** - * Style class of the decrement button. - * @group Props - */ - @Input() decrementButtonClass: string | undefined; - /** - * Style class of the increment button. - * @group Props - */ - @Input() incrementButtonIcon: string | undefined; - /** - * Style class of the decrement button. - * @group Props - */ - @Input() decrementButtonIcon: string | undefined; - /** - * When present, it specifies that an input field is read-only. - * @group Props - */ - @Input({ transform: booleanAttribute }) readonly: boolean = false; - /** - * Step factor to increment/decrement the value. - * @group Props - */ - @Input({ transform: numberAttribute }) step: number = 1; - /** - * Determines whether the input field is empty. - * @group Props - */ - @Input({ transform: booleanAttribute }) allowEmpty: boolean = true; - /** - * Locale to be used in formatting. - * @group Props - */ - @Input() locale: string | undefined; - /** - * The locale matching algorithm to use. Possible values are "lookup" and "best fit"; the default is "best fit". See Locale Negotiation for details. - * @group Props - */ - @Input() localeMatcher: any; - /** - * Defines the behavior of the component, valid values are "decimal" and "currency". - * @group Props - */ - @Input() mode: string | any = 'decimal'; - /** - * The currency to use in currency formatting. Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB. There is no default value; if the style is "currency", the currency property must be provided. - * @group Props - */ - @Input() currency: string | undefined; - /** - * How to display the currency in currency formatting. Possible values are "symbol" to use a localized currency symbol such as €, ü"code" to use the ISO currency code, "name" to use a localized currency name such as "dollar"; the default is "symbol". - * @group Props - */ - @Input() currencyDisplay: string | undefined | any; - /** - * Whether to use grouping separators, such as thousands separators or thousand/lakh/crore separators. - * @group Props - */ - @Input({ transform: booleanAttribute }) useGrouping: boolean = true; - /** - * Specifies the input variant of the component. - * @group Props - */ - @Input() variant: 'filled' | 'outlined'; - /** - * The minimum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number and percent formatting is 0; the default for currency formatting is the number of minor unit digits provided by the ISO 4217 currency code list (2 if the list doesn't provide that information). - * @group Props - */ - @Input({ transform: (value: unknown) => numberAttribute(value, null) }) minFractionDigits: number | undefined; - /** - * The maximum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number formatting is the larger of minimumFractionDigits and 3; the default for currency formatting is the larger of minimumFractionDigits and the number of minor unit digits provided by the ISO 4217 currency code list (2 if the list doesn't provide that information). - * @group Props - */ - @Input({ transform: (value: unknown) => numberAttribute(value, null) }) maxFractionDigits: number | undefined; - /** - * Text to display before the value. - * @group Props - */ - @Input() prefix: string | undefined; - /** - * Text to display after the value. - * @group Props - */ - @Input() suffix: string | undefined; - /** - * Inline style of the input field. - * @group Props - */ - @Input() inputStyle: any; - /** - * Style class of the input field. - * @group Props - */ - @Input() inputStyleClass: string | undefined; - /** - * When enabled, a clear icon is displayed to clear the value. - * @group Props - */ - @Input({ transform: booleanAttribute }) showClear: boolean = false; - /** - * When present, it specifies that the component should automatically get focus on load. - * @group Props - */ - @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; - /** - * When present, it specifies that the element should be disabled. - * @group Props - */ - @Input() get disabled(): boolean | undefined { - return this._disabled; - } - set disabled(disabled: boolean | undefined) { - if (disabled) this.focused = false; - - this._disabled = disabled; - - if (this.timer) this.clearTimer(); - } - /** - * Spans 100% width of the container when enabled. - * @group Props - */ - @Input({ transform: booleanAttribute }) fluid: boolean = false; - /** - * Callback to invoke on input. - * @param {InputNumberInputEvent} event - Custom input event. - * @group Emits - */ - @Output() onInput: EventEmitter = new EventEmitter(); - /** - * Callback to invoke when the component receives focus. - * @param {Event} event - Browser event. - * @group Emits - */ - @Output() onFocus: EventEmitter = new EventEmitter(); - /** - * Callback to invoke when the component loses focus. - * @param {Event} event - Browser event. - * @group Emits - */ - @Output() onBlur: EventEmitter = new EventEmitter(); - /** - * Callback to invoke on input key press. - * @param {KeyboardEvent} event - Keyboard event. - * @group Emits - */ - @Output() onKeyDown: EventEmitter = new EventEmitter(); - /** - * Callback to invoke when clear token is clicked. - * @group Emits - */ - @Output() onClear: EventEmitter = new EventEmitter(); - - /** - * Template of the clear icon. - * @group Templates - */ - @ContentChild('clearicon', { descendants: false }) clearIconTemplate: Nullable>; - /** - * Template of the increment button icon. - * @group Templates - */ - @ContentChild('incrementbuttonicon', { descendants: false }) incrementButtonIconTemplate: Nullable>; - - /** - * Template of the decrement button icon. - * @group Templates - */ - @ContentChild('decrementbuttonicon', { descendants: false }) decrementButtonIconTemplate: Nullable>; - - @ContentChildren(PrimeTemplate) templates!: QueryList; - - @ViewChild('input') input!: ElementRef; - - _clearIconTemplate: TemplateRef | undefined; - - _incrementButtonIconTemplate: TemplateRef | undefined; - - _decrementButtonIconTemplate: TemplateRef | undefined; - - value: Nullable; - - onModelChange: Function = () => {}; - - onModelTouched: Function = () => {}; - - focused: Nullable; - - initialized: Nullable; - - groupChar: string = ''; - - prefixChar: string = ''; - - suffixChar: string = ''; - - isSpecialChar: Nullable; - - timer: any; - - lastValue: Nullable; - - _numeral: any; - - numberFormat: any; - - _decimal: any; - - _decimalChar: string; - - _group: any; - - _minusSign: any; - - _currency: Nullable; - - _prefix: Nullable; - - _suffix: Nullable; - - _index: number | any; - - _disabled: boolean | undefined; - - _componentStyle = inject(InputNumberStyle); - - private ngControl: NgControl | null = null; - - get _rootClass() { - return this._componentStyle.classes.root({ instance: this }); - } - - get hasFluid() { - const nativeElement = this.el.nativeElement; - const fluidComponent = nativeElement.closest('p-fluid'); - return this.fluid || !!fluidComponent; - } - - get _incrementButtonClass() { - return this._componentStyle.classes.incrementButton({ instance: this }); - } - - get _decrementButtonClass() { - return this._componentStyle.classes.decrementButton({ instance: this }); - } - - constructor(public readonly injector: Injector) { - super(); - } - - ngOnChanges(simpleChange: SimpleChanges) { - super.ngOnChanges(simpleChange); - const props = ['locale', 'localeMatcher', 'mode', 'currency', 'currencyDisplay', 'useGrouping', 'minFractionDigits', 'maxFractionDigits', 'prefix', 'suffix']; - if (props.some((p) => !!simpleChange[p])) { - this.updateConstructParser(); - } - } - - get hostClass(): string { - return [ - 'p-inputnumber p-component p-inputwrapper', - this.styleClass, - this.filled || this.allowEmpty === false ? 'p-inputwrapper-filled' : '', - this.focused ? 'p-inputwrapper-focus' : '', - this.showButtons && this.buttonLayout === 'stacked' ? 'p-inputnumber-stacked' : '', - this.showButtons && this.buttonLayout === 'horizontal' ? 'p-inputnumber-horizontal' : '', - this.showButtons && this.buttonLayout === 'vertical' ? 'p-inputnumber-vertical' : '', - this.hasFluid ? 'p-inputnumber-fluid' : '' - ] - .filter((cls) => !!cls) - .join(' '); - } - - @HostBinding('style') get hostStyle(): any { - return this.style; - } - - ngOnInit() { - super.ngOnInit(); - - this.ngControl = this.injector.get(NgControl, null, { optional: true }); - - this.constructParser(); - - this.initialized = true; - } - - ngAfterContentInit() { - this.templates.forEach((item) => { - switch (item.getType()) { - case 'clearicon': - this._clearIconTemplate = item.template; - break; - - case 'incrementbuttonicon': - this._incrementButtonIconTemplate = item.template; - break; - - case 'decrementbuttonicon': - this._decrementButtonIconTemplate = item.template; - break; - } - }); - } - - getOptions() { - return { - localeMatcher: this.localeMatcher, - style: this.mode, - currency: this.currency, - currencyDisplay: this.currencyDisplay, - useGrouping: this.useGrouping, - minimumFractionDigits: this.minFractionDigits ?? undefined, - maximumFractionDigits: this.maxFractionDigits ?? undefined - }; - } - - constructParser() { - this.numberFormat = new Intl.NumberFormat(this.locale, this.getOptions()); - const numerals = [...new Intl.NumberFormat(this.locale, { useGrouping: false }).format(9876543210)].reverse(); - const index = new Map(numerals.map((d, i) => [d, i])); - this._numeral = new RegExp(`[${numerals.join('')}]`, 'g'); - this._group = this.getGroupingExpression(); - this._minusSign = this.getMinusSignExpression(); - this._currency = this.getCurrencyExpression(); - this._decimal = this.getDecimalExpression(); - this._decimalChar = this.getDecimalChar(); - this._suffix = this.getSuffixExpression(); - this._prefix = this.getPrefixExpression(); - this._index = (d: any) => index.get(d); - } - - updateConstructParser() { - if (this.initialized) { - this.constructParser(); - } - } - - escapeRegExp(text: string): string { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - } - - getDecimalExpression(): RegExp { - const decimalChar = this.getDecimalChar(); - return new RegExp(`[${decimalChar}]`, 'g'); - } - getDecimalChar(): string { - const formatter = new Intl.NumberFormat(this.locale, { ...this.getOptions(), useGrouping: false }); - return formatter - .format(1.1) - .replace(this._currency as RegExp | string, '') - .trim() - .replace(this._numeral, ''); - } - - getGroupingExpression(): RegExp { - const formatter = new Intl.NumberFormat(this.locale, { useGrouping: true }); - this.groupChar = formatter.format(1000000).trim().replace(this._numeral, '').charAt(0); - return new RegExp(`[${this.groupChar}]`, 'g'); - } - - getMinusSignExpression(): RegExp { - const formatter = new Intl.NumberFormat(this.locale, { useGrouping: false }); - return new RegExp(`[${formatter.format(-1).trim().replace(this._numeral, '')}]`, 'g'); - } - - getCurrencyExpression(): RegExp { - if (this.currency) { - const formatter = new Intl.NumberFormat(this.locale, { - style: 'currency', - currency: this.currency, - currencyDisplay: this.currencyDisplay, - minimumFractionDigits: 0, - maximumFractionDigits: 0 - }); - return new RegExp(`[${formatter.format(1).replace(/\s/g, '').replace(this._numeral, '').replace(this._group, '')}]`, 'g'); - } - - return new RegExp(`[]`, 'g'); - } - - getPrefixExpression(): RegExp { - if (this.prefix) { - this.prefixChar = this.prefix; - } else { - const formatter = new Intl.NumberFormat(this.locale, { - style: this.mode, - currency: this.currency, - currencyDisplay: this.currencyDisplay - }); - this.prefixChar = formatter.format(1).split('1')[0]; - } - - return new RegExp(`${this.escapeRegExp(this.prefixChar || '')}`, 'g'); - } - - getSuffixExpression(): RegExp { - if (this.suffix) { - this.suffixChar = this.suffix; - } else { - const formatter = new Intl.NumberFormat(this.locale, { - style: this.mode, - currency: this.currency, - currencyDisplay: this.currencyDisplay, - minimumFractionDigits: 0, - maximumFractionDigits: 0 - }); - this.suffixChar = formatter.format(1).split('1')[1]; - } - - return new RegExp(`${this.escapeRegExp(this.suffixChar || '')}`, 'g'); - } - - formatValue(value: any) { - if (value != null) { - if (value === '-') { - // Minus sign - return value; - } - - if (this.format) { - let formatter = new Intl.NumberFormat(this.locale, this.getOptions()); - let formattedValue = formatter.format(value); - - if (this.prefix && value != this.prefix) { - formattedValue = this.prefix + formattedValue; - } - - if (this.suffix && value != this.suffix) { - formattedValue = formattedValue + this.suffix; - } - - return formattedValue; - } - - return value.toString(); - } - - return ''; - } - - parseValue(text: any) { - const suffixRegex = new RegExp(this._suffix, ''); - const prefixRegex = new RegExp(this._prefix, ''); - const currencyRegex = new RegExp(this._currency, ''); - - let filteredText = text - .replace(suffixRegex, '') - .replace(prefixRegex, '') - .trim() - .replace(/\s/g, '') - .replace(currencyRegex, '') - .replace(this._group, '') - .replace(this._minusSign, '-') - .replace(this._decimal, '.') - .replace(this._numeral, this._index); - - if (filteredText) { - if (filteredText === '-') - // Minus sign - return filteredText; - - let parsedValue = +filteredText; - return isNaN(parsedValue) ? null : parsedValue; - } - - return null; - } - - repeat(event: Event, interval: number | null, dir: number) { - if (this.readonly) { - return; - } - - let i = interval || 500; - - this.clearTimer(); - this.timer = setTimeout(() => { - this.repeat(event, 40, dir); - }, i); - - this.spin(event, dir); - } - - spin(event: Event, dir: number) { - let step = this.step * dir; - let currentValue = this.parseValue(this.input?.nativeElement.value) || 0; - let newValue = this.validateValue((currentValue as number) + step); - if (this.maxlength && this.maxlength < this.formatValue(newValue).length) { - return; - } - this.updateInput(newValue, null, 'spin', null); - this.updateModel(event, newValue); - - this.handleOnInput(event, currentValue, newValue); - } - - clear() { - this.value = null; - this.onModelChange(this.value); - this.onClear.emit(); - } - - onUpButtonMouseDown(event: MouseEvent) { - if (event.button === 2) { - this.clearTimer(); - return; - } - - if (!this.disabled) { - this.input?.nativeElement.focus(); - this.repeat(event, null, 1); - event.preventDefault(); - } - } - - onUpButtonMouseUp() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onUpButtonMouseLeave() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onUpButtonKeyDown(event: KeyboardEvent) { - if (event.keyCode === 32 || event.keyCode === 13) { - this.repeat(event, null, 1); - } - } - - onUpButtonKeyUp() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onDownButtonMouseDown(event: MouseEvent) { - if (event.button === 2) { - this.clearTimer(); - return; - } - if (!this.disabled) { - this.input?.nativeElement.focus(); - this.repeat(event, null, -1); - event.preventDefault(); - } - } - - onDownButtonMouseUp() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onDownButtonMouseLeave() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onDownButtonKeyUp() { - if (!this.disabled) { - this.clearTimer(); - } - } - - onDownButtonKeyDown(event: KeyboardEvent) { - if (event.keyCode === 32 || event.keyCode === 13) { - this.repeat(event, null, -1); - } - } - - onUserInput(event: Event) { - if (this.readonly) { - return; - } - - if (this.isSpecialChar) { - (event.target as HTMLInputElement).value = this.lastValue as string; - } - this.isSpecialChar = false; - } - - onInputKeyDown(event: KeyboardEvent) { - if (this.readonly) { - return; - } - - this.lastValue = (event.target as HTMLInputElement).value; - if ((event as KeyboardEvent).shiftKey || (event as KeyboardEvent).altKey) { - this.isSpecialChar = true; - return; - } - - let selectionStart = (event.target as HTMLInputElement).selectionStart as number; - let selectionEnd = (event.target as HTMLInputElement).selectionEnd as number; - let inputValue = (event.target as HTMLInputElement).value as string; - let newValueStr = null; - - if (event.altKey) { - event.preventDefault(); - } - - switch (event.key) { - case 'ArrowUp': - this.spin(event, 1); - event.preventDefault(); - break; - - case 'ArrowDown': - this.spin(event, -1); - event.preventDefault(); - break; - - case 'ArrowLeft': - for (let index = selectionStart; index <= inputValue.length; index++) { - const previousCharIndex = index === 0 ? 0 : index - 1; - if (this.isNumeralChar(inputValue.charAt(previousCharIndex))) { - this.input.nativeElement.setSelectionRange(index, index); - break; - } - } - break; - - case 'ArrowRight': - for (let index = selectionEnd; index >= 0; index--) { - if (this.isNumeralChar(inputValue.charAt(index))) { - this.input.nativeElement.setSelectionRange(index, index); - break; - } - } - break; - - case 'Tab': - case 'Enter': - newValueStr = this.validateValue(this.parseValue(this.input.nativeElement.value)); - this.input.nativeElement.value = this.formatValue(newValueStr); - this.input.nativeElement.setAttribute('aria-valuenow', newValueStr); - this.updateModel(event, newValueStr); - break; - - case 'Backspace': { - event.preventDefault(); - - if (selectionStart === selectionEnd) { - if ((selectionStart == 1 && this.prefix) || (selectionStart == inputValue.length && this.suffix)) { - break; - } - - const deleteChar = inputValue.charAt(selectionStart - 1); - const { decimalCharIndex, decimalCharIndexWithoutPrefix } = this.getDecimalCharIndexes(inputValue); - - if (this.isNumeralChar(deleteChar)) { - const decimalLength = this.getDecimalLength(inputValue); - - if (this._group.test(deleteChar)) { - this._group.lastIndex = 0; - newValueStr = inputValue.slice(0, selectionStart - 2) + inputValue.slice(selectionStart - 1); - } else if (this._decimal.test(deleteChar)) { - this._decimal.lastIndex = 0; - - if (decimalLength) { - this.input?.nativeElement.setSelectionRange(selectionStart - 1, selectionStart - 1); - } else { - newValueStr = inputValue.slice(0, selectionStart - 1) + inputValue.slice(selectionStart); - } - } else if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { - const insertedText = this.isDecimalMode() && (this.minFractionDigits || 0) < decimalLength ? '' : '0'; - newValueStr = inputValue.slice(0, selectionStart - 1) + insertedText + inputValue.slice(selectionStart); - } else if (decimalCharIndexWithoutPrefix === 1) { - newValueStr = inputValue.slice(0, selectionStart - 1) + '0' + inputValue.slice(selectionStart); - newValueStr = (this.parseValue(newValueStr) as number) > 0 ? newValueStr : ''; - } else { - newValueStr = inputValue.slice(0, selectionStart - 1) + inputValue.slice(selectionStart); - } - } else if (this.mode === 'currency' && deleteChar.search(this._currency) != -1) { - newValueStr = inputValue.slice(1); - } - - this.updateValue(event, newValueStr, null, 'delete-single'); - } else { - newValueStr = this.deleteRange(inputValue, selectionStart, selectionEnd); - this.updateValue(event, newValueStr, null, 'delete-range'); - } - - break; - } - - case 'Delete': - event.preventDefault(); - - if (selectionStart === selectionEnd) { - if ((selectionStart == 0 && this.prefix) || (selectionStart == inputValue.length - 1 && this.suffix)) { - break; - } - const deleteChar = inputValue.charAt(selectionStart); - const { decimalCharIndex, decimalCharIndexWithoutPrefix } = this.getDecimalCharIndexes(inputValue); - - if (this.isNumeralChar(deleteChar)) { - const decimalLength = this.getDecimalLength(inputValue); - - if (this._group.test(deleteChar)) { - this._group.lastIndex = 0; - newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 2); - } else if (this._decimal.test(deleteChar)) { - this._decimal.lastIndex = 0; - - if (decimalLength) { - this.input?.nativeElement.setSelectionRange(selectionStart + 1, selectionStart + 1); - } else { - newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 1); - } - } else if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { - const insertedText = this.isDecimalMode() && (this.minFractionDigits || 0) < decimalLength ? '' : '0'; - newValueStr = inputValue.slice(0, selectionStart) + insertedText + inputValue.slice(selectionStart + 1); - } else if (decimalCharIndexWithoutPrefix === 1) { - newValueStr = inputValue.slice(0, selectionStart) + '0' + inputValue.slice(selectionStart + 1); - newValueStr = (this.parseValue(newValueStr) as number) > 0 ? newValueStr : ''; - } else { - newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 1); - } - } - - this.updateValue(event, newValueStr as string, null, 'delete-back-single'); - } else { - newValueStr = this.deleteRange(inputValue, selectionStart, selectionEnd); - this.updateValue(event, newValueStr, null, 'delete-range'); - } - break; - - case 'Home': - if (this.min) { - this.updateModel(event, this.min); - event.preventDefault(); - } - break; - - case 'End': - if (this.max) { - this.updateModel(event, this.max); - event.preventDefault(); - } - break; - - default: - break; - } - - this.onKeyDown.emit(event); - } - - onInputKeyPress(event: KeyboardEvent) { - if (this.readonly) { - return; - } - - let code = event.which || event.keyCode; - let char = String.fromCharCode(code); - let isDecimalSign = this.isDecimalSign(char); - const isMinusSign = this.isMinusSign(char); - - if (code != 13) { - event.preventDefault(); - } - if (!isDecimalSign && event.code === 'NumpadDecimal') { - isDecimalSign = true; - char = this._decimalChar; - code = char.charCodeAt(0); - } - const { value, selectionStart, selectionEnd } = this.input.nativeElement; - const newValue = this.parseValue(value + char); - const newValueStr = newValue != null ? newValue.toString() : ''; - const selectedValue = value.substring(selectionStart, selectionEnd); - const selectedValueParsed = this.parseValue(selectedValue); - const selectedValueStr = selectedValueParsed != null ? selectedValueParsed.toString() : ''; - - if (selectionStart !== selectionEnd && selectedValueStr.length > 0) { - this.insert(event, char, { isDecimalSign, isMinusSign }); - return; - } - - if (this.maxlength && newValueStr.length > this.maxlength) { - return; - } - - if ((48 <= code && code <= 57) || isMinusSign || isDecimalSign) { - this.insert(event, char, { isDecimalSign, isMinusSign }); - } - } - - onPaste(event: ClipboardEvent) { - if (!this.disabled && !this.readonly) { - event.preventDefault(); - let data = (event.clipboardData || (this.document as any).defaultView['clipboardData']).getData('Text'); - if (data) { - if (this.maxlength) { - data = data.toString().substring(0, this.maxlength); - } - - let filteredData = this.parseValue(data); - if (filteredData != null) { - this.insert(event, filteredData.toString()); - } - } - } - } - - allowMinusSign() { - return this.min == null || this.min < 0; - } - - isMinusSign(char: string) { - if (this._minusSign.test(char) || char === '-') { - this._minusSign.lastIndex = 0; - return true; - } - - return false; - } - - isDecimalSign(char: string) { - if (this._decimal.test(char)) { - this._decimal.lastIndex = 0; - return true; - } - - return false; - } - - isDecimalMode() { - return this.mode === 'decimal'; - } - - getDecimalCharIndexes(val: string) { - let decimalCharIndex = val.search(this._decimal); - this._decimal.lastIndex = 0; - - const filteredVal = val - .replace(this._prefix as RegExp, '') - .trim() - .replace(/\s/g, '') - .replace(this._currency as RegExp, ''); - const decimalCharIndexWithoutPrefix = filteredVal.search(this._decimal); - this._decimal.lastIndex = 0; - - return { decimalCharIndex, decimalCharIndexWithoutPrefix }; - } - - getCharIndexes(val: string) { - const decimalCharIndex = val.search(this._decimal); - this._decimal.lastIndex = 0; - const minusCharIndex = val.search(this._minusSign); - this._minusSign.lastIndex = 0; - const suffixCharIndex = val.search(this._suffix as RegExp); - (this._suffix as RegExp).lastIndex = 0; - const currencyCharIndex = val.search(this._currency as RegExp); - (this._currency as RegExp).lastIndex = 0; - - return { decimalCharIndex, minusCharIndex, suffixCharIndex, currencyCharIndex }; - } - - insert(event: Event, text: string, sign = { isDecimalSign: false, isMinusSign: false }) { - const minusCharIndexOnText = text.search(this._minusSign); - this._minusSign.lastIndex = 0; - if (!this.allowMinusSign() && minusCharIndexOnText !== -1) { - return; - } - - let selectionStart = this.input?.nativeElement.selectionStart; - let selectionEnd = this.input?.nativeElement.selectionEnd; - let inputValue = this.input?.nativeElement.value.trim(); - const { decimalCharIndex, minusCharIndex, suffixCharIndex, currencyCharIndex } = this.getCharIndexes(inputValue); - let newValueStr; - - if (sign.isMinusSign) { - if (selectionStart === 0) { - newValueStr = inputValue; - if (minusCharIndex === -1 || selectionEnd !== 0) { - newValueStr = this.insertText(inputValue, text, 0, selectionEnd); - } - - this.updateValue(event, newValueStr, text, 'insert'); - } - } else if (sign.isDecimalSign) { - if (decimalCharIndex > 0 && selectionStart === decimalCharIndex) { - this.updateValue(event, inputValue, text, 'insert'); - } else if (decimalCharIndex > selectionStart && decimalCharIndex < selectionEnd) { - newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); - this.updateValue(event, newValueStr, text, 'insert'); - } else if (decimalCharIndex === -1 && this.maxFractionDigits) { - newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); - this.updateValue(event, newValueStr, text, 'insert'); - } - } else { - const maxFractionDigits = this.numberFormat.resolvedOptions().maximumFractionDigits; - const operation = selectionStart !== selectionEnd ? 'range-insert' : 'insert'; - - if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { - if (selectionStart + text.length - (decimalCharIndex + 1) <= maxFractionDigits) { - const charIndex = currencyCharIndex >= selectionStart ? currencyCharIndex - 1 : suffixCharIndex >= selectionStart ? suffixCharIndex : inputValue.length; - - newValueStr = inputValue.slice(0, selectionStart) + text + inputValue.slice(selectionStart + text.length, charIndex) + inputValue.slice(charIndex); - this.updateValue(event, newValueStr, text, operation); - } - } else { - newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); - this.updateValue(event, newValueStr, text, operation); - } - } - } - - insertText(value: string, text: string, start: number, end: number) { - let textSplit = text === '.' ? text : text.split('.'); - - if (textSplit.length === 2) { - const decimalCharIndex = value.slice(start, end).search(this._decimal); - this._decimal.lastIndex = 0; - return decimalCharIndex > 0 ? value.slice(0, start) + this.formatValue(text) + value.slice(end) : value || this.formatValue(text); - } else if (end - start === value.length) { - return this.formatValue(text); - } else if (start === 0) { - return text + value.slice(end); - } else if (end === value.length) { - return value.slice(0, start) + text; - } else { - return value.slice(0, start) + text + value.slice(end); - } - } - - deleteRange(value: string, start: number, end: number) { - let newValueStr; - - if (end - start === value.length) newValueStr = ''; - else if (start === 0) newValueStr = value.slice(end); - else if (end === value.length) newValueStr = value.slice(0, start); - else newValueStr = value.slice(0, start) + value.slice(end); - - return newValueStr; - } - - initCursor() { - let selectionStart = this.input?.nativeElement.selectionStart; - let selectionEnd = this.input?.nativeElement.selectionEnd; - let inputValue = this.input?.nativeElement.value; - let valueLength = inputValue.length; - let index = null; - - // remove prefix - let prefixLength = (this.prefixChar || '').length; - inputValue = inputValue.replace(this._prefix, ''); - - // Will allow selecting whole prefix. But not a part of it. - // Negative values will trigger clauses after this to fix the cursor position. - if (selectionStart === selectionEnd || selectionStart !== 0 || selectionEnd < prefixLength) { - selectionStart -= prefixLength; - } - - let char = inputValue.charAt(selectionStart); - if (this.isNumeralChar(char)) { - return selectionStart + prefixLength; - } - - //left - let i = selectionStart - 1; - while (i >= 0) { - char = inputValue.charAt(i); - if (this.isNumeralChar(char)) { - index = i + prefixLength; - break; - } else { - i--; - } - } - - if (index !== null) { - this.input?.nativeElement.setSelectionRange(index + 1, index + 1); - } else { - i = selectionStart; - while (i < valueLength) { - char = inputValue.charAt(i); - if (this.isNumeralChar(char)) { - index = i + prefixLength; - break; - } else { - i++; - } - } - - if (index !== null) { - this.input?.nativeElement.setSelectionRange(index, index); - } - } - - return index || 0; - } - - onInputClick() { - const currentValue = this.input?.nativeElement.value; - - if (!this.readonly && currentValue !== getSelection()) { - this.initCursor(); - } - } - - isNumeralChar(char: string) { - if (char.length === 1 && (this._numeral.test(char) || this._decimal.test(char) || this._group.test(char) || this._minusSign.test(char))) { - this.resetRegex(); - return true; - } - - return false; - } - - resetRegex() { - this._numeral.lastIndex = 0; - this._decimal.lastIndex = 0; - this._group.lastIndex = 0; - this._minusSign.lastIndex = 0; - } - - updateValue(event: Event, valueStr: Nullable, insertedValueStr: Nullable, operation: Nullable) { - let currentValue = this.input?.nativeElement.value; - let newValue = null; - - if (valueStr != null) { - newValue = this.parseValue(valueStr); - newValue = !newValue && !this.allowEmpty ? 0 : newValue; - this.updateInput(newValue, insertedValueStr, operation, valueStr); - - this.handleOnInput(event, currentValue, newValue); - } - } - - handleOnInput(event: Event, currentValue: string, newValue: any) { - if (this.isValueChanged(currentValue, newValue)) { - (this.input as ElementRef).nativeElement.value = this.formatValue(newValue); - this.input?.nativeElement.setAttribute('aria-valuenow', newValue); - this.updateModel(event, newValue); - this.onInput.emit({ originalEvent: event, value: newValue, formattedValue: currentValue }); - } - } - - isValueChanged(currentValue: string, newValue: string) { - if (newValue === null && currentValue !== null) { - return true; - } - - if (newValue != null) { - let parsedCurrentValue = typeof currentValue === 'string' ? this.parseValue(currentValue) : currentValue; - return newValue !== parsedCurrentValue; - } - - return false; - } - - validateValue(value: number | string) { - if (value === '-' || value == null) { - return null; - } - - if (this.min != null && (value as number) < this.min) { - return this.min; - } - - if (this.max != null && (value as number) > this.max) { - return this.max; - } - - return value; - } - - updateInput(value: any, insertedValueStr: Nullable, operation: Nullable, valueStr: Nullable) { - insertedValueStr = insertedValueStr || ''; - - let inputValue = this.input?.nativeElement.value; - let newValue = this.formatValue(value); - let currentLength = inputValue.length; - - if (newValue !== valueStr) { - newValue = this.concatValues(newValue, valueStr as string); - } - - if (currentLength === 0) { - this.input.nativeElement.value = newValue; - this.input.nativeElement.setSelectionRange(0, 0); - const index = this.initCursor(); - const selectionEnd = index + insertedValueStr.length; - this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } else { - let selectionStart = this.input.nativeElement.selectionStart; - let selectionEnd = this.input.nativeElement.selectionEnd; - - if (this.maxlength && newValue.length > this.maxlength) { - newValue = newValue.slice(0, this.maxlength); - selectionStart = Math.min(selectionStart, this.maxlength); - selectionEnd = Math.min(selectionEnd, this.maxlength); - } - - if (this.maxlength && this.maxlength < newValue.length) { - return; - } - - this.input.nativeElement.value = newValue; - let newLength = newValue.length; - - if (operation === 'range-insert') { - const startValue = this.parseValue((inputValue || '').slice(0, selectionStart)); - const startValueStr = startValue !== null ? startValue.toString() : ''; - const startExpr = startValueStr.split('').join(`(${this.groupChar})?`); - const sRegex = new RegExp(startExpr, 'g'); - sRegex.test(newValue); - - const tExpr = insertedValueStr.split('').join(`(${this.groupChar})?`); - const tRegex = new RegExp(tExpr, 'g'); - tRegex.test(newValue.slice(sRegex.lastIndex)); - - selectionEnd = sRegex.lastIndex + tRegex.lastIndex; - this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } else if (newLength === currentLength) { - if (operation === 'insert' || operation === 'delete-back-single') this.input.nativeElement.setSelectionRange(selectionEnd + 1, selectionEnd + 1); - else if (operation === 'delete-single') this.input.nativeElement.setSelectionRange(selectionEnd - 1, selectionEnd - 1); - else if (operation === 'delete-range' || operation === 'spin') this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } else if (operation === 'delete-back-single') { - let prevChar = inputValue.charAt(selectionEnd - 1); - let nextChar = inputValue.charAt(selectionEnd); - let diff = currentLength - newLength; - let isGroupChar = this._group.test(nextChar); - - if (isGroupChar && diff === 1) { - selectionEnd += 1; - } else if (!isGroupChar && this.isNumeralChar(prevChar)) { - selectionEnd += -1 * diff + 1; - } - - this._group.lastIndex = 0; - this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } else if (inputValue === '-' && operation === 'insert') { - this.input.nativeElement.setSelectionRange(0, 0); - const index = this.initCursor(); - const selectionEnd = index + insertedValueStr.length + 1; - this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } else { - selectionEnd = selectionEnd + (newLength - currentLength); - this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); - } - } - - this.input.nativeElement.setAttribute('aria-valuenow', value); - } - - concatValues(val1: string, val2: string) { - if (val1 && val2) { - let decimalCharIndex = val2.search(this._decimal); - this._decimal.lastIndex = 0; - - if (this.suffixChar) { - return decimalCharIndex !== -1 ? val1.replace(this.suffixChar, '').split(this._decimal)[0] + val2.replace(this.suffixChar, '').slice(decimalCharIndex) + this.suffixChar : val1; - } else { - return decimalCharIndex !== -1 ? val1.split(this._decimal)[0] + val2.slice(decimalCharIndex) : val1; - } - } - return val1; - } - - getDecimalLength(value: string) { - if (value) { - const valueSplit = value.split(this._decimal); - - if (valueSplit.length === 2) { - return valueSplit[1] - .replace(this._suffix as RegExp, '') - .trim() - .replace(/\s/g, '') - .replace(this._currency as RegExp, '').length; - } - } - - return 0; - } - - onInputFocus(event: Event) { - this.focused = true; - this.onFocus.emit(event); - } - - onInputBlur(event: Event) { - this.focused = false; - - const newValueNumber = this.validateValue(this.parseValue(this.input.nativeElement.value)); - const newValueString = newValueNumber?.toString(); - this.input.nativeElement.value = this.formatValue(newValueString); - this.input.nativeElement.setAttribute('aria-valuenow', newValueString); - this.updateModel(event, newValueNumber); - this.onBlur.emit(event); - } - - formattedValue() { - const val = !this.value && !this.allowEmpty ? 0 : this.value; - return this.formatValue(val); - } - - updateModel(event: Event, value: any) { - const isBlurUpdateOnMode = this.ngControl?.control?.updateOn === 'blur'; - - if (this.value !== value) { - this.value = value; - - if (!(isBlurUpdateOnMode && this.focused)) { - this.onModelChange(value); - } - } else if (isBlurUpdateOnMode) { - this.onModelChange(value); - } - this.onModelTouched(); - } - - writeValue(value: any): void { - this.value = value ? Number(value) : value; - this.cd.markForCheck(); - } - - registerOnChange(fn: Function): void { - this.onModelChange = fn; - } - - registerOnTouched(fn: Function): void { - this.onModelTouched = fn; - } - - setDisabledState(val: boolean): void { - this.disabled = val; - this.cd.markForCheck(); - } - - get filled() { - return this.value != null && this.value.toString().length > 0; - } - - clearTimer() { - if (this.timer) { - clearInterval(this.timer); - } - } -} - -@NgModule({ - imports: [InputNumber, SharedModule], - exports: [InputNumber, SharedModule] -}) -export class InputNumberModule {} \ No newline at end of file diff --git a/myshare/UI/src/app/shares/jwt.interceptor.ts b/myshare/UI/src/app/shares/jwt.interceptor.ts deleted file mode 100644 index 72e3195..0000000 --- a/myshare/UI/src/app/shares/jwt.interceptor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpInterceptorFn, HttpHandlerFn } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Utils } from './utils'; -/* -@Injectable() -export class JwtInterceptor implements HttpInterceptor { - intercept(request: HttpRequest, next: HttpHandler): Observable> { - // add authorization header with jwt token if available - const currentUser = Utils.getCurrentUser();//localStorage.getItem('currentUser')!; - console.log('I am interceptor debug for currentUser obj', currentUser); - if (currentUser && currentUser.token) { - //console.log('I am interceptor add authorization header with jwt token'); - request = request.clone({ - setHeaders: { - Authorization: `Bearer ${currentUser.token}` - } - }); - } - return next.handle(request); - } -} - -/* -new one -//////////////// -*/ -export const JwtInterceptor: HttpInterceptorFn = (request: HttpRequest, next: HttpHandlerFn): Observable> => { - //const logger = inject(Logger); - //logger.log(`Request is on its way to ${req.url}`); - const currentUser = Utils.getCurrentUser();//localStorage.getItem('currentUser')!; - // console.log('I am interceptor debug for currentUser obj', currentUser); - if (currentUser && currentUser.token && currentUser.token != "") { - // console.log('I am interceptor add authorization header with jwt token'); - request = request.clone({ - setHeaders: { - Authorization: `Bearer ${currentUser.token}` - } - }); - } - return next(request); -} - -//////////////// -/* -providers: [provideHttpClient(withInterceptors([loggerInterceptor]))] -*/ \ No newline at end of file diff --git a/myshare/UI/src/app/shares/lookup.service.ts b/myshare/UI/src/app/shares/lookup.service.ts deleted file mode 100644 index c6bfc3d..0000000 --- a/myshare/UI/src/app/shares/lookup.service.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Injectable, Inject , Output} from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { map } from 'rxjs/operators'; -import { Observable, of } from 'rxjs'; -import { ConfigureUrl,Lookup,LookupEdit,ResultModel - } from '../models'; -import { Utils,AppSettingService } from '../shares'; - - -@Injectable({ providedIn: 'root' }) -export class LookupService { - msg: string = "[lookupService] "; - _lookupByStatus:any; - _staffList:any; - _clientList:any; - _jobList:any; - constructor(private http: HttpClient, - private appSetting :AppSettingService - ) { - // this default when load look for previous login information - // if no need then comment out downthere - this.setAllNull(); - } - setAllNull() :void { - // this._lhdList = undefined; - this._lookupByStatus = {}; - this._staffList = null; - this._clientList = null; - this._jobList = null; - } - loadLookupEditBystatus(type:string): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl + "/LoadLookupEdit"; - const params = new HttpParams().append('type', type); - console.log(this.msg + "go server this loadLookupEditBystatus is in cache ", type); - return this.http.get>(baseUrl, {params}); -} -loadLookupById(id:number, type:string): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl; - const params = new HttpParams() - .append('id', id) - .append('type', type); - return this.http.get>(baseUrl,{params}); - } - saveLookup(item:LookupEdit): Observable> { //insert Lookup - this.setAllNull(); - let config = { headers : { 'Content-Type': 'application/json' } }; - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl; - return this.http.post>(baseUrl, item, config); - } - deleteLookup(id:number): Observable>{ - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl; - return this.http.delete>(baseUrl + "/" + id ); - } - - loadLookupBystatus(type:string): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl + "/LoadJobs"; - console.log(this.msg + "loadLookupBystatus", this._lookupByStatus); - if (this._lookupByStatus[type]) - { - console.log(this.msg + "Not go server this LoadJobs is in cache ",type); - return of(this._lookupByStatus[type]); - } - else - { - const params = new HttpParams().append('type', type); - console.log(this.msg + "go server this loadLookupBystatus is in cache ", type); - return this.http.get>(baseUrl, {params}) - .pipe(map(resultModel => { - this._lookupByStatus[type] = resultModel; - return resultModel; - }) - ); - } - } - loadStaffs(): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl + "/GetStaffs"; - /* const params = new HttpParams() - .append('id', id) - .append('type', type); - return this.http.get>(baseUrl,{params}); - */ - if (this._staffList != null) - { - return of(this._staffList); - } - else - { - return this.http.get>(baseUrl) - .pipe(map( x => { - this._staffList = x; - return x; - })); - } - } - loadClients(): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl + "/GetClients"; - /* const params = new HttpParams() - .append('id', id) - .append('type', type); - return this.http.get>(baseUrl,{params}); - */ - if (this._clientList != null) - { - return of(this._clientList); - } - else - { - return this.http.get>(baseUrl) - .pipe(map(resultModel => { - this._clientList = resultModel; - return resultModel; - }) - ); - } - } - loadJobs(): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.lookupUrl + "/GetJobs"; - /* const params = new HttpParams() - .append('id', id) - .append('type', type); - return this.http.get>(baseUrl,{params}); - */ - if (this._jobList != null) - { - return of(this._jobList); - } - else - { - return this.http.get>(baseUrl) - .pipe(map(x => { - this._jobList = x; - return x; - })) - } - } -} diff --git a/myshare/UI/src/app/shares/timeinput.ts b/myshare/UI/src/app/shares/timeinput.ts deleted file mode 100644 index 4aedf17..0000000 --- a/myshare/UI/src/app/shares/timeinput.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Input, forwardRef, OnInit, OnDestroy } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR,ReactiveFormsModule, FormControl, Validators } from '@angular/forms'; -import { Subject, takeUntil } from 'rxjs'; - -@Component({ - selector: 'time-input', - imports:[ReactiveFormsModule,CommonModule], - template: ` - - `, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => TimeInputComponent), - multi: true, - }, - ], -}) -export class TimeInputComponent implements ControlValueAccessor, OnInit, OnDestroy { - @Input() placeholder: string = 'HH:MM'; - @Input() initialValue: string = ''; // Added initialValue input - @Input() disabled: boolean = false; - - timeControl = new FormControl('', [ - Validators.pattern(/^([0-2][0-9]:[0-5][0-9])?$/), // Added more precise regex - ]); - - private destroy$ = new Subject(); - private _value: string = ''; - private onChange: (value: string) => void = () => {}; - private onTouched: () => void = () => {}; - - constructor() {} - - ngOnInit(): void { - this.timeControl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value) => { - this.onChange(value || ''); // Pass the value to the parent form - }); - if (this.initialValue) { - this.writeValue(this.initialValue); - } - this.timeControl.disable(); - if(!this.disabled){ - this.timeControl.enable(); - } - } - - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } - - get value(): string { - return this._value; - } - - set value(val: string) { - this._value = val; - this.onChange(val); - this.onTouched(); - } - - writeValue(value: string): void { - this._value = value || ''; - this.formatInput(this._value); // Use the formatting function - } - - registerOnChange(fn: (value: string) => void): void { - this.onChange = fn; - } - - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - if (isDisabled) { - this.timeControl.disable(); - } else { - this.timeControl.enable(); - } - } - - onInput(event: Event): void { - let input = (event.target as HTMLInputElement).value; - input = input.replace(/[^0-9]/g, ''); // Remove non-numeric characters. - - if (input.length > 4) { - input = input.slice(0, 4); // Limit to 4 digits - } - - let formatted = ''; - if (input.length > 2) { - formatted = input.slice(0, 2) + ':' + input.slice(2); - } else { - formatted = input; - } - this.timeControl.setValue(formatted, { emitEvent: false }); // Prevent infinite loop - this.value = formatted; - } - - onBlur(): void { - this.onTouched(); - if (this.timeControl.valid) { - return; - } - if (this.timeControl.value?.length === 0) { - this.timeControl.setValue('', {emitEvent: false}); - this.value = ''; - return - } - this.formatInput(this.timeControl.value); - } - - private formatInput(val: string | null): void { - if (!val) { - this.timeControl.setValue('', {emitEvent: false}); - this.value = ''; - return; - } - let numbersOnly = val.replace(/[^0-9]/g, ''); - let formatted = ''; - - if (numbersOnly.length > 2) { - formatted = numbersOnly.slice(0, 2) + ':' + numbersOnly.slice(2, 4); - } else { - formatted = numbersOnly; - } - if (formatted.length === 5 && this.timeControl.valid) { - this.timeControl.setValue(formatted, {emitEvent: false}); - this.value = formatted; - } else if (numbersOnly.length <= 2) { - this.timeControl.setValue(formatted, {emitEvent: false}); - this.value = formatted; - } else { - this.timeControl.setValue('00:00', {emitEvent: false}); - this.value = '00:00' - } - } -} diff --git a/myshare/UI/src/app/shares/utils.ts b/myshare/UI/src/app/shares/utils.ts deleted file mode 100644 index 047e628..0000000 --- a/myshare/UI/src/app/shares/utils.ts +++ /dev/null @@ -1,213 +0,0 @@ -import moment from "moment"; -import { Person, User, userRole } from "../models" -import { TreeNode } from "primeng/api"; - -type MyProName = "fatherId" | "motherId"; - -export class Utils { - static toBase64 (file:any) - { - let promise = new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => resolve(reader.result); - reader.onerror = reject; - }); - return promise; - } - static getBase64(file: any) { - let result: any; - var reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = function () { - result = reader.result; - console.log('tobase64 ', result); - }; - reader.onerror = function (error) { - console.log('Error: ', error); - }; - } - static getCurrentUser(): User { - - let myUser = new User(); - myUser.username = ""; - const obj = sessionStorage.getItem('currentUser'); - //const obj = localStorage.getItem('currentUser'); - if (obj != undefined) { - let user = JSON.parse(obj); - myUser.firstName = user.firstName; - myUser.id = user.id; - myUser.lastName = user.lastName; - myUser.role = user.role; - myUser.username = user.username; - myUser.email = user.email; - myUser.token = user.token; - myUser.phone = user.phone; - myUser.department = user.department; - myUser.position = user.position; - myUser.managerEmail = user.managerEmail; - - - - } - // console.log("[util] getcurrentUser",myUser); - return myUser; - } - static setLocalStore(user: User): void { - if (user && user.token) { - // store user details and jwt token in local storage to keep user logged in between page refreshes - // localStorage.setItem('currentUser', JSON.stringify(user)); - sessionStorage.setItem('currentUser', JSON.stringify(user)); - } - } - - static getLastMonth(): Date { - let result = moment().subtract(1, 'months').toDate(); - result.setDate(1); - return result; - } - static getHome(): string { - let result =""; - const user = this.getCurrentUser(); - const urole = user.role; - if (urole == userRole.Accounting) - { - result = "staffworkw"; - } - else if (urole == userRole.Admin) - { - result = "staff"; - } - else if (urole == userRole.ServiceManager) - { - result = "servicetask"; - } - else if (urole == userRole.WorkShop) - { - result = "staffwork"; - } - else if (urole == userRole.Normal) - { - result = "staff"; - } - return result; - } - static getTimeStr(val:Date): string { - let result = "00:00"; - if (val) - { - const hh = val.getHours(); - const min = val.getMinutes(); - if (hh < 10) - result = '0' + hh.toString(); - else - result = hh.toString(); - if (min < 10) - result = result + ":0" + min.toString(); - else - result = result + ":" + min.toString(); - - } - return result; - } - static canRunReport(role: number): boolean { - let result = false; - if (role == userRole.Admin) - result = true; - return result; - } -static getUserRole(user: User): number { - /* - sysadmin - request_manager - ward_user - */ - let ret = 0; - if (user) { - // console.log("utils user", user); - if (user.role) - ret = user.role; - } - return ret; - } - static getIsAuth(): boolean { - const user = this.getCurrentUser(); - if (user.username != "") { - return true; - } - else - return false; - } - static getAdminRoleName(): number { - return userRole.Admin; - } - static clearCurrentUser(): void { - sessionStorage.clear(); - //localStorage.clear(); - } - -static formatNode(item:Person): TreeNode - { - let label = item.lastName + " " + item.firstName; - let key = item.id.toString(); - let node: TreeNode ={ - key, - label, - type: 'person', - data: {title: item.title, name: label, image: item.image}, - icon: 'pi pi-user' - }; - - return node; - } - - static getChildForParentId(proName: MyProName , pid: number,childressNodes: Person[]): TreeNode[] { - let result: TreeNode[] =[]; - let tree_node_child: TreeNode[]; - let node:TreeNode; - let item: Person; - - const children = childressNodes.filter(x => x[proName] == pid); - for (let c = 0; c < children.length; c++) - { - item = children[c]; - node = this.formatNode(item); - tree_node_child = this.getChildForParentId(proName,item.id, childressNodes); - console.log("getChildForParentId childressNodes item tree_node_child ", childressNodes, item, tree_node_child); - if (tree_node_child.length > 0) - { - node.expanded = true; - node.children = tree_node_child; - } - result.push(node); - } - return result; - } - -static populateNode(proName: MyProName, familyList: Person[]): TreeNode[] { - let familyTree: TreeNode[] = []; - let node:TreeNode; - let child_nodes:TreeNode[]; - - let childressNodes:Person[]; - - let item: Person; - const topNodes = familyList.filter(x => x[proName]! < 1); - childressNodes = familyList.filter(x => x[proName]! > 0); - for(let i = 0; i < topNodes.length; i++) - { - item = topNodes[i]; - node = Utils.formatNode(item); - child_nodes = this.getChildForParentId(proName, item.id,childressNodes); - console.log("populate getchildrenForParentId", child_nodes); - if (child_nodes.length > 0) - { - node.expanded = true; - node.children = child_nodes; - } - familyTree.push(node); - //childressNodes = - } - return familyTree; - } -} \ No newline at end of file diff --git a/myshare/UI/src/app/staff/index.ts b/myshare/UI/src/app/staff/index.ts deleted file mode 100644 index fe5f350..0000000 --- a/myshare/UI/src/app/staff/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './staff.component'; -export * from './staff.edit.component'; -export * from './staff.service'; -export * from './staff.pass.component'; diff --git a/myshare/UI/src/app/staff/staff.component.css b/myshare/UI/src/app/staff/staff.component.css deleted file mode 100644 index 3db3368..0000000 --- a/myshare/UI/src/app/staff/staff.component.css +++ /dev/null @@ -1,12 +0,0 @@ -table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} -td.mat-column-edit, .mat-column-delete { - width: 35px; - padding-right: 2px; -} diff --git a/myshare/UI/src/app/staff/staff.component.html b/myshare/UI/src/app/staff/staff.component.html deleted file mode 100644 index 898fd58..0000000 --- a/myshare/UI/src/app/staff/staff.component.html +++ /dev/null @@ -1,63 +0,0 @@ -
-

Staff List

-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
-
- - - - Email - - Surname - - First Name - - - Active - Edit - - - - - {{user.email}} - {{user.lastname}} - {{user.firstname}} - - - - - - - - - - -
- diff --git a/myshare/UI/src/app/staff/staff.component.ts b/myshare/UI/src/app/staff/staff.component.ts deleted file mode 100644 index d40f117..0000000 --- a/myshare/UI/src/app/staff/staff.component.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, inject, ChangeDetectorRef} from '@angular/core'; - -import { StaffView ,StaffSearch } from '../models'; - -/* ngRx */ -/* -import { Store, select } from '@ngrx/store'; -import * as validationActions from './store/actions/validationpoint.action'; -import * as validationSelector from './store/selectors/validationpoint.selector'; -import { appValidationState } from './store/reducers'; -*/ -import { take } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { Router } from '@angular/router'; -import { StaffService } from './staff.service'; -import { AuthenticationService } from '../user-services'; -import { TableModule } from 'primeng/table'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; - -@Component({ - selector: 'staff-list', - templateUrl: './staff.component.html', - imports:[TableModule,FormsModule,CommonModule,ButtonModule,InputTextModule], - styleUrls: ['./staff.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class StaffComponent implements OnInit, OnDestroy{ - - private subscription:Subscription = new Subscription(); - firstname = ''; - email = ''; - lastname = ''; - loading = false; - userList:StaffView[] = []; - private cd = inject(ChangeDetectorRef); - msg ="[Staff component]"; - - /* - private store: Store - */ - constructor( - private staffService: StaffService, - private authenticationService: AuthenticationService, - private router: Router - ) {} - getSearchCiteria(): StaffSearch { - let criteria:StaffSearch = { - email: this.email, - firstName: this.firstname, - lastName: this.lastname, - }; - - return criteria; - - } - canSearch():boolean { - let result = false; - result = this.email !== ""; - result = result || this.lastname !== ""; - result = result || this.firstname !== ""; - return result; - } - ngOnInit(): void - { - this.authenticationService.isHome = false; - this.authenticationService.isReport = false; - const prev = this.staffService.searchCriteria; - let goload = true; - if (prev.lastName !== '') - { - this.lastname = prev.lastName; - goload = true; - } - if (prev.firstName !== '') - { - this.firstname = prev.firstName; - goload = true; - } - if (prev.email !== '') - { - this.email = prev.email; - goload = true; - } - if (goload) - { - this.search(); - } - } - getActive(active:boolean):string { - let result = 'false-icon pi-times-circle'; - if (active) - result = 'true-icon pi-check-circle'; - return result; - } - search():void { - const canSearch = true; // this.canSearch(); - if (canSearch) - { - this.loading = true; - const criteria = this.getSearchCiteria(); - this.staffService.searchCriteria = criteria; - this.subscription.add( - this.staffService.searchStaffs(criteria).subscribe( { - next: result => { - this.loading = false; - // console.log(this.msg + "search load Data", result); - this.userList = result.data; - this.cd.detectChanges(); - }, - error: e => { - const message = e || e.message; - // this.toastr.error(message); - this.loading = false; - console.log("error ", e); - } - }) - ); - } - } - newUser():void { - //console.log("add new employee"); - this.router.navigate( ['/staff/new'], { queryParams: {returnUrl:'/staff' } }); - } - edit(id: number) : void { - //console.log("edit staff", id); - this.router.navigate( ['/staff/'+id], { queryParams: {returnUrl:'/staff' } }); - } - - deleteItem(id: number): void { - this.staffService.deleteStaff(id) - .pipe(take(1)) - .subscribe({ next: result => { - console.log(this.msg + " deleteItem success", result); - //let data = this.dataSource.data; - //let index: number = data.findIndex(d => d.id === id); - // console.log(this.msg + "delete from datasource"); - //data.splice(index, 1) - //this.dataSource.data = data; - }, - error: e => console.error(e) - }); - //console.log(this.msg + "click button to delete"); - } - - ngOnDestroy() { - this.subscription.unsubscribe(); - } -} - diff --git a/myshare/UI/src/app/staff/staff.edit.component.css b/myshare/UI/src/app/staff/staff.edit.component.css deleted file mode 100644 index 139597f..0000000 --- a/myshare/UI/src/app/staff/staff.edit.component.css +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/myshare/UI/src/app/staff/staff.edit.component.html b/myshare/UI/src/app/staff/staff.edit.component.html deleted file mode 100644 index 0059cbd..0000000 --- a/myshare/UI/src/app/staff/staff.edit.component.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
- {{getEditText()}} -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-
-
- - -
-
- -
\ No newline at end of file diff --git a/myshare/UI/src/app/staff/staff.edit.component.ts b/myshare/UI/src/app/staff/staff.edit.component.ts deleted file mode 100644 index 3b3d28e..0000000 --- a/myshare/UI/src/app/staff/staff.edit.component.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms'; -import { Subject, Subscription} from 'rxjs'; -import { MessageService } from 'primeng/api'; - -import {Staff, Code, userRole} from '../models'; -import { LookupService, Utils } from '../shares'; -import { StaffService } from './staff.service'; -import { ButtonModule } from 'primeng/button'; -import { SelectModule } from 'primeng/select'; -import { CheckboxModule } from 'primeng/checkbox'; -import { InputTextModule } from 'primeng/inputtext'; - -@Component({ -templateUrl: 'staff.edit.component.html', -selector: 'staff-edit', -imports:[ButtonModule,ReactiveFormsModule,SelectModule,CheckboxModule, InputTextModule], -styleUrls: ['staff.edit.component.css'] -}) -export class StaffEditComponent implements OnInit, OnDestroy { - returnUrl =''; - loginUser =''; - _error =''; - _id= -1; - Roles: Code[]; - isNew = false; - validationPoints?: Code[]; - msg="[adminUser Component] "; - private formBuilder = inject(UntypedFormBuilder); - //for focus input -// @ViewChild('mystaffid') mystaffNo!: MatInput; - isChange = true; // disable use false//true for not disable. make sure it true is disable button. - private subscription:Subscription = new Subscription(); - subChanged$ = new Subject(); - adminuserForm = this.formBuilder.group({ - id: [0], //Validators.required - email: ['',Validators.required], //Validators.required - firstname: ['',Validators.required], //Validators.required - lastname: ['',Validators.required], //Validators.required - phone: [''], //Validators.required - password: [''], - active: [false], //Validators.required - - roleType: [0,[Validators.required, Validators.min(1)]], - - }); -constructor( - private staffService: StaffService, - private messageService: MessageService, - private lookupService: LookupService, - private router: Router, private route: ActivatedRoute, - ) { - - this.Roles = []; - let item:Code = {id:userRole.Admin, name: 'Admin', status:'Admin'}; - this.Roles.push(item); - item = {id:userRole.Accounting, name: 'Accounting', status:'Accounting'}; - this.Roles.push(item); - item = {id:userRole.Normal, name: 'Normal', status:'Normal'}; - this.Roles.push(item); - item = {id:userRole.ServiceManager, name: 'Service Manager', status:'ServiceManager'}; - this.Roles.push(item); - - - //item = {id:userRole.Normal, name: 'Switch', status:'Switch'}; - //this.Roles.push(item); - } -getClassForRequire(prev:string,name:string){ - const notok = !this.adminuserForm.controls[name].valid && - this.adminuserForm.controls[name].touched; - let str =prev; - if (notok) - str += " ng-invalid ng-dirty"; - return str; -} -ngOnInit():void { - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; - const id = Number(this.route.snapshot.paramMap.get('id')); - // now load thing up - const user = Utils.getCurrentUser(); -// console.log(this.msg + "current login user ", user); - if (user.username === '') - alert("you are not login."); - else - this.loginUser = user.firstName; - this._id = id; - //console.log(this.msg + " " + id ); - this.subscription.add(this.adminuserForm.valueChanges.subscribe(x => this.isChange = false)); - this.subscription.add(this.subChanged$.subscribe(x => this.isChange = x)); - if (id > 0) - { - this.isNew = false; - this.subscription.add( - this.staffService.loadStaffById(id).subscribe({ - next: x => this.assignValue(x.data), - error: e => console.log(e) - }) - ); - } - else - { - this.isNew = true; - } - -} -getEditText(): string { - if (this._id > 0) - return "Edit Staff"; - else - return "New Staff"; -} -// this for disable submit button -get isFieldsChange() { - const chan = this.isChange || !this.adminuserForm.valid; // this disable so need true valid = true not - //console.log(this.msg + 'is fields change', chan); - return chan; - } - -assignValue(adminuser:Staff): void { - this.adminuserForm.patchValue({ - id: adminuser.id, - email: adminuser.email, - firstname: adminuser.firstname, - lastname: adminuser.lastname, - active: adminuser.active, - phone: adminuser.phone, - roleType: adminuser.roleType, - - }); - // disable use false//true for not disable. - this.subChanged$.next(true); - } - - // convenience getter for easy access in form fields - get f() { return this.adminuserForm.controls;} - validate(adminuser:Staff): boolean { - let result = true; - if (adminuser.email.trim() == '') - { - this._error = 'email is blank or empty'; - result = false; - } - else if (adminuser.firstname.trim() == '') - { - this._error = 'Firstname is blank or empty'; - result = false; - } - else if (adminuser.lastname.trim() == '') - { - this._error = 'lastname is blank or empty'; - result = false; - } - return result; - } -onSubmit(): void { - // if form valid then go save - //make sure - const okToSave = this.adminuserForm.valid; - if (okToSave) - { - let adminuserValue = this.adminuserForm.value; - - let adminuser:Staff = { - id: adminuserValue.id, - email: adminuserValue.email, - firstname: adminuserValue.firstname, - lastname: adminuserValue.lastname, - active: adminuserValue.active, - roleType: adminuserValue.roleType, - phone: adminuserValue.phone, - password: adminuserValue.password, - - type: 0 - }; - this._error =''; - const allOK = this.validate(adminuser); - if (allOK) - { - this.subscription.add ( - this.staffService.saveStaff(adminuser).subscribe({ - next: x => { - if (x.statusCode >= 1) - { - this.messageService.add({severity:'success', summary: 'Save user', detail: adminuser.firstname + " " + adminuser.lastname }); - this.router.navigate([this.returnUrl]); - } - else - { - this.messageService.add({severity:'error', summary: 'Error', detail: x.message }); - } - }, - error: e => { - const message = e || e.message; - // this.toastr.error(message); - console.log("error ", e); - } - }) - ); - } - else - this.messageService.add({severity:'error', summary: 'Error', detail: this._error }); - } -} -goBack(): void { - this.router.navigate([this.returnUrl]); -} -ngOnDestroy() { - this.subscription.unsubscribe(); -} -} diff --git a/myshare/UI/src/app/staff/staff.pass.component.css b/myshare/UI/src/app/staff/staff.pass.component.css deleted file mode 100644 index 139597f..0000000 --- a/myshare/UI/src/app/staff/staff.pass.component.css +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/myshare/UI/src/app/staff/staff.pass.component.html b/myshare/UI/src/app/staff/staff.pass.component.html deleted file mode 100644 index 6486375..0000000 --- a/myshare/UI/src/app/staff/staff.pass.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
- {{getEditText()}} -
-
-
- -
- - -
-
- - -
- -
-
- - -
-
- -
\ No newline at end of file diff --git a/myshare/UI/src/app/staff/staff.pass.component.ts b/myshare/UI/src/app/staff/staff.pass.component.ts deleted file mode 100644 index 7f5c8d3..0000000 --- a/myshare/UI/src/app/staff/staff.pass.component.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { FormsModule, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms'; -import { Subject, Subscription} from 'rxjs'; -import { MessageService } from 'primeng/api'; - -import {Staff, Code, userRole, ResetPassword} from '../models'; -import { LookupService, Utils } from '../shares'; -import { StaffService } from './staff.service'; -import { CommonModule } from '@angular/common'; -import { ButtonModule } from 'primeng/button'; - -@Component({ -templateUrl: 'staff.pass.component.html', -selector: 'staff-pass', -imports:[ReactiveFormsModule,CommonModule,ButtonModule], -styleUrls: ['staff.pass.component.css'] -}) -export class StaffPassComponent implements OnInit, OnDestroy { - returnUrl =''; - loginUser =''; - _error =''; - _id= -1; - - isNew = false; - validationPoints?: Code[]; - msg="[adminUser Component] "; - private formBuilder = inject(UntypedFormBuilder); - //for focus input -// @ViewChild('mystaffid') mystaffNo!: MatInput; - isChange = true; // disable use false//true for not disable. make sure it true is disable button. - private subscription:Subscription = new Subscription(); - subChanged$ = new Subject(); - adminuserForm = this.formBuilder.group({ - id: [0], //Validators.required - - password: ['',Validators.required], //Validators.required - passwordAgain: ['',Validators.required], //Validators.required - - - }); -constructor( - private staffService: StaffService, - private messageService: MessageService, - private lookupService: LookupService, - private router: Router, private route: ActivatedRoute, - ) { - - - //item = {id:userRole.Normal, name: 'Switch', status:'Switch'}; - //this.Roles.push(item); - } -getClassForRequire(prev:string,name:string){ - const notok = !this.adminuserForm.controls[name].valid && - this.adminuserForm.controls[name].touched; - let str =prev; - if (notok) - str += " ng-invalid ng-dirty"; - return str; -} -ngOnInit():void { - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; - const id = Number(this.route.snapshot.paramMap.get('id')); - // now load thing up - const user = Utils.getCurrentUser(); -// console.log(this.msg + "current login user ", user); - if (user.username === '') - alert("you are not login."); - else - this.loginUser = user.firstName; - this._id = id; - //console.log(this.msg + " " + id ); - this.subscription.add(this.adminuserForm.valueChanges.subscribe(x => this.isChange = false)); - this.subscription.add(this.subChanged$.subscribe(x => this.isChange = x)); - - -} -getEditText(): string { - - return "Reset Password"; - -} -// this for disable submit button -get isFieldsChange() { - const chan = this.isChange || !this.adminuserForm.valid; // this disable so need true valid = true not - //console.log(this.msg + 'is fields change', chan); - return chan; - } - searchUser(): void { - const staffid = this.adminuserForm.controls["stafflinkNo"].value; - // console.log(this.msg + " the staffid is ", staffid); - if (staffid != '') { - //this.form.controls['your form control name'].value - this.staffService.loadStaffById(staffid).subscribe({ - next: x => { - //console.log(this.msg + " this is stafflink no ", x); - // now get current user. - - if (x.statusCode == 1) { - //this.error = true; - const fname = x.data.firstname + " " + x.data.lastname; - this.adminuserForm.patchValue({name:fname, addedBy:this.loginUser}); - - } - else { - this.messageService.add({severity:'error', summary: 'Error', detail: x.message }); - } - }, - error: e => { - const message = e || e.message; - //this.toastr.error(message); - console.log("error ", e); - } - }); - } - else - { - //this.toastr.error("please enter staff link no"); - } - } - - - // convenience getter for easy access in form fields - get f() { return this.adminuserForm.controls;} - validate(adminuser:any, passwordAgain:string): boolean { - let result = true; - const pass = adminuser.password.trim(); - if (pass == '') - { - this._error = 'password is blank or empty'; - result = false; - } - if (pass !== passwordAgain) - { - this._error = 'password is not match'; - result = false; - } - - return result; - } -onSubmit(): void { - // if form valid then go save - //make sure - const okToSave = this.adminuserForm.valid; - - if (okToSave) - { - let adminuserValue = this.adminuserForm.value; - - let adminuser:ResetPassword = { - id: this._id, - password: adminuserValue.password, - - }; - this._error =''; - const again = adminuserValue.passwordAgain; - const allOK = this.validate(adminuserValue, again); - if (allOK) - { - this.subscription.add ( - this.staffService.saveResetPassword(adminuser).subscribe({ - next: x => { - if (x.statusCode >= 1) - { - this.messageService.add({severity:'success', summary: 'Save user', detail: adminuser.id.toString() }); - this.router.navigate([this.returnUrl]); - } - else - { - this.messageService.add({severity:'error', summary: 'Error', detail: x.message }); - } - }, - error: e => { - const message = e || e.message; - // this.toastr.error(message); - console.log("error ", e); - } - }) - ); - } - else - this.messageService.add({severity:'error', summary: 'Error', detail: this._error }); - } -} -goBack(): void { - this.router.navigate([this.returnUrl]); -} -ngOnDestroy() { - this.subscription.unsubscribe(); -} -} diff --git a/myshare/UI/src/app/staff/staff.service.ts b/myshare/UI/src/app/staff/staff.service.ts deleted file mode 100644 index fe29ebc..0000000 --- a/myshare/UI/src/app/staff/staff.service.ts +++ /dev/null @@ -1,55 +0,0 @@ - -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Staff,StaffSearch, StaffView, ResultModel,ConfigureUrl,ResetPassword } from '../models'; -import { AppSettingService } from '../shares'; - -@Injectable({ providedIn: 'root' }) -export class StaffService { - public searchCriteria: StaffSearch; - constructor(private http: HttpClient, - private appSetting :AppSettingService - ) { - this.searchCriteria = { - email:'', - firstName: '', - lastName:'' - }; - - } - searchStaffs(criteria: StaffSearch): Observable> { - let config = { headers : { 'Content-Type': 'application/json' } }; - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.staffUrl + "/SearchStaff"; - return this.http.post>(baseUrl, criteria, config); - } - - loadStaffById(id:number): Observable> { - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.staffUrl; - /* - const params = new HttpParams().set("id", ""+id); - const headers = new HttpHeaders().set('Content-Type', 'application/json'); - const options = { - headers: headers, - params: params - }; - */ - //return this.http.get(this.baseUrl + 'api/Adminuser/LoadAdminuserById',options); - return this.http.get>(baseUrl + "/" + id); - } - saveStaff(data:Staff): Observable> { //insert Adminuser - let config = { headers : { 'Content-Type': 'application/json' } }; - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.staffUrl+"/SaveStaff"; - return this.http.post>(baseUrl, data, config); - } - saveResetPassword(data:ResetPassword): Observable> { //insert Adminuser - let config = { headers : { 'Content-Type': 'application/json' } }; - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.staffUrl+"/ResetPassStaff"; - return this.http.post>(baseUrl, data, config); - } - deleteStaff(id:number): Observable>{ - const baseUrl = this.appSetting.appSetting.baseUrl + "/"+ ConfigureUrl.staffUrl; - - return this.http.delete>(baseUrl + "/" + id); - } -} diff --git a/myshare/UI/src/app/toolbar/toolbar.component.css b/myshare/UI/src/app/toolbar/toolbar.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/myshare/UI/src/app/toolbar/toolbar.component.html b/myshare/UI/src/app/toolbar/toolbar.component.html deleted file mode 100644 index ddfecff..0000000 --- a/myshare/UI/src/app/toolbar/toolbar.component.html +++ /dev/null @@ -1,41 +0,0 @@ -@if (currentUserS() && isAuth) -{ -
-
- Banner -
-
-
- -
- - - - - - -
-
-
-
-} \ No newline at end of file diff --git a/myshare/UI/src/app/toolbar/toolbar.component.ts b/myshare/UI/src/app/toolbar/toolbar.component.ts deleted file mode 100644 index b908174..0000000 --- a/myshare/UI/src/app/toolbar/toolbar.component.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Component, OnInit, OnDestroy, effect, computed, Signal, } from '@angular/core'; -import { Router } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { MenuItem } from 'primeng/api'; -import { MenuModule } from 'primeng/menu'; -import { ButtonModule} from 'primeng/button'; -import { ButtonGroupModule } from 'primeng/buttongroup'; -import { Subscription } from 'rxjs'; -import { AuthenticationService } from '../user-services'; -import { Utils } from '../shares'; -import { User } from '../models'; - - -@Component({ - selector: 'app-toolbar', - imports: [CommonModule, MenuModule, ButtonModule, ButtonGroupModule], - templateUrl: './toolbar.component.html', - styleUrl: './toolbar.component.css' -}) -export class ToolbarComponent implements OnInit, OnDestroy { - title = 'Safe Assessment Unit UI'; - isAuth = false; - hasRoleAdmin = false; - hasRoleReport = false; - homeUrl = "/person"; - oneMenu: MenuItem[] = []; - reportMenu: MenuItem[] = []; - systemMenu: MenuItem[] = []; - currentUserName = ""; - currentUserS: Signal = computed (() => { - const currentUser = this.authenticationService.authChange(); - this.isAuth =false; - if (currentUser.username) { - this.isAuth =true; - this.assignRole(currentUser); - console.log(`${this.title} on auth currentUser signal now ${this.isAuth}`); - // add this to the one menu - if (this.hasRoleAdmin) { - - let i = 0; - for (i = 0; i < this.systemMenu.length; i++) { - this.oneMenu.push(this.systemMenu[i]); - } - - } - //add the logout here - this.oneMenu.push( - { - label: 'Logout', icon: 'pi pi-power-off', command: () => { - this.logout() - } - } - ); - } - return currentUser; - }); - - private subscription: Subscription = new Subscription(); - constructor( - private router: Router, - private authenticationService: AuthenticationService - ) { - this.authenticationService.isReport = false; - this.authenticationService.isHome = true; - } - onHome(): void { - this.authenticationService.isHome = true; - this.router.navigate([this.homeUrl]); - } - get isHome(): boolean { - return this.authenticationService.isHome; - } - get loginUser(): string { - let result = ""; - let greeting = "Good "; - const d = new Date(); - const hour = d.getHours(); - if (hour >= 5 && hour < 12) - greeting = "Good morning, "; - else if (hour >= 12 && hour < 17) - greeting = "Good afternoon, "; - else if (hour >= 17 && hour < 21) - greeting = "Good evening, "; - else - greeting = "Good night, "; - if (this.isAuth) { - const user = Utils.getCurrentUser(); - result = user.firstName; - } - return greeting + result; - } - get isReport(): boolean { - - return this.authenticationService.isReport; - } - initOneMenu(): void { - this.oneMenu = [ - { - label: 'Home', icon: 'pi pi-slack', command: () => { - this.router.navigate([this.homeUrl]); - - } - } - ]; - } - initSystemMenu(): void { - this.systemMenu = [ -/* - { - label: 'Lookup', icon: 'pi pi-bars', command: () => { - this.router.navigate(['/lookup']); - this.authenticationService.isReport = false; - this.authenticationService.isHome = false; - } - }, - { - label: 'Waiting List', icon: 'pi pi-map-marker', command: () => { - this.router.navigate(['/waitinglist']); - this.authenticationService.isReport = false; - this.authenticationService.isHome = false; - } - }, - */ - { - label: 'Person', icon: 'pi pi-users', - command: () => { - this.router.navigate(['/person']); - - } - }, - { - label: 'Import', icon: 'pi pi-users', - command: () => { - this.router.navigate(['/import']); - - } - }, - { - label: 'Family tree', icon: 'pi pi-users', - command: () => { - this.router.navigate(['/familytree']); - - } - }, - - { - label: 'Staff', icon: 'pi pi-users', - command: () => { - this.router.navigate(['/staff']); - - } - }, - - ]; - } - - logout(): void { - this.initOneMenu(); - this.authenticationService.logout(); - this.router.navigate(['/login']); - } - assignRole(user: User): void { - const userRole = Utils.getUserRole(user); - this.hasRoleReport = Utils.canRunReport(userRole); - this.currentUserName = user.firstName; - //this.hasRoleAdmin = true; - this.hasRoleAdmin = userRole == Utils.getAdminRoleName(); - //console.log(this.msg + " hasRoleAdmin ", this.hasRoleAdmin); - - } - ngOnInit(): void { - this.initOneMenu(); - this.initSystemMenu(); - console.log("ngOnInit toolbar called"); - // this.initStart(); - } - - ngOnDestroy(): void { - this.subscription.unsubscribe(); - } -} diff --git a/myshare/UI/src/app/user-services/authentication.service.ts b/myshare/UI/src/app/user-services/authentication.service.ts deleted file mode 100644 index ee15ed7..0000000 --- a/myshare/UI/src/app/user-services/authentication.service.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Injectable, Inject, Output, signal, computed, Signal } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { map } from 'rxjs/operators'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { ConfigureUrl, User } from '../models'; -import { Utils, AppSettingService, LookupService } from '../shares'; - - -@Injectable({ providedIn: 'root' }) -export class AuthenticationService { - //private authChange = new BehaviorSubject(new User()); - // public currentUser: Observable; - public authChange = signal(new User()); - - private _isHome = false; - private _isReport = false; - private _selectDate: Date | null = null; - baseUrl = ''; // this.appSettingService.appSetting.baseUrl + "/"+ ConfigureUrl.loginApiUrl; - constructor(private http: HttpClient, - private appSetting: AppSettingService, - private lookupService: LookupService, - - ) { - // this default when load look for previous login information - // if no need then comment out downthere - // this.currentUser = this.authChange.asObservable(); - const fname = this.getCurrentUser(); - if (fname) { - - this.authChange.set(fname); - } - - } - - - /* select date */ - public get SelectDate(): Date | null { - return this._selectDate; - } - public set SelectDate(value: Date | null) { - this._selectDate = value; - } - - public get isHome(): boolean { - return this._isHome; - } - public set isHome(value: boolean) { - if (value) { - this._isReport = false; - } - this._isHome = value; - } - - public get isReport(): boolean { - return this._isReport; - } - public set isReport(value: boolean) { - if (value) { - this._isHome = false; - } - this._isReport = value; - } - - login(username: string, password: string): Observable { - this.lookupService.setAllNull(); - - const url = this.appSetting.appSetting.baseUrl + "/" + ConfigureUrl.loginApiUrl; - const epass = btoa(password); - return this.http.post(url, { username, password: epass }) - .pipe(map(resultModel => { - // login successful if there's a jwt token in the response - if (resultModel.statusCode == 1) { - const user = resultModel.data; - - Utils.setLocalStore(user); - // const fName = user.firstName + " " + user.lastName; - this.authChange.set(user); - console.log("login from API result ", this.authChange()); - - } - return resultModel; - })); - } - - getCurrentUser(): User { - let userObj: User; - userObj = new User(); - let user = sessionStorage.getItem('currentUser'); - if (user) { - userObj = JSON.parse(user); - //fname = userObj.firstName + " " + userObj.lastName; - // logged in so return true - } - return userObj; - } - - isAuth(): boolean { - let val: boolean; - val = false; - if (sessionStorage.getItem('currentUser')) { - // logged in so return true - val = true; - } - return val; - } - logout(): void { - this.lookupService.setAllNull(); - - const url = this.appSetting.appSetting.baseUrl + "/" + ConfigureUrl.logoutUrl; - this.http.post(url, {}).subscribe({ - next: x => { - // console.log("logout return", x); - sessionStorage.removeItem('currentUser'); - const user = new User(); - this.authChange.set(user); - }, - error: e => { - sessionStorage.removeItem('currentUser'); - this.authChange.set(new User()); - } - }); - - } -} diff --git a/myshare/UI/src/app/user-services/index.ts b/myshare/UI/src/app/user-services/index.ts deleted file mode 100644 index f6d76d5..0000000 --- a/myshare/UI/src/app/user-services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './authentication.service'; diff --git a/myshare/UI/src/index.html b/myshare/UI/src/index.html deleted file mode 100644 index 989706d..0000000 --- a/myshare/UI/src/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - FamilyTree - - - - - - - - diff --git a/myshare/UI/src/main.ts b/myshare/UI/src/main.ts deleted file mode 100644 index 5df75f9..0000000 --- a/myshare/UI/src/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { App } from './app/app'; - -bootstrapApplication(App, appConfig) - .catch((err) => console.error(err)); diff --git a/myshare/UI/src/styles.css b/myshare/UI/src/styles.css deleted file mode 100644 index 7773df2..0000000 --- a/myshare/UI/src/styles.css +++ /dev/null @@ -1,60 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ -@import "tailwindcss"; -@plugin "tailwindcss-primeui"; -@import "primeicons/primeicons.css"; -html, -body { - height: 100%; - margin: 0; -} - -body { - /*padding-top: 5px; */ - padding-right: 1rem; - padding-left: 1rem; - padding-bottom: 0.3rem; - background-color: var(--surface-b); - font-family: var(--font-family); - font-weight: 400; - color: var(--text-color); - -} -.false-icon { - color: #c63737; -} - -.true-icon { - color: #15961e; -} - -.app-require { - font-size: 18px; - font-weight: bold; - color: red; -} - -.validateStar { - color: red; - font-size: 14px; -} - -.p-datepicker table td>span { - width: 1.2rem !important; - height: 1.2rem !important; - border: none !important; -} - -.p-datepicker .p-timepicker>div { - height: 50px !important; -} - -.p-datepicker .p-timepicker span { - font-size: 1rem !important; -} - -.p-datatable .p-datatable-tbody>tr>td { - - border: 1px solid #dee2e6; - border-width: 1px 0 0 0; - padding: 5px 5px !important; -} \ No newline at end of file diff --git a/myshare/UI/tsconfig.app.json b/myshare/UI/tsconfig.app.json deleted file mode 100644 index 264f459..0000000 --- a/myshare/UI/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "src/**/*.spec.ts" - ] -} diff --git a/myshare/UI/tsconfig.json b/myshare/UI/tsconfig.json deleted file mode 100644 index e4955f2..0000000 --- a/myshare/UI/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "compileOnSave": false, - "compilerOptions": { - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "skipLibCheck": true, - "isolatedModules": true, - "experimentalDecorators": true, - "importHelpers": true, - "target": "ES2022", - "module": "preserve" - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "typeCheckHostBindings": true, - "strictTemplates": true - }, - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/myshare/UI/tsconfig.spec.json b/myshare/UI/tsconfig.spec.json deleted file mode 100644 index 04df34c..0000000 --- a/myshare/UI/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "src/**/*.ts" - ] -}