diff --git a/.gitignore b/.gitignore index 671e6d11..9940eff1 100644 --- a/.gitignore +++ b/.gitignore @@ -84,4 +84,18 @@ proxy.conf.insight.json /src/environments/environment.insight.ts /src/assets/i18n/multi-selection-toolbar /src/assets/i18n/custom-elements -/src/assets/i18n/user-profile \ No newline at end of file +/src/assets/i18n/user-profile + +# Agent (agt-*) translations copied from @sinequa/atomic-angular at install +/src/assets/i18n/agt-agent +/src/assets/i18n/agt-components +/src/assets/i18n/agt-directives +/src/assets/i18n/agt-feedback +/src/assets/i18n/agt-input +/src/assets/i18n/agt-messages-agent +/src/assets/i18n/agt-messages-debug +/src/assets/i18n/agt-messages-function +/src/assets/i18n/agt-messages-user +/src/assets/i18n/agt-saved-chats +/src/assets/i18n/agt-search +/src/assets/i18n/agt-settings diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000..278a3ecd --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,21 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "embeddedLanguageFormatting": "off", + "experimentalTailwindcss": { + "attributes": ["class"], + "functions": ["tv", "cva", "cn"], + "preserveWhitespace": true + }, + "tabWidth": 2, + "useTabs": false, + "singleQuote": false, + "semi": true, + "bracketSpacing": true, + "arrowParens": "avoid", + "trailingComma": "none", + "bracketSameLine": true, + "printWidth": 160, + "endOfLine": "crlf", + "experimentalSortPackageJson": false, + "ignorePatterns": ["src/assets/vendors/**/*", "*.html"] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..53f4da15 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,31 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "oxc"], + "categories": { + "correctness": "warn" + }, + "rules": { + "typescript/no-floating-promises": "warn", + "typescript/no-unsafe-assignment": "warn" + }, + "settings": { + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + }, + "vitest": { + "typecheck": false + } + }, + "env": { + "builtin": true + }, + "globals": {}, + "ignorePatterns": [] +} diff --git a/.prettierrc b/.prettierrc index 31814d19..e68814c6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,27 +1,28 @@ -{ - "plugins": [ - "prettier-plugin-tailwindcss", - "prettier-plugin-package" - ], - "tailwindFunctions": [ - "tv", "cva" - ], - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "semi": true, - "bracketSpacing": true, - "arrowParens": "avoid", - "trailingComma": "none", - "bracketSameLine": true, - "printWidth": 160, - "endOfLine": "crlf", - "overrides": [ - { - "files": "*.html", - "options": { - "parser": "angular" - } - } - ] -} \ No newline at end of file +{ + "plugins": [ + "prettier-plugin-tailwindcss", + "prettier-plugin-package" + ], + "tailwindStylesheet": "./src/styles.css", + "tailwindFunctions": [ + "tv", "cva", "cn" + ], + "tabWidth": 2, + "useTabs": false, + "singleQuote": false, + "semi": true, + "bracketSpacing": true, + "arrowParens": "avoid", + "trailingComma": "none", + "bracketSameLine": true, + "printWidth": 160, + "endOfLine": "crlf", + "overrides": [ + { + "files": ["*.html"], + "options": { + "parser": "angular" + } + } + ] +} diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..7aeefd76 --- /dev/null +++ b/biome.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.14/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": ["src/**/*.{js,ts,html,scss,css,json}"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 160, + "formatWithErrors": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "useImportType": "off" + }, + "correctness": { + "noUnknownTypeSelector": "warn" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "trailingCommas": "none" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "css": { + "parser": { + "tailwindDirectives": true + } + }, + "html": { + "parser": { + "interpolation": true + } + }, + "json": { + "formatter": { + "enabled": true + } + } +} diff --git a/docusaurus/docs/atomic-angular/components/filters/filters-bar.md b/docusaurus/docs/atomic-angular/components/filters/filters-bar.md index 6e705f68..ad2c96e3 100644 --- a/docusaurus/docs/atomic-angular/components/filters/filters-bar.md +++ b/docusaurus/docs/atomic-angular/components/filters/filters-bar.md @@ -58,12 +58,16 @@ export class SampleComponent {} ### Inputs -| Name | Type | Description | -|-------------------|-----------------------------|-----------------------------------------------------------------------------| -| `direction` | `horizontal \| vertical` | Direction of the filter bar (default: `horizontal`) | -| `position` | `Placement` | Position of the dropdown filters (default: `bottom-start`) | -| `excludeFilters` | `string[]` | List of filter names to exclude from the bar (default: `[]`) | -| `filtersCount` | `number` | Maximum number of filters to display before overflow (default: `5`) | +| Name | Type | Description | +|-------------------------|------------------------------|-------------------------------------------------------------------------| +| `direction` | `horizontal` \| `vertical` | Direction of the filter bar (default: `horizontal`). | +| `position` | `Placement` | Position of the dropdown filters (default: `bottom-start`). | +| `includeFilters` | `string[]` | List of filter names that should only be displayed (default: `[]`). | +| `excludeFilters` | `string[]` | List of filter names to exclude from the bar (default: `[]`). | +| `aggregations` | `Aggregation[]` | List of filter names to include in the bar (default: `undefined`). | +| `filtersCount` | `number` | Maximum number of filters to display before overflow (default: `5`). | +| `showMoreFiltersButton` | `boolean` | Whether to show the "More Filters" button (default: `true`). | +| `homepage` | `boolean` | When `true`, only displays filters flagged with `homepage: true` in the "filters" custom JSON; shows none if no filter is flagged (default: `false`). | `filtersCount` can be customized using the Angular Injection Token: `FILTERS_BREAKPOINT`. This allows you to define how many filters should be displayed before the "More" button appears. diff --git a/docusaurus/docs/atomic-angular/components/loading.md b/docusaurus/docs/atomic-angular/components/loading.md index ac6db235..58b0afaf 100644 --- a/docusaurus/docs/atomic-angular/components/loading.md +++ b/docusaurus/docs/atomic-angular/components/loading.md @@ -1,13 +1,18 @@ --- title: Loading +sidebar_class_name: deprecated --- +:::warning Deprecated +The `Loading` component and its `/loading` route are no longer used and are **deprecated**. Authentication is now handled at bootstrap (`withBootstrapApp` / `signIn`), and the `AuthGuard` redirects unauthenticated users straight to the login page. This component will be removed in a future major release — do not use it in new code. +::: + The `Loading` component provides a visually appealing spinner that displays during application initialization or route transitions, with automatic timeout and error handling. ## Usage ```ts title="sample.component.ts" -import { LoadingComponent } from "@angular/atomic-angular"; +import { LoadingComponent } from "@sinequa/atomic-angular"; @Component({ selector: "sample-component", @@ -42,7 +47,7 @@ External developers can extend this component to customize it for their specific ```ts title="custom-loading.component.ts" import { Component } from '@angular/core'; -import { LoadingComponent } from '@angular/atomic-angular'; +import { LoadingComponent } from '@sinequa/atomic-angular'; @Component({ selector: 'custom-wait', diff --git a/docusaurus/package.json b/docusaurus/package.json index 9e0fa057..7ab337d6 100644 --- a/docusaurus/package.json +++ b/docusaurus/package.json @@ -15,9 +15,9 @@ "write-translations": "docusaurus write-translations" }, "dependencies": { - "@docusaurus/core": "^3.10.1", - "@docusaurus/preset-classic": "^3.10.1", - "@docusaurus/theme-mermaid": "^3.10.1", + "@docusaurus/core": "^3.9.0", + "@docusaurus/preset-classic": "^3.9.0", + "@docusaurus/theme-mermaid": "^3.9.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "docusaurus-lunr-search": "^3.4.0", @@ -26,16 +26,15 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.10.1", - "@docusaurus/types": "^3.10.1", + "@docusaurus/module-type-aliases": "^3.9.0", + "@docusaurus/types": "^3.9.0", "@tailwindcss/postcss": "^4.1.8", "baseline-browser-mapping": "^2.9.17" }, "overrides": { - "serialize-javascript": "^7.0.5", - "sockjs": { - "uuid": "^11.1.1" - } + "lodash-es": ">=4.18.0", + "serialize-javascript": "^7.0.3", + "minimatch": "^3.1.3" }, "browserslist": { "production": [ diff --git a/package-lock.json b/package-lock.json index bb2c4c84..c3d36f46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,9 +29,9 @@ "@ngrx/signals": "^20.1.0", "@ngrx/store": "^20.1.0", "@sinequa/assistant": "3.10.13", - "@sinequa/atomic": "^1.1.0", - "@sinequa/atomic-angular": "^1.0.4", - "@sinequa/ui": "^1.0.0", + "@sinequa/atomic": "^2.0.5", + "@sinequa/atomic-angular": "~1.0.18", + "@sinequa/ui": "1.0.0", "@tailwindcss/postcss": "^4.1.3", "@tanstack/angular-query-experimental": "^5.40.0", "@tanstack/angular-virtual": "^4.0.7", @@ -56,6 +56,7 @@ "@angular/build": "^20.3.13", "@angular/cli": "^20.3.13", "@angular/compiler-cli": "^20.3.15", + "@biomejs/biome": "2.3.14", "@jsverse/transloco-scoped-libs": "^7.0.1", "@tailwindcss/typography": "^0.5.16", "@types/flowjs": "^2.13.14", @@ -65,10 +66,13 @@ "autoprefixer": "^10.4.16", "husky": "^9.1.7", "lint-staged": "^15.4.1", + "oxfmt": "^0.31.0", + "oxlint": "^1.60.0", + "oxlint-tsgolint": "^0.12.0", "postcss": "^8.5.3", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "prettier-plugin-package": "^1.4.0", - "prettier-plugin-tailwindcss": "^0.6.11", + "prettier-plugin-tailwindcss": "^0.7.2", "tailwind-merge": "^2.2.2", "tailwindcss": "^4.1.3", "typescript": "~5.8.3", @@ -537,14 +541,14 @@ } }, "node_modules/@angular/build": { - "version": "20.3.28", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.28.tgz", - "integrity": "sha512-qPMS9NAkOlaE+F7QieAbHzK5Fd7TEE8BXo8Y0GIkvbAaS1twiq6rmMbVZ54/pVE7lyzj5VcpYkBO+MREDdbyAA==", + "version": "20.3.29", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.29.tgz", + "integrity": "sha512-AWPK8AMDgqDFTldicU2hX6xyqlJAwcovzC1NyNQhBxOXItAQ6VrHQyprexFiX5/9/ApakEp6nO31oXb4tEdYqA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.28", + "@angular-devkit/architect": "0.2003.29", "@babel/core": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -586,7 +590,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.28", + "@angular/ssr": "^20.3.29", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^20.0.0", @@ -636,13 +640,13 @@ } }, "node_modules/@angular/build/node_modules/@angular-devkit/architect": { - "version": "0.2003.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.28.tgz", - "integrity": "sha512-1m5xewVT5TrT28lHKuh7dQBoSwx86Z/lUMyYmrQJcgPm0hdcprowc8CPr2MNi1+RoccnAbgPVcUpokmSqYZx4A==", + "version": "0.2003.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.29.tgz", + "integrity": "sha512-+oASUJI/mSgNp9v7s/dEBZqVX7shXaUJFDO+2QOfJ0DNQuoItUDDEzKJtmpwULNLHvIQf4cV9fSXbuGgkbw2Jg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.28", + "@angular-devkit/core": "20.3.29", "rxjs": "7.8.2" }, "engines": { @@ -652,9 +656,9 @@ } }, "node_modules/@angular/build/node_modules/@angular-devkit/core": { - "version": "20.3.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.28.tgz", - "integrity": "sha512-WwC7lm+Im3YVTugPLjOoNgjoYlAHzsVLY60jB9euyq5BdF8xB0L0LyhYHVWjEfkdddAiKPrdbLaRu6dMBPSc/w==", + "version": "20.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.29.tgz", + "integrity": "sha512-mITFI5HUh/yC8i8kKNwJlKtID/3HTaOKqovgMu0pu+ujIN5swA8VntQODw4+sf3tzeDONy7lviVfskzQrL+BTg==", "dev": true, "license": "MIT", "dependencies": { @@ -748,98 +752,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/build/node_modules/vite": { - "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.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/vite/node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/@angular/build/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -1065,9 +977,9 @@ } }, "node_modules/@angular/common": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.15.tgz", - "integrity": "sha512-k4mCXWRFiOHK3bUKfWkRQQ8KBPxW8TAJuKLYCsSHPCpMz6u0eA1F0VlrnOkZVKWPI792fOaEAWH2Y4PTaXlUHw==", + "version": "20.3.25", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.25.tgz", + "integrity": "sha512-rnRGcXbjet0DHgkRL4Dqxk21G2T4UypVfiTV/fay58H8w9U89PJ1L6gRmk8B/uyfpii/9r23cBwnpcguQykxYw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1076,14 +988,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.15", + "@angular/core": "20.3.25", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.3.18", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.18.tgz", - "integrity": "sha512-AaP/LCiDNcYmF135EEozjyR04NRBT38ZfBHQwjhgwiBBTejmvcpHwJaHSkraLpZqZzE4BQqqmgiQ1EJqxEwLVA==", + "version": "20.3.25", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.25.tgz", + "integrity": "sha512-TSh6gVoQqlLPqWwsYMK0lfVEQYENQO+USzS+BHFXEHFfgBRap6qDpIUGnRdj0Y2PlaVJUVFbeq1855EZUPUEoA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1093,9 +1005,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.3.15", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.15.tgz", - "integrity": "sha512-8sJoxodxsfyZ8eJ5r6Bx7BCbazXYgsZ1+dE8t5u5rTQ6jNggwNtYEzkyReoD5xvP+MMtRkos3xpwq4rtFnpI6A==", + "version": "20.3.25", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.25.tgz", + "integrity": "sha512-iqxwVo5Pgzt3EfT49OZ6plxA6KKxwv7ixx1XNH7QRvaOJC9gmsPScWpx+LO7ZsVZdo/NkA+rnXDl0PauUgGciw==", "dev": true, "license": "MIT", "dependencies": { @@ -1116,7 +1028,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.15", + "@angular/compiler": "20.3.25", "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { @@ -1225,9 +1137,9 @@ } }, "node_modules/@angular/core": { - "version": "20.3.18", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.18.tgz", - "integrity": "sha512-B+NQQngd/aDbcfW0zGLis3wTLDeHTeTYMl/mGKQH+HwdPaRCKI1wEtaXaOYVJXkP2FeThocPevB8gLwNlPQUUw==", + "version": "20.3.25", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.25.tgz", + "integrity": "sha512-B4XnnR5jzikZDvZ4PjwjAWZMT14dxrKrmJdwa/n0yp7rMPkIJTKF6ZJMg4d1pLWLLSsc2oWHioN3UrWlGqIKnA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1236,7 +1148,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.18", + "@angular/compiler": "20.3.25", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" }, @@ -1641,10 +1553,207 @@ "node": ">=6.9.0" } }, + "node_modules/@biomejs/biome": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/biome/-/biome-2.3.14.tgz", + "integrity": "sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.3.14", + "@biomejs/cli-darwin-x64": "2.3.14", + "@biomejs/cli-linux-arm64": "2.3.14", + "@biomejs/cli-linux-arm64-musl": "2.3.14", + "@biomejs/cli-linux-x64": "2.3.14", + "@biomejs/cli-linux-x64-musl": "2.3.14", + "@biomejs/cli-win32-arm64": "2.3.14", + "@biomejs/cli-win32-x64": "2.3.14" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.14.tgz", + "integrity": "sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.14.tgz", + "integrity": "sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.14.tgz", + "integrity": "sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.14.tgz", + "integrity": "sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.14.tgz", + "integrity": "sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.14.tgz", + "integrity": "sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.14.tgz", + "integrity": "sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.3.14", + "resolved": "https://npm.sinequa.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.14.tgz", + "integrity": "sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", "cpu": [ "ppc64" ], @@ -1659,9 +1768,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "cpu": [ "arm" ], @@ -1676,9 +1785,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "cpu": [ "arm64" ], @@ -1693,9 +1802,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "cpu": [ "x64" ], @@ -1710,9 +1819,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ "arm64" ], @@ -1727,9 +1836,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "cpu": [ "x64" ], @@ -1744,9 +1853,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "cpu": [ "arm64" ], @@ -1761,9 +1870,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "cpu": [ "x64" ], @@ -1778,9 +1887,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "cpu": [ "arm" ], @@ -1795,9 +1904,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "cpu": [ "arm64" ], @@ -1812,9 +1921,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "cpu": [ "ia32" ], @@ -1829,9 +1938,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "cpu": [ "loong64" ], @@ -1846,9 +1955,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "cpu": [ "mips64el" ], @@ -1863,9 +1972,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "cpu": [ "ppc64" ], @@ -1880,9 +1989,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", "cpu": [ "riscv64" ], @@ -1897,9 +2006,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", "cpu": [ "s390x" ], @@ -1914,9 +2023,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", "cpu": [ "x64" ], @@ -1931,9 +2040,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", "cpu": [ "arm64" ], @@ -1948,9 +2057,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", "cpu": [ "x64" ], @@ -1965,9 +2074,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", "cpu": [ "arm64" ], @@ -1982,9 +2091,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", "cpu": [ "x64" ], @@ -1999,9 +2108,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", "cpu": [ "arm64" ], @@ -2016,9 +2125,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "cpu": [ "x64" ], @@ -2033,9 +2142,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "cpu": [ "arm64" ], @@ -2050,9 +2159,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "cpu": [ "ia32" ], @@ -2067,9 +2176,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "cpu": [ "x64" ], @@ -3351,6 +3460,25 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, "node_modules/@ngrx/signals": { "version": "20.1.0", "resolved": "https://registry.npmjs.org/@ngrx/signals/-/signals-20.1.0.tgz", @@ -3613,7 +3741,7 @@ }, "node_modules/@npmcli/package-json/node_modules/path-scurry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "resolved": "https://npm.sinequa.com/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", @@ -3630,7 +3758,7 @@ }, "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", + "resolved": "https://npm.sinequa.com/proc-log/-/proc-log-6.1.0.tgz", "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, "license": "ISC", @@ -3640,7 +3768,7 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "resolved": "https://npm.sinequa.com/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "dev": true, "license": "ISC", @@ -3653,7 +3781,7 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "resolved": "https://npm.sinequa.com/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "license": "ISC", @@ -3663,7 +3791,7 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "resolved": "https://npm.sinequa.com/which/-/which-6.0.0.tgz", "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "dev": true, "license": "ISC", @@ -3679,7 +3807,7 @@ }, "node_modules/@npmcli/redact": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "resolved": "https://npm.sinequa.com/@npmcli/redact/-/redact-4.0.0.tgz", "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, "license": "ISC", @@ -3689,7 +3817,7 @@ }, "node_modules/@npmcli/run-script": { "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", + "resolved": "https://npm.sinequa.com/@npmcli/run-script/-/run-script-10.0.3.tgz", "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", "dev": true, "license": "ISC", @@ -3707,7 +3835,7 @@ }, "node_modules/@npmcli/run-script/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "resolved": "https://npm.sinequa.com/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "license": "ISC", @@ -3717,7 +3845,7 @@ }, "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", + "resolved": "https://npm.sinequa.com/proc-log/-/proc-log-6.1.0.tgz", "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, "license": "ISC", @@ -3727,7 +3855,7 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "resolved": "https://npm.sinequa.com/which/-/which-6.0.0.tgz", "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "dev": true, "license": "ISC", @@ -3741,47 +3869,37 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.31.0.tgz", + "integrity": "sha512-2A7s+TmsY7xF3yM0VWXq2YJ82Z7Rd7AOKraotyp58Fbk7q9cFZKczW6Zrz/iaMaJYfR/UHDxF3kMR11vayflug==", + "cpu": [ + "arm" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, + "os": [ + "android" + ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.31.0.tgz", + "integrity": "sha512-3ppKOIf2lQv/BFhRyENWs/oarueppCEnPNo0Az2fKkz63JnenRuJPoHaGRrMHg1oFMUitdYy+YH29Cv5ISZWRQ==", "cpu": [ "arm64" ], @@ -3792,17 +3910,13 @@ "android" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.31.0.tgz", + "integrity": "sha512-eFhNnle077DPRW6QPsBtl/wEzPoqgsB1LlzDRYbbztizObHdCo6Yo8T0hew9+HoYtnVMAP19zcRE7VG9OfqkMw==", "cpu": [ "arm64" ], @@ -3813,17 +3927,13 @@ "darwin" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.31.0.tgz", + "integrity": "sha512-9UQSunEqokhR1WnlQCgJjkjw13y8PSnBvR98L78beGudTtNSaPMgwE7t/T0IPDibtDTxeEt+IQVKoQJ+8Jo6Lg==", "cpu": [ "x64" ], @@ -3834,17 +3944,13 @@ "darwin" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.31.0.tgz", + "integrity": "sha512-FHo7ITkDku3kQ8/44nU6IGR1UNH22aqYM3LV2ytV40hWSMVllXFlM+xIVusT+I/SZBAtuFpwEWzyS+Jn4TkkAQ==", "cpu": [ "x64" ], @@ -3855,17 +3961,13 @@ "freebsd" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.31.0.tgz", + "integrity": "sha512-o1NiDlJDO9SOoY5wH8AyPUX60yQcOwu5oVuepi2eetArBp0iFF9qIH1uLlZsUu4QQ6ywqxcJSMjXCqGKC5uQFg==", "cpu": [ "arm" ], @@ -3876,17 +3978,13 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.31.0.tgz", + "integrity": "sha512-VXiRxlBz7ivAIjhnnVBEYdjCQ66AsjM0YKxYAcliS0vPqhWKiScIT61gee0DPCVaw1XcuW8u19tfRwpfdYoreg==", "cpu": [ "arm" ], @@ -3897,17 +3995,13 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.31.0.tgz", + "integrity": "sha512-ryGPOtPViNcjs8N8Ap+wn7SM6ViiLzR9f0Pu7yprae+wjl6qwnNytzsUe7wcb+jT43DJYmvemFqE8tLVUavYbQ==", "cpu": [ "arm64" ], @@ -3918,17 +4012,13 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.31.0.tgz", + "integrity": "sha512-BA3Euxp4bfd+AU3cKPgmHL44BbuBtmQTyAQoVDhX/nqPgbS/auoGp71uQBE4SAPTsQM/FcXxfKmCAdBS7ygF9w==", "cpu": [ "arm64" ], @@ -3939,19 +4029,15 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.31.0.tgz", + "integrity": "sha512-wIiKHulVWE9s6PSftPItucTviyCvjugwPqEyUl1VD47YsFqa5UtQTknBN49NODHJvBgO+eqqUodgRqmNMp3xyw==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", @@ -3960,19 +4046,15 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.31.0.tgz", + "integrity": "sha512-6cM8Jt54bg9V/JoeUWhwnzHAS9Kvgc0oFsxql8PVs/njAGs0H4r+GEU4d+LXZPwI3b3ZUuzpbxlRJzer8KW+Cg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", @@ -3981,59 +4063,47 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.31.0.tgz", + "integrity": "sha512-d+b05wXVRGaO6gobTaDqUdBvTXwYc0ro7k1UVC37k4VimLRQOzEZqTwVinqIX3LxTaFCmfO1yG00u9Pct3AKwQ==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.31.0.tgz", + "integrity": "sha512-Q+i2kj8e+two9jTZ3vxmxdNlg++qShe1ODL6xV4+Qt6SnJYniMxfcqphuXli4ft270kuHqd8HSVZs84CsSh1EA==", "cpu": [ - "ia32" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.31.0.tgz", + "integrity": "sha512-F2Z5ffj2okhaQBi92MylwZddKvFPBjrsZnGvvRmVvWRf8WJ0WkKUTtombDgRYNDgoW7GBUUrNNNgWhdB7kVjBA==", "cpu": [ "x64" ], @@ -4041,80 +4111,101 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.31.0.tgz", + "integrity": "sha512-Vz7dZQd1yhE5wTWujGanPmZgDtzLZS1PQoeMmUj89p4eMTmpIkvWaIr3uquJCbh8dQd5cPZrFvMmdDgcY5z+GA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.31.0.tgz", + "integrity": "sha512-nm0gus6R5V9tM1XaELiiIduUzmdBuCefkwToWKL4UtuFoMCGkigVQnbzHwPTGLVWOEF6wTQucFA8Fn1U8hxxVw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "optional": true + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.31.0.tgz", + "integrity": "sha512-mMpvvPpoLD97Q2TMhjWDJSn+ib3kN+H+F4gq9p88zpeef6sqWc9djorJ3JXM2sOZMJ6KZ+1kSJfe0rkji74Pog==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.31.0.tgz", + "integrity": "sha512-zTngbPyrTDBYJFVQa4OJldM6w1Rqzi8c0/eFxAEbZRoj6x149GkyMkAY3kM+09ZhmszFitCML2S3p10NE2XmHA==", "cpu": [ - "arm" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ] + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.31.0.tgz", + "integrity": "sha512-TB30D+iRLe6eUbc/utOA93+FNz5C6vXSb/TEhwvlODhKYZZSSKn/lFpYzZC7bdhx3a8m4Jq8fEUoCJ6lKnzdpA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ] + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "node_modules/@oxlint-tsgolint/darwin-arm64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.12.2.tgz", + "integrity": "sha512-XIfavTqkJPGYi/98z7ZCkZvXq2AccMAAB0iwvKDRTQqiweMXVUyeUdx46phCHHH1PgmIVJtVfysThkHq2xCyrw==", "cpu": [ "arm64" ], @@ -4125,10 +4216,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "node_modules/@oxlint-tsgolint/darwin-x64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.12.2.tgz", + "integrity": "sha512-tytsvP6zmNShRNDo4GgQartOXmd4GPd+TylCUMdO/iWl9PZVOgRyswWbYVTNgn85Cib/aY2q3Uu+jOw+QlbxvQ==", "cpu": [ "x64" ], @@ -4139,10 +4230,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "node_modules/@oxlint-tsgolint/linux-arm64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.12.2.tgz", + "integrity": "sha512-3W38yJuF7taEquhEuD6mYQyCeWNAlc1pNPjFkspkhLKZVgbrhDA4V6fCxLDDRvrTHde0bXPmFvuPlUq5pSePgA==", "cpu": [ "arm64" ], @@ -4150,13 +4241,13 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ] }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "node_modules/@oxlint-tsgolint/linux-x64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/linux-x64/-/linux-x64-0.12.2.tgz", + "integrity": "sha512-EjcEspeeV0NmaopEp4wcN5ntQP9VCJJDrTvzOjMP4W6ajz18M+pni9vkKvmcPIpRa/UmWobeFgKoVd/KGueeuQ==", "cpu": [ "x64" ], @@ -4164,41 +4255,58 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ] }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "node_modules/@oxlint-tsgolint/win32-arm64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.12.2.tgz", + "integrity": "sha512-a9L7iA5K/Ht/i8d9+7RTp6hbPa4cyXP0MdySVXAO6vczpL/4ildfY9Hr2m2wqL12uK6xe/uVABpVTrqay/wV+g==", "cpu": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "node_modules/@oxlint-tsgolint/win32-x64": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/@oxlint-tsgolint/win32-x64/-/win32-x64-0.12.2.tgz", + "integrity": "sha512-Cvt40UbTf5ib12DjGN+mMGOnjWa4Bc6Y7KEaXXp9qzckvs3HpNk2wSwMV3gnuR8Ipx4hkzkzrgzD0BAUsySAfA==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.69.0.tgz", + "integrity": "sha512-DKQQbD5cZ/MYfDgDI7YGyGD9FSxABlsBsYFo5p26lloob543tP9+4N3guwdXIYJN+7HSZxLe8YJuwcOWw5qnHg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.69.0.tgz", + "integrity": "sha512-lEhb+I5pr4inux+JFwfCa1HRq3Os7NirEFQ0H1I35SVEHPm6byX0Ah47xmRha3qi6LAkxUcxViL8o/9PivjzBg==", "cpu": [ "arm64" ], @@ -4206,13 +4314,16 @@ "license": "MIT", "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.69.0.tgz", + "integrity": "sha512-GY2YE8lOZW59BW1Ia1y+1gR0XyjrZRvVWHAr8LGeGhYHE0OQJ/7cRKXTkx1P+E9/6awEc3SX8a68SFTjh/E//A==", "cpu": [ "arm64" ], @@ -4220,139 +4331,186 @@ "license": "MIT", "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.69.0.tgz", + "integrity": "sha512-ax1oZnOjHX3LB7myQyHEaQkDwfLb6str3/nSP6O7EVUviQGNkEGzGV0EqcBJWK+Ufwx0l4xPgyYayurvhAdl2Q==", "cpu": [ - "loong64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.69.0.tgz", + "integrity": "sha512-kHWeHv4g2h8NY+mpCxzCtY4uerMJWTN/TSnNj1CPbakFpHEJ6cTya2wWV0pDSYWOJ2+0UiEbhn3AtXxHtsnKjg==", "cpu": [ - "loong64" + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.69.0.tgz", + "integrity": "sha512-gq84vM1a1oEehXo27YCDzGVcxPsZDI1yswZwz2Da1/cbnWtrL16XZZnz0G/+gIU8edtHpfjxq5c+vWEHqJfWoQ==", + "cpu": [ + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.69.0.tgz", + "integrity": "sha512-kIqEa98JQ0VRyrcncxA417m2AzasqTlD+FyVT1AksjvjkqQcvm7pBWYvoW3/mpyOP2XYvi5nSCCTIe6De1yu5g==", "cpu": [ - "ppc64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.69.0.tgz", + "integrity": "sha512-j+xYiXozxGWx2cpjCrwwGR4awTxPFsRv3JZrv23RCogEPMc4R7UqjHW47p/RG0aRlbWiROCJ8coUfCwy0dvzHA==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.69.0.tgz", + "integrity": "sha512-xEPpNppTfN1l/nM7gYSf9iocscu/as+p/7vxkLeLEKnYU+09Dm+5V6IhDYDh+Uz6FajEupWwCLt5SOG0y1PCKg==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.69.0.tgz", + "integrity": "sha512-Ug0+eU7HJBlek+SjklYH62IlOMirEJsdxpihH0kSqX0XdrDD4NdHpQc10fK1JC35yn6KrrcN+uYzlHD38XAf8Q==", "cpu": [ - "riscv64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.69.0.tgz", + "integrity": "sha512-iEyI3GIg0l/s3G4qy2TlaaWKdzj4PJJStwtlocpDTC00PY9hZueotf6OKUj9+yfQh0lrpBW/pLMgTztbAHKJEg==", "cpu": [ - "s390x" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.69.0.tgz", + "integrity": "sha512-NjHjpiI4WIKSMwuoJSZi5VToPeoYOS1FR52HLIDG6lidMdqquusgtODb4iLk0+lb1q3Z0nv2/aPRcC/olmpQGg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.69.0.tgz", + "integrity": "sha512-Ai/prDewoItkDXbp38gwGZi41DycZbUTZJ3UidwoHgQC0/DaqC2TGdtBTQLJ6hSD+SAxASzh8+/eSBPmxfOacA==", "cpu": [ - "x64" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.69.0.tgz", + "integrity": "sha512-Gt3KHgp46mRKz4sJeaASmKvD8ayXookRw07RMf+NowhEztGGDZ7VrXpoW96XuKJLjFukWizOFVNjmYb/u7caNQ==", "cpu": [ "x64" ], @@ -4360,27 +4518,33 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" - ] + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.69.0.tgz", + "integrity": "sha512-7tQhJ2+p/oHv1zcfnjYI7YVzC/7iBaVOfIvFYtxdJ5F45mWgEdrCyXZXZGfiLey5t/5JhOhsaMnnv1kAzckd7g==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" - ] + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.69.0.tgz", + "integrity": "sha512-vmWz6TKp/3hfA4lksR0zHBv/6xuX1jhym6eqOjdH2DXsDDHZWcp2f0KG0VCAnlVbIrjk29G4wAWMXb/Hn1YobA==", "cpu": [ "arm64" ], @@ -4388,41 +4552,50 @@ "license": "MIT", "optional": true, "os": [ - "win32" - ] + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.69.0.tgz", + "integrity": "sha512-9RExaLgmaw6IoIkU9cTpT71mLfI0xZ86iZH8x518LVsOkjquJMYqb9P7KpC8lgd1t0Dxs41p2pxynq4XR3Ttzw==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.69.0.tgz", + "integrity": "sha512-1907kRPF8/PrcIw1E7LMs9JbVrpgnt/MvFdss3an8oDkYNAACXzTntV3t3869ZZhMZxb2AzRGbz1pA/jdFatXA==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.69.0.tgz", + "integrity": "sha512-w8SOXv3mT9Fi6jY8OXdXCfnvX/3KNLXGNr4HEz2TA7S4Mv/PYAOmpB8y/ge40mxvBMgGNaSaaDwZpAsQn7HtWA==", "cpu": [ "x64" ], @@ -4431,31 +4604,990 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@schematics/angular": { - "version": "20.3.22", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.22.tgz", - "integrity": "sha512-wXTdFaPIBnSSNj/m0kclvPCYQOc2EGTQN1+Q3j9RIghS9gKgPxI1unSfgieJldZWKzcl8+WdB2zUuDzE7tEshQ==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "@angular-devkit/core": "20.3.22", - "@angular-devkit/schematics": "20.3.22", - "jsonc-parser": "3.3.1" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", - "dev": true, - "license": "Apache-2.0", + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "20.3.22", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.22.tgz", + "integrity": "sha512-wXTdFaPIBnSSNj/m0kclvPCYQOc2EGTQN1+Q3j9RIghS9gKgPxI1unSfgieJldZWKzcl8+WdB2zUuDzE7tEshQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.22", + "@angular-devkit/schematics": "20.3.22", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", + "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" }, @@ -4543,7 +5675,7 @@ "node_modules/@sinequa/assistant": { "version": "3.10.13", "resolved": "https://registry.npmjs.org/@sinequa/assistant/-/assistant-3.10.13.tgz", - "integrity": "sha512-a6quP058dL4jMjxirE+S/5JGT1vDkxc0Wqsub2PFIwACB8qUNbBq7aujckm8sT0o1gAXZMPQGZKRcGv83rBiVg==", + "integrity": "sha512-D9YsVwDpxe4z9MWXM9GnUaC/w0XuCOq0QqHjk8CJipEyFOe7D4OwpKfHsD9WolKxuek0rhbGdPnZlbkQ+NFRIA==", "bundleDependencies": [ "zod" ], @@ -4559,7 +5691,7 @@ } }, "node_modules/@sinequa/assistant/node_modules/zod": { - "version": "4.4.3", + "version": "4.4.1", "inBundle": true, "license": "MIT", "funding": { @@ -4567,14 +5699,22 @@ } }, "node_modules/@sinequa/atomic": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sinequa/atomic/-/atomic-1.1.0.tgz", - "integrity": "sha512-uBizqE/okk+FnSlY8S1CUDNW9U2dtVHQEHPENUEipvR94+KaQ5wAeWC0q989I5NslyvoiEPSkWD5R/I69XEB/g==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@sinequa/atomic/-/atomic-2.0.5.tgz", + "integrity": "sha512-OfzN8wJyQNDz4uIaKd9WKX8mlZmjvHsybrixoMDM7dgrUZIY9ak2OPjslp6NXB8UCSCj7PeUOi0fOtyQW9Tgjw==", + "peerDependencies": { + "@microsoft/sp-http": "^1.20.0" + }, + "peerDependenciesMeta": { + "@microsoft/sp-http": { + "optional": true + } + } }, "node_modules/@sinequa/atomic-angular": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sinequa/atomic-angular/-/atomic-angular-1.0.4.tgz", - "integrity": "sha512-fczP6Tw3rjMdMIiTlXgZElYYWOXeSa/4e6w9Vr57Im/Crg8ftdZexhrrntalarq50Wlqi9mzKcLNphYEK2qVAg==", + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@sinequa/atomic-angular/-/atomic-angular-1.0.18.tgz", + "integrity": "sha512-d4bGf/RwY7fCd7kKQwHn1W8k73qIfbeqLUr8Zg/N0ceVWCjR9Zffu+Iv/bSjwN926LFEebuWmfR14e15fW4JFQ==", "dependencies": { "@angular-architects/ngrx-toolkit": "^20.0.0", "@floating-ui/dom": "^1.7.2", @@ -5086,6 +6226,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -6520,9 +7671,9 @@ } }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6533,32 +7684,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" } }, "node_modules/escalade": { @@ -7126,9 +8277,9 @@ } }, "node_modules/hono": { - "version": "4.12.25", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.25.tgz", - "integrity": "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==", + "version": "4.12.26", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.26.tgz", + "integrity": "sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==", "dev": true, "license": "MIT", "engines": { @@ -7637,9 +8788,19 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7770,6 +8931,27 @@ "lightningcss-win32-x64-msvc": "1.30.1" } }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-darwin-arm64": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", @@ -7990,9 +9172,19 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" @@ -8381,14 +9573,24 @@ "license": "Unicode-DFS-2016" }, "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", - "linkify-it": "^5.0.0", + "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -8737,9 +9939,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "funding": [ { "type": "github", @@ -9277,6 +10479,113 @@ "license": "MIT", "optional": true }, + "node_modules/oxfmt": { + "version": "0.31.0", + "resolved": "https://npm.sinequa.com/oxfmt/-/oxfmt-0.31.0.tgz", + "integrity": "sha512-ukl7nojEuJUGbqR4ijC0Z/7a6BYpD4RxLS2UsyJKgbeZfx6TNrsa48veG0z2yQbhTx1nVnes4GIcqMn7n2jFtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.31.0", + "@oxfmt/binding-android-arm64": "0.31.0", + "@oxfmt/binding-darwin-arm64": "0.31.0", + "@oxfmt/binding-darwin-x64": "0.31.0", + "@oxfmt/binding-freebsd-x64": "0.31.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.31.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.31.0", + "@oxfmt/binding-linux-arm64-gnu": "0.31.0", + "@oxfmt/binding-linux-arm64-musl": "0.31.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.31.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.31.0", + "@oxfmt/binding-linux-riscv64-musl": "0.31.0", + "@oxfmt/binding-linux-s390x-gnu": "0.31.0", + "@oxfmt/binding-linux-x64-gnu": "0.31.0", + "@oxfmt/binding-linux-x64-musl": "0.31.0", + "@oxfmt/binding-openharmony-arm64": "0.31.0", + "@oxfmt/binding-win32-arm64-msvc": "0.31.0", + "@oxfmt/binding-win32-ia32-msvc": "0.31.0", + "@oxfmt/binding-win32-x64-msvc": "0.31.0" + } + }, + "node_modules/oxlint": { + "version": "1.69.0", + "resolved": "https://npm.sinequa.com/oxlint/-/oxlint-1.69.0.tgz", + "integrity": "sha512-ypZkK/aDc5NQV8zIR6s2H2Tl3aNW8FmJ1m9+2qsaYuRenl8vgnHNCGwTHviWJdUQzglOlHFchgopdtGhSy17Rw==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.69.0", + "@oxlint/binding-android-arm64": "1.69.0", + "@oxlint/binding-darwin-arm64": "1.69.0", + "@oxlint/binding-darwin-x64": "1.69.0", + "@oxlint/binding-freebsd-x64": "1.69.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.69.0", + "@oxlint/binding-linux-arm-musleabihf": "1.69.0", + "@oxlint/binding-linux-arm64-gnu": "1.69.0", + "@oxlint/binding-linux-arm64-musl": "1.69.0", + "@oxlint/binding-linux-ppc64-gnu": "1.69.0", + "@oxlint/binding-linux-riscv64-gnu": "1.69.0", + "@oxlint/binding-linux-riscv64-musl": "1.69.0", + "@oxlint/binding-linux-s390x-gnu": "1.69.0", + "@oxlint/binding-linux-x64-gnu": "1.69.0", + "@oxlint/binding-linux-x64-musl": "1.69.0", + "@oxlint/binding-openharmony-arm64": "1.69.0", + "@oxlint/binding-win32-arm64-msvc": "1.69.0", + "@oxlint/binding-win32-ia32-msvc": "1.69.0", + "@oxlint/binding-win32-x64-msvc": "1.69.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.22.1", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint-tsgolint": { + "version": "0.12.2", + "resolved": "https://npm.sinequa.com/oxlint-tsgolint/-/oxlint-tsgolint-0.12.2.tgz", + "integrity": "sha512-IFiOhYZfSgiHbBznTZOhFpEHpsZFSP0j7fVRake03HEkgH0YljnTFDNoRkGWsTrnrHr7nRIomSsF4TnCI/O+kQ==", + "dev": true, + "license": "MIT", + "bin": { + "tsgolint": "bin/tsgolint.js" + }, + "optionalDependencies": { + "@oxlint-tsgolint/darwin-arm64": "0.12.2", + "@oxlint-tsgolint/darwin-x64": "0.12.2", + "@oxlint-tsgolint/linux-arm64": "0.12.2", + "@oxlint-tsgolint/linux-x64": "0.12.2", + "@oxlint-tsgolint/win32-arm64": "0.12.2", + "@oxlint-tsgolint/win32-x64": "0.12.2" + } + }, "node_modules/p-map": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", @@ -9563,9 +10872,9 @@ } }, "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -9582,7 +10891,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -9619,9 +10928,9 @@ "license": "MIT" }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.8.4", + "resolved": "https://npm.sinequa.com/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", "dev": true, "license": "MIT", "bin": { @@ -9648,16 +10957,18 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.12.tgz", - "integrity": "sha512-OuTQKoqNwV7RnxTPwXWzOFXy6Jc4z8oeRZYGuMpRyG3WbuR3jjXdQFK8qFBMBx8UHWdHrddARz2fgUenild6aw==", + "version": "0.7.4", + "resolved": "https://npm.sinequa.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.4.tgz", + "integrity": "sha512-UKii4RjY05SNt/WQi6/NcOn/LsT0/ILLXsxygjbRg5/YZelsSu5jTqorYHPDGq4nZy5q5hpCu+XdGZ1xaJEQgw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.21.3" + "node": ">=20.19" }, "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", @@ -9665,20 +10976,24 @@ "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "peerDependenciesMeta": { "@ianvs/prettier-plugin-sort-imports": { "optional": true }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, "@prettier/plugin-pug": { "optional": true }, @@ -9697,9 +11012,6 @@ "prettier-plugin-css-order": { "optional": true }, - "prettier-plugin-import-sort": { - "optional": true - }, "prettier-plugin-jsdoc": { "optional": true }, @@ -9718,9 +11030,6 @@ "prettier-plugin-sort-imports": { "optional": true }, - "prettier-plugin-style-order": { - "optional": true - }, "prettier-plugin-svelte": { "optional": true } @@ -10048,6 +11357,40 @@ "dev": true, "license": "MIT" }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, "node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", @@ -10747,304 +12090,649 @@ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.5.16", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://npm.sinequa.com/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tar": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", - "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", - "license": "BlueOak-1.0.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": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 10.0.0" } }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">= 0.8" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=8.0" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", - "engines": { - "node": ">=0.6" + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "license": "MIT" + }, + "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": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", + "node_modules/validate-npm-package-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 4.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "node_modules/vanillajs-datepicker": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/vanillajs-datepicker/-/vanillajs-datepicker-1.3.4.tgz", + "integrity": "sha512-waOyp2Ay+K1VA/B5cNlFgSNzFR9efCVKaoyMyNEAhAwmKLzMB9nCJs6Vqmo6HuHWA98VEHXbgz5thZ7hH/uohA==", "license": "MIT" }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/tuf-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", - "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">= 0.6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14.17" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", - "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^6.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" + "engines": { + "node": ">= 12.0.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "license": "MIT" - }, - "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==", + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/validate-npm-package-name": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", - "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vanillajs-datepicker": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/vanillajs-datepicker/-/vanillajs-datepicker-1.3.4.tgz", - "integrity": "sha512-waOyp2Ay+K1VA/B5cNlFgSNzFR9efCVKaoyMyNEAhAwmKLzMB9nCJs6Vqmo6HuHWA98VEHXbgz5thZ7hH/uohA==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">= 0.8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/watchpack": { @@ -11254,9 +12942,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", "engines": { "node": ">=8.3.0" diff --git a/package.json b/package.json index 26d2b818..b964f766 100644 --- a/package.json +++ b/package.json @@ -7,24 +7,27 @@ "docs:build-internal": "cd docusaurus && npm run build-internal", "docs:ci": "cd docusaurus && npm ci", "docs:start": "npm run start:docs", - "lint": "ng lint", "ng": "ng", "postinstall": "npm run transloco:extract-scoped-libs", "prepare": "husky", - "prettier:check": "prettier --config .prettierrc --check src/**/*.{js,ts,html,scss,css,json}", - "prettier:write": "prettier --config .prettierrc --write src/**/*.{js,ts,html,scss,css,json}", + "prettier:check": "prettier --config .prettierrc --check src/**/*.html", + "prettier:write": "prettier --config .prettierrc --write src/**/*.html", "start": "ng serve", "start:docs": "cd docusaurus && npm start", "start:local": "ng serve --ssl=true --proxy-config=proxy.conf.local.json", "t:extract": "transloco-scoped-libs", "test": "ng test", "transloco:extract-scoped-libs": "npm run t:extract", - "watch": "ng build --watch --configuration development" + "watch": "ng build --watch --configuration development", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "fmt": "oxfmt", + "fmt:check": "oxfmt --check" }, "lint-staged": { - "*.{js,ts,html,scss,css,json}": [ - "prettier --write" - ] + "*.{js,ts}": "npm run lint", + "*.{js,ts,scss,css,json}": "oxfmt --no-error-on-unmatched-pattern", + "*.html": "prettier --write" }, "private": true, "dependencies": { @@ -48,9 +51,9 @@ "@ngrx/signals": "^20.1.0", "@ngrx/store": "^20.1.0", "@sinequa/assistant": "3.10.13", - "@sinequa/atomic": "^1.1.0", - "@sinequa/atomic-angular": "^1.0.4", - "@sinequa/ui": "^1.0.0", + "@sinequa/atomic": "^2.0.5", + "@sinequa/atomic-angular": "~1.0.18", + "@sinequa/ui": "1.0.0", "@tailwindcss/postcss": "^4.1.3", "@tanstack/angular-query-experimental": "^5.40.0", "@tanstack/angular-virtual": "^4.0.7", @@ -75,6 +78,7 @@ "@angular/build": "^20.3.13", "@angular/cli": "^20.3.13", "@angular/compiler-cli": "^20.3.15", + "@biomejs/biome": "2.3.14", "@jsverse/transloco-scoped-libs": "^7.0.1", "@tailwindcss/typography": "^0.5.16", "@types/flowjs": "^2.13.14", @@ -84,16 +88,20 @@ "autoprefixer": "^10.4.16", "husky": "^9.1.7", "lint-staged": "^15.4.1", + "oxfmt": "^0.31.0", + "oxlint": "^1.60.0", + "oxlint-tsgolint": "^0.12.0", "postcss": "^8.5.3", - "prettier": "^3.5.3", + "prettier": "^3.8.1", "prettier-plugin-package": "^1.4.0", - "prettier-plugin-tailwindcss": "^0.6.11", + "prettier-plugin-tailwindcss": "^0.7.2", "tailwind-merge": "^2.2.2", "tailwindcss": "^4.1.3", "typescript": "~5.8.3", "zod": "^3.24.2" }, "overrides": { - "esbuild": "0.28.1" + "ajv": "8.18.0", + "vite": ">=7.3.2" } } diff --git a/src/app/app.config.ts b/src/app/app.config.ts index c795786c..a424e8c3 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,18 +1,18 @@ -import { registerLocaleData } from '@angular/common'; -import { provideHttpClient, withInterceptors } from '@angular/common/http'; -import localeDe from '@angular/common/locales/de'; -import localeFr from '@angular/common/locales/fr'; -import { APP_INITIALIZER, type ApplicationConfig, inject, isDevMode, LOCALE_ID, provideAppInitializer, provideZonelessChangeDetection } from '@angular/core'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; -import { provideRouter, RouteReuseStrategy, withComponentInputBinding, withHashLocation } from '@angular/router'; -import { CustomReuseStrategy } from '@config/custom-reuse-strategy'; -import { PREVIEW_HIGHLIGHTS } from '@config/highlight.config'; -import { TranslocoHttpLoader } from '@config/transloco-loader'; +import { registerLocaleData } from "@angular/common"; +import { provideHttpClient, withInterceptors } from "@angular/common/http"; +import localeDe from "@angular/common/locales/de"; +import localeFr from "@angular/common/locales/fr"; +import { APP_INITIALIZER, ApplicationConfig, isDevMode, LOCALE_ID, provideAppInitializer, provideZonelessChangeDetection } from "@angular/core"; +import { provideNoopAnimations } from "@angular/platform-browser/animations"; +import { provideRouter, RouteReuseStrategy, withComponentInputBinding, withHashLocation } from "@angular/router"; +import { CustomReuseStrategy } from "@config/custom-reuse-strategy"; +import { PREVIEW_HIGHLIGHTS } from "@config/highlight.config"; +import { TranslocoHttpLoader } from "@config/transloco-loader"; // @ts-expect-error -import Flow from '@flowjs/flow.js'; -import { FlowInjectionToken } from '@flowjs/ngx-flow'; -import { provideTransloco } from '@jsverse/transloco'; -import { provideTranslocoMessageformat } from '@jsverse/transloco-messageformat'; +import Flow from "@flowjs/flow.js"; +import { FlowInjectionToken } from "@flowjs/ngx-flow"; +import { provideTransloco } from "@jsverse/transloco"; +import { provideTranslocoMessageformat } from "@jsverse/transloco-messageformat"; import { ASSISTANT_CUSTOM_ELEMENTS, ASSISTANT_MARKDOWN_IT_PLUGINS, @@ -29,15 +29,14 @@ import { markdownItTableToolsPlugin, PageReferenceComponent, TableToolsComponent -} from '@sinequa/assistant/chat'; -import { appInitializerFn } from '@sinequa/atomic'; +} from "@sinequa/assistant/chat"; import { - ApplicationService, auditInterceptorFn, authInterceptorFn, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, bodyInterceptorFn, + bootstrapApp, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, @@ -52,14 +51,13 @@ import { ROUTE_COMPONENTS, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, - toastInterceptorFn, - withBootstrapApp -} from '@sinequa/atomic-angular'; -import { provideTanStackQuery, QueryClient } from '@tanstack/angular-query-experimental'; -import { SearchAllComponent } from './pages/search/all/search-all.component'; -import { SearchLayoutComponent } from './pages/search/layout'; -import { getComponentsForDocumentType } from './registry/document-type-registry'; -import { routes } from './routes'; + toastInterceptorFn +} from "@sinequa/atomic-angular"; +import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental"; +import { SearchAllComponent } from "./pages/search/all/search-all.component"; +import { SearchLayoutComponent } from "./pages/search/layout"; +import { getComponentsForDocumentType } from "./registry/document-type-registry"; +import { routes } from "./routes"; registerLocaleData(localeFr); registerLocaleData(localeDe); @@ -75,11 +73,12 @@ export const appConfig: ApplicationConfig = { // By default, Angular destroys a component when navigating away from its route and re-creates it when navigating back to that route. // With this provider, we can tell Angular to keep the component instance in memory and reuse it when navigating back to the route. { provide: RouteReuseStrategy, useClass: CustomReuseStrategy }, - // this function is used to configure the application before it is loaded - provideAppInitializer(appInitializerFn), - // this function is used to sign in the user and bootstrap the application - provideAppInitializer(() => withBootstrapApp(inject(ApplicationService), { createRoutes: true })), + // Signs the user in and bootstraps the application. `bootstrapApp` injects ApplicationService + // itself AFTER resolving the auth mode (initializeAppConfig) and setting `backendUrl`, so the + // factory must NOT eagerly inject ApplicationService (that would construct dependent stores + // before `backendUrl` is set → `/undefined/api/v1/...`). + provideAppInitializer(() => bootstrapApp({ createRoutes: true })), // Provides an APP_INITIALIZER which will initialize the custom elements defined in the @sinequa/assistant/chat // library. This is required to be able to use the custom elements in Angular components templates. @@ -94,11 +93,11 @@ export const appConfig: ApplicationConfig = { { provide: ASSISTANT_CUSTOM_ELEMENTS, useValue: { - 'document-reference': DocumentReferenceComponent, - 'page-reference': PageReferenceComponent, - 'image-reference': ImageReferenceComponent, - 'code-block': CodeBlockComponent, - 'table-tools': TableToolsComponent + "document-reference": DocumentReferenceComponent, + "page-reference": PageReferenceComponent, + "image-reference": ImageReferenceComponent, + "code-block": CodeBlockComponent, + "table-tools": TableToolsComponent } }, { @@ -113,7 +112,7 @@ export const appConfig: ApplicationConfig = { ] }, - { provide: LOCALE_ID, useValue: 'fr-FR' }, + { provide: LOCALE_ID, useValue: "fr-FR" }, // this token is used to configure the CSS class to use in the preview with the highlights // for each highlight, a CSS class will be created with the name of the highlight @@ -121,10 +120,7 @@ export const appConfig: ApplicationConfig = { // this token is used to configure the function who returns the component to use for the preview // the function should return a DocumentTypeMap object - { - provide: COMPONENTS_FOR_DOCUMENT_TYPE, - useValue: getComponentsForDocumentType - }, + { provide: COMPONENTS_FOR_DOCUMENT_TYPE, useValue: getComponentsForDocumentType }, // this token is used to configure the component to use with the drawer { provide: DRAWER_COMPONENT, useValue: DrawerPreviewComponent }, @@ -133,38 +129,10 @@ export const appConfig: ApplicationConfig = { // by default, the routerLink is "/xxx", where xxx is the name of the widget // if you want to change the path of the widget, you can use the routerLink property // showLoadMore is used to show the "Load more" button in the widgets, by default it is set to true, so here we set it to false - { - provide: RECENT_SEARCHES_CONFIG, - useValue: { - ...RECENT_SEARCHES_OPTIONS, - routerLink: '/widgets/recent-searches', - showLoadMore: false - } - }, - { - provide: SAVED_SEARCHES_CONFIG, - useValue: { - ...SAVED_SEARCHES_OPTIONS, - routerLink: '/widgets/saved-searches', - showLoadMore: false - } - }, - { - provide: BOOKMARKS_CONFIG, - useValue: { - ...BOOKMARKS_OPTIONS, - routerLink: '/widgets/bookmarks', - showLoadMore: false - } - }, - { - provide: COLLECTIONS_CONFIG, - useValue: { - ...COLLECTIONS_OPTIONS, - routerLink: '/widgets/collections', - showLoadMore: false - } - }, + { provide: RECENT_SEARCHES_CONFIG, useValue: { ...RECENT_SEARCHES_OPTIONS, routerLink: "/widgets/recent-searches", showLoadMore: false } }, + { provide: SAVED_SEARCHES_CONFIG, useValue: { ...SAVED_SEARCHES_OPTIONS, routerLink: "/widgets/saved-searches", showLoadMore: false } }, + { provide: BOOKMARKS_CONFIG, useValue: { ...BOOKMARKS_OPTIONS, routerLink: "/widgets/bookmarks", showLoadMore: false } }, + { provide: COLLECTIONS_CONFIG, useValue: { ...COLLECTIONS_OPTIONS, routerLink: "/widgets/collections", showLoadMore: false } }, // this token is used to configure how the extracts will be retrieved // if worker is allowed by your Security Policy, the extracts will be retrieved using a web worker // if not, comment the line below or set it to false @@ -176,12 +144,12 @@ export const appConfig: ApplicationConfig = { provide: ROUTE_COMPONENTS, useValue: [ { - path: 'search', + path: "search", component: SearchLayoutComponent, isRoot: true }, { - path: 'all', + path: "all", component: SearchAllComponent } ] @@ -215,12 +183,12 @@ export const appConfig: ApplicationConfig = { ), provideTransloco({ config: { - availableLangs: ['en', 'fr', 'de'], - defaultLang: 'en', + availableLangs: ["en", "fr", "de"], + defaultLang: "en", // Remove this option if your application doesn't support changing language in runtime. reRenderOnLangChange: true, prodMode: !isDevMode(), - fallbackLang: 'en', + fallbackLang: "en", missingHandler: { logMissingKey: true, useFallbackTranslation: true diff --git a/src/app/components/assistant/assistant.ts b/src/app/components/assistant/assistant.ts index 7a54185a..da2e0561 100644 --- a/src/app/components/assistant/assistant.ts +++ b/src/app/components/assistant/assistant.ts @@ -1,33 +1,33 @@ -import { afterNextRender, Component, computed, DestroyRef, effect, inject, input, output, signal, ViewEncapsulation, viewChild } from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import type { HubConnection } from '@microsoft/signalr'; -import { getState } from '@ngrx/signals'; +import { afterNextRender, Component, computed, DestroyRef, effect, inject, input, output, signal, ViewEncapsulation, viewChild } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { HubConnection } from "@microsoft/signalr"; +import { getState } from "@ngrx/signals"; import { ChatComponent, - type ChatConfig, - type ChatContextAttachment, + ChatConfig, + ChatContextAttachment, ChatSettingsV3Component, - type InitChat, - type MessageHandler, - type RawMessage, - type SuggestedAction -} from '@sinequa/assistant/chat'; -import { type Article, error, type Query } from '@sinequa/atomic'; + InitChat, + MessageHandler, + RawMessage, + SuggestedAction +} from "@sinequa/assistant/chat"; +import { Article, error, Query } from "@sinequa/atomic"; import { AppStore, DrawerStackService, - type PreviewHighlights, + PreviewHighlights, PreviewService, PrincipalStore, QueryParamsStore, SelectionStore, UserSettingsStore -} from '@sinequa/atomic-angular'; -import { cn } from '@sinequa/ui'; -import { catchError, of } from 'rxjs'; +} from "@sinequa/atomic-angular"; +import { cn } from "@sinequa/ui"; +import { catchError, of } from "rxjs"; @Component({ - selector: 'assistant, Assistant', + selector: "assistant, Assistant", imports: [ChatComponent, ChatSettingsV3Component], template: ` @if (isChatInitialized() || showAssistant()) { @@ -56,9 +56,9 @@ import { catchError, of } from 'rxjs'; } } `, - styleUrl: './assistant.css', + styleUrl: "./assistant.css", host: { - '[attr.no-progress]': 'noProgress' + "[attr.no-progress]": "noProgress" }, encapsulation: ViewEncapsulation.None }) @@ -73,7 +73,7 @@ export class AssistantComponent { selectionStore = inject(SelectionStore); protected readonly previewService = inject(PreviewService); - class = input(''); + class = input(""); // Used to initialize the chat unconditionally showAssistant = input(false); instanceId = input.required(); @@ -102,7 +102,7 @@ export class AssistantComponent { queryParamsStore = inject(QueryParamsStore); // used to cronstruct a valid query object used by the sqChat component - defaultQueryName = computed(() => this.appStore.getDefaultQuery()?.name || '_query'); + defaultQueryName = computed(() => this.appStore.getDefaultQuery()?.name || "_query"); _query = { name: this.defaultQueryName() }; query = input(); @@ -147,20 +147,20 @@ export class AssistantComponent { ?.chatService?.streaming$.pipe( takeUntilDestroyed(this.destroyRef), catchError(err => { - error('Unhandled error in streaming', err); + error("Unhandled error in streaming", err); return []; }) ) .subscribe({ next: streaming => this.isStreaming.emit(streaming), - error: err => error('Error in streaming', err) + error: err => error("Error in streaming", err) }); this.sqChat() ?.chatService?.initProcess$.pipe( takeUntilDestroyed(this.destroyRef), catchError(err => { - error('Unhandled error in init process', err); + error("Unhandled error in init process", err); return of(false); }) ) @@ -205,7 +205,7 @@ export class AssistantComponent { ? { highlights: [ { - category: 'snippet', + category: "snippet", highlights: event.parts } ], @@ -217,12 +217,8 @@ export class AssistantComponent { const partId = event.$partId !== undefined ? event.$partId! - 1 : undefined; if (partId) { - this.previewService.events.set('scrollTo'); - this.previewService.sendMessage({ - action: 'select', - id: `snippet_${partId}`, - usePassageHighlighter: true - }); + this.previewService.events.set("scrollTo"); + this.previewService.sendMessage({ action: "select", id: `snippet_${partId}`, usePassageHighlighter: true }); } } @@ -236,10 +232,10 @@ export class AssistantComponent { handleSuggestAction(action: SuggestedAction) { switch (action.type) { - case 'Prefill': + case "Prefill": this.insertText(action.content); break; - case 'Submit': + case "Submit": this.submitQuestion(action.content); break; default: @@ -250,8 +246,8 @@ export class AssistantComponent { handleRedirect($event: any) { const url = $event.url1; - if (url && typeof url === 'string' && url.trim() !== '') { - window.open(url, '_blank'); + if (url && typeof url === "string" && url.trim() !== "") { + window.open(url, "_blank"); } } @@ -271,21 +267,13 @@ export class AssistantComponent { const config = this.appStore.assistants()[this.instanceId()!]; if (question && config) { - const systemMsg = { - role: 'system', - content: config.defaultValues.systemPrompt, - additionalProperties: { display: false } - } as RawMessage; + const systemMsg = { role: "system", content: config.defaultValues.systemPrompt, additionalProperties: { display: false } } as RawMessage; const messages: RawMessage[] = [ systemMsg, { - role: 'user', - content: question || '', - additionalProperties: { - display: true, - isUserInput: true, - additionalWorkflowProperties: config.additionalWorkflowProperties - } + role: "user", + content: question || "", + additionalProperties: { display: true, isUserInput: true, additionalWorkflowProperties: config.additionalWorkflowProperties } } ]; this.initChat = { messages } as InitChat; @@ -321,7 +309,7 @@ export class AssistantComponent { if (sqChatInstance) { sqChatInstance.attachToChat(ids); } else { - error('sqChat instance is not defined'); + error("sqChat instance is not defined"); } } diff --git a/src/app/components/preview/preview-tabs/preview-tabs.ts b/src/app/components/preview/preview-tabs/preview-tabs.ts index cd0f6d53..5c842c2d 100644 --- a/src/app/components/preview/preview-tabs/preview-tabs.ts +++ b/src/app/components/preview/preview-tabs/preview-tabs.ts @@ -1,14 +1,14 @@ -import { Component, computed, DestroyRef, effect, inject, signal, viewChild } from '@angular/core'; -import { TranslocoPipe } from '@jsverse/transloco'; +import { Component, computed, DestroyRef, effect, inject, signal, viewChild } from "@angular/core"; +import { TranslocoPipe } from "@jsverse/transloco"; -import { getState } from '@ngrx/signals'; -import { Article, CCApp, Query } from '@sinequa/atomic'; -import { AppStore, SelectionStore } from '@sinequa/atomic-angular'; -import { TabComponent, TabContent, TabsComponent, TabsListComponent } from '@sinequa/ui'; -import { AssistantComponent } from '../../assistant/assistant'; -import { PreviewContentComponent } from '../preview-content/preview-content'; +import { getState } from "@ngrx/signals"; +import { Article, CCApp, Query } from "@sinequa/atomic"; +import { AppStore, SelectionStore } from "@sinequa/atomic-angular"; +import { SpinnerIcon, TabComponent, TabContent, TabsComponent, TabsListComponent } from "@sinequa/ui"; +import { AssistantComponent } from "../../assistant/assistant"; +import { PreviewContentComponent } from "../preview-content/preview-content"; -export type PreviewTab = 'summary' | 'preview' | 'discussion'; +export type PreviewTab = "summary" | "preview" | "discussion"; /** * Preview tabs component @@ -25,9 +25,9 @@ export type PreviewTab = 'summary' | 'preview' | 'discussion'; * */ @Component({ - selector: 'preview-tabs, PreviewTabs, previewtabs', + selector: "preview-tabs, PreviewTabs, previewtabs", standalone: true, - imports: [TranslocoPipe, TabsComponent, TabsListComponent, TabComponent, TabContent, AssistantComponent, PreviewContentComponent], + imports: [TranslocoPipe, TabsComponent, TabsListComponent, TabComponent, TabContent, AssistantComponent, PreviewContentComponent, SpinnerIcon], template: ` @@ -40,11 +40,11 @@ export type PreviewTab = 'summary' | 'preview' | 'discussion'; @if (displaySummary()) { @if (isStreaming()) { - + } @else { } - {{ 'preview.summarize' | transloco }} + {{ 'preview.summarize' | transloco }} } @@ -57,7 +57,7 @@ export type PreviewTab = 'summary' | 'preview' | 'discussion'; } -
+
@if (displaySummaryContent() && summarizeInstanceId()) { @@ -67,14 +67,14 @@ export type PreviewTab = 'summary' | 'preview' | 'discussion'; [query]="miniPreviewQuery()" [showAssistant]="showSummarizeAssistant()" (isStreaming)="handleStreaming($event)" - class="flex-grow" /> + class="grow" /> } @if (displayChatWithDocContent() && chatWithDocIntanceId()) { - + } @@ -107,9 +107,9 @@ export class PreviewTabsComponent { readonly miniPreviewQuery = computed(() => { const article = this.article(); const query = { - name: this.appStore.getDefaultQuery()?.name || '_query', + name: this.appStore.getDefaultQuery()?.name || "_query", text: article?.title, - filters: { field: 'id', value: article?.id, operator: 'eq' } + filters: { field: "id", value: article?.id, operator: "eq" } }; return query as Query; }); @@ -117,9 +117,9 @@ export class PreviewTabsComponent { readonly chatWithDocQuery = computed(() => { const article = this.article(); const query = { - name: this.appStore.getDefaultQuery()?.name || '_query', + name: this.appStore.getDefaultQuery()?.name || "_query", text: article?.title, - filters: { field: 'id', value: article?.id, operator: 'eq' } + filters: { field: "id", value: article?.id, operator: "eq" } }; return query as Query; }); @@ -130,7 +130,7 @@ export class PreviewTabsComponent { const { name } = getState(this.appStore) as CCApp; return `${name}-preview-summarize-assistant`; } else { - return 'preview-summarize-assistant'; + return "preview-summarize-assistant"; } }); @@ -140,23 +140,23 @@ export class PreviewTabsComponent { const { name } = getState(this.appStore) as CCApp; return `${name}-preview-chatwithdoc-assistant`; } else { - return 'preview-chatwithdoc-assistant'; + return "preview-chatwithdoc-assistant"; } }); displaySummaryContent = computed(() => this.appStore.isAssistantAllowed(this.summarizeInstanceId())); displayChatWithDocContent = computed(() => this.appStore.isAssistantAllowed(this.chatWithDocIntanceId())); - showAssistants = signal<{ name: 'summary' | 'discussion'; enabled: boolean; visible: boolean }[]>([ - { name: 'summary', enabled: false, visible: this.displaySummaryContent() }, - { name: 'discussion', enabled: false, visible: this.displayChatWithDocContent() } + showAssistants = signal<{ name: "summary" | "discussion"; enabled: boolean; visible: boolean }[]>([ + { name: "summary", enabled: false, visible: this.displaySummaryContent() }, + { name: "discussion", enabled: false, visible: this.displayChatWithDocContent() } ]); - showSummarizeAssistant = computed(() => this.showAssistants().find(assistant => assistant.name === 'summary')?.enabled); - showChatWithDocAssistant = computed(() => this.showAssistants().find(assistant => assistant.name === 'discussion')?.enabled); + showSummarizeAssistant = computed(() => this.showAssistants().find(assistant => assistant.name === "summary")?.enabled); + showChatWithDocAssistant = computed(() => this.showAssistants().find(assistant => assistant.name === "discussion")?.enabled); protected readonly isStreaming = signal(false); - displaySummary = computed(() => this.showAssistants().some(assistant => assistant.name === 'summary' && assistant.visible)); - displayChatWithDoc = computed(() => this.showAssistants().some(assistant => assistant.name === 'discussion' && assistant.visible)); + displaySummary = computed(() => this.showAssistants().some(assistant => assistant.name === "summary" && assistant.visible)); + displayChatWithDoc = computed(() => this.showAssistants().some(assistant => assistant.name === "discussion" && assistant.visible)); constructor() { effect(() => { @@ -170,12 +170,12 @@ export class PreviewTabsComponent { } setSummaryAssistant() { - const assistants = this.showAssistants().filter(assistant => assistant.name !== 'summary'); - this.showAssistants.set([...assistants, { name: 'summary', enabled: true, visible: true }]); + const assistants = this.showAssistants().filter(assistant => assistant.name !== "summary"); + this.showAssistants.set([...assistants, { name: "summary", enabled: true, visible: true }]); } setChatWithDocAssistant() { - const assistants = this.showAssistants().filter(assistant => assistant.name !== 'discussion'); - this.showAssistants.set([...assistants, { name: 'discussion', enabled: true, visible: true }]); + const assistants = this.showAssistants().filter(assistant => assistant.name !== "discussion"); + this.showAssistants.set([...assistants, { name: "discussion", enabled: true, visible: true }]); } handleStreaming(isStreaming: boolean) { diff --git a/src/app/components/user-menu/user-menu.ts b/src/app/components/user-menu/user-menu.ts index 5071848b..961e034f 100644 --- a/src/app/components/user-menu/user-menu.ts +++ b/src/app/components/user-menu/user-menu.ts @@ -1,12 +1,12 @@ -import { NgComponentOutlet } from '@angular/common'; -import { Component, computed, inject, signal, type Type, viewChild, viewChildren } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Router } from '@angular/router'; -import { bootstrapNewApp } from '@config/bootstrap-new-app'; -import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco'; -import { getState } from '@ngrx/signals'; -import { logout, setGlobalConfig } from '@sinequa/atomic'; -import { AppStore, OverrideUserDialogComponent, PrincipalStore, ResetUserSettingsDialogComponent, UserSettingsStore } from '@sinequa/atomic-angular'; +import { NgComponentOutlet } from "@angular/common"; +import { Component, computed, inject, signal, Type, viewChild, viewChildren } from "@angular/core"; +import { FormsModule } from "@angular/forms"; +import { Router } from "@angular/router"; +import { bootstrapNewApp } from "@config/bootstrap-new-app"; +import { provideTranslocoScope, TranslocoPipe, TranslocoService } from "@jsverse/transloco"; +import { getState } from "@ngrx/signals"; +import { logout, setGlobalConfig } from "@sinequa/atomic"; +import { AppStore, OverrideUserDialogComponent, PrincipalStore, ResetUserSettingsDialogComponent, UserSettingsStore } from "@sinequa/atomic-angular"; import { AvatarComponent, AvatarFallbackComponent, @@ -19,12 +19,12 @@ import { MenuItemComponent, Separator, UserIcon -} from '@sinequa/ui'; +} from "@sinequa/ui"; -const THEME = ['light', 'dark', 'system'] as const; +const THEME = ["light", "dark", "system"] as const; type Theme = (typeof THEME)[number]; -const SUPPORTED_LANGUAGES = ['en', 'fr'] as const; +const SUPPORTED_LANGUAGES = ["en", "fr"] as const; type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]; /** @@ -34,7 +34,7 @@ type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]; * @deprecated This component is deprecated and will be removed in future releases. */ @Component({ - selector: 'app-user-menu', + selector: "app-user-menu", imports: [ FormsModule, MenuComponent, @@ -51,23 +51,19 @@ type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]; Separator, NgComponentOutlet ], - templateUrl: './user-menu.html', - providers: [provideTranslocoScope('user-menu')] + templateUrl: "./user-menu.html", + providers: [provideTranslocoScope("user-menu")] }) export class UserMenuComponent { AllThemes: { name: Theme; icon: string }[] = [ - { name: 'light', icon: 'fa-fw fal fa-sun-bright' }, - { name: 'dark', icon: 'fa-fw fal fa-moon' }, - { name: 'system', icon: 'fa-fw fal fa-desktop' } + { name: "light", icon: "fa-fw fal fa-sun-bright" }, + { name: "dark", icon: "fa-fw fal fa-moon" }, + { name: "system", icon: "fa-fw fal fa-desktop" } ] as const; - AllLanguages: { - code: SupportedLanguage; - label: string; - icon: Type; - }[] = [ - { code: 'en', label: 'English', icon: FlagEnglishIconComponent }, - { code: 'fr', label: 'Français', icon: FlagFrenchIconComponent } + AllLanguages: { code: SupportedLanguage; label: string; icon: Type }[] = [ + { code: "en", label: "English", icon: FlagEnglishIconComponent }, + { code: "fr", label: "Français", icon: FlagFrenchIconComponent } ] as const; readonly menus = viewChildren(MenuComponent); @@ -87,17 +83,17 @@ export class UserMenuComponent { readonly initials = computed(() => { const principal = this.user(); - const separator = principal.fullName ? ' ' : '.'; - return (principal.fullName || principal.name || '') + const separator = principal.fullName ? " " : "."; + return (principal.fullName || principal.name || "") .split(separator) .filter(word => word[0] && word[0] === word[0].toUpperCase()) .map(word => word[0]) - .join('') + .join("") .slice(0, 3); }); readonly allowUserOverride = computed(() => this.principalStore.allowUserOverride()); readonly isOverridingUser = computed(() => this.principalStore.isOverridingUser()); - readonly allowNewUI = computed(() => this.features?.['newUI']); + readonly allowNewUI = computed(() => this.features?.["newUI"]); readonly currentActiveLang = signal(this.transloco.getActiveLang()); readonly currentTheme = computed(() => this.userSettingsStore.userTheme()); @@ -112,8 +108,8 @@ export class UserMenuComponent { } switchTheme(mode: Theme) { - const userTheme = mode === 'dark' || (mode === 'system' && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); - document.documentElement.classList.toggle('dark', userTheme); + const userTheme = mode === "dark" || (mode === "system" && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches); + document.documentElement.classList.toggle("dark", userTheme); this.userSettingsStore.setUserTheme(mode); } @@ -123,7 +119,7 @@ export class UserMenuComponent { if (redirectUrl) { window.location.href = redirectUrl; } else { - this.router.navigate(['/logout']); + this.router.navigate(["/logout"]); } }); } @@ -145,6 +141,6 @@ export class UserMenuComponent { } openSinequa() { - window.open('https://sinequa.com', '_blank', 'noopener'); + window.open("https://sinequa.com", "_blank", "noopener"); } } diff --git a/src/app/pages/assistant/assistant.layout.ts b/src/app/pages/assistant/assistant.layout.ts index a4a655c2..1060fbff 100644 --- a/src/app/pages/assistant/assistant.layout.ts +++ b/src/app/pages/assistant/assistant.layout.ts @@ -1,29 +1,19 @@ -import { ChangeDetectorRef, Component, computed, effect, inject, input, signal, viewChild } from '@angular/core'; -import type { OnRouteAttached } from '@config/custom-reuse-strategy'; -import { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco'; -import type { HubConnection } from '@microsoft/signalr'; -import { getState } from '@ngrx/signals'; -import { type SavedChat, SavedChatsComponent } from '@sinequa/assistant/chat'; -import { type CCApp, fetchQuery, type Query } from '@sinequa/atomic'; -import { - AggregationComponent, - AggregationsStore, - ApplicationService, - AppStore, - DrawerStackService, - PrincipalStore, - QueryParamsStore, - SelectionStore -} from '@sinequa/atomic-angular'; -import { ButtonComponent, cn, PageHeaderComponent } from '@sinequa/ui'; -import { firstValueFrom } from 'rxjs'; -import { AssistantUploadComponent } from '../../../components/assistant/document-upload/assistant-upload.component'; -import { AssistantComponent } from '../../components/assistant/assistant'; -import { NavbarComponent } from '../../components/navbar/navbar.component'; -import { AppSidebarComponent } from '../../components/sidebar/sidebar.component'; +import { ChangeDetectionStrategy, Component, computed, effect, inject, input, viewChild } from "@angular/core"; +import { OnRouteAttached } from "@config/custom-reuse-strategy"; +import { provideTranslocoScope, TranslocoPipe } from "@jsverse/transloco"; +import { SavedChatsComponent } from "@sinequa/assistant/chat"; +import { SpellingCorrectionMode } from "@sinequa/atomic"; +import { AggregationComponent, ApplicationService, DrawerStackService } from "@sinequa/atomic-angular"; +import { ButtonComponent, cn, PageHeaderComponent } from "@sinequa/ui"; +import { AssistantUploadComponent } from "../../../components/assistant/document-upload/assistant-upload.component"; +import { injectAssistantLayout } from "../../../composables/inject-assistant-layout"; +import { AssistantComponent } from "../../components/assistant/assistant"; +import { NavbarComponent } from "../../components/navbar/navbar.component"; +import { AppSidebarComponent } from "../../components/sidebar/sidebar.component"; @Component({ - selector: 'assistant-layout, AssistantLayout', + selector: "assistant-layout, AssistantLayout", + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ TranslocoPipe, AssistantComponent, @@ -35,7 +25,7 @@ import { AppSidebarComponent } from '../../components/sidebar/sidebar.component' ButtonComponent, AppSidebarComponent ], - providers: [provideTranslocoScope('filters')], + providers: [provideTranslocoScope("filters")], template: ` @@ -50,8 +40,8 @@ import { AppSidebarComponent } from '../../components/sidebar/sidebar.component' ">
- @for (key of [assistantKey()]; track key) { - @if (showSavedChats()) { + @for (key of [layout.assistantKey()]; track key) { + @if (layout.showSavedChats()) {

@@ -63,12 +53,12 @@ import { AppSidebarComponent } from '../../components/sidebar/sidebar.component' size="icon" [title]="'assistant.new-discussion' | transloco" [attr.aria-label]="'assistant.new-discussion' | transloco" - (click)="chat()?.newChat()"> + (click)="layout.startNewChat()">

- +
} @@ -83,15 +73,20 @@ import { AppSidebarComponent } from '../../components/sidebar/sidebar.component' class="border-foreground/10 dark:bg-menu rounded-2xl border p-4 shadow" /> - @for (key of [assistantKey()]; track key) { - @if (showDocumentUploader()) { - + @for (key of [layout.assistantKey()]; track key) { + @if (layout.showDocumentUploader()) { + } }
- @if (query()) { + @if (layout.query()) {
- +
}
@@ -109,175 +104,43 @@ import { AppSidebarComponent } from '../../components/sidebar/sidebar.component' ] }) export class AssistantLayoutComponent implements OnRouteAttached { - cn = cn; - chat = viewChild(AssistantComponent); + readonly cn = cn; + readonly chat = viewChild(AssistantComponent); - drawerStackService = inject(DrawerStackService); - opened = computed(() => this.drawerStackService.isOpened()); - - private readonly appStore = inject(AppStore); - private readonly appFeatures = this.appStore.general()?.features; - private readonly aggregationStore = inject(AggregationsStore); - private readonly selectionStore = inject(SelectionStore); - private readonly queryParamsStore = inject(QueryParamsStore); + readonly drawerStackService = inject(DrawerStackService); + readonly opened = computed(() => this.drawerStackService.isOpened()); + // kept for app-sidebar binding; no longer tracked reactively + readonly backLevel = 0; private readonly applicationService = inject(ApplicationService); - private readonly cdr = inject(ChangeDetectorRef); - - query = signal(undefined); - readonly instanceId = computed(() => { - const { usePrefixName = false } = this.appFeatures?.assistant || {}; - if (usePrefixName) { - const { name } = getState(this.appStore) as CCApp; - return `${name}-standalone-assistant`; - } - return `standalone-assistant`; + readonly q = input(); + readonly t = input(); + readonly b = input(); + readonly s = input(); + readonly f = input(); + readonly n = input(); + readonly c = input(); + + protected readonly layout = injectAssistantLayout(this.chat, { + q: this.q, + t: this.t, + b: this.b, + s: this.s, + f: this.f, + n: this.n, + c: this.c }); - // this is the assistant component who triggers the connection is established - connectionEstablished = signal(false); - - // this is used to know if the assistant is ready to use (i.e. the assistant is ready to receive queries) - isAssistantReady = signal(false); - - // used to know how many times we have to go back to return to the search page (decreases at each query params change) - backLevel = 0; - - // this is used to know if the saved chats component should be displayed - readonly allowSavedChats = computed(() => Boolean(this.appStore.assistants()[this.instanceId()]?.['savedChatSettings']?.['display'])); - - // this is used to know if the document uploader component should be displayed - readonly allowDocumentUploader = computed(() => Boolean(this.appStore.customizationJson()?.['documentsUploadSettings']?.['enabled'])); - - // this is used to display the saved chats component - readonly showSavedChats = computed(() => this.allowSavedChats() && this.connectionEstablished() && this.isAssistantReady()); - - // this is used to display the saved chats component - readonly showDocumentUploader = computed(() => this.allowDocumentUploader() && this.connectionEstablished() && this.isAssistantReady()); - - // queryparams input binding - q = input(); - - /* To force the recreation of the assistant component when the principal changes,*/ - readonly principalStore = inject(PrincipalStore); - // Add to your component class - assistantKey = signal(0); - // Call this method when you need to recreate - recreateAssistant() { - this.assistantKey.update(v => v + 1); - } - /* End of assistant recreation code */ - constructor() { - effect(() => { - // each time the principal store updates, we recreate the assistant component to make sure it uses the latest principal - getState(this.principalStore); - this.recreateAssistant(); - const chat = this.chat(); - if (chat && this.isAssistantReady()) { - // also start a new chat - this.chat()?.newChat(); - } - }); - - effect(() => { - this.queryParamsStore.setFromUrl(window.location.hash); - this.query.set(this.queryParamsStore.getQuery()); - this.backLevel--; - }); - - effect(() => { - // force the change detection when the AggregationStore is updated. - // This is needed because we use the ChatComponent which is not a signal component (i.e Angular v14) - getState(this.aggregationStore); - this.cdr.detectChanges(); - }); - - effect(() => { - const question = this.q(); - this.chat()?.askAI(question); - }); - - // react to drawer state changes to update the application title when the drawer is closed + // Update the title when the drawer closes (app1-specific behaviour) effect(() => { if (!this.drawerStackService.isOpened()) { - this.applicationService.setTitle('Assistant'); + this.applicationService.setTitle("Assistant"); } }); - - // when the component is initialized, we want to set the application title and clear the selection store - this.initialize(); } - onRouteAttached(): void { - this.initialize(); - } - - private initialize() { - // react to drawer state changes to update the application title when the drawer is closed - this.applicationService.setTitle('Assistant'); - // clear the selection store - // this is needed to avoid the selection store to be populated with the assistant queries - this.selectionStore.clear(); - - // this is needed to populate the aggregation with the sources as no query is sent to the server - this.getFirstPageQuery(); - } - - async getFirstPageQuery() { - const query = this.appStore.getDefaultQuery() || { name: '_default' }; - const response = await fetchQuery({ isFirstPage: true, name: query.name }); - this.aggregationStore.update(response.aggregations); - } - - handleConnection(connection: HubConnection) { - // to properly instanciate the saved-chats component, we need to wait for the connection to be established - if (connection.state === 'Connected') { - this.connectionEstablished.set(true); - } - } - - handleReady(ready: boolean) { - if (ready) { - this.isAssistantReady.set(true); - } - } - - /** - * Loads a saved chat and updates the query signal with the first user message content. - * - * This method fetches the saved chat history, locates the first user message, - * and updates the query signal with its content. - * - * @param savedChat - The saved chat object containing the chat ID to load - * @returns A promise that resolves when the saved chat has been loaded and processed - * - * @remarks - * - Requires a valid chat service instance to be available - * - Only processes messages with role 'user' that have content - * - Updates the query signal's text property with the first user message content - * - If no chat service is available or no user message is found, the method returns early - */ - async handleLoadSavedChat(savedChat: SavedChat) { - // 1. fetch the saved chat to get its history - // 2. find the first user message in the history - // 3. update the query signal with the first user message content - const chatService = this.chat()?.sqChat()?.chatService; - if (!chatService) { - return; - } - const response = await firstValueFrom(chatService.getSavedChat(savedChat.id)); - const history = response?.history || []; - const firstUserMessage = history.find(msg => msg.role === 'user' && msg.content); - if (firstUserMessage) { - this.query.update(q => { - if (q && firstUserMessage) { - const newQuery = { ...q }; - newQuery.text = firstUserMessage.content as string; - return newQuery; - } - return q; - }); - } + onRouteAttached() { + this.layout.onRouteAttached(); } } diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 2fd08f8d..2e1f9a94 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -9,10 +9,13 @@
- - - +
+ + + + +
@for (tab of tabs(); track tab.label) { @@ -23,7 +26,7 @@ } -
+
@for (tab of tabs(); track tab.label) { diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index aeafee91..37c9f5c3 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -1,30 +1,29 @@ -import { NgComponentOutlet } from '@angular/common'; -import { Component, DestroyRef, Injector, Type, afterNextRender, computed, effect, inject, runInInjectionContext, signal, viewChild } from '@angular/core'; -import { Router } from '@angular/router'; -import { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco'; - +import { NgComponentOutlet } from "@angular/common"; +import { afterNextRender, Component, computed, DestroyRef, effect, Injector, inject, runInInjectionContext, signal, Type, viewChild } from "@angular/core"; +import { Router } from "@angular/router"; +import { provideTranslocoScope, TranslocoPipe } from "@jsverse/transloco"; +import { getState } from "@ngrx/signals"; +import { error, fetchQuery } from "@sinequa/atomic"; import { AggregationsStore, - AppStore, ApplicationService, + AppStore, AutocompleteService, BookmarksComponent, CollectionsComponent, DrawerStackService, + FiltersBarComponent, KeyboardNavigatorOptions, QueryParamsStore, RecentSearchesComponent, SavedSearchesComponent, signIn -} from '@sinequa/atomic-angular'; -import { Separator, TabComponent, TabContent, TabsComponent, TabsListComponent } from '@sinequa/ui'; - -import { getState } from '@ngrx/signals'; -import { error, fetchQuery } from '@sinequa/atomic'; -import { ActiveSuggestion, AutocompleteComponent } from '../../components/search/autocomplete/autocomplete.component'; -import { SearchComponent } from '../../components/search/search.component'; -import { AppSidebarComponent } from '../../components/sidebar/sidebar.component'; -import { UserMenuComponent } from '../../components/user-menu/user-menu'; +} from "@sinequa/atomic-angular"; +import { Separator, TabComponent, TabContent, TabsComponent, TabsListComponent } from "@sinequa/ui"; +import { ActiveSuggestion, AutocompleteComponent } from "../../components/search/autocomplete/autocomplete.component"; +import { SearchComponent } from "../../components/search/search.component"; +import { AppSidebarComponent } from "../../components/sidebar/sidebar.component"; +import { UserMenuComponent } from "../../components/user-menu/user-menu"; type HomeTab = { name: string; @@ -37,30 +36,30 @@ type HomeTab = { const homeFeatures: HomeTab[] = [ { - name: 'recentSearches', - iconClass: 'fa-regular fa-clock-rotate-left', - label: 'searches.recent.label', + name: "recentSearches", + iconClass: "fa-regular fa-clock-rotate-left", + label: "searches.recent.label", inputs: { options: { itemsPerPage: 5 } }, component: RecentSearchesComponent }, { - name: 'savedSearches', - iconClass: 'fa-regular fa-star', - label: 'searches.saved.label', + name: "savedSearches", + iconClass: "fa-regular fa-star", + label: "searches.saved.label", inputs: { options: { itemsPerPage: 5 } }, component: SavedSearchesComponent }, { - name: 'bookmarks', - iconClass: 'fa-regular fa-bookmark', - label: 'bookmarks.label', + name: "bookmarks", + iconClass: "fa-regular fa-bookmark", + label: "bookmarks.label", inputs: { options: { itemsPerPage: 5 } }, component: BookmarksComponent }, { - name: 'baskets', - iconClass: 'fa-regular fa-inbox', - label: 'collections.label', + name: "baskets", + iconClass: "fa-regular fa-inbox", + label: "collections.label", component: CollectionsComponent } ]; @@ -70,7 +69,7 @@ const homeFeatures: HomeTab[] = [ * @deprecated This component is deprecated and will be removed in future versions. */ @Component({ - selector: 'app-home', + selector: "app-home", imports: [ NgComponentOutlet, TranslocoPipe, @@ -82,21 +81,22 @@ const homeFeatures: HomeTab[] = [ TabContent, AppSidebarComponent, TabsListComponent, - Separator + Separator, + FiltersBarComponent ], - templateUrl: './home.component.html', + templateUrl: "./home.component.html", host: { - class: 'layout-search h-screen', - '[attr.drawer-opened]': 'drawerOpened' + class: "layout-search h-screen", + "[attr.drawer-opened]": "drawerOpened" }, - providers: [provideTranslocoScope('bookmarks', 'searches', 'collections')] + providers: [provideTranslocoScope("bookmarks", "searches", "collections")] }) export class HomeComponent { public drawerOpened = computed(() => this.drawerStack.isOpened()); - readonly autocomplete = viewChild('autocomplete'); + readonly autocomplete = viewChild("autocomplete"); - readonly searchText = signal(''); + readonly searchText = signal(""); readonly tabs = signal(homeFeatures); @@ -110,9 +110,9 @@ export class HomeComponent { readonly applicationService = inject(ApplicationService); navigatorOptions = signal({ - name: 'tabsNavigator', + name: "tabsNavigator", optionSelector: '[role="tab"]:not([aria-disabled="true"])', - direction: 'horizontal', + direction: "horizontal", selectOnFocus: true, resetSelectionOnBlur: true }); @@ -124,42 +124,34 @@ export class HomeComponent { }; constructor(private destroyRef: DestroyRef) { - afterNextRender(() => { - this.queryParamsStore.patch({ filters: [], text: undefined, tab: undefined }); - }); - // react to drawer state changes to update the application title when the drawer is closed effect(() => { if (!this.drawerOpened()) { - this.applicationService.setTitle('Home'); - } - }); - - effect(() => { - const state = getState(this.queryParamsStore); - if (state.filters !== undefined && state.filters.length > 0) { - this.search(this.searchText()); + this.applicationService.setTitle("Home"); } }); // when the component is destroyed, close all drawers this.destroyRef.onDestroy(() => this.drawerStack.closeAll()); - // this is needed to populate the aggregation with the sources as no query is sent to the server - this.getFirstPageQuery(); + // this is needed to populate the aggregation with the sources as no query is sent to the server. + // Run it after the next render so the filters bar is already mounted when the aggregations + // land in the store — otherwise a fast response could resolve before the component is mounted + // and the filters would not show. + afterNextRender(() => this.getFirstPageQuery()); } async getFirstPageQuery() { try { - const query = this.appStore.getDefaultQuery() || { name: '_default' }; + const query = this.appStore.getDefaultQuery() || { name: "_default" }; const response = await fetchQuery({ isFirstPage: true, name: query.name }); this.aggregationStore.update(response.aggregations); } catch (err: any) { if (err.status === 401) { - error('Unauthorized access - please check your credentials:', err); + error("Unauthorized access - please check your credentials:", err); runInInjectionContext(this.injector, () => signIn()); } else if (err.status === 404) { - console.log('404 Not Found!'); + console.log("404 Not Found!"); } else { console.log(`HTTP error: ${err.status}`); } @@ -168,10 +160,10 @@ export class HomeComponent { public search(text: string): void { const { filters } = getState(this.queryParamsStore); - this.router.navigate(['/search'], { queryParams: { q: text, f: JSON.stringify(filters) } }); + this.router.navigate(["/search"], { queryParams: { q: text, f: JSON.stringify(filters) } }); } selected(element: HTMLElement | null): void { - this.search(element?.getAttribute('data-text') || this.searchText()); + this.search(element?.getAttribute("data-text") || this.searchText()); } } diff --git a/src/app/pages/search/all/search-all.component.ts b/src/app/pages/search/all/search-all.component.ts index c78b1034..9a1c3a20 100644 --- a/src/app/pages/search/all/search-all.component.ts +++ b/src/app/pages/search/all/search-all.component.ts @@ -1,14 +1,10 @@ -import { NgComponentOutlet } from '@angular/common'; -import { Component, computed, DestroyRef, effect, inject, input, signal, Type } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Placement } from '@floating-ui/dom'; -import { TranslocoPipe } from '@jsverse/transloco'; -import { getState } from '@ngrx/signals'; -import { injectInfiniteQuery } from '@tanstack/angular-query-experimental'; -import { lastValueFrom, map, tap } from 'rxjs'; - -import { MessageHandler } from '@sinequa/assistant/chat'; -import { Aggregation, Article, bisect, CCApp, isNotInputEvent, Query, QueryParams, Result as R, SpellingCorrectionMode } from '@sinequa/atomic'; +import { NgComponentOutlet } from "@angular/common"; +import { Component, computed, DestroyRef, effect, inject, input, signal, Type } from "@angular/core"; +import { Placement } from "@floating-ui/dom"; +import { TranslocoPipe } from "@jsverse/transloco"; +import { getState } from "@ngrx/signals"; +import { MessageHandler } from "@sinequa/assistant/chat"; +import { Aggregation, Article, bisect, CCApp, isNotInputEvent, Query, QueryParams, Result as R, SpellingCorrectionMode } from "@sinequa/atomic"; import { AggregationsStore, AppStore, @@ -28,31 +24,23 @@ import { SortSelectorComponent, SponsoredResultsComponent, UserSettingsStore -} from '@sinequa/atomic-angular'; -import { ButtonComponent, CardComponent, CardContentComponent, CardHeaderComponent, ChevronRightIcon, cn } from '@sinequa/ui'; - -import { AssistantComponent } from '../../../components/assistant/assistant'; -import { CardSkeleton } from '../../../components/cards/record/skeleton'; -import { getComponentsForDocumentType } from '../../../registry/document-type-registry'; +} from "@sinequa/atomic-angular"; +import { ButtonComponent, CardComponent, CardContentComponent, CardHeaderComponent, ChevronRightIcon, cn } from "@sinequa/ui"; +import { injectInfiniteQuery } from "@tanstack/angular-query-experimental"; +import { lastValueFrom, map, tap } from "rxjs"; +import { injectUrlQueryParamsSync } from "../../../../composables/url-query-params-sync"; +import { AssistantComponent } from "../../../components/assistant/assistant"; +import { CardSkeleton } from "../../../components/cards/record/skeleton"; +import { getComponentsForDocumentType } from "../../../registry/document-type-registry"; type Result = R & { nextPage?: number; previousPage?: number }; -type QueryParamsProps = { - f?: string; // filters list - p?: number; // page number - s?: string; // sort name - t?: string; // tab name - q?: string; // query text - b?: string; // basket, - n?: string; // query name - c?: SpellingCorrectionMode; // correction mode -}; /** * Component for displaying all search results with various features like sorting, filtering, infinite scrolling, and an assistant. * @deprecated This component is deprecated and will be removed in future versions. */ @Component({ - selector: 'app-search-all', + selector: "app-search-all", imports: [ NgComponentOutlet, SortSelectorComponent, @@ -72,7 +60,7 @@ type QueryParamsProps = { TranslocoPipe, ChevronRightIcon ], - templateUrl: './search-all.component.html', + templateUrl: "./search-all.component.html", styles: [ ` app-overview-people:not(.hidden) + app-overview-slides { @@ -87,10 +75,10 @@ type QueryParamsProps = { ` ], host: { - class: 'layout-search', - 'attr.drawer-opened': 'drawerStack.isOpened()', - '(keydown.enter)': 'handleKeydownEnter($event)', - '[attr.drawer-opened]': 'drawerOpened() || false' + class: "layout-search", + "attr.drawer-opened": "drawerStack.isOpened()", + "(keydown.enter)": "handleKeydownEnter($event)", + "[attr.drawer-opened]": "drawerOpened() || false" } }) export class SearchAllComponent { @@ -109,9 +97,6 @@ export class SearchAllComponent { protected readonly userSettingsStore = inject(UserSettingsStore); readonly selectionStore = inject(SelectionStore); - protected readonly router = inject(Router); - protected readonly route = inject(ActivatedRoute); - // input url bindings protected readonly q = input(); // text protected readonly t = input(); // tab @@ -119,14 +104,15 @@ export class SearchAllComponent { protected readonly s = input(); // sort protected readonly f = input(); // filters protected readonly n = input(); // query param - protected readonly id = input(); // record.id protected readonly c = input(); // correction mode + protected readonly p = input(); // page number + protected readonly id = input(); // record.id // all signals used in the component protected readonly drawerOpened = computed(() => this.drawerStack.isOpened()); protected readonly result = signal(undefined); - protected readonly queryText = signal(''); + protected readonly queryText = signal(""); protected readonly currentKeys = signal(undefined); // the Assistant is expanded and visible by default @@ -143,6 +129,10 @@ export class SearchAllComponent { return state.userOverrideActive; }); + // Keys of the last search recorded as a recent search, so we only record on a + // genuine new search — not when the query re-fires (e.g. user override toggle). ES-32053. + private lastRecordedKeys: string | undefined; + // Whether the feedback button is to hide hideFeedback = signal(false); @@ -156,17 +146,20 @@ export class SearchAllComponent { const query = { ...q, page: pageParam, tab: this.t(), basket: this.currentKeys()?.basket, correctionMode: this.c() } as Query; this.assistantQuery = { ...this.assistantQuery, ...query }; - // Add the current search to the user settings when the text is not empty - if (query.text && query.text !== '') { + // Record only on a genuine new search (params changed), first page, non-empty text. + // Prevents re-recording when the query re-fires purely due to a user-override toggle. ES-32053. + const keys = JSON.stringify(this.currentKeys()); + if (pageParam === 1 && query.text && query.text !== "" && keys !== this.lastRecordedKeys) { + this.lastRecordedKeys = keys; this.userSettingsStore.addCurrentSearch(query as QueryParams); } return lastValueFrom( this.queryService.search(query).pipe( - tap(() => this.queryText.set(this.currentKeys()?.text ?? '')), + tap(() => this.queryText.set(this.currentKeys()?.text ?? "")), map(result => { result.records?.map((article: Article) => { - return { ...article, value: article.title, type: 'default' }; + return { ...article, value: article.title, type: "default" }; }); return result; }), @@ -231,12 +224,12 @@ export class SearchAllComponent { * * @returns The computed placement value of type `Placement`. */ - position = computed(() => (this.drawerOpened() ? 'bottom-end' : 'bottom-start')); + position = computed(() => (this.drawerOpened() ? "bottom-end" : "bottom-start")); /** * Signal to track state of the selected all checkbox. */ - selectedAll = signal<'all' | 'some' | 'none'>('none'); + selectedAll = signal<"all" | "some" | "none">("none"); /** * If query has rowCount greater than 0, we have results, otherwise no results found. @@ -263,50 +256,23 @@ export class SearchAllComponent { return `search-results-assistant`; }); readonly allowAI = computed(() => !this.b() && this.appStore.isAssistantAllowed(this.instanceId())); - readonly enabledUserInput = computed(() => this.appStore.assistants()[this.instanceId()]?.['modeSettings']?.['enabledUserInput'] === true); - assistantQuery: Query = { name: 'assistant' }; + readonly enabledUserInput = computed(() => this.appStore.assistants()[this.instanceId()]?.["modeSettings"]?.["enabledUserInput"] === true); + assistantQuery: Query = { name: "assistant" }; conditionalMessageHandler: Map> = new Map(); constructor(destroyRef: DestroyRef) { - // Update the query params store with the filters from the URL query params - // This allows Browser back/forward to work correctly - effect(() => { - const filters = this.f() ? JSON.parse(this.f() ?? '') : []; // Parse the filters from the query params - this.queryParamsStore.patch({ - text: this.q(), - tab: this.t(), - basket: this.b(), - sort: this.s(), - filters, - name: this.n(), - spellingCorrectionMode: this.c() - }); - }); + // Synchronize URL query params ↔ QueryParamsStore (bidirectional) + injectUrlQueryParamsSync({ q: this.q, t: this.t, b: this.b, s: this.s, f: this.f, n: this.n, c: this.c, p: this.p }); - // Update the URL with the query params from the query params store + // Reset the feedback visibility on any store change effect(() => { + getState(this.queryParamsStore); this.hideFeedback.set(false); - - const queryParams: QueryParamsProps = {}; - const { text, filters = [], page, sort, tab, basket, name, spellingCorrectionMode } = getState(this.queryParamsStore); - - queryParams.f = filters.length > 0 ? JSON.stringify(filters) : undefined; - queryParams.p = page; - queryParams.s = sort; - queryParams.t = tab; - queryParams.q = text; - queryParams.b = basket; - queryParams.n = name; - queryParams.c = spellingCorrectionMode; - - this.router.navigate([], { relativeTo: this.route, queryParamsHandling: 'merge', queryParams, state: {} }); }); // Update keys to retrigger the query when relevant parameters change effect(() => { - this.hideFeedback.set(false); - const state = getState(this.queryParamsStore); const r = { tab: state.tab, @@ -348,9 +314,9 @@ export class SearchAllComponent { const selection = this.selectionStore.multiSelection().map(x => x.id); const b = bisect(articles, x => selection.includes(x)); - if (b.true.length === 0) this.selectedAll.set('none'); - else if (b.false.length === 0) this.selectedAll.set('all'); - else this.selectedAll.set('some'); + if (b.true.length === 0) this.selectedAll.set("none"); + else if (b.false.length === 0) this.selectedAll.set("all"); + else this.selectedAll.set("some"); }); effect(() => { @@ -366,7 +332,7 @@ export class SearchAllComponent { effect(() => this.onDrawerOpenedChange(this.drawerOpened())); - this.conditionalMessageHandler.set('SkillsTester', { handler: message => this.handleConditionalDisplayMessage(message), isGlobalHandler: false }); + this.conditionalMessageHandler.set("SkillsTester", { handler: message => this.handleConditionalDisplayMessage(message), isGlobalHandler: false }); // When the component is destroyed, clear the aggregations store // to avoid memory leaks and ensure that the aggregations are reset @@ -374,7 +340,7 @@ export class SearchAllComponent { } selectAll() { - if (this.selectedAll() === 'all') { + if (this.selectedAll() === "all") { this.unselectAll(); return; } @@ -413,7 +379,7 @@ export class SearchAllComponent { onSort(sort: SortingChoice): void { const audit = { - type: 'Search_Sort', + type: "Search_Sort", detail: { sort: sort.name, orderByClause: sort.orderByClause @@ -429,7 +395,7 @@ export class SearchAllComponent { handleConditionalDisplayMessage(message: any) { const { result } = message as { result: string }; - if (result.toLocaleLowerCase().includes('show overview')) { + if (result.toLocaleLowerCase().includes("show overview")) { this.hideAssistant.set(false); } else { this.hideAssistant.set(true); diff --git a/src/app/routes.ts b/src/app/routes.ts index 07d33c9f..89cffc42 100644 --- a/src/app/routes.ts +++ b/src/app/routes.ts @@ -1,10 +1,10 @@ -import type { Data, Route } from '@angular/router'; +import { Data, Route } from "@angular/router"; -import { AuthGuard, ErrorComponent, LoadingComponent, queryNameResolver, SignInComponent } from '@sinequa/atomic-angular'; +import { AuthGuard, AuthPageComponent, ErrorComponent, queryNameResolver } from "@sinequa/atomic-angular"; -import { HomeComponent } from './pages/home/home.component'; -import { SearchAllComponent } from './pages/search/all/search-all.component'; -import { SearchLayoutComponent } from './pages/search/layout'; +import { HomeComponent } from "./pages/home/home.component"; +import { SearchAllComponent } from "./pages/search/all/search-all.component"; +import { SearchLayoutComponent } from "./pages/search/layout"; // Extended types to add custom properties to routes type ExtendedData = Data & { @@ -21,57 +21,51 @@ type ExtendedRoute = Route & { type ExtendedRoutes = ExtendedRoute[]; export const routes: ExtendedRoutes = [ - { path: 'login', component: SignInComponent }, - { path: 'logout', component: SignInComponent }, + { path: "login", component: AuthPageComponent }, + { path: "logout", component: AuthPageComponent }, { - path: 'assistant', - loadComponent: () => import('./pages/assistant/assistant.layout').then(m => m.AssistantLayoutComponent), + path: "assistant", + loadComponent: () => import("./pages/assistant/assistant.layout").then(m => m.AssistantLayoutComponent), canActivate: [AuthGuard()], resolve: { queryName: queryNameResolver }, data: { reuse: true } // This route will be "frozen" when we navigate away from it, and "thawed" when we come back to it }, + { path: "home", component: HomeComponent, canActivate: [AuthGuard()], resolve: { queryName: queryNameResolver } }, { - path: 'home', - component: HomeComponent, - canActivate: [AuthGuard()], - resolve: { queryName: queryNameResolver } - }, - { - path: 'widgets', - loadComponent: () => import('./pages/widgets/layout').then(m => m.WidgetsLayoutComponent), + path: "widgets", + loadComponent: () => import("./pages/widgets/layout").then(m => m.WidgetsLayoutComponent), canActivate: [AuthGuard()], children: [ { - path: 'recent-searches', - loadComponent: () => import('./pages/widgets/recent-searches/recent-searches.component').then(m => m.RecentSearchesComponent) + path: "recent-searches", + loadComponent: () => import("./pages/widgets/recent-searches/recent-searches.component").then(m => m.RecentSearchesComponent) }, { - path: 'bookmarks', - loadComponent: () => import('./pages/widgets/bookmarks/bookmarks.component').then(m => m.BookmarksComponent) + path: "bookmarks", + loadComponent: () => import("./pages/widgets/bookmarks/bookmarks.component").then(m => m.BookmarksComponent) }, { - path: 'saved-searches', - loadComponent: () => import('./pages/widgets/saved-searches/saved-searches.component').then(m => m.SavedSearchesComponent) + path: "saved-searches", + loadComponent: () => import("./pages/widgets/saved-searches/saved-searches.component").then(m => m.SavedSearchesComponent) }, { - path: 'collections', - loadComponent: () => import('./pages/widgets/collections/collections.component').then(m => m.CollectionsComponent) + path: "collections", + loadComponent: () => import("./pages/widgets/collections/collections.component").then(m => m.CollectionsComponent) } ] }, { - path: 'search', + path: "search", component: SearchLayoutComponent, canActivate: [AuthGuard()], children: [ { - path: '**', + path: "**", component: SearchAllComponent, resolve: { queryName: queryNameResolver } } ] }, - { path: 'loading', component: LoadingComponent }, - { path: 'error', component: ErrorComponent }, - { path: '**', redirectTo: 'home', pathMatch: 'full' } + { path: "error", component: ErrorComponent }, + { path: "**", redirectTo: "home", pathMatch: "full" } ]; diff --git a/src/app2/app.config.ts b/src/app2/app.config.ts index 671ac422..74bed36b 100644 --- a/src/app2/app.config.ts +++ b/src/app2/app.config.ts @@ -1,18 +1,18 @@ -import { registerLocaleData } from '@angular/common'; -import { provideHttpClient, withInterceptors } from '@angular/common/http'; -import localeDe from '@angular/common/locales/de'; -import localeFr from '@angular/common/locales/fr'; -import { APP_INITIALIZER, type ApplicationConfig, inject, isDevMode, LOCALE_ID, provideAppInitializer, provideZonelessChangeDetection } from '@angular/core'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; -import { provideRouter, RouteReuseStrategy, withComponentInputBinding, withHashLocation } from '@angular/router'; -import { CustomReuseStrategy } from '@config/custom-reuse-strategy'; -import { TranslocoHttpLoader } from '@config/transloco-loader'; +import { registerLocaleData } from "@angular/common"; +import { provideHttpClient, withInterceptors } from "@angular/common/http"; +import localeDe from "@angular/common/locales/de"; +import localeFr from "@angular/common/locales/fr"; +import { APP_INITIALIZER, ApplicationConfig, isDevMode, LOCALE_ID, provideAppInitializer, provideZonelessChangeDetection } from "@angular/core"; +import { provideNoopAnimations } from "@angular/platform-browser/animations"; +import { provideRouter, RouteReuseStrategy, withComponentInputBinding, withHashLocation } from "@angular/router"; +import { CustomReuseStrategy } from "@config/custom-reuse-strategy"; +import { TranslocoHttpLoader } from "@config/transloco-loader"; // @ts-expect-error -import Flow from '@flowjs/flow.js'; -import { FlowInjectionToken } from '@flowjs/ngx-flow'; -import { provideTransloco } from '@jsverse/transloco'; -import { provideTranslocoMessageformat } from '@jsverse/transloco-messageformat'; -import { getComponentsForDocumentType } from '@registry/document-type-registry'; +import Flow from "@flowjs/flow.js"; +import { FlowInjectionToken } from "@flowjs/ngx-flow"; +import { provideTransloco } from "@jsverse/transloco"; +import { provideTranslocoMessageformat } from "@jsverse/transloco-messageformat"; +import { getComponentsForDocumentType } from "@registry/document-type-registry"; import { ASSISTANT_CUSTOM_ELEMENTS, ASSISTANT_MARKDOWN_IT_PLUGINS, @@ -29,15 +29,14 @@ import { markdownItTableToolsPlugin, PageReferenceComponent, TableToolsComponent -} from '@sinequa/assistant/chat'; -import { appInitializerFn } from '@sinequa/atomic'; +} from "@sinequa/assistant/chat"; import { - ApplicationService, auditInterceptorFn, authInterceptorFn, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, bodyInterceptorFn, + bootstrapApp, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, @@ -50,14 +49,13 @@ import { ROUTE_COMPONENTS, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, - toastInterceptorFn, - withBootstrapApp -} from '@sinequa/atomic-angular'; -import { provideTanStackQuery, QueryClient } from '@tanstack/angular-query-experimental'; -import { PREVIEW_HIGHLIGHTS } from '../config/highlight.config'; -import { SearchAllComponent } from './pages/search/search-all'; -import { SearchLayoutComponent } from './pages/search/search-layout'; -import { routes } from './routes'; + toastInterceptorFn +} from "@sinequa/atomic-angular"; +import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental"; +import { PREVIEW_HIGHLIGHTS } from "../config/highlight.config"; +import { SearchAllComponent } from "./pages/search/search-all"; +import { SearchLayoutComponent } from "./pages/search/search-layout"; +import { routes } from "./routes"; registerLocaleData(localeFr); registerLocaleData(localeDe); @@ -73,11 +71,14 @@ export const appConfig: ApplicationConfig = { // By default, Angular destroys a component when navigating away from its route and re-creates it when navigating back to that route. // With this provider, we can tell Angular to keep the component instance in memory and reuse it when navigating back to the route. { provide: RouteReuseStrategy, useClass: CustomReuseStrategy }, - // this function is used to configure the application before it is loaded - provideAppInitializer(appInitializerFn), - // this function is used to sign in the user and bootstrap the application - provideAppInitializer(() => withBootstrapApp(inject(ApplicationService), { createRoutes: true })), + // Signs the user in and bootstraps the application. `bootstrapApp` injects ApplicationService + // itself AFTER resolving the auth mode (initializeAppConfig), so: + // - detection runs before sign-in (no bootstrap race), and + // - `backendUrl` is set before any service/store is constructed (no `/undefined/api/v1/...`). + // Note: we must NOT eagerly `inject(ApplicationService)` in this factory — that would construct + // it (and its dependent stores) before detection sets `backendUrl`. + provideAppInitializer(() => bootstrapApp({ createRoutes: true })), // Provides an APP_INITIALIZER which will initialize the custom elements defined in the @sinequa/assistant/chat // library. This is required to be able to use the custom elements in Angular components templates. @@ -92,11 +93,11 @@ export const appConfig: ApplicationConfig = { { provide: ASSISTANT_CUSTOM_ELEMENTS, useValue: { - 'document-reference': DocumentReferenceComponent, - 'page-reference': PageReferenceComponent, - 'image-reference': ImageReferenceComponent, - 'code-block': CodeBlockComponent, - 'table-tools': TableToolsComponent + "document-reference": DocumentReferenceComponent, + "page-reference": PageReferenceComponent, + "image-reference": ImageReferenceComponent, + "code-block": CodeBlockComponent, + "table-tools": TableToolsComponent } }, { @@ -111,7 +112,7 @@ export const appConfig: ApplicationConfig = { ] }, - { provide: LOCALE_ID, useValue: 'fr-FR' }, + { provide: LOCALE_ID, useValue: "fr-FR" }, // this token is used to configure the CSS class to use in the preview with the highlights // for each highlight, a CSS class will be created with the name of the highlight @@ -119,47 +120,16 @@ export const appConfig: ApplicationConfig = { // this token is used to configure the function who returns the component to use for the preview // the function should return a DocumentTypeMap object - { - provide: COMPONENTS_FOR_DOCUMENT_TYPE, - useValue: getComponentsForDocumentType - }, + { provide: COMPONENTS_FOR_DOCUMENT_TYPE, useValue: getComponentsForDocumentType }, // those tokens are used to configure the path of the widgets // by default, the routerLink is "/xxx", where xxx is the name of the widget // if you want to change the path of the widget, you can use the routerLink property // showLoadMore is used to show the "Load more" button in the widgets, by default it is set to true, so here we set it to false - { - provide: RECENT_SEARCHES_CONFIG, - useValue: { - ...RECENT_SEARCHES_OPTIONS, - routerLink: '/widgets/recent-searches', - showLoadMore: false - } - }, - { - provide: SAVED_SEARCHES_CONFIG, - useValue: { - ...SAVED_SEARCHES_OPTIONS, - routerLink: '/widgets/saved-searches', - showLoadMore: false - } - }, - { - provide: BOOKMARKS_CONFIG, - useValue: { - ...BOOKMARKS_OPTIONS, - routerLink: '/widgets/bookmarks', - showLoadMore: false - } - }, - { - provide: COLLECTIONS_CONFIG, - useValue: { - ...COLLECTIONS_OPTIONS, - routerLink: '/widgets/collections', - showLoadMore: false - } - }, + { provide: RECENT_SEARCHES_CONFIG, useValue: { ...RECENT_SEARCHES_OPTIONS, routerLink: "/widgets/recent-searches", showLoadMore: false } }, + { provide: SAVED_SEARCHES_CONFIG, useValue: { ...SAVED_SEARCHES_OPTIONS, routerLink: "/widgets/saved-searches", showLoadMore: false } }, + { provide: BOOKMARKS_CONFIG, useValue: { ...BOOKMARKS_OPTIONS, routerLink: "/widgets/bookmarks", showLoadMore: false } }, + { provide: COLLECTIONS_CONFIG, useValue: { ...COLLECTIONS_OPTIONS, routerLink: "/widgets/collections", showLoadMore: false } }, // this token is used to configure how the extracts will be retrieved // if worker is allowed by your Security Policy, the extracts will be retrieved using a web worker // if not, comment the line below or set it to false @@ -171,12 +141,12 @@ export const appConfig: ApplicationConfig = { provide: ROUTE_COMPONENTS, useValue: [ { - path: 'search', + path: "search", component: SearchLayoutComponent, isRoot: true }, { - path: 'all', + path: "all", component: SearchAllComponent } ] @@ -210,12 +180,12 @@ export const appConfig: ApplicationConfig = { ), provideTransloco({ config: { - availableLangs: ['en', 'fr', 'de'], - defaultLang: 'en', + availableLangs: ["en", "fr", "de"], + defaultLang: "en", // Remove this option if your application doesn't support changing language in runtime. reRenderOnLangChange: true, prodMode: !isDevMode(), - fallbackLang: 'en', + fallbackLang: "en", missingHandler: { logMissingKey: true, useFallbackTranslation: true diff --git a/src/app2/pages/assistant/assistant.layout.ts b/src/app2/pages/assistant/assistant.layout.ts index 54ecec97..f87b426e 100644 --- a/src/app2/pages/assistant/assistant.layout.ts +++ b/src/app2/pages/assistant/assistant.layout.ts @@ -1,22 +1,12 @@ -import { ChangeDetectorRef, Component, computed, effect, inject, input, signal, viewChild } from '@angular/core'; -import { AssistantComponent } from '@components/assistant/assistant'; -import { AssistantUploadComponent } from '@components/assistant/document-upload/assistant-upload.component'; -import { SidebarMainComponent } from '@components/sidebar/sidebar'; -import type { OnRouteAttached } from '@config/custom-reuse-strategy'; -import { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco'; -import type { HubConnection } from '@microsoft/signalr'; -import { getState } from '@ngrx/signals'; -import { type SavedChat, SavedChatsComponent } from '@sinequa/assistant/chat'; -import { type CCApp, fetchQuery, type Query } from '@sinequa/atomic'; -import { - AggregationComponent, - AggregationsStore, - ApplicationService, - AppStore, - PrincipalStore, - QueryParamsStore, - SelectionStore -} from '@sinequa/atomic-angular'; +import { ChangeDetectionStrategy, Component, inject, input, viewChild } from "@angular/core"; +import { AssistantComponent } from "@components/assistant/assistant"; +import { AssistantUploadComponent } from "@components/assistant/document-upload/assistant-upload.component"; +import { SidebarMainComponent } from "@components/sidebar/sidebar"; +import { OnRouteAttached } from "@config/custom-reuse-strategy"; +import { provideTranslocoScope, TranslocoPipe } from "@jsverse/transloco"; +import { SavedChatsComponent } from "@sinequa/assistant/chat"; +import { SpellingCorrectionMode } from "@sinequa/atomic"; +import { AggregationComponent } from "@sinequa/atomic-angular"; import { BreakpointObserverService, ButtonComponent, @@ -30,11 +20,12 @@ import { SidebarProviderComponent, SidebarService, SidebarTriggerComponent -} from '@sinequa/ui'; -import { firstValueFrom } from 'rxjs'; +} from "@sinequa/ui"; +import { injectAssistantLayout } from "../../../composables/inject-assistant-layout"; @Component({ - selector: 'assistant-layout, AssistantLayout', + selector: "assistant-layout, AssistantLayout", + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ TranslocoPipe, AssistantComponent, @@ -51,7 +42,7 @@ import { firstValueFrom } from 'rxjs'; SidebarMenuComponent, SidebarMenuButtonComponent ], - providers: [SidebarService, SheetService, provideTranslocoScope('filters')], + providers: [SidebarService, SheetService, provideTranslocoScope("filters")], template: ` @@ -60,8 +51,8 @@ import { firstValueFrom } from 'rxjs'; - @for (key of [assistantKey()]; track key) { - @if (showSavedChats()) { + @for (key of [layout.assistantKey()]; track key) { + @if (layout.showSavedChats()) {

@@ -73,12 +64,15 @@ import { firstValueFrom } from 'rxjs'; size="icon" [title]="'assistant.new-discussion' | transloco" [attr.aria-label]="'assistant.new-discussion' | transloco" - (click)="chat()?.newChat()"> + (click)="layout.startNewChat()">

- +
} @@ -93,22 +87,22 @@ import { firstValueFrom } from 'rxjs'; class="border-foreground/10 rounded-2xl border p-4" /> - @for (key of [assistantKey()]; track key) { - @if (showDocumentUploader()) { - + @for (key of [layout.assistantKey()]; track key) { + @if (layout.showDocumentUploader()) { + } }
- @if (query()) { + @if (layout.query()) {
+ [query]="layout.query()" + [instanceId]="layout.instanceId()" + (onReady)="layout.handleReady($event)" + (onConnection)="layout.handleConnection($event)" />
}
@@ -119,7 +113,7 @@ import { firstValueFrom } from 'rxjs'; Assistant - + {{ 'assistant.new-discussion' | transloco }} @@ -142,170 +136,32 @@ import { firstValueFrom } from 'rxjs'; ] }) export class AssistantLayoutComponent implements OnRouteAttached { - cn = cn; - chat = viewChild(AssistantComponent); - - breakpointObserverService = inject(BreakpointObserverService); - sidebarService = inject(SidebarService); - sheetService = inject(SheetService); - - private readonly appStore = inject(AppStore); - private readonly appFeatures = this.appStore.general()?.features; - private readonly aggregationStore = inject(AggregationsStore); - private readonly selectionStore = inject(SelectionStore); - private readonly queryParamsStore = inject(QueryParamsStore); - private readonly applicationService = inject(ApplicationService); - private readonly cdr = inject(ChangeDetectorRef); - - query = signal(undefined); - - readonly instanceId = computed(() => { - const { usePrefixName = false } = this.appFeatures?.assistant || {}; - if (usePrefixName) { - const { name } = getState(this.appStore) as CCApp; - return `${name}-standalone-assistant`; - } - return `standalone-assistant`; + readonly cn = cn; + readonly chat = viewChild(AssistantComponent); + + readonly breakpointObserverService = inject(BreakpointObserverService); + readonly sidebarService = inject(SidebarService); + readonly sheetService = inject(SheetService); + + readonly q = input(); + readonly t = input(); + readonly b = input(); + readonly s = input(); + readonly f = input(); + readonly n = input(); + readonly c = input(); + + protected readonly layout = injectAssistantLayout(this.chat, { + q: this.q, + t: this.t, + b: this.b, + s: this.s, + f: this.f, + n: this.n, + c: this.c }); - // this is the assistant component who triggers the connection is established - connectionEstablished = signal(false); - - // this is used to know if the assistant is ready to use (i.e. the assistant is ready to receive queries) - isAssistantReady = signal(false); - - // used to know how many times we have to go back to return to the search page (decreases at each query params change) - backLevel = 0; - - // this is used to know if the saved chats component should be displayed - readonly allowSavedChats = computed(() => Boolean(this.appStore.assistants()[this.instanceId()]?.['savedChatSettings']?.['display'])); - - // this is used to know if the document uploader component should be displayed - readonly allowDocumentUploader = computed(() => Boolean(this.appStore.customizationJson()?.['documentsUploadSettings']?.['enabled'])); - - // this is used to display the saved chats component - readonly showSavedChats = computed(() => this.allowSavedChats() && this.connectionEstablished() && this.isAssistantReady()); - - // this is used to display the saved chats component - readonly showDocumentUploader = computed(() => this.allowDocumentUploader() && this.connectionEstablished() && this.isAssistantReady()); - - // queryparams input binding - q = input(); - - /* To force the recreation of the assistant component when the principal changes,*/ - readonly principalStore = inject(PrincipalStore); - // Add to your component class - assistantKey = signal(0); - // Call this method when you need to recreate - recreateAssistant() { - this.assistantKey.update(v => v + 1); - } - /* End of assistant recreation code */ - - constructor() { - effect(() => { - // each time the principal store updates, we recreate the assistant component to make sure it uses the latest principal - getState(this.principalStore); - this.recreateAssistant(); - const chat = this.chat(); - if (chat && this.isAssistantReady()) { - // also start a new chat - this.chat()?.newChat(); - } - }); - - effect(() => { - this.queryParamsStore.setFromUrl(window.location.hash); - this.query.set(this.queryParamsStore.getQuery()); - this.backLevel--; - }); - - effect(() => { - // force the change detection when the AggregationStore is updated. - // This is needed because we use the ChatComponent which is not a signal component (i.e Angular v14) - getState(this.aggregationStore); - this.cdr.detectChanges(); - }); - - effect(() => { - const question = this.q(); - this.chat()?.askAI(question); - }); - - // react to drawer state changes to update the application title when the drawer is closed - this.applicationService.setTitle('Assistant'); - - // when the component is initialized, we want to set the application title and clear the selection store - this.initialize(); - } - - onRouteAttached(): void { - this.initialize(); - } - - private initialize() { - // clear the selection store - // this is needed to avoid the selection store to be populated with the assistant queries - this.selectionStore.clear(); - - // this is needed to populate the aggregation with the sources as no query is sent to the server - this.getFirstPageQuery(); - } - - async getFirstPageQuery() { - const query = this.appStore.getDefaultQuery() || { name: '_default' }; - const response = await fetchQuery({ isFirstPage: true, name: query.name }); - this.aggregationStore.update(response.aggregations); - } - - handleConnection(connection: HubConnection) { - // to properly instanciate the saved-chats component, we need to wait for the connection to be established - if (connection.state === 'Connected') { - this.connectionEstablished.set(true); - } - } - - handleReady(ready: boolean) { - if (ready) { - this.isAssistantReady.set(true); - } - } - - /** - * Loads a saved chat and updates the query signal with the first user message content. - * - * This method fetches the saved chat history, locates the first user message, - * and updates the query signal with its content. - * - * @param savedChat - The saved chat object containing the chat ID to load - * @returns A promise that resolves when the saved chat has been loaded and processed - * - * @remarks - * - Requires a valid chat service instance to be available - * - Only processes messages with role 'user' that have content - * - Updates the query signal's text property with the first user message content - * - If no chat service is available or no user message is found, the method returns early - */ - async handleLoadSavedChat(savedChat: SavedChat) { - // 1. fetch the saved chat to get its history - // 2. find the first user message in the history - // 3. update the query signal with the first user message content - const chatService = this.chat()?.sqChat()?.chatService; - if (!chatService) { - return; - } - const response = await firstValueFrom(chatService.getSavedChat(savedChat.id)); - const history = response?.history || []; - const firstUserMessage = history.find(msg => msg.role === 'user' && msg.content); - if (firstUserMessage) { - this.query.update(q => { - if (q && firstUserMessage) { - const newQuery = { ...q }; - newQuery.text = firstUserMessage.content as string; - return newQuery; - } - return q; - }); - } + onRouteAttached() { + this.layout.onRouteAttached(); } } diff --git a/src/app2/pages/home/home.html b/src/app2/pages/home/home.html index 3f9e9b6c..d02a60de 100644 --- a/src/app2/pages/home/home.html +++ b/src/app2/pages/home/home.html @@ -9,7 +9,10 @@
- +
+ + +
diff --git a/src/app2/pages/home/home.ts b/src/app2/pages/home/home.ts index 70dda8d6..2e93417e 100644 --- a/src/app2/pages/home/home.ts +++ b/src/app2/pages/home/home.ts @@ -1,23 +1,35 @@ -import { Component, DestroyRef, Injector, computed, effect, inject, runInInjectionContext, signal } from '@angular/core'; -import { provideTranslocoScope } from '@jsverse/transloco'; - -import { AggregationsStore, AppStore, ApplicationService, DrawerStackService, KeyboardNavigatorOptions, signIn } from '@sinequa/atomic-angular'; - -import { error, fetchQuery } from '@sinequa/atomic'; -import { SidebarProviderComponent, SidebarTriggerComponent } from '@sinequa/ui'; - -import { SearchWithAutocompleteComponent } from '@components/search/search-with-autocomplete'; -import { SidebarMainComponent } from '@components/sidebar/sidebar'; -import { WidgetsTabsComponent } from '@components/widgets/widgets-tabs'; +import { afterNextRender, Component, computed, DestroyRef, effect, Injector, inject, runInInjectionContext, signal } from "@angular/core"; +import { SearchWithAutocompleteComponent } from "@components/search/search-with-autocomplete"; +import { SidebarMainComponent } from "@components/sidebar/sidebar"; +import { WidgetsTabsComponent } from "@components/widgets/widgets-tabs"; +import { provideTranslocoScope } from "@jsverse/transloco"; +import { error, fetchQuery } from "@sinequa/atomic"; +import { + AggregationsStore, + ApplicationService, + AppStore, + DrawerStackService, + FiltersBarComponent, + KeyboardNavigatorOptions, + signIn +} from "@sinequa/atomic-angular"; +import { SidebarProviderComponent, SidebarTriggerComponent } from "@sinequa/ui"; @Component({ - selector: 'app-home', - imports: [SidebarMainComponent, WidgetsTabsComponent, SearchWithAutocompleteComponent, SidebarTriggerComponent, SidebarProviderComponent], - templateUrl: './home.html', + selector: "app-home", + imports: [ + SidebarMainComponent, + WidgetsTabsComponent, + SearchWithAutocompleteComponent, + SidebarTriggerComponent, + SidebarProviderComponent, + FiltersBarComponent + ], + templateUrl: "./home.html", host: { - '[attr.drawer-opened]': 'drawerOpened()' + "[attr.drawer-opened]": "drawerOpened()" }, - providers: [provideTranslocoScope('bookmarks', 'searches', 'collections')] + providers: [provideTranslocoScope("bookmarks", "searches", "collections")] }) export class HomeComponent { public drawerOpened = computed(() => this.drawerStack.isOpened()); @@ -29,9 +41,9 @@ export class HomeComponent { readonly applicationService = inject(ApplicationService); navigatorOptions = signal({ - name: 'tabsNavigator', + name: "tabsNavigator", optionSelector: '[role="tab"]:not([aria-disabled="true"])', - direction: 'horizontal', + direction: "horizontal", selectOnFocus: true, resetSelectionOnBlur: true }); @@ -46,28 +58,31 @@ export class HomeComponent { // react to drawer state changes to update the application title when the drawer is closed effect(() => { if (!this.drawerOpened()) { - this.applicationService.setTitle('Home'); + this.applicationService.setTitle("Home"); } }); // when the component is destroyed, close all drawers this.destroyRef.onDestroy(() => this.drawerStack.closeAll()); - // this is needed to populate the aggregation with the sources as no query is sent to the server - this.getFirstPageQuery(); + // this is needed to populate the aggregation with the sources as no query is sent to the server. + // Run it after the next render so the filters bar is already mounted when the aggregations + // land in the store — otherwise a fast response could resolve before the component is mounted + // and the filters would not show. + afterNextRender(() => this.getFirstPageQuery()); } async getFirstPageQuery() { try { - const query = this.appStore.getDefaultQuery() || { name: '_default' }; + const query = this.appStore.getDefaultQuery() || { name: "_default" }; const response = await fetchQuery({ isFirstPage: true, name: query.name }); this.aggregationStore.update(response.aggregations); } catch (err: any) { if (err.status === 401) { - error('Unauthorized access - please check your credentials:', err); + error("Unauthorized access - please check your credentials:", err); runInInjectionContext(this.injector, () => signIn()); } else if (err.status === 404) { - console.log('404 Not Found!'); + console.log("404 Not Found!"); } else { console.log(`HTTP error: ${err.status}`); } diff --git a/src/app2/pages/search/search-all.html b/src/app2/pages/search/search-all.html index 15aade0b..8b7b5887 100644 --- a/src/app2/pages/search/search-all.html +++ b/src/app2/pages/search/search-all.html @@ -1,10 +1,10 @@
-
+
@if (isTabSearchActive()) { } - + @@ -15,15 +15,15 @@
- +